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
324cdb13ceSBram Moolenaar  let nr: number = 1234
334cdb13ceSBram Moolenaar  call CheckDefFailure(['let nr: number = "asdf"'], 'E1013:')
344cdb13ceSBram Moolenaar
35b209750bSBram Moolenaar  let a: number = 6 #comment
369be61bbbSBram Moolenaar  assert_equal(6, a)
379be61bbbSBram Moolenaar
3842a480bfSBram Moolenaar  if has('channel')
3942a480bfSBram Moolenaar    let chan1: channel
40fbdd08edSBram Moolenaar    let job1: job
41f51cb4e0SBram Moolenaar    let job2: job = job_start('willfail')
4242a480bfSBram Moolenaar  endif
43fbdd08edSBram Moolenaar  if has('float')
44fbdd08edSBram Moolenaar    let float1: float = 3.4
45fbdd08edSBram Moolenaar  endif
465deeb3f1SBram Moolenaar  let Funky1: func
475deeb3f1SBram Moolenaar  let Funky2: func = function('len')
484c17ad94SBram Moolenaar  let Party2: func = funcref('g:Test_syntax')
4942a480bfSBram Moolenaar
50b209750bSBram Moolenaar  g:newvar = 'new'  #comment
51401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
52401d9ffbSBram Moolenaar
53401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
54401d9ffbSBram Moolenaar  g:existing = 'no'
55401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
56401d9ffbSBram Moolenaar
57b283a8a6SBram Moolenaar  v:char = 'abc'
586e587dcbSBram Moolenaar  assert_equal('abc', v:char)
59b283a8a6SBram Moolenaar
60b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
616e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
62b283a8a6SBram Moolenaar  $ENVVAR = ''
636e587dcbSBram Moolenaar
64b5ed2660SBram Moolenaar  let lines =<< trim END
65b5ed2660SBram Moolenaar    vim9script
66b5ed2660SBram Moolenaar    $ENVVAR = 'barfoo'
67b5ed2660SBram Moolenaar    assert_equal('barfoo', $ENVVAR)
68b5ed2660SBram Moolenaar    $ENVVAR = ''
69b5ed2660SBram Moolenaar  END
70b5ed2660SBram Moolenaar  call CheckScriptSuccess(lines)
71b5ed2660SBram Moolenaar
72fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
73fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
74fd1823e0SBram Moolenaar  s:addToMe += 222
75fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
760bbf722aSBram Moolenaar  s:newVar = 'new'
770bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
78a8c17704SBram Moolenaar
79a8c17704SBram Moolenaar  set ts=7
80a8c17704SBram Moolenaar  &ts += 1
81a8c17704SBram Moolenaar  assert_equal(8, &ts)
8280c34ca3SBram Moolenaar  &ts -= 3
8380c34ca3SBram Moolenaar  assert_equal(5, &ts)
8480c34ca3SBram Moolenaar  &ts *= 2
8580c34ca3SBram Moolenaar  assert_equal(10, &ts)
8680c34ca3SBram Moolenaar  &ts /= 3
8780c34ca3SBram Moolenaar  assert_equal(3, &ts)
8880c34ca3SBram Moolenaar  set ts=10
8980c34ca3SBram Moolenaar  &ts %= 4
9080c34ca3SBram Moolenaar  assert_equal(2, &ts)
91b5ed2660SBram Moolenaar
92b5ed2660SBram Moolenaar  lines =<< trim END
93b5ed2660SBram Moolenaar    vim9script
94b5ed2660SBram Moolenaar    &ts = 6
95b5ed2660SBram Moolenaar    &ts += 3
96b5ed2660SBram Moolenaar    assert_equal(9, &ts)
97b5ed2660SBram Moolenaar  END
98b5ed2660SBram Moolenaar  call CheckScriptSuccess(lines)
99b5ed2660SBram Moolenaar
100a8c17704SBram Moolenaar  call CheckDefFailure(['&notex += 3'], 'E113:')
101a8c17704SBram Moolenaar  call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
102a6e67e4fSBram Moolenaar  call CheckDefFailure(['&ts = [7]'], 'E1013:')
103a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list')
104a6e67e4fSBram Moolenaar  call CheckDefFailure(['&ts = "xx"'], 'E1013:')
105a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string')
106a8c17704SBram Moolenaar  call CheckDefFailure(['&path += 3'], 'E1013:')
107a6e67e4fSBram Moolenaar  call CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
108cb711abfSBram Moolenaar  # test freeing ISN_STOREOPT
109585fea7bSBram Moolenaar  call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
11080c34ca3SBram Moolenaar  &ts = 8
111a8c17704SBram Moolenaar
11233afa244SBram Moolenaar  call CheckDefFailure(['let s:var = 123'], 'E1101:')
11333afa244SBram Moolenaar  call CheckDefFailure(['let s:var: number'], 'E1101:')
11433afa244SBram Moolenaar
115a8c17704SBram Moolenaar  g:inc_counter += 1
116a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
117a8c17704SBram Moolenaar
118a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
119a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
120a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:')
121a8c17704SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:')
122a8c17704SBram Moolenaar
123a8c17704SBram Moolenaar  @a = 'areg'
124a8c17704SBram Moolenaar  @a ..= 'add'
125a8c17704SBram Moolenaar  assert_equal('aregadd', @a)
126a8c17704SBram Moolenaar  call CheckDefFailure(['@a += "more"'], 'E1013:')
127a8c17704SBram Moolenaar  call CheckDefFailure(['@a += 123'], 'E1013:')
128e69f6d04SBram Moolenaar
129b5ed2660SBram Moolenaar  lines =<< trim END
130b5ed2660SBram Moolenaar    vim9script
131b5ed2660SBram Moolenaar    @c = 'areg'
132b5ed2660SBram Moolenaar    @c ..= 'add'
133b5ed2660SBram Moolenaar    assert_equal('aregadd', @c)
134b5ed2660SBram Moolenaar  END
135b5ed2660SBram Moolenaar  call CheckScriptSuccess(lines)
136b5ed2660SBram Moolenaar
137e69f6d04SBram Moolenaar  v:errmsg = 'none'
138e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
139e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
140e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += "more"'], 'E1013:')
141e69f6d04SBram Moolenaar  call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
14233afa244SBram Moolenaar
14333afa244SBram Moolenaar  # single letter variables
14433afa244SBram Moolenaar  a = 123
14533afa244SBram Moolenaar  assert_equal(123, a)
14633afa244SBram Moolenaar  let b: number
14733afa244SBram Moolenaar  b = 123
14833afa244SBram Moolenaar  assert_equal(123, b)
14933afa244SBram Moolenaar  let g: number
15033afa244SBram Moolenaar  g = 123
15133afa244SBram Moolenaar  assert_equal(123, g)
15233afa244SBram Moolenaar  let s: number
15333afa244SBram Moolenaar  s = 123
15433afa244SBram Moolenaar  assert_equal(123, s)
15533afa244SBram Moolenaar  let t: number
15633afa244SBram Moolenaar  t = 123
15733afa244SBram Moolenaar  assert_equal(123, t)
15833afa244SBram Moolenaar  let v: number
15933afa244SBram Moolenaar  v = 123
16033afa244SBram Moolenaar  assert_equal(123, v)
16133afa244SBram Moolenaar  let w: number
16233afa244SBram Moolenaar  w = 123
16333afa244SBram Moolenaar  assert_equal(123, w)
1645deeb3f1SBram Moolenaarenddef
1655deeb3f1SBram Moolenaar
1663b74b6b4SBram Moolenaardef Test_vim9_single_char_vars()
1673b74b6b4SBram Moolenaar  let lines =<< trim END
1683b74b6b4SBram Moolenaar      vim9script
1693b74b6b4SBram Moolenaar
170f5be8cdbSBram Moolenaar      # single character variable declarations work
1713b74b6b4SBram Moolenaar      let a: string
1723b74b6b4SBram Moolenaar      let b: number
1733b74b6b4SBram Moolenaar      let l: list<any>
1743b74b6b4SBram Moolenaar      let s: string
1753b74b6b4SBram Moolenaar      let t: number
1763b74b6b4SBram Moolenaar      let v: number
1773b74b6b4SBram Moolenaar      let w: number
1783b74b6b4SBram Moolenaar
179f5be8cdbSBram Moolenaar      # script-local variables can be used without s: prefix
1803b74b6b4SBram Moolenaar      a = 'script-a'
1813b74b6b4SBram Moolenaar      b = 111
1823b74b6b4SBram Moolenaar      l = [1, 2, 3]
1833b74b6b4SBram Moolenaar      s = 'script-s'
1843b74b6b4SBram Moolenaar      t = 222
1853b74b6b4SBram Moolenaar      v = 333
1863b74b6b4SBram Moolenaar      w = 444
1873b74b6b4SBram Moolenaar
1883b74b6b4SBram Moolenaar      assert_equal('script-a', a)
1893b74b6b4SBram Moolenaar      assert_equal(111, b)
1903b74b6b4SBram Moolenaar      assert_equal([1, 2, 3], l)
1913b74b6b4SBram Moolenaar      assert_equal('script-s', s)
1923b74b6b4SBram Moolenaar      assert_equal(222, t)
1933b74b6b4SBram Moolenaar      assert_equal(333, v)
1943b74b6b4SBram Moolenaar      assert_equal(444, w)
1953b74b6b4SBram Moolenaar  END
1963b74b6b4SBram Moolenaar  writefile(lines, 'Xsinglechar')
1973b74b6b4SBram Moolenaar  source Xsinglechar
1983b74b6b4SBram Moolenaar  delete('Xsinglechar')
1993b74b6b4SBram Moolenaarenddef
2003b74b6b4SBram Moolenaar
20184370087SBram Moolenaardef Test_assignment_list()
20284370087SBram Moolenaar  let list1: list<bool> = [false, true, false]
20384370087SBram Moolenaar  let list2: list<number> = [1, 2, 3]
20484370087SBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
20584370087SBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
20684370087SBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
20784370087SBram Moolenaar
20884370087SBram Moolenaar  let listS: list<string> = []
20984370087SBram Moolenaar  let listN: list<number> = []
21084370087SBram Moolenaar
21184370087SBram Moolenaar  assert_equal([1, 2, 3], list2)
21284370087SBram Moolenaar  list2[-1] = 99
21384370087SBram Moolenaar  assert_equal([1, 2, 99], list2)
21484370087SBram Moolenaar  list2[-2] = 88
21584370087SBram Moolenaar  assert_equal([1, 88, 99], list2)
21684370087SBram Moolenaar  list2[-3] = 77
21784370087SBram Moolenaar  assert_equal([77, 88, 99], list2)
21884370087SBram Moolenaar  call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
219c5b1c20bSBram Moolenaar  call CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:')
22084370087SBram Moolenaar
22184370087SBram Moolenaar  # type becomes list<any>
22284370087SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
22384370087SBram Moolenaarenddef
22484370087SBram Moolenaar
225b31be3f9SBram Moolenaardef Test_assignment_list_vim9script()
226b31be3f9SBram Moolenaar  let lines =<< trim END
227b31be3f9SBram Moolenaar    vim9script
228b31be3f9SBram Moolenaar    let v1: number
229b31be3f9SBram Moolenaar    let v2: number
230b31be3f9SBram Moolenaar    let v3: number
231b31be3f9SBram Moolenaar    [v1, v2, v3] = [1, 2, 3]
232b31be3f9SBram Moolenaar    assert_equal([1, 2, 3], [v1, v2, v3])
233b31be3f9SBram Moolenaar  END
234b31be3f9SBram Moolenaar  call CheckScriptSuccess(lines)
235b31be3f9SBram Moolenaarenddef
236b31be3f9SBram Moolenaar
23784370087SBram Moolenaardef Test_assignment_dict()
23884370087SBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
23984370087SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
24084370087SBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
24184370087SBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
24274fae513SBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, two: 0z02}
24384370087SBram Moolenaar
244f5be8cdbSBram Moolenaar  # overwrite
245c785b9a7SBram Moolenaar  dict3['key'] = 'another'
246c785b9a7SBram Moolenaar
247*58626872SBram Moolenaar  # empty key can be used
248*58626872SBram Moolenaar  let dd = {}
249*58626872SBram Moolenaar  dd[""] = 6
250*58626872SBram Moolenaar  assert_equal({'': 6}, dd)
25184370087SBram Moolenaar
25284370087SBram Moolenaar  # type becomes dict<any>
25384370087SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
25484370087SBram Moolenaarenddef
25584370087SBram Moolenaar
256d3aac291SBram Moolenaardef Test_assignment_local()
257f5be8cdbSBram Moolenaar  # Test in a separated file in order not to the current buffer/window/tab is
258f5be8cdbSBram Moolenaar  # changed.
259d3aac291SBram Moolenaar  let script_lines: list<string> =<< trim END
260d3aac291SBram Moolenaar    let b:existing = 'yes'
261d3aac291SBram Moolenaar    let w:existing = 'yes'
262d3aac291SBram Moolenaar    let t:existing = 'yes'
263d3aac291SBram Moolenaar
264d3aac291SBram Moolenaar    def Test_assignment_local_internal()
265d3aac291SBram Moolenaar      b:newvar = 'new'
266d3aac291SBram Moolenaar      assert_equal('new', b:newvar)
267d3aac291SBram Moolenaar      assert_equal('yes', b:existing)
268d3aac291SBram Moolenaar      b:existing = 'no'
269d3aac291SBram Moolenaar      assert_equal('no', b:existing)
270396f3138SBram Moolenaar      b:existing ..= 'NO'
271396f3138SBram Moolenaar      assert_equal('noNO', b:existing)
272d3aac291SBram Moolenaar
273d3aac291SBram Moolenaar      w:newvar = 'new'
274d3aac291SBram Moolenaar      assert_equal('new', w:newvar)
275d3aac291SBram Moolenaar      assert_equal('yes', w:existing)
276d3aac291SBram Moolenaar      w:existing = 'no'
277d3aac291SBram Moolenaar      assert_equal('no', w:existing)
278396f3138SBram Moolenaar      w:existing ..= 'NO'
279396f3138SBram Moolenaar      assert_equal('noNO', w:existing)
280d3aac291SBram Moolenaar
281d3aac291SBram Moolenaar      t:newvar = 'new'
282d3aac291SBram Moolenaar      assert_equal('new', t:newvar)
283d3aac291SBram Moolenaar      assert_equal('yes', t:existing)
284d3aac291SBram Moolenaar      t:existing = 'no'
285d3aac291SBram Moolenaar      assert_equal('no', t:existing)
286396f3138SBram Moolenaar      t:existing ..= 'NO'
287396f3138SBram Moolenaar      assert_equal('noNO', t:existing)
288d3aac291SBram Moolenaar    enddef
289d3aac291SBram Moolenaar    call Test_assignment_local_internal()
290d3aac291SBram Moolenaar  END
291d3aac291SBram Moolenaar  call CheckScriptSuccess(script_lines)
292d3aac291SBram Moolenaarenddef
293d3aac291SBram Moolenaar
2945deeb3f1SBram Moolenaardef Test_assignment_default()
295e69f6d04SBram Moolenaar
296cb711abfSBram Moolenaar  # Test default values.
297e69f6d04SBram Moolenaar  let thebool: bool
298e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
299e69f6d04SBram Moolenaar
300e69f6d04SBram Moolenaar  let thenumber: number
301e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
302e69f6d04SBram Moolenaar
303e69f6d04SBram Moolenaar  if has('float')
304e69f6d04SBram Moolenaar    let thefloat: float
305e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
306e69f6d04SBram Moolenaar  endif
307e69f6d04SBram Moolenaar
308e69f6d04SBram Moolenaar  let thestring: string
309e69f6d04SBram Moolenaar  assert_equal('', thestring)
310e69f6d04SBram Moolenaar
311e69f6d04SBram Moolenaar  let theblob: blob
312e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
313e69f6d04SBram Moolenaar
3145deeb3f1SBram Moolenaar  let Thefunc: func
3155deeb3f1SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
316e69f6d04SBram Moolenaar
317e69f6d04SBram Moolenaar  let thelist: list<any>
318e69f6d04SBram Moolenaar  assert_equal([], thelist)
319e69f6d04SBram Moolenaar
320e69f6d04SBram Moolenaar  let thedict: dict<any>
321e69f6d04SBram Moolenaar  assert_equal({}, thedict)
322e69f6d04SBram Moolenaar
3232c869deeSBram Moolenaar  if has('channel')
324e69f6d04SBram Moolenaar    let thejob: job
325e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
326e69f6d04SBram Moolenaar
327e69f6d04SBram Moolenaar    let thechannel: channel
328e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
329c785b9a7SBram Moolenaar
330c785b9a7SBram Moolenaar    if has('unix') && executable('cat')
331f5be8cdbSBram Moolenaar      # check with non-null job and channel, types must match
332c785b9a7SBram Moolenaar      thejob = job_start("cat ", #{})
333c785b9a7SBram Moolenaar      thechannel = job_getchannel(thejob)
334c785b9a7SBram Moolenaar      job_stop(thejob, 'kill')
335c785b9a7SBram Moolenaar    endif
3362c869deeSBram Moolenaar  endif
337585fea7bSBram Moolenaar
338585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
339585fea7bSBram Moolenaar  assert_equal(5678, nr)
3408a7d6542SBram Moolenaarenddef
3418a7d6542SBram Moolenaar
34247a519a9SBram Moolenaardef Test_assignment_var_list()
34347a519a9SBram Moolenaar  let v1: string
34447a519a9SBram Moolenaar  let v2: string
3459af78769SBram Moolenaar  let vrem: list<string>
3469af78769SBram Moolenaar  [v1] = ['aaa']
3479af78769SBram Moolenaar  assert_equal('aaa', v1)
3489af78769SBram Moolenaar
34947a519a9SBram Moolenaar  [v1, v2] = ['one', 'two']
35047a519a9SBram Moolenaar  assert_equal('one', v1)
35147a519a9SBram Moolenaar  assert_equal('two', v2)
3529af78769SBram Moolenaar
3539af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two']
3549af78769SBram Moolenaar  assert_equal('one', v1)
3559af78769SBram Moolenaar  assert_equal('two', v2)
3569af78769SBram Moolenaar  assert_equal([], vrem)
3579af78769SBram Moolenaar
3589af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two', 'three']
3599af78769SBram Moolenaar  assert_equal('one', v1)
3609af78769SBram Moolenaar  assert_equal('two', v2)
3619af78769SBram Moolenaar  assert_equal(['three'], vrem)
36247a519a9SBram Moolenaarenddef
36347a519a9SBram Moolenaar
364c7e44a7eSBram Moolenaardef Test_assignment_vim9script()
365c7e44a7eSBram Moolenaar  let lines =<< trim END
366c7e44a7eSBram Moolenaar    vim9script
367c7e44a7eSBram Moolenaar    def Func(): list<number>
368c7e44a7eSBram Moolenaar      return [1, 2]
369c7e44a7eSBram Moolenaar    enddef
370c7e44a7eSBram Moolenaar    let var1: number
371c7e44a7eSBram Moolenaar    let var2: number
372c7e44a7eSBram Moolenaar    [var1, var2] =
373c7e44a7eSBram Moolenaar          Func()
374c7e44a7eSBram Moolenaar    assert_equal(1, var1)
375c7e44a7eSBram Moolenaar    assert_equal(2, var2)
376c7e44a7eSBram Moolenaar    let ll =
377c7e44a7eSBram Moolenaar          Func()
378c7e44a7eSBram Moolenaar    assert_equal([1, 2], ll)
379c7e44a7eSBram Moolenaar  END
380c7e44a7eSBram Moolenaar  CheckScriptSuccess(lines)
381c7e44a7eSBram Moolenaarenddef
382c7e44a7eSBram Moolenaar
383cab27678SBram Moolenaardef Mess(): string
384cab27678SBram Moolenaar  v:foldstart = 123
385cab27678SBram Moolenaar  return 'xxx'
386cab27678SBram Moolenaarenddef
387cab27678SBram Moolenaar
388d72c1bf0SBram Moolenaardef Test_assignment_failure()
3898a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
3908a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
3918a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
3928a7d6542SBram Moolenaar
39363be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:')
39463be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='")
39563be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:')
39663be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:')
39763be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:')
39863be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='")
39963be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:')
40063be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='")
40163be3d4bSBram Moolenaar
4028a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
4038a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
4048a7d6542SBram Moolenaar
4059b7bf9e9SBram Moolenaar  call CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
4069af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
4079af78769SBram Moolenaar                            '[a] = test_null_list()'], 'E1093:')
4089af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
4099af78769SBram Moolenaar                            '[a] = []'], 'E1093:')
4109af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
4119af78769SBram Moolenaar                            'let y: number',
4129af78769SBram Moolenaar                            '[x, y] = [1]'], 'E1093:')
4139af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
4149af78769SBram Moolenaar                            'let y: number',
4159af78769SBram Moolenaar                            'let z: list<number>',
4169af78769SBram Moolenaar                            '[x, y; z] = [1]'], 'E1093:')
4179be61bbbSBram Moolenaar
418e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
4199be61bbbSBram Moolenaar  call CheckDefFailure(['let &option'], 'E1052:')
4209be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
4219be61bbbSBram Moolenaar
422e55b1c09SBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
4239be61bbbSBram Moolenaar
4249be61bbbSBram Moolenaar  call CheckDefFailure(['let @~ = 5'], 'E354:')
4259be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
4269be61bbbSBram Moolenaar
427e55b1c09SBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
428e55b1c09SBram Moolenaar  call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
429e55b1c09SBram Moolenaar  call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
430e55b1c09SBram Moolenaar  call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
4319be61bbbSBram Moolenaar
4329be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
4339be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
4349be61bbbSBram Moolenaar
435822ba247SBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:')
43633fa29cfSBram Moolenaar
4378a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
4388a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
4398a7d6542SBram Moolenaar
4408a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
4418a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
4428a7d6542SBram Moolenaar
4438a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
4448a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
44542a480bfSBram Moolenaar
446d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
44742a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
448cab27678SBram Moolenaar
449cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
450cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
45143e969d3SBram Moolenaar
45243e969d3SBram Moolenaar  call CheckDefFailure(['w:foo: number = 10'],
45343e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 1')
45443e969d3SBram Moolenaar  call CheckDefFailure(['t:foo: bool = true'],
45543e969d3SBram Moolenaar                       'E488: Trailing characters: : bool = true')
45643e969d3SBram Moolenaar  call CheckDefFailure(['b:foo: string = "x"'],
45743e969d3SBram Moolenaar                       'E488: Trailing characters: : string = "x"')
45843e969d3SBram Moolenaar  call CheckDefFailure(['g:foo: number = 123'],
45943e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 123')
460d72c1bf0SBram Moolenaarenddef
461d72c1bf0SBram Moolenaar
462d72c1bf0SBram Moolenaardef Test_unlet()
463d72c1bf0SBram Moolenaar  g:somevar = 'yes'
464d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
465d72c1bf0SBram Moolenaar  unlet g:somevar
466d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
467d72c1bf0SBram Moolenaar  unlet! g:somevar
468d72c1bf0SBram Moolenaar
469d72c1bf0SBram Moolenaar  call CheckScriptFailure([
470d72c1bf0SBram Moolenaar        'vim9script',
471d72c1bf0SBram Moolenaar        'let svar = 123',
472d72c1bf0SBram Moolenaar        'unlet svar',
473d72c1bf0SBram Moolenaar        ], 'E1081:')
474d72c1bf0SBram Moolenaar  call CheckScriptFailure([
475d72c1bf0SBram Moolenaar        'vim9script',
476d72c1bf0SBram Moolenaar        'let svar = 123',
477d72c1bf0SBram Moolenaar        'unlet s:svar',
478d72c1bf0SBram Moolenaar        ], 'E1081:')
479d72c1bf0SBram Moolenaar  call CheckScriptFailure([
480d72c1bf0SBram Moolenaar        'vim9script',
481d72c1bf0SBram Moolenaar        'let svar = 123',
482d72c1bf0SBram Moolenaar        'def Func()',
483d72c1bf0SBram Moolenaar        '  unlet svar',
484d72c1bf0SBram Moolenaar        'enddef',
485822ba247SBram Moolenaar        'defcompile',
486d72c1bf0SBram Moolenaar        ], 'E1081:')
487d72c1bf0SBram Moolenaar  call CheckScriptFailure([
488d72c1bf0SBram Moolenaar        'vim9script',
489d72c1bf0SBram Moolenaar        'let svar = 123',
490d72c1bf0SBram Moolenaar        'def Func()',
491d72c1bf0SBram Moolenaar        '  unlet s:svar',
492d72c1bf0SBram Moolenaar        'enddef',
493822ba247SBram Moolenaar        'defcompile',
494d72c1bf0SBram Moolenaar        ], 'E1081:')
4957bdaea6eSBram Moolenaar
4967bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
4977bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
4987bdaea6eSBram Moolenaar  unlet $ENVVAR
4997bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
500d72c1bf0SBram Moolenaarenddef
501599c89c8SBram Moolenaar
5024c17ad94SBram Moolenaardef Test_delfunction()
503f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
5044c17ad94SBram Moolenaar  CheckScriptSuccess([
5054c17ad94SBram Moolenaar      'vim9script',
5064c17ad94SBram Moolenaar      'func CheckMe()',
5074c17ad94SBram Moolenaar      '  return 123',
5084c17ad94SBram Moolenaar      'endfunc',
5094c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
5104c17ad94SBram Moolenaar      ])
5114c17ad94SBram Moolenaar
512f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
5134c17ad94SBram Moolenaar  CheckScriptFailure([
5144c17ad94SBram Moolenaar      'vim9script',
5154c17ad94SBram Moolenaar      'func DeleteMe1()',
5164c17ad94SBram Moolenaar      'endfunc',
5174c17ad94SBram Moolenaar      'delfunction DeleteMe1',
5184c17ad94SBram Moolenaar      ], 'E1084:')
5194c17ad94SBram Moolenaar  CheckScriptFailure([
5204c17ad94SBram Moolenaar      'vim9script',
5214c17ad94SBram Moolenaar      'func DeleteMe2()',
5224c17ad94SBram Moolenaar      'endfunc',
5234c17ad94SBram Moolenaar      'def DoThat()',
5244c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
5254c17ad94SBram Moolenaar      'enddef',
5264c17ad94SBram Moolenaar      'DoThat()',
5274c17ad94SBram Moolenaar      ], 'E1084:')
5284c17ad94SBram Moolenaar  CheckScriptFailure([
5294c17ad94SBram Moolenaar      'vim9script',
5304c17ad94SBram Moolenaar      'def DeleteMe3()',
5314c17ad94SBram Moolenaar      'enddef',
5324c17ad94SBram Moolenaar      'delfunction DeleteMe3',
5334c17ad94SBram Moolenaar      ], 'E1084:')
5344c17ad94SBram Moolenaar  CheckScriptFailure([
5354c17ad94SBram Moolenaar      'vim9script',
5364c17ad94SBram Moolenaar      'def DeleteMe4()',
5374c17ad94SBram Moolenaar      'enddef',
5384c17ad94SBram Moolenaar      'def DoThat()',
5394c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
5404c17ad94SBram Moolenaar      'enddef',
5414c17ad94SBram Moolenaar      'DoThat()',
5424c17ad94SBram Moolenaar      ], 'E1084:')
543925e9fd6SBram Moolenaar
544925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
545925e9fd6SBram Moolenaar  let lines =<< trim END
546925e9fd6SBram Moolenaar      vim9script
547925e9fd6SBram Moolenaar      def g:Global(): string
548925e9fd6SBram Moolenaar        return "yes"
549925e9fd6SBram Moolenaar      enddef
550925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
551925e9fd6SBram Moolenaar      def! g:Global(): string
552925e9fd6SBram Moolenaar        return "no"
553925e9fd6SBram Moolenaar      enddef
554925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
555925e9fd6SBram Moolenaar      delfunc g:Global
556925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
557925e9fd6SBram Moolenaar  END
558925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
559925e9fd6SBram Moolenaar
560925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
561925e9fd6SBram Moolenaar  lines =<< trim END
562925e9fd6SBram Moolenaar      vim9script
563925e9fd6SBram Moolenaar      func g:Global()
564925e9fd6SBram Moolenaar        return "yes"
565925e9fd6SBram Moolenaar      endfunc
566925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
567925e9fd6SBram Moolenaar      def! g:Global(): string
568925e9fd6SBram Moolenaar        return "no"
569925e9fd6SBram Moolenaar      enddef
570925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
571925e9fd6SBram Moolenaar      delfunc g:Global
572925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
573925e9fd6SBram Moolenaar  END
574925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
575925e9fd6SBram Moolenaar
576925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
577925e9fd6SBram Moolenaar  lines =<< trim END
578925e9fd6SBram Moolenaar      vim9script
579925e9fd6SBram Moolenaar      def g:Global(): string
580925e9fd6SBram Moolenaar        return "yes"
581925e9fd6SBram Moolenaar      enddef
582925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
583925e9fd6SBram Moolenaar      func! g:Global()
584925e9fd6SBram Moolenaar        return "no"
585925e9fd6SBram Moolenaar      endfunc
586925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
587925e9fd6SBram Moolenaar      delfunc g:Global
588925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
589925e9fd6SBram Moolenaar  END
590925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
5914c17ad94SBram Moolenaarenddef
5924c17ad94SBram Moolenaar
593599c89c8SBram Moolenaarfunc Test_wrong_type()
594599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
595599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
596599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
597599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
598599c89c8SBram Moolenaar
599599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
600599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
60142a480bfSBram Moolenaar
60242a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
60342a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
60442a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
60542a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
60642a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
60742a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
60842a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
60942a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
61042a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
61142a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
61242a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
613a0a9f43aSBram Moolenaar
614a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
615a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
6168a7d6542SBram Moolenaarendfunc
6178a7d6542SBram Moolenaar
6188a7d6542SBram Moolenaarfunc Test_const()
6198a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
6208a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
6218a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
6229be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
6238a7d6542SBram Moolenaarendfunc
6248a7d6542SBram Moolenaar
625df069eecSBram Moolenaardef Test_range_no_colon()
626df069eecSBram Moolenaar  call CheckDefFailure(['%s/a/b/'], 'E1050:')
627df069eecSBram Moolenaar  call CheckDefFailure(['+ s/a/b/'], 'E1050:')
628df069eecSBram Moolenaar  call CheckDefFailure(['- s/a/b/'], 'E1050:')
629df069eecSBram Moolenaar  call CheckDefFailure(['. s/a/b/'], 'E1050:')
630df069eecSBram Moolenaarenddef
631df069eecSBram Moolenaar
632df069eecSBram Moolenaar
6338a7d6542SBram Moolenaardef Test_block()
6348a7d6542SBram Moolenaar  let outer = 1
6358a7d6542SBram Moolenaar  {
6368a7d6542SBram Moolenaar    let inner = 2
6378a7d6542SBram Moolenaar    assert_equal(1, outer)
6388a7d6542SBram Moolenaar    assert_equal(2, inner)
6398a7d6542SBram Moolenaar  }
6408a7d6542SBram Moolenaar  assert_equal(1, outer)
6418a7d6542SBram Moolenaarenddef
6428a7d6542SBram Moolenaar
6438a7d6542SBram Moolenaarfunc Test_block_failure()
6448a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
645585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
646585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
6478a7d6542SBram Moolenaarendfunc
6488a7d6542SBram Moolenaar
649585fea7bSBram Moolenaardef Test_cmd_modifier()
650585fea7bSBram Moolenaar  tab echo '0'
651585fea7bSBram Moolenaar  call CheckDefFailure(['5tab echo 3'], 'E16:')
652585fea7bSBram Moolenaarenddef
653585fea7bSBram Moolenaar
654d032f34aSBram Moolenaarfunc g:NoSuchFunc()
655d032f34aSBram Moolenaar  echo 'none'
656d032f34aSBram Moolenaarendfunc
657d032f34aSBram Moolenaar
6588a7d6542SBram Moolenaardef Test_try_catch()
6598a7d6542SBram Moolenaar  let l = []
6607a092245SBram Moolenaar  try # comment
6618a7d6542SBram Moolenaar    add(l, '1')
6628a7d6542SBram Moolenaar    throw 'wrong'
6638a7d6542SBram Moolenaar    add(l, '2')
6647a092245SBram Moolenaar  catch # comment
6658a7d6542SBram Moolenaar    add(l, v:exception)
6667a092245SBram Moolenaar  finally # comment
6678a7d6542SBram Moolenaar    add(l, '3')
6687a092245SBram Moolenaar  endtry # comment
6698a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
67068d130c6SBram Moolenaar
671e859312eSBram Moolenaar  l = []
672e859312eSBram Moolenaar  try
673e859312eSBram Moolenaar    try
674e859312eSBram Moolenaar      add(l, '1')
675e859312eSBram Moolenaar      throw 'wrong'
676e859312eSBram Moolenaar      add(l, '2')
677e859312eSBram Moolenaar    catch /right/
678e859312eSBram Moolenaar      add(l, v:exception)
679e859312eSBram Moolenaar    endtry
680e859312eSBram Moolenaar  catch /wrong/
681e859312eSBram Moolenaar    add(l, 'caught')
682e859312eSBram Moolenaar  finally
683e859312eSBram Moolenaar    add(l, 'finally')
684e859312eSBram Moolenaar  endtry
685e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
686e859312eSBram Moolenaar
68768d130c6SBram Moolenaar  let n: number
68868d130c6SBram Moolenaar  try
68968d130c6SBram Moolenaar    n = l[3]
69068d130c6SBram Moolenaar  catch /E684:/
69168d130c6SBram Moolenaar    n = 99
69268d130c6SBram Moolenaar  endtry
69368d130c6SBram Moolenaar  assert_equal(99, n)
69468d130c6SBram Moolenaar
69568d130c6SBram Moolenaar  try
69668d130c6SBram Moolenaar    n = g:astring[3]
69768d130c6SBram Moolenaar  catch /E714:/
69868d130c6SBram Moolenaar    n = 77
69968d130c6SBram Moolenaar  endtry
70068d130c6SBram Moolenaar  assert_equal(77, n)
70168d130c6SBram Moolenaar
70268d130c6SBram Moolenaar  try
70368d130c6SBram Moolenaar    n = l[g:astring]
70468d130c6SBram Moolenaar  catch /E39:/
70568d130c6SBram Moolenaar    n = 77
70668d130c6SBram Moolenaar  endtry
70768d130c6SBram Moolenaar  assert_equal(77, n)
70868d130c6SBram Moolenaar
70968d130c6SBram Moolenaar  try
71068d130c6SBram Moolenaar    n = s:does_not_exist
71168d130c6SBram Moolenaar  catch /E121:/
712f0b9f43cSBram Moolenaar    n = 111
713f0b9f43cSBram Moolenaar  endtry
714f0b9f43cSBram Moolenaar  assert_equal(111, n)
715f0b9f43cSBram Moolenaar
716f0b9f43cSBram Moolenaar  try
717f0b9f43cSBram Moolenaar    n = g:does_not_exist
718f0b9f43cSBram Moolenaar  catch /E121:/
71968d130c6SBram Moolenaar    n = 121
72068d130c6SBram Moolenaar  endtry
72168d130c6SBram Moolenaar  assert_equal(121, n)
72268d130c6SBram Moolenaar
72368d130c6SBram Moolenaar  let d = #{one: 1}
72468d130c6SBram Moolenaar  try
72568d130c6SBram Moolenaar    n = d[g:astring]
72668d130c6SBram Moolenaar  catch /E716:/
72768d130c6SBram Moolenaar    n = 222
72868d130c6SBram Moolenaar  endtry
72968d130c6SBram Moolenaar  assert_equal(222, n)
730f0b9f43cSBram Moolenaar
731f0b9f43cSBram Moolenaar  try
732f0b9f43cSBram Moolenaar    n = -g:astring
733f0b9f43cSBram Moolenaar  catch /E39:/
734f0b9f43cSBram Moolenaar    n = 233
735f0b9f43cSBram Moolenaar  endtry
736f0b9f43cSBram Moolenaar  assert_equal(233, n)
737f0b9f43cSBram Moolenaar
738f0b9f43cSBram Moolenaar  try
739f0b9f43cSBram Moolenaar    n = +g:astring
740f0b9f43cSBram Moolenaar  catch /E1030:/
741f0b9f43cSBram Moolenaar    n = 244
742f0b9f43cSBram Moolenaar  endtry
743f0b9f43cSBram Moolenaar  assert_equal(244, n)
744f0b9f43cSBram Moolenaar
745f0b9f43cSBram Moolenaar  try
746f0b9f43cSBram Moolenaar    n = +g:alist
747f0b9f43cSBram Moolenaar  catch /E745:/
748f0b9f43cSBram Moolenaar    n = 255
749f0b9f43cSBram Moolenaar  endtry
750f0b9f43cSBram Moolenaar  assert_equal(255, n)
751f0b9f43cSBram Moolenaar
752f0b9f43cSBram Moolenaar  let nd: dict<any>
753f0b9f43cSBram Moolenaar  try
754f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
755f0b9f43cSBram Moolenaar  catch /E1029:/
756f0b9f43cSBram Moolenaar    n = 266
757f0b9f43cSBram Moolenaar  endtry
758f0b9f43cSBram Moolenaar  assert_equal(266, n)
759f0b9f43cSBram Moolenaar
760f0b9f43cSBram Moolenaar  try
761f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
762f0b9f43cSBram Moolenaar  catch /E1093:/
763f0b9f43cSBram Moolenaar    n = 277
764f0b9f43cSBram Moolenaar  endtry
765f0b9f43cSBram Moolenaar  assert_equal(277, n)
766f0b9f43cSBram Moolenaar
767e859312eSBram Moolenaar  try
768e859312eSBram Moolenaar    &ts = g:astring
769e859312eSBram Moolenaar  catch /E1029:/
770e859312eSBram Moolenaar    n = 288
771e859312eSBram Moolenaar  endtry
772e859312eSBram Moolenaar  assert_equal(288, n)
773e859312eSBram Moolenaar
774e859312eSBram Moolenaar  try
775e859312eSBram Moolenaar    &backspace = 'asdf'
776e859312eSBram Moolenaar  catch /E474:/
777e859312eSBram Moolenaar    n = 299
778e859312eSBram Moolenaar  endtry
779e859312eSBram Moolenaar  assert_equal(299, n)
780e859312eSBram Moolenaar
781e859312eSBram Moolenaar  l = [1]
782e859312eSBram Moolenaar  try
783e859312eSBram Moolenaar    l[3] = 3
784e859312eSBram Moolenaar  catch /E684:/
785e859312eSBram Moolenaar    n = 300
786e859312eSBram Moolenaar  endtry
787e859312eSBram Moolenaar  assert_equal(300, n)
788e859312eSBram Moolenaar
789e859312eSBram Moolenaar  try
790e859312eSBram Moolenaar    unlet g:does_not_exist
791e859312eSBram Moolenaar  catch /E108:/
792e859312eSBram Moolenaar    n = 322
793e859312eSBram Moolenaar  endtry
794e859312eSBram Moolenaar  assert_equal(322, n)
795e859312eSBram Moolenaar
796e859312eSBram Moolenaar  try
797e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
798e859312eSBram Moolenaar  catch /E721:/
799e859312eSBram Moolenaar    n = 333
800e859312eSBram Moolenaar  endtry
801e859312eSBram Moolenaar  assert_equal(333, n)
802e859312eSBram Moolenaar
803e859312eSBram Moolenaar  try
804e859312eSBram Moolenaar    l = DeletedFunc()
805e859312eSBram Moolenaar  catch /E933:/
806e859312eSBram Moolenaar    n = 344
807e859312eSBram Moolenaar  endtry
808e859312eSBram Moolenaar  assert_equal(344, n)
809d032f34aSBram Moolenaar
810d032f34aSBram Moolenaar  try
811d032f34aSBram Moolenaar    echo len(v:true)
812d032f34aSBram Moolenaar  catch /E701:/
813d032f34aSBram Moolenaar    n = 355
814d032f34aSBram Moolenaar  endtry
815d032f34aSBram Moolenaar  assert_equal(355, n)
816d032f34aSBram Moolenaar
817d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
818d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
819d032f34aSBram Moolenaar  try
820d032f34aSBram Moolenaar    echo P()
821d032f34aSBram Moolenaar  catch /E117:/
822d032f34aSBram Moolenaar    n = 366
823d032f34aSBram Moolenaar  endtry
824d032f34aSBram Moolenaar  assert_equal(366, n)
825d032f34aSBram Moolenaar
826d032f34aSBram Moolenaar  try
827d032f34aSBram Moolenaar    echo g:NoSuchFunc()
828d032f34aSBram Moolenaar  catch /E117:/
829d032f34aSBram Moolenaar    n = 377
830d032f34aSBram Moolenaar  endtry
831d032f34aSBram Moolenaar  assert_equal(377, n)
832d032f34aSBram Moolenaar
833d032f34aSBram Moolenaar  try
834d032f34aSBram Moolenaar    echo g:alist + 4
835d032f34aSBram Moolenaar  catch /E745:/
836d032f34aSBram Moolenaar    n = 388
837d032f34aSBram Moolenaar  endtry
838d032f34aSBram Moolenaar  assert_equal(388, n)
839d032f34aSBram Moolenaar
840d032f34aSBram Moolenaar  try
841d032f34aSBram Moolenaar    echo 4 + g:alist
842d032f34aSBram Moolenaar  catch /E745:/
843d032f34aSBram Moolenaar    n = 399
844d032f34aSBram Moolenaar  endtry
845d032f34aSBram Moolenaar  assert_equal(399, n)
846d032f34aSBram Moolenaar
847d032f34aSBram Moolenaar  try
848d032f34aSBram Moolenaar    echo g:alist.member
849d032f34aSBram Moolenaar  catch /E715:/
850d032f34aSBram Moolenaar    n = 400
851d032f34aSBram Moolenaar  endtry
852d032f34aSBram Moolenaar  assert_equal(400, n)
853d032f34aSBram Moolenaar
854d032f34aSBram Moolenaar  try
855d032f34aSBram Moolenaar    echo d.member
856d032f34aSBram Moolenaar  catch /E716:/
857d032f34aSBram Moolenaar    n = 411
858d032f34aSBram Moolenaar  endtry
859d032f34aSBram Moolenaar  assert_equal(411, n)
8608a7d6542SBram Moolenaarenddef
8618a7d6542SBram Moolenaar
862e859312eSBram Moolenaardef DeletedFunc(): list<any>
863e859312eSBram Moolenaar  return ['delete me']
864e859312eSBram Moolenaarenddef
865e859312eSBram Moolenaardefcompile
866e859312eSBram Moolenaardelfunc DeletedFunc
867e859312eSBram Moolenaar
868257cc5eeSBram Moolenaardef ThrowFromDef()
869a72cfb80SBram Moolenaar  throw "getout" # comment
870257cc5eeSBram Moolenaarenddef
871257cc5eeSBram Moolenaar
872257cc5eeSBram Moolenaarfunc CatchInFunc()
873257cc5eeSBram Moolenaar  try
874257cc5eeSBram Moolenaar    call ThrowFromDef()
875257cc5eeSBram Moolenaar  catch
876257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
877257cc5eeSBram Moolenaar  endtry
878257cc5eeSBram Moolenaarendfunc
879257cc5eeSBram Moolenaar
880257cc5eeSBram Moolenaardef CatchInDef()
881257cc5eeSBram Moolenaar  try
882257cc5eeSBram Moolenaar    ThrowFromDef()
883257cc5eeSBram Moolenaar  catch
884257cc5eeSBram Moolenaar    g:thrown_def = v:exception
885257cc5eeSBram Moolenaar  endtry
886257cc5eeSBram Moolenaarenddef
887257cc5eeSBram Moolenaar
888f575adffSBram Moolenaardef ReturnFinally(): string
889f575adffSBram Moolenaar  try
890f575adffSBram Moolenaar    return 'intry'
891f575adffSBram Moolenaar  finally
892f575adffSBram Moolenaar    g:in_finally = 'finally'
893f575adffSBram Moolenaar  endtry
894f575adffSBram Moolenaar  return 'end'
895f575adffSBram Moolenaarenddef
896f575adffSBram Moolenaar
897257cc5eeSBram Moolenaardef Test_try_catch_nested()
898257cc5eeSBram Moolenaar  CatchInFunc()
899257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
900257cc5eeSBram Moolenaar
901257cc5eeSBram Moolenaar  CatchInDef()
902257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
903f575adffSBram Moolenaar
904f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
905f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
906f575adffSBram Moolenaarenddef
907f575adffSBram Moolenaar
908f575adffSBram Moolenaardef Test_try_catch_match()
909f575adffSBram Moolenaar  let seq = 'a'
910f575adffSBram Moolenaar  try
911f575adffSBram Moolenaar    throw 'something'
912f575adffSBram Moolenaar  catch /nothing/
913f575adffSBram Moolenaar    seq ..= 'x'
914f575adffSBram Moolenaar  catch /some/
915f575adffSBram Moolenaar    seq ..= 'b'
916f575adffSBram Moolenaar  catch /asdf/
917f575adffSBram Moolenaar    seq ..= 'x'
918e8c4abbbSBram Moolenaar  catch ?a\?sdf?
919e8c4abbbSBram Moolenaar    seq ..= 'y'
920f575adffSBram Moolenaar  finally
921f575adffSBram Moolenaar    seq ..= 'c'
922f575adffSBram Moolenaar  endtry
923f575adffSBram Moolenaar  assert_equal('abc', seq)
924257cc5eeSBram Moolenaarenddef
925257cc5eeSBram Moolenaar
926e8c4abbbSBram Moolenaardef Test_try_catch_fails()
927e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
928e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
929e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
930585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
931585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
932585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
933585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
934585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
935585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
936585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
937585fea7bSBram Moolenaar
938a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
939585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
940e8c4abbbSBram Moolenaarenddef
941e8c4abbbSBram Moolenaar
942006ad48bSBram Moolenaardef Test_throw_vimscript()
943f5be8cdbSBram Moolenaar  # only checks line continuation
944006ad48bSBram Moolenaar  let lines =<< trim END
945006ad48bSBram Moolenaar      vim9script
946006ad48bSBram Moolenaar      try
947006ad48bSBram Moolenaar        throw 'one'
948006ad48bSBram Moolenaar              .. 'two'
949006ad48bSBram Moolenaar      catch
950006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
951006ad48bSBram Moolenaar      endtry
952006ad48bSBram Moolenaar  END
953006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
954006ad48bSBram Moolenaarenddef
955006ad48bSBram Moolenaar
95637c83711SBram Moolenaardef Test_cexpr_vimscript()
957f5be8cdbSBram Moolenaar  # only checks line continuation
95837c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
95937c83711SBram Moolenaar  let lines =<< trim END
96037c83711SBram Moolenaar      vim9script
96137c83711SBram Moolenaar      cexpr 'File'
96237c83711SBram Moolenaar                .. ' someFile' ..
96337c83711SBram Moolenaar                   ' line 19'
96437c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
96537c83711SBram Moolenaar  END
96637c83711SBram Moolenaar  CheckScriptSuccess(lines)
96737c83711SBram Moolenaar  set errorformat&
96837c83711SBram Moolenaarenddef
96937c83711SBram Moolenaar
970b209750bSBram Moolenaardef Test_list_vimscript()
971b209750bSBram Moolenaar  # checks line continuation and comments
972b209750bSBram Moolenaar  let lines =<< trim END
973b209750bSBram Moolenaar      vim9script
974b209750bSBram Moolenaar      let mylist = [
975b209750bSBram Moolenaar            'one',
976b209750bSBram Moolenaar            # comment
977b209750bSBram Moolenaar            'two', # empty line follows
978b209750bSBram Moolenaar
979b209750bSBram Moolenaar            'three',
980b209750bSBram Moolenaar            ]
981b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
982b209750bSBram Moolenaar  END
983b209750bSBram Moolenaar  CheckScriptSuccess(lines)
984b209750bSBram Moolenaarenddef
985b209750bSBram Moolenaar
9862a1381c3SBram Moolenaarif has('channel')
98740ee466cSBram Moolenaar  let someJob = test_null_job()
98840ee466cSBram Moolenaar
98940ee466cSBram Moolenaar  def FuncWithError()
99040ee466cSBram Moolenaar    echomsg g:someJob
99140ee466cSBram Moolenaar  enddef
99240ee466cSBram Moolenaar
99340ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
99440ee466cSBram Moolenaar    try
99540ee466cSBram Moolenaar      call FuncWithError()
99640ee466cSBram Moolenaar    catch
99740ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
99840ee466cSBram Moolenaar    endtry
99940ee466cSBram Moolenaar  endfunc
10002a1381c3SBram Moolenaarendif
100140ee466cSBram Moolenaar
10028a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
10038a7d6542SBram Moolenaar  vim9script
10048a7d6542SBram Moolenaar  let name: string = 'bob'
10058a7d6542SBram Moolenaar  def Concat(arg: string): string
10068a7d6542SBram Moolenaar    return name .. arg
10078a7d6542SBram Moolenaar  enddef
1008227a69deSBram Moolenaar  g:result = Concat('bie')
1009227a69deSBram Moolenaar  g:localname = name
10108a7d6542SBram Moolenaar
10118a7d6542SBram Moolenaar  export const CONST = 1234
10128a7d6542SBram Moolenaar  export let exported = 9876
10136e587dcbSBram Moolenaar  export let exp_name = 'John'
10148a7d6542SBram Moolenaar  export def Exported(): string
10158a7d6542SBram Moolenaar    return 'Exported'
10168a7d6542SBram Moolenaar  enddef
10178a7d6542SBram MoolenaarEND
10188a7d6542SBram Moolenaar
10195269bd2aSBram Moolenaardef Test_vim9_import_export()
10208a7d6542SBram Moolenaar  let import_script_lines =<< trim END
10218a7d6542SBram Moolenaar    vim9script
10228a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
10238a7d6542SBram Moolenaar    g:imported = exported
10246e587dcbSBram Moolenaar    exported += 3
10256e587dcbSBram Moolenaar    g:imported_added = exported
10268a7d6542SBram Moolenaar    g:imported_func = Exported()
10276e587dcbSBram Moolenaar
102840f4f7a4SBram Moolenaar    def GetExported(): string
102940f4f7a4SBram Moolenaar      let local_dict = #{ref: Exported}
103040f4f7a4SBram Moolenaar      return local_dict.ref()
103140f4f7a4SBram Moolenaar    enddef
103240f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
103340f4f7a4SBram Moolenaar
10346e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
10356e587dcbSBram Moolenaar    g:imported_name = exp_name
10366e587dcbSBram Moolenaar    exp_name ..= ' Doe'
10376e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
10385381c7a1SBram Moolenaar    g:imported_later = exported
10398a7d6542SBram Moolenaar  END
10408a7d6542SBram Moolenaar
10418a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
10428a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
10438a7d6542SBram Moolenaar
10448a7d6542SBram Moolenaar  source Ximport.vim
10458a7d6542SBram Moolenaar
10468a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
10478a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
10488a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
10496e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
10505381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
10518a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
105240f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
10536e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
10546e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
10558a7d6542SBram Moolenaar  assert_false(exists('g:name'))
10568a7d6542SBram Moolenaar
10578a7d6542SBram Moolenaar  unlet g:result
10588a7d6542SBram Moolenaar  unlet g:localname
10598a7d6542SBram Moolenaar  unlet g:imported
10606e587dcbSBram Moolenaar  unlet g:imported_added
10615381c7a1SBram Moolenaar  unlet g:imported_later
10628a7d6542SBram Moolenaar  unlet g:imported_func
10636e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
10648a7d6542SBram Moolenaar  delete('Ximport.vim')
1065f2d5c240SBram Moolenaar
10661c991144SBram Moolenaar  # similar, with line breaks
10671c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
10681c991144SBram Moolenaar    vim9script
10691c991144SBram Moolenaar    import {
10701c991144SBram Moolenaar        exported,
10711c991144SBram Moolenaar        Exported,
10721c991144SBram Moolenaar        }
10731c991144SBram Moolenaar        from
10741c991144SBram Moolenaar        './Xexport.vim'
10751c991144SBram Moolenaar    g:imported = exported
10761c991144SBram Moolenaar    exported += 5
10771c991144SBram Moolenaar    g:imported_added = exported
10781c991144SBram Moolenaar    g:imported_func = Exported()
10791c991144SBram Moolenaar  END
10801c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
10811c991144SBram Moolenaar  source Ximport_lbr.vim
10821c991144SBram Moolenaar
10831c991144SBram Moolenaar  assert_equal(9876, g:imported)
10841c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
10851c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
10861c991144SBram Moolenaar
10871c991144SBram Moolenaar  # exported script not sourced again
10881c991144SBram Moolenaar  assert_false(exists('g:result'))
10891c991144SBram Moolenaar  unlet g:imported
10901c991144SBram Moolenaar  unlet g:imported_added
10911c991144SBram Moolenaar  unlet g:imported_func
10921c991144SBram Moolenaar  delete('Ximport_lbr.vim')
10931c991144SBram Moolenaar
10941c991144SBram Moolenaar  # import inside :def function
10955381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
10965381c7a1SBram Moolenaar    vim9script
10975381c7a1SBram Moolenaar    def ImportInDef()
10985381c7a1SBram Moolenaar      import exported from './Xexport.vim'
10995381c7a1SBram Moolenaar      g:imported = exported
11005381c7a1SBram Moolenaar      exported += 7
11015381c7a1SBram Moolenaar      g:imported_added = exported
11025381c7a1SBram Moolenaar    enddef
11035381c7a1SBram Moolenaar    ImportInDef()
11045381c7a1SBram Moolenaar  END
11055381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
11065381c7a1SBram Moolenaar  source Ximport2.vim
1107f5be8cdbSBram Moolenaar  # TODO: this should be 9879
11085381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
11095381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
11105381c7a1SBram Moolenaar  unlet g:imported
11115381c7a1SBram Moolenaar  unlet g:imported_added
11125381c7a1SBram Moolenaar  delete('Ximport2.vim')
11135381c7a1SBram Moolenaar
1114f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
1115f2d5c240SBram Moolenaar    vim9script
1116f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1117f2d5c240SBram Moolenaar    def UseExport()
1118f2d5c240SBram Moolenaar      g:imported = Export.exported
1119f2d5c240SBram Moolenaar    enddef
1120f2d5c240SBram Moolenaar    UseExport()
1121f2d5c240SBram Moolenaar  END
1122f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1123f2d5c240SBram Moolenaar  source Ximport.vim
11245381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1125f2d5c240SBram Moolenaar
1126599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
1127599c89c8SBram Moolenaar    vim9script
1128599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1129599c89c8SBram Moolenaar    def Func()
1130599c89c8SBram Moolenaar      let dummy = 1
1131599c89c8SBram Moolenaar      let imported = Export + dummy
1132599c89c8SBram Moolenaar    enddef
1133822ba247SBram Moolenaar    defcompile
1134599c89c8SBram Moolenaar  END
1135599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
1136599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
1137599c89c8SBram Moolenaar
1138599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
1139599c89c8SBram Moolenaar    vim9script
1140599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1141599c89c8SBram Moolenaar    def Func()
1142599c89c8SBram Moolenaar      let imported = Export . exported
1143599c89c8SBram Moolenaar    enddef
1144822ba247SBram Moolenaar    defcompile
1145599c89c8SBram Moolenaar  END
1146599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
1147599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1148599c89c8SBram Moolenaar
1149599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
1150599c89c8SBram Moolenaar    vim9script
1151599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1152599c89c8SBram Moolenaar    def Func()
1153599c89c8SBram Moolenaar      let imported = Export.
1154599c89c8SBram Moolenaar    enddef
1155822ba247SBram Moolenaar    defcompile
1156599c89c8SBram Moolenaar  END
1157599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
1158599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1159599c89c8SBram Moolenaar
11601c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
11611c991144SBram Moolenaar    vim9script
11621c991144SBram Moolenaar    import *
11631c991144SBram Moolenaar        as Export
11641c991144SBram Moolenaar        from
11651c991144SBram Moolenaar        './Xexport.vim'
11661c991144SBram Moolenaar    def UseExport()
11671c991144SBram Moolenaar      g:imported = Export.exported
11681c991144SBram Moolenaar    enddef
11691c991144SBram Moolenaar    UseExport()
11701c991144SBram Moolenaar  END
11711c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
11721c991144SBram Moolenaar  source Ximport.vim
11731c991144SBram Moolenaar  assert_equal(9883, g:imported)
11741c991144SBram Moolenaar
1175f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1176f2d5c240SBram Moolenaar    vim9script
1177f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1178f2d5c240SBram Moolenaar  END
1179f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
1180f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
1181f2d5c240SBram Moolenaar
1182f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1183fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1184fa29c8abSBram Moolenaar    vim9script
1185fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1186fa29c8abSBram Moolenaar  END
1187fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
1188fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
1189fa29c8abSBram Moolenaar
1190f5be8cdbSBram Moolenaar  # try to import something that is already defined
11915269bd2aSBram Moolenaar  let import_already_defined =<< trim END
11925269bd2aSBram Moolenaar    vim9script
11935269bd2aSBram Moolenaar    let exported = 'something'
11945269bd2aSBram Moolenaar    import exported from './Xexport.vim'
11955269bd2aSBram Moolenaar  END
11965269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
11975269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
11985269bd2aSBram Moolenaar
1199f5be8cdbSBram Moolenaar  # try to import something that is already defined
12005269bd2aSBram Moolenaar  import_already_defined =<< trim END
12015269bd2aSBram Moolenaar    vim9script
12025269bd2aSBram Moolenaar    let exported = 'something'
12035269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
12045269bd2aSBram Moolenaar  END
12055269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
12065269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
12075269bd2aSBram Moolenaar
1208f5be8cdbSBram Moolenaar  # try to import something that is already defined
12095269bd2aSBram Moolenaar  import_already_defined =<< trim END
12105269bd2aSBram Moolenaar    vim9script
12115269bd2aSBram Moolenaar    let exported = 'something'
12125269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
12135269bd2aSBram Moolenaar  END
12145269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
12155269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
12165269bd2aSBram Moolenaar
1217f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1218fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1219fa29c8abSBram Moolenaar    vim9script
1220fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1221fa29c8abSBram Moolenaar  END
1222fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
1223fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1224fa29c8abSBram Moolenaar
1225fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1226fa29c8abSBram Moolenaar    vim9script
1227fa29c8abSBram Moolenaar    import name './Xexport.vim'
1228fa29c8abSBram Moolenaar  END
1229fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
1230fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
1231fa29c8abSBram Moolenaar
1232fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1233fa29c8abSBram Moolenaar    vim9script
1234fa29c8abSBram Moolenaar    import name from Xexport.vim
1235fa29c8abSBram Moolenaar  END
1236fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
1237fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
1238fa29c8abSBram Moolenaar
1239fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1240fa29c8abSBram Moolenaar    vim9script
1241fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1242fa29c8abSBram Moolenaar  END
1243fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
1244fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
1245fa29c8abSBram Moolenaar
1246fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1247fa29c8abSBram Moolenaar    vim9script
1248fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1249fa29c8abSBram Moolenaar  END
12505269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
12515269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
1252fa29c8abSBram Moolenaar
1253f2d5c240SBram Moolenaar  delete('Ximport.vim')
12545269bd2aSBram Moolenaar  delete('Ximport3.vim')
12558a7d6542SBram Moolenaar  delete('Xexport.vim')
12568a7d6542SBram Moolenaar
1257f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1258750802b5SBram Moolenaar  set cpo&vi
1259750802b5SBram Moolenaar  let cpo_before = &cpo
1260750802b5SBram Moolenaar  let lines =<< trim END
1261750802b5SBram Moolenaar    vim9script
1262750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1263750802b5SBram Moolenaar  END
1264750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1265750802b5SBram Moolenaar  source Xvim9_script
1266750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1267750802b5SBram Moolenaar  set cpo&vim
1268750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1269750802b5SBram Moolenaar  delete('Xvim9_script')
1270750802b5SBram Moolenaarenddef
1271750802b5SBram Moolenaar
1272750802b5SBram Moolenaardef Test_vim9script_fails()
12738a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
12748a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1275750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
12769721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
12779b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1278750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1279750802b5SBram Moolenaar
1280c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:')
1281c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1282c785b9a7SBram Moolenaar
1283750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
1284a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
12858a7d6542SBram Moolenaarenddef
12868a7d6542SBram Moolenaar
1287f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1288101f4810SBram Moolenaar  CheckRunVimInTerminal
1289101f4810SBram Moolenaar
12909bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1291c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
12929bb3eb3eSBram Moolenaarendfunc
12939bb3eb3eSBram Moolenaar
1294c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1295101f4810SBram Moolenaar  let export =<< trim END
1296101f4810SBram Moolenaar    vim9script
1297101f4810SBram Moolenaar    export def Foo(): number
1298101f4810SBram Moolenaar        return 0
1299101f4810SBram Moolenaar    enddef
1300101f4810SBram Moolenaar  END
13019bb3eb3eSBram Moolenaar  writefile(export, 'Xexport.vim')
1302101f4810SBram Moolenaar
13039bb3eb3eSBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{
13049bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
13059bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1306101f4810SBram Moolenaar
13079bb3eb3eSBram Moolenaar  delete('Xexport.vim')
13089bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
13099bb3eb3eSBram Moolenaarenddef
1310101f4810SBram Moolenaar
13114c17ad94SBram Moolenaardef Test_vim9script_reload_import()
13128a7d6542SBram Moolenaar  let lines =<< trim END
13138a7d6542SBram Moolenaar    vim9script
13148a7d6542SBram Moolenaar    const var = ''
13158a7d6542SBram Moolenaar    let valone = 1234
13168a7d6542SBram Moolenaar    def MyFunc(arg: string)
13178a7d6542SBram Moolenaar       valone = 5678
13188a7d6542SBram Moolenaar    enddef
13198a7d6542SBram Moolenaar  END
13208a7d6542SBram Moolenaar  let morelines =<< trim END
13218a7d6542SBram Moolenaar    let valtwo = 222
13228a7d6542SBram Moolenaar    export def GetValtwo(): number
13238a7d6542SBram Moolenaar      return valtwo
13248a7d6542SBram Moolenaar    enddef
13258a7d6542SBram Moolenaar  END
132603afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
13278a7d6542SBram Moolenaar  source Xreload.vim
13288a7d6542SBram Moolenaar  source Xreload.vim
13298a7d6542SBram Moolenaar  source Xreload.vim
13308a7d6542SBram Moolenaar
13318a7d6542SBram Moolenaar  let testlines =<< trim END
13328a7d6542SBram Moolenaar    vim9script
13338a7d6542SBram Moolenaar    def TheFunc()
13348a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
13358a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
13368a7d6542SBram Moolenaar    enddef
13378a7d6542SBram Moolenaar    TheFunc()
13388a7d6542SBram Moolenaar  END
13398a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
13408a7d6542SBram Moolenaar  source Ximport.vim
13418a7d6542SBram Moolenaar
1342f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1343f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
13448a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
13458a7d6542SBram Moolenaar  source Ximport.vim
13468a7d6542SBram Moolenaar
1347f5be8cdbSBram Moolenaar  # cannot declare a var twice
13488a7d6542SBram Moolenaar  lines =<< trim END
13498a7d6542SBram Moolenaar    vim9script
13508a7d6542SBram Moolenaar    let valone = 1234
13518a7d6542SBram Moolenaar    let valone = 5678
13528a7d6542SBram Moolenaar  END
13538a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
13548a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
13558a7d6542SBram Moolenaar
13568a7d6542SBram Moolenaar  delete('Xreload.vim')
13578a7d6542SBram Moolenaar  delete('Ximport.vim')
13588a7d6542SBram Moolenaarenddef
13598a7d6542SBram Moolenaar
1360fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1361fe465a01SBram Moolenaar" script-local name.
1362fe465a01SBram Moolenaardef Test_vim9script_funcref()
1363fe465a01SBram Moolenaar  let sortlines =<< trim END
1364fe465a01SBram Moolenaar      vim9script
1365fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1366bed36b93SBram Moolenaar        return i2 - i1
1367fe465a01SBram Moolenaar      enddef
1368fe465a01SBram Moolenaar
1369fe465a01SBram Moolenaar      export def FastSort(): list<number>
1370fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1371fe465a01SBram Moolenaar      enddef
1372fe465a01SBram Moolenaar  END
1373fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1374fe465a01SBram Moolenaar
1375fe465a01SBram Moolenaar  let lines =<< trim END
1376fe465a01SBram Moolenaar    vim9script
1377fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1378fe465a01SBram Moolenaar    def Test()
1379fe465a01SBram Moolenaar      g:result = FastSort()
1380fe465a01SBram Moolenaar    enddef
1381fe465a01SBram Moolenaar    Test()
1382fe465a01SBram Moolenaar  END
1383fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1384fe465a01SBram Moolenaar
1385fe465a01SBram Moolenaar  source Xscript.vim
1386fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1387fe465a01SBram Moolenaar
1388fe465a01SBram Moolenaar  unlet g:result
1389fe465a01SBram Moolenaar  delete('Xsort.vim')
1390fe465a01SBram Moolenaar  delete('Xscript.vim')
1391fe465a01SBram Moolenaarenddef
1392fe465a01SBram Moolenaar
1393c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the
1394c620c055SBram Moolenaar" script where FastFilter() is called from.
1395c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1396c620c055SBram Moolenaar  let filterLines =<< trim END
1397c620c055SBram Moolenaar    vim9script
1398c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1399c620c055SBram Moolenaar      return idx % 2 == 1
1400c620c055SBram Moolenaar    enddef
1401c620c055SBram Moolenaar    export def FastFilter(): list<number>
1402c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1403c620c055SBram Moolenaar    enddef
1404c620c055SBram Moolenaar  END
1405c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1406c620c055SBram Moolenaar
1407c620c055SBram Moolenaar  let lines =<< trim END
1408c620c055SBram Moolenaar    vim9script
1409c620c055SBram Moolenaar    import {FilterFunc, FastFilter} from './Xfilter.vim'
1410c620c055SBram Moolenaar    def Test()
1411c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1412c620c055SBram Moolenaar    enddef
1413c620c055SBram Moolenaar    Test()
1414c620c055SBram Moolenaar  END
1415c620c055SBram Moolenaar  writefile(lines, 'Ximport.vim')
1416c620c055SBram Moolenaar  assert_fails('source Ximport.vim', 'E121:')
1417c620c055SBram Moolenaar
1418c620c055SBram Moolenaar  delete('Xfilter.vim')
1419c620c055SBram Moolenaar  delete('Ximport.vim')
1420c620c055SBram Moolenaarenddef
1421c620c055SBram Moolenaar
14224c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
14234c17ad94SBram Moolenaar  let first_lines =<< trim END
14244c17ad94SBram Moolenaar    vim9script
14254c17ad94SBram Moolenaar    def FuncYes(): string
14264c17ad94SBram Moolenaar      return 'yes'
14274c17ad94SBram Moolenaar    enddef
14284c17ad94SBram Moolenaar  END
142903afdcf1SBram Moolenaar  let withno_lines =<< trim END
14304c17ad94SBram Moolenaar    def FuncNo(): string
14314c17ad94SBram Moolenaar      return 'no'
14324c17ad94SBram Moolenaar    enddef
14334c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
14344c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
14354c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
143603afdcf1SBram Moolenaar    enddef
143703afdcf1SBram Moolenaar  END
143803afdcf1SBram Moolenaar  let nono_lines =<< trim END
143903afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
144003afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
14414c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
14424c17ad94SBram Moolenaar    enddef
14434c17ad94SBram Moolenaar  END
14444c17ad94SBram Moolenaar
14454c17ad94SBram Moolenaar  # FuncNo() is defined
144603afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
14474c17ad94SBram Moolenaar  source Xreloaded.vim
14484c17ad94SBram Moolenaar  g:DoCheck(true)
14494c17ad94SBram Moolenaar
14504c17ad94SBram Moolenaar  # FuncNo() is not redefined
145103afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
14524c17ad94SBram Moolenaar  source Xreloaded.vim
145303afdcf1SBram Moolenaar  g:DoCheck()
14544c17ad94SBram Moolenaar
14554c17ad94SBram Moolenaar  # FuncNo() is back
145603afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
14574c17ad94SBram Moolenaar  source Xreloaded.vim
145803afdcf1SBram Moolenaar  g:DoCheck()
14594c17ad94SBram Moolenaar
14604c17ad94SBram Moolenaar  delete('Xreloaded.vim')
14614c17ad94SBram Moolenaarenddef
14624c17ad94SBram Moolenaar
146389483d40SBram Moolenaardef Test_vim9script_reload_delvar()
146489483d40SBram Moolenaar  # write the script with a script-local variable
146589483d40SBram Moolenaar  let lines =<< trim END
146689483d40SBram Moolenaar    vim9script
146789483d40SBram Moolenaar    let var = 'string'
146889483d40SBram Moolenaar  END
146989483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
147089483d40SBram Moolenaar  source XreloadVar.vim
147189483d40SBram Moolenaar
147289483d40SBram Moolenaar  # now write the script using the same variable locally - works
147389483d40SBram Moolenaar  lines =<< trim END
147489483d40SBram Moolenaar    vim9script
147589483d40SBram Moolenaar    def Func()
147689483d40SBram Moolenaar      let var = 'string'
147789483d40SBram Moolenaar    enddef
147889483d40SBram Moolenaar  END
147989483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
148089483d40SBram Moolenaar  source XreloadVar.vim
148189483d40SBram Moolenaar
148289483d40SBram Moolenaar  delete('XreloadVar.vim')
148389483d40SBram Moolenaarenddef
148489483d40SBram Moolenaar
14858a7d6542SBram Moolenaardef Test_import_absolute()
14868a7d6542SBram Moolenaar  let import_lines = [
1487e6085c53SBram Moolenaar        'vim9script',
1488e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1489e6085c53SBram Moolenaar        'def UseExported()',
1490e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1491e6085c53SBram Moolenaar        '  exported = 8888',
1492e6085c53SBram Moolenaar        '  g:imported_after = exported',
1493e6085c53SBram Moolenaar        'enddef',
1494e6085c53SBram Moolenaar        'UseExported()',
1495e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1496e6085c53SBram Moolenaar        ]
14978a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
14988a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
14998a7d6542SBram Moolenaar
15008a7d6542SBram Moolenaar  source Ximport_abs.vim
15018a7d6542SBram Moolenaar
15028a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
15034e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1504675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1505675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1506675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1507675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1508675f716eSBram Moolenaar          'exported = 8888.*' ..
1509675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1510675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1511675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1512675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1513e6085c53SBram Moolenaar        g:import_disassembled)
15148a7d6542SBram Moolenaar  unlet g:imported_abs
15154e12a5dfSBram Moolenaar  unlet g:import_disassembled
15168a7d6542SBram Moolenaar
15178a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
15188a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
15198a7d6542SBram Moolenaarenddef
15208a7d6542SBram Moolenaar
15218a7d6542SBram Moolenaardef Test_import_rtp()
15228a7d6542SBram Moolenaar  let import_lines = [
1523e6085c53SBram Moolenaar        'vim9script',
1524e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1525e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1526e6085c53SBram Moolenaar        ]
15278a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
15288a7d6542SBram Moolenaar  mkdir('import')
15298a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
15308a7d6542SBram Moolenaar
15318a7d6542SBram Moolenaar  let save_rtp = &rtp
15328a7d6542SBram Moolenaar  &rtp = getcwd()
15338a7d6542SBram Moolenaar  source Ximport_rtp.vim
15348a7d6542SBram Moolenaar  &rtp = save_rtp
15358a7d6542SBram Moolenaar
15368a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
15378a7d6542SBram Moolenaar  unlet g:imported_rtp
15388a7d6542SBram Moolenaar
15398a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
154089483d40SBram Moolenaar  delete('import', 'rf')
15418a7d6542SBram Moolenaarenddef
15428a7d6542SBram Moolenaar
154325e0f586SBram Moolenaardef Test_import_compile_error()
154425e0f586SBram Moolenaar  let export_lines = [
154525e0f586SBram Moolenaar        'vim9script',
154625e0f586SBram Moolenaar        'export def ExpFunc(): string',
154725e0f586SBram Moolenaar        '  return notDefined',
154825e0f586SBram Moolenaar        'enddef',
154925e0f586SBram Moolenaar        ]
155025e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
155125e0f586SBram Moolenaar
155225e0f586SBram Moolenaar  let import_lines = [
155325e0f586SBram Moolenaar        'vim9script',
155425e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
155525e0f586SBram Moolenaar        'def ImpFunc()',
155625e0f586SBram Moolenaar        '  echo ExpFunc()',
155725e0f586SBram Moolenaar        'enddef',
155825e0f586SBram Moolenaar        'defcompile',
155925e0f586SBram Moolenaar        ]
156025e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
156125e0f586SBram Moolenaar
156225e0f586SBram Moolenaar  try
156325e0f586SBram Moolenaar    source Ximport.vim
156425e0f586SBram Moolenaar  catch /E1001/
1565f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
156625e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
156725e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
156825e0f586SBram Moolenaar  endtry
156925e0f586SBram Moolenaar
157025e0f586SBram Moolenaar  delete('Xexported.vim')
157125e0f586SBram Moolenaar  delete('Ximport.vim')
157225e0f586SBram Moolenaarenddef
157325e0f586SBram Moolenaar
15748a7d6542SBram Moolenaardef Test_fixed_size_list()
1575f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
15768a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
15778a7d6542SBram Moolenaar  l->remove(0)
15788a7d6542SBram Moolenaar  l->add(5)
15798a7d6542SBram Moolenaar  l->insert(99, 1)
15800f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
15818a7d6542SBram Moolenaarenddef
15828a7d6542SBram Moolenaar
1583ae616494SBram Moolenaardef Test_no_insert_xit()
1584ae616494SBram Moolenaar  call CheckDefExecFailure(['x = 1'], 'E1100:')
1585ae616494SBram Moolenaar  call CheckDefExecFailure(['a = 1'], 'E1100:')
1586ae616494SBram Moolenaar  call CheckDefExecFailure(['i = 1'], 'E1100:')
1587ae616494SBram Moolenaar  call CheckDefExecFailure(['c = 1'], 'E1100:')
1588ae616494SBram Moolenaar
1589ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1590ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1591ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1592ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1593ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1594ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1595ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1596ae616494SBram Moolenaarenddef
1597ae616494SBram Moolenaar
1598158906cfSBram Moolenaardef IfElse(what: number): string
1599158906cfSBram Moolenaar  let res = ''
1600158906cfSBram Moolenaar  if what == 1
1601158906cfSBram Moolenaar    res = "one"
1602158906cfSBram Moolenaar  elseif what == 2
1603158906cfSBram Moolenaar    res = "two"
1604a259d8d3SBram Moolenaar  else
1605158906cfSBram Moolenaar    res = "three"
1606a259d8d3SBram Moolenaar  endif
1607158906cfSBram Moolenaar  return res
1608a259d8d3SBram Moolenaarenddef
1609a259d8d3SBram Moolenaar
1610158906cfSBram Moolenaardef Test_if_elseif_else()
1611158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1612158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1613158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
16140f18b6d1SBram Moolenaarenddef
16150f18b6d1SBram Moolenaar
1616e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1617e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1618e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
1619e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
1620e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1621585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
1622e8c4abbbSBram Moolenaarenddef
1623e8c4abbbSBram Moolenaar
16246d69bf60SBram Moolenaarlet g:bool_true = v:true
16256d69bf60SBram Moolenaarlet g:bool_false = v:false
16266d69bf60SBram Moolenaar
16276d69bf60SBram Moolenaardef Test_if_const_expr()
16286d69bf60SBram Moolenaar  let res = false
16296d69bf60SBram Moolenaar  if true ? true : false
16306d69bf60SBram Moolenaar    res = true
16316d69bf60SBram Moolenaar  endif
16326d69bf60SBram Moolenaar  assert_equal(true, res)
16336d69bf60SBram Moolenaar
1634585fea7bSBram Moolenaar  g:glob = 2
1635585fea7bSBram Moolenaar  if false
16366797966dSBram Moolenaar    execute('g:glob = 3')
1637585fea7bSBram Moolenaar  endif
1638585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1639585fea7bSBram Moolenaar  if true
16406797966dSBram Moolenaar    execute('g:glob = 3')
1641585fea7bSBram Moolenaar  endif
1642585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1643585fea7bSBram Moolenaar
16446d69bf60SBram Moolenaar  res = false
16456d69bf60SBram Moolenaar  if g:bool_true ? true : false
16466d69bf60SBram Moolenaar    res = true
16476d69bf60SBram Moolenaar  endif
16486d69bf60SBram Moolenaar  assert_equal(true, res)
16496d69bf60SBram Moolenaar
16506d69bf60SBram Moolenaar  res = false
16516d69bf60SBram Moolenaar  if true ? g:bool_true : false
16526d69bf60SBram Moolenaar    res = true
16536d69bf60SBram Moolenaar  endif
16546d69bf60SBram Moolenaar  assert_equal(true, res)
16556d69bf60SBram Moolenaar
16566d69bf60SBram Moolenaar  res = false
16576d69bf60SBram Moolenaar  if true ? true : g:bool_false
16586d69bf60SBram Moolenaar    res = true
16596d69bf60SBram Moolenaar  endif
16606d69bf60SBram Moolenaar  assert_equal(true, res)
16616d69bf60SBram Moolenaar
16626d69bf60SBram Moolenaar  res = false
16636d69bf60SBram Moolenaar  if true ? false : true
16646d69bf60SBram Moolenaar    res = true
16656d69bf60SBram Moolenaar  endif
16666d69bf60SBram Moolenaar  assert_equal(false, res)
16676d69bf60SBram Moolenaar
16686d69bf60SBram Moolenaar  res = false
16696d69bf60SBram Moolenaar  if false ? false : true
16706d69bf60SBram Moolenaar    res = true
16716d69bf60SBram Moolenaar  endif
16726d69bf60SBram Moolenaar  assert_equal(true, res)
16736d69bf60SBram Moolenaar
16746d69bf60SBram Moolenaar  res = false
16756d69bf60SBram Moolenaar  if false ? true : false
16766d69bf60SBram Moolenaar    res = true
16776d69bf60SBram Moolenaar  endif
16786d69bf60SBram Moolenaar  assert_equal(false, res)
16796d69bf60SBram Moolenaar
16806d69bf60SBram Moolenaar  res = false
1681e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1682e8c4abbbSBram Moolenaar    res = true
1683e8c4abbbSBram Moolenaar  endif
1684e8c4abbbSBram Moolenaar  assert_equal(false, res)
1685e8c4abbbSBram Moolenaar
1686e8c4abbbSBram Moolenaar  res = false
16876d69bf60SBram Moolenaar  if true && true
16886d69bf60SBram Moolenaar    res = true
16896d69bf60SBram Moolenaar  endif
16906d69bf60SBram Moolenaar  assert_equal(true, res)
16916d69bf60SBram Moolenaar
16926d69bf60SBram Moolenaar  res = false
16936d69bf60SBram Moolenaar  if true && false
16946d69bf60SBram Moolenaar    res = true
16956d69bf60SBram Moolenaar  endif
16966d69bf60SBram Moolenaar  assert_equal(false, res)
16976d69bf60SBram Moolenaar
16986d69bf60SBram Moolenaar  res = false
16996d69bf60SBram Moolenaar  if g:bool_true && false
17006d69bf60SBram Moolenaar    res = true
17016d69bf60SBram Moolenaar  endif
17026d69bf60SBram Moolenaar  assert_equal(false, res)
17036d69bf60SBram Moolenaar
17046d69bf60SBram Moolenaar  res = false
17056d69bf60SBram Moolenaar  if true && g:bool_false
17066d69bf60SBram Moolenaar    res = true
17076d69bf60SBram Moolenaar  endif
17086d69bf60SBram Moolenaar  assert_equal(false, res)
17096d69bf60SBram Moolenaar
17106d69bf60SBram Moolenaar  res = false
17116d69bf60SBram Moolenaar  if false && false
17126d69bf60SBram Moolenaar    res = true
17136d69bf60SBram Moolenaar  endif
17146d69bf60SBram Moolenaar  assert_equal(false, res)
17156d69bf60SBram Moolenaar
17166d69bf60SBram Moolenaar  res = false
17176d69bf60SBram Moolenaar  if true || false
17186d69bf60SBram Moolenaar    res = true
17196d69bf60SBram Moolenaar  endif
17206d69bf60SBram Moolenaar  assert_equal(true, res)
17216d69bf60SBram Moolenaar
17226d69bf60SBram Moolenaar  res = false
17236d69bf60SBram Moolenaar  if g:bool_true || false
17246d69bf60SBram Moolenaar    res = true
17256d69bf60SBram Moolenaar  endif
17266d69bf60SBram Moolenaar  assert_equal(true, res)
17276d69bf60SBram Moolenaar
17286d69bf60SBram Moolenaar  res = false
17296d69bf60SBram Moolenaar  if true || g:bool_false
17306d69bf60SBram Moolenaar    res = true
17316d69bf60SBram Moolenaar  endif
17326d69bf60SBram Moolenaar  assert_equal(true, res)
17336d69bf60SBram Moolenaar
17346d69bf60SBram Moolenaar  res = false
17356d69bf60SBram Moolenaar  if false || false
17366d69bf60SBram Moolenaar    res = true
17376d69bf60SBram Moolenaar  endif
17386d69bf60SBram Moolenaar  assert_equal(false, res)
173980c34ca3SBram Moolenaarenddef
17406d69bf60SBram Moolenaar
174180c34ca3SBram Moolenaardef Test_if_const_expr_fails()
174280c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
174380c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1744e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
1745e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
17466d69bf60SBram Moolenaarenddef
17476d69bf60SBram Moolenaar
174872abcf42SBram Moolenaardef RunNested(i: number): number
174972abcf42SBram Moolenaar  let x: number = 0
175072abcf42SBram Moolenaar  if i % 2
175172abcf42SBram Moolenaar    if 1
1752f5be8cdbSBram Moolenaar      # comment
175372abcf42SBram Moolenaar    else
1754f5be8cdbSBram Moolenaar      # comment
175572abcf42SBram Moolenaar    endif
175672abcf42SBram Moolenaar    x += 1
175772abcf42SBram Moolenaar  else
175872abcf42SBram Moolenaar    x += 1000
175972abcf42SBram Moolenaar  endif
176072abcf42SBram Moolenaar  return x
176172abcf42SBram Moolenaarenddef
176272abcf42SBram Moolenaar
176372abcf42SBram Moolenaardef Test_nested_if()
176472abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
176572abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
176672abcf42SBram Moolenaarenddef
176772abcf42SBram Moolenaar
1768ad39c094SBram Moolenaardef Test_execute_cmd()
1769ad39c094SBram Moolenaar  new
1770ad39c094SBram Moolenaar  setline(1, 'default')
1771ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1772ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1773a72cfb80SBram Moolenaar
1774a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
1775a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1776a72cfb80SBram Moolenaar
1777ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
1778ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1779a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1780ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1781a72cfb80SBram Moolenaar
1782ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1783ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1784a72cfb80SBram Moolenaar
1785ad39c094SBram Moolenaar  let cmd_first = 'call '
1786ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1787ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1788ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1789ad39c094SBram Moolenaar  bwipe!
1790585fea7bSBram Moolenaar
17912d6b20d6SBram Moolenaar  let n = true
17922d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
17932d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
17942d6b20d6SBram Moolenaar
1795585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
1796a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
1797ad39c094SBram Moolenaarenddef
1798ad39c094SBram Moolenaar
179947e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1800f5be8cdbSBram Moolenaar  # only checks line continuation
180147e880d6SBram Moolenaar  let lines =<< trim END
180247e880d6SBram Moolenaar      vim9script
180347e880d6SBram Moolenaar      execute 'g:someVar'
180447e880d6SBram Moolenaar                .. ' = ' ..
180547e880d6SBram Moolenaar                   '28'
180647e880d6SBram Moolenaar      assert_equal(28, g:someVar)
180747e880d6SBram Moolenaar      unlet g:someVar
180847e880d6SBram Moolenaar  END
180947e880d6SBram Moolenaar  CheckScriptSuccess(lines)
181047e880d6SBram Moolenaarenddef
181147e880d6SBram Moolenaar
1812ad39c094SBram Moolenaardef Test_echo_cmd()
1813a72cfb80SBram Moolenaar  echo 'some' # comment
1814585fea7bSBram Moolenaar  echon 'thing'
1815ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1816ad39c094SBram Moolenaar
1817a72cfb80SBram Moolenaar  echo "some" # comment
1818a72cfb80SBram Moolenaar  echon "thing"
1819a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1820a72cfb80SBram Moolenaar
1821ad39c094SBram Moolenaar  let str1 = 'some'
1822ad39c094SBram Moolenaar  let str2 = 'more'
1823ad39c094SBram Moolenaar  echo str1 str2
1824ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1825a72cfb80SBram Moolenaar
1826a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1827ad39c094SBram Moolenaarenddef
1828ad39c094SBram Moolenaar
1829f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1830f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1831f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1832f93c7feaSBram Moolenaar  echo 'clear'
1833df069eecSBram Moolenaar  :1messages
1834f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1835f93c7feaSBram Moolenaar
1836f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1837f93c7feaSBram Moolenaarenddef
1838f93c7feaSBram Moolenaar
183947e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
1840f5be8cdbSBram Moolenaar  # only checks line continuation
184147e880d6SBram Moolenaar  let lines =<< trim END
184247e880d6SBram Moolenaar      vim9script
184347e880d6SBram Moolenaar      echomsg 'here'
184447e880d6SBram Moolenaar                .. ' is ' ..
184547e880d6SBram Moolenaar                   'a message'
184647e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
184747e880d6SBram Moolenaar  END
184847e880d6SBram Moolenaar  CheckScriptSuccess(lines)
184947e880d6SBram Moolenaarenddef
185047e880d6SBram Moolenaar
1851f93c7feaSBram Moolenaardef Test_echoerr_cmd()
185240ee466cSBram Moolenaar  try
185340ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
185440ee466cSBram Moolenaar  catch
185540ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
185640ee466cSBram Moolenaar  endtry
1857f93c7feaSBram Moolenaarenddef
1858f93c7feaSBram Moolenaar
185947e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
1860f5be8cdbSBram Moolenaar  # only checks line continuation
186147e880d6SBram Moolenaar  let lines =<< trim END
186247e880d6SBram Moolenaar      vim9script
186347e880d6SBram Moolenaar      try
186447e880d6SBram Moolenaar        echoerr 'this'
186547e880d6SBram Moolenaar                .. ' is ' ..
186647e880d6SBram Moolenaar                   'wrong'
186747e880d6SBram Moolenaar      catch
186847e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
186947e880d6SBram Moolenaar      endtry
187047e880d6SBram Moolenaar  END
187147e880d6SBram Moolenaar  CheckScriptSuccess(lines)
187247e880d6SBram Moolenaarenddef
187347e880d6SBram Moolenaar
187441fe0617SBram Moolenaardef Test_for_outside_of_function()
187541fe0617SBram Moolenaar  let lines =<< trim END
187641fe0617SBram Moolenaar    vim9script
187741fe0617SBram Moolenaar    new
187841fe0617SBram Moolenaar    for var in range(0, 3)
187941fe0617SBram Moolenaar      append(line('$'), var)
188041fe0617SBram Moolenaar    endfor
188141fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
188241fe0617SBram Moolenaar    bwipe!
188341fe0617SBram Moolenaar  END
188441fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
188541fe0617SBram Moolenaar  source Xvim9for.vim
188641fe0617SBram Moolenaar  delete('Xvim9for.vim')
188741fe0617SBram Moolenaarenddef
18888a7d6542SBram Moolenaar
1889e8c4abbbSBram Moolenaardef Test_for_loop()
1890e8c4abbbSBram Moolenaar  let result = ''
1891e8c4abbbSBram Moolenaar  for cnt in range(7)
1892e8c4abbbSBram Moolenaar    if cnt == 4
1893e8c4abbbSBram Moolenaar      break
1894e8c4abbbSBram Moolenaar    endif
1895e8c4abbbSBram Moolenaar    if cnt == 2
1896e8c4abbbSBram Moolenaar      continue
1897e8c4abbbSBram Moolenaar    endif
1898e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1899e8c4abbbSBram Moolenaar  endfor
1900e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
19010ad3e894SBram Moolenaar
19020ad3e894SBram Moolenaar  let concat = ''
19030ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
19040ad3e894SBram Moolenaar    concat ..= str
19050ad3e894SBram Moolenaar  endfor
19060ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
1907e8c4abbbSBram Moolenaarenddef
1908e8c4abbbSBram Moolenaar
1909e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1910675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1911675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1912675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
1913822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
19140ad3e894SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1013:')
1915675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1916675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1917675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1918e8c4abbbSBram Moolenaarenddef
1919e8c4abbbSBram Moolenaar
1920d0df1aacSBram Moolenaardef Test_while_loop()
1921d0df1aacSBram Moolenaar  let result = ''
1922d0df1aacSBram Moolenaar  let cnt = 0
1923d0df1aacSBram Moolenaar  while cnt < 555
1924d0df1aacSBram Moolenaar    if cnt == 3
1925d0df1aacSBram Moolenaar      break
1926d0df1aacSBram Moolenaar    endif
1927d0df1aacSBram Moolenaar    cnt += 1
1928d0df1aacSBram Moolenaar    if cnt == 2
1929d0df1aacSBram Moolenaar      continue
1930d0df1aacSBram Moolenaar    endif
1931d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1932d0df1aacSBram Moolenaar  endwhile
1933d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1934d0df1aacSBram Moolenaarenddef
1935d0df1aacSBram Moolenaar
1936e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1937675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
1938675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
1939675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
1940675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
1941675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
1942675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
1943675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1944bd5da371SBram Moolenaarenddef
1945bd5da371SBram Moolenaar
19469645e2d9SBram Moolenaardef Test_interrupt_loop()
194797acfc78SBram Moolenaar  let caught = false
19489645e2d9SBram Moolenaar  let x = 0
194997acfc78SBram Moolenaar  try
19509645e2d9SBram Moolenaar    while 1
19519645e2d9SBram Moolenaar      x += 1
19529645e2d9SBram Moolenaar      if x == 100
19539645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
19549645e2d9SBram Moolenaar      endif
19559645e2d9SBram Moolenaar    endwhile
195697acfc78SBram Moolenaar  catch
195797acfc78SBram Moolenaar    caught = true
195897acfc78SBram Moolenaar    assert_equal(100, x)
195997acfc78SBram Moolenaar  endtry
196097acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
19619645e2d9SBram Moolenaarenddef
196220431c9dSBram Moolenaar
19634fdae999SBram Moolenaardef Test_automatic_line_continuation()
19644fdae999SBram Moolenaar  let mylist = [
19654fdae999SBram Moolenaar      'one',
19664fdae999SBram Moolenaar      'two',
19674fdae999SBram Moolenaar      'three',
1968f5be8cdbSBram Moolenaar      ] # comment
19694fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
19704fdae999SBram Moolenaar
19714fdae999SBram Moolenaar  let mydict = {
19724fdae999SBram Moolenaar      'one': 1,
19734fdae999SBram Moolenaar      'two': 2,
19744fdae999SBram Moolenaar      'three':
19754fdae999SBram Moolenaar          3,
1976f5be8cdbSBram Moolenaar      } # comment
19774fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
19784fdae999SBram Moolenaar  mydict = #{
19792c330432SBram Moolenaar      one: 1,  # comment
19802c330432SBram Moolenaar      two:     # comment
19812c330432SBram Moolenaar           2,  # comment
19822c330432SBram Moolenaar      three: 3 # comment
19832c330432SBram Moolenaar      }
19842c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
19852c330432SBram Moolenaar  mydict = #{
19862c330432SBram Moolenaar      one: 1,
19874fdae999SBram Moolenaar      two:
19884fdae999SBram Moolenaar           2,
19892c330432SBram Moolenaar      three: 3
19904fdae999SBram Moolenaar      }
19914fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1992e6085c53SBram Moolenaar
1993e6085c53SBram Moolenaar  assert_equal(
1994e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1995e6085c53SBram Moolenaar        split('one two three')
1996e6085c53SBram Moolenaar        )
19974fdae999SBram Moolenaarenddef
19984fdae999SBram Moolenaar
19997a092245SBram Moolenaardef Test_vim9_comment()
20007a092245SBram Moolenaar  CheckScriptSuccess([
20017a092245SBram Moolenaar      'vim9script',
20027a092245SBram Moolenaar      '# something',
20037a092245SBram Moolenaar      ])
20047a092245SBram Moolenaar  CheckScriptFailure([
20057a092245SBram Moolenaar      'vim9script',
20067a092245SBram Moolenaar      ':# something',
20077a092245SBram Moolenaar      ], 'E488:')
20087a092245SBram Moolenaar  CheckScriptFailure([
20097a092245SBram Moolenaar      '# something',
20107a092245SBram Moolenaar      ], 'E488:')
20117a092245SBram Moolenaar  CheckScriptFailure([
20127a092245SBram Moolenaar      ':# something',
20137a092245SBram Moolenaar      ], 'E488:')
20147a092245SBram Moolenaar
20154a8d9f2eSBram Moolenaar  { # block start
20164a8d9f2eSBram Moolenaar  } # block end
20174a8d9f2eSBram Moolenaar  CheckDefFailure([
20184a8d9f2eSBram Moolenaar      '{# comment',
20194a8d9f2eSBram Moolenaar      ], 'E488:')
20204a8d9f2eSBram Moolenaar  CheckDefFailure([
20214a8d9f2eSBram Moolenaar      '{',
20224a8d9f2eSBram Moolenaar      '}# comment',
20234a8d9f2eSBram Moolenaar      ], 'E488:')
20244a8d9f2eSBram Moolenaar
20254a8d9f2eSBram Moolenaar  echo "yes" # comment
20264a8d9f2eSBram Moolenaar  CheckDefFailure([
20274a8d9f2eSBram Moolenaar      'echo "yes"# comment',
20284a8d9f2eSBram Moolenaar      ], 'E488:')
20297a092245SBram Moolenaar  CheckScriptSuccess([
20307a092245SBram Moolenaar      'vim9script',
20317a092245SBram Moolenaar      'echo "yes" # something',
20327a092245SBram Moolenaar      ])
20337a092245SBram Moolenaar  CheckScriptFailure([
20347a092245SBram Moolenaar      'vim9script',
20357a092245SBram Moolenaar      'echo "yes"# something',
20367a092245SBram Moolenaar      ], 'E121:')
20377a092245SBram Moolenaar  CheckScriptFailure([
20387a092245SBram Moolenaar      'vim9script',
20397a092245SBram Moolenaar      'echo# something',
20407a092245SBram Moolenaar      ], 'E121:')
20417a092245SBram Moolenaar  CheckScriptFailure([
20427a092245SBram Moolenaar      'echo "yes" # something',
20437a092245SBram Moolenaar      ], 'E121:')
20447a092245SBram Moolenaar
20454a8d9f2eSBram Moolenaar  exe "echo" # comment
20464a8d9f2eSBram Moolenaar  CheckDefFailure([
20474a8d9f2eSBram Moolenaar      'exe "echo"# comment',
20484a8d9f2eSBram Moolenaar      ], 'E488:')
20494a8d9f2eSBram Moolenaar  CheckScriptSuccess([
20504a8d9f2eSBram Moolenaar      'vim9script',
20514a8d9f2eSBram Moolenaar      'exe "echo" # something',
20524a8d9f2eSBram Moolenaar      ])
20534a8d9f2eSBram Moolenaar  CheckScriptFailure([
20544a8d9f2eSBram Moolenaar      'vim9script',
20554a8d9f2eSBram Moolenaar      'exe "echo"# something',
20564a8d9f2eSBram Moolenaar      ], 'E121:')
20574a8d9f2eSBram Moolenaar  CheckDefFailure([
20584a8d9f2eSBram Moolenaar      'exe # comment',
20594a8d9f2eSBram Moolenaar      ], 'E1015:')
20604a8d9f2eSBram Moolenaar  CheckScriptFailure([
20614a8d9f2eSBram Moolenaar      'vim9script',
20624a8d9f2eSBram Moolenaar      'exe# something',
20634a8d9f2eSBram Moolenaar      ], 'E121:')
20644a8d9f2eSBram Moolenaar  CheckScriptFailure([
20654a8d9f2eSBram Moolenaar      'exe "echo" # something',
20664a8d9f2eSBram Moolenaar      ], 'E121:')
20674a8d9f2eSBram Moolenaar
20687a092245SBram Moolenaar  CheckDefFailure([
20697a092245SBram Moolenaar      'try# comment',
20707a092245SBram Moolenaar      '  echo "yes"',
20717a092245SBram Moolenaar      'catch',
20727a092245SBram Moolenaar      'endtry',
20737a092245SBram Moolenaar      ], 'E488:')
20742c5ed4e3SBram Moolenaar  CheckScriptFailure([
20752c5ed4e3SBram Moolenaar      'vim9script',
20762c5ed4e3SBram Moolenaar      'try# comment',
20772c5ed4e3SBram Moolenaar      'echo "yes"',
20782c5ed4e3SBram Moolenaar      ], 'E488:')
20797a092245SBram Moolenaar  CheckDefFailure([
20807a092245SBram Moolenaar      'try',
2081a72cfb80SBram Moolenaar      '  throw#comment',
2082a72cfb80SBram Moolenaar      'catch',
2083a72cfb80SBram Moolenaar      'endtry',
2084a72cfb80SBram Moolenaar      ], 'E1015:')
2085a72cfb80SBram Moolenaar  CheckDefFailure([
2086a72cfb80SBram Moolenaar      'try',
2087a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2088a72cfb80SBram Moolenaar      'catch',
2089a72cfb80SBram Moolenaar      'endtry',
2090a72cfb80SBram Moolenaar      ], 'E488:')
2091a72cfb80SBram Moolenaar  CheckDefFailure([
2092a72cfb80SBram Moolenaar      'try',
20937a092245SBram Moolenaar      '  echo "yes"',
20947a092245SBram Moolenaar      'catch# comment',
20957a092245SBram Moolenaar      'endtry',
20967a092245SBram Moolenaar      ], 'E488:')
20972c5ed4e3SBram Moolenaar  CheckScriptFailure([
20982c5ed4e3SBram Moolenaar      'vim9script',
20992c5ed4e3SBram Moolenaar      'try',
21002c5ed4e3SBram Moolenaar      '  echo "yes"',
21012c5ed4e3SBram Moolenaar      'catch# comment',
21022c5ed4e3SBram Moolenaar      'endtry',
21032c5ed4e3SBram Moolenaar      ], 'E654:')
21042c5ed4e3SBram Moolenaar  CheckDefFailure([
21052c5ed4e3SBram Moolenaar      'try',
21062c5ed4e3SBram Moolenaar      '  echo "yes"',
21072c5ed4e3SBram Moolenaar      'catch /pat/# comment',
21082c5ed4e3SBram Moolenaar      'endtry',
21092c5ed4e3SBram Moolenaar      ], 'E488:')
21107a092245SBram Moolenaar  CheckDefFailure([
21117a092245SBram Moolenaar      'try',
21127a092245SBram Moolenaar      'echo "yes"',
21137a092245SBram Moolenaar      'catch',
21147a092245SBram Moolenaar      'endtry# comment',
21157a092245SBram Moolenaar      ], 'E488:')
21162c5ed4e3SBram Moolenaar  CheckScriptFailure([
21172c5ed4e3SBram Moolenaar      'vim9script',
21182c5ed4e3SBram Moolenaar      'try',
21192c5ed4e3SBram Moolenaar      '  echo "yes"',
21202c5ed4e3SBram Moolenaar      'catch',
21212c5ed4e3SBram Moolenaar      'endtry# comment',
21229b7bf9e9SBram Moolenaar      ], 'E488:')
21232c5ed4e3SBram Moolenaar
21242c5ed4e3SBram Moolenaar  CheckScriptSuccess([
21252c5ed4e3SBram Moolenaar      'vim9script',
21262c5ed4e3SBram Moolenaar      'hi # comment',
21272c5ed4e3SBram Moolenaar      ])
21282c5ed4e3SBram Moolenaar  CheckScriptFailure([
21292c5ed4e3SBram Moolenaar      'vim9script',
21302c5ed4e3SBram Moolenaar      'hi# comment',
21312c5ed4e3SBram Moolenaar      ], 'E416:')
21321966c248SBram Moolenaar  CheckScriptSuccess([
21331966c248SBram Moolenaar      'vim9script',
21341966c248SBram Moolenaar      'hi Search # comment',
21351966c248SBram Moolenaar      ])
21361966c248SBram Moolenaar  CheckScriptFailure([
21371966c248SBram Moolenaar      'vim9script',
21381966c248SBram Moolenaar      'hi Search# comment',
21391966c248SBram Moolenaar      ], 'E416:')
21401966c248SBram Moolenaar  CheckScriptSuccess([
21411966c248SBram Moolenaar      'vim9script',
21421966c248SBram Moolenaar      'hi link This Search # comment',
21431966c248SBram Moolenaar      ])
21441966c248SBram Moolenaar  CheckScriptFailure([
21451966c248SBram Moolenaar      'vim9script',
21461966c248SBram Moolenaar      'hi link This That# comment',
21471966c248SBram Moolenaar      ], 'E413:')
21481966c248SBram Moolenaar  CheckScriptSuccess([
21491966c248SBram Moolenaar      'vim9script',
21501966c248SBram Moolenaar      'hi clear This # comment',
21511966c248SBram Moolenaar      'hi clear # comment',
21521966c248SBram Moolenaar      ])
2153f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2154f5be8cdbSBram Moolenaar  # hi clear This# comment',
21551966c248SBram Moolenaar  CheckScriptFailure([
21561966c248SBram Moolenaar      'vim9script',
21571966c248SBram Moolenaar      'hi clear# comment',
21581966c248SBram Moolenaar      ], 'E416:')
21591966c248SBram Moolenaar
21601966c248SBram Moolenaar  CheckScriptSuccess([
21611966c248SBram Moolenaar      'vim9script',
21621966c248SBram Moolenaar      'hi Group term=bold',
21631966c248SBram Moolenaar      'match Group /todo/ # comment',
21641966c248SBram Moolenaar      ])
21651966c248SBram Moolenaar  CheckScriptFailure([
21661966c248SBram Moolenaar      'vim9script',
21671966c248SBram Moolenaar      'hi Group term=bold',
21681966c248SBram Moolenaar      'match Group /todo/# comment',
21691966c248SBram Moolenaar      ], 'E488:')
21701966c248SBram Moolenaar  CheckScriptSuccess([
21711966c248SBram Moolenaar      'vim9script',
21721966c248SBram Moolenaar      'match # comment',
21731966c248SBram Moolenaar      ])
21741966c248SBram Moolenaar  CheckScriptFailure([
21751966c248SBram Moolenaar      'vim9script',
21761966c248SBram Moolenaar      'match# comment',
21771966c248SBram Moolenaar      ], 'E475:')
21781966c248SBram Moolenaar  CheckScriptSuccess([
21791966c248SBram Moolenaar      'vim9script',
21801966c248SBram Moolenaar      'match none # comment',
21811966c248SBram Moolenaar      ])
21821966c248SBram Moolenaar  CheckScriptFailure([
21831966c248SBram Moolenaar      'vim9script',
21841966c248SBram Moolenaar      'match none# comment',
21851966c248SBram Moolenaar      ], 'E475:')
21861966c248SBram Moolenaar
21871966c248SBram Moolenaar  CheckScriptSuccess([
21881966c248SBram Moolenaar      'vim9script',
21891966c248SBram Moolenaar      'menutrans clear # comment',
21901966c248SBram Moolenaar      ])
21911966c248SBram Moolenaar  CheckScriptFailure([
21921966c248SBram Moolenaar      'vim9script',
21931966c248SBram Moolenaar      'menutrans clear# comment text',
21941966c248SBram Moolenaar      ], 'E474:')
21951966c248SBram Moolenaar
21961966c248SBram Moolenaar  CheckScriptSuccess([
21971966c248SBram Moolenaar      'vim9script',
21981966c248SBram Moolenaar      'syntax clear # comment',
21991966c248SBram Moolenaar      ])
22001966c248SBram Moolenaar  CheckScriptFailure([
22011966c248SBram Moolenaar      'vim9script',
22021966c248SBram Moolenaar      'syntax clear# comment text',
22031966c248SBram Moolenaar      ], 'E28:')
22041966c248SBram Moolenaar  CheckScriptSuccess([
22051966c248SBram Moolenaar      'vim9script',
22061966c248SBram Moolenaar      'syntax keyword Word some',
22071966c248SBram Moolenaar      'syntax clear Word # comment',
22081966c248SBram Moolenaar      ])
22091966c248SBram Moolenaar  CheckScriptFailure([
22101966c248SBram Moolenaar      'vim9script',
22111966c248SBram Moolenaar      'syntax keyword Word some',
22121966c248SBram Moolenaar      'syntax clear Word# comment text',
22131966c248SBram Moolenaar      ], 'E28:')
22141966c248SBram Moolenaar
22151966c248SBram Moolenaar  CheckScriptSuccess([
22161966c248SBram Moolenaar      'vim9script',
22171966c248SBram Moolenaar      'syntax list # comment',
22181966c248SBram Moolenaar      ])
22191966c248SBram Moolenaar  CheckScriptFailure([
22201966c248SBram Moolenaar      'vim9script',
22211966c248SBram Moolenaar      'syntax list# comment text',
22221966c248SBram Moolenaar      ], 'E28:')
22231966c248SBram Moolenaar
22241966c248SBram Moolenaar  CheckScriptSuccess([
22251966c248SBram Moolenaar      'vim9script',
22261966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
22271966c248SBram Moolenaar      ])
22281966c248SBram Moolenaar  CheckScriptFailure([
22291966c248SBram Moolenaar      'vim9script',
22301966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
22311966c248SBram Moolenaar      ], 'E475:')
22321966c248SBram Moolenaar
22331966c248SBram Moolenaar  CheckScriptSuccess([
22341966c248SBram Moolenaar      'vim9script',
22351966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
22361966c248SBram Moolenaar      ])
22371966c248SBram Moolenaar  CheckScriptFailure([
22381966c248SBram Moolenaar      'vim9script',
22391966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
22401966c248SBram Moolenaar      ], 'E789:')
22411966c248SBram Moolenaar
22421966c248SBram Moolenaar  CheckScriptSuccess([
22431966c248SBram Moolenaar      'vim9script',
22441966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
22451966c248SBram Moolenaar      ])
22461966c248SBram Moolenaar  CheckScriptFailure([
22471966c248SBram Moolenaar      'vim9script',
22481966c248SBram Moolenaar      'syntax match Word /pat/# comment',
22491966c248SBram Moolenaar      ], 'E402:')
22501966c248SBram Moolenaar
22511966c248SBram Moolenaar  CheckScriptSuccess([
22521966c248SBram Moolenaar      'vim9script',
22531966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
22541966c248SBram Moolenaar      ])
22551966c248SBram Moolenaar  CheckScriptFailure([
22561966c248SBram Moolenaar      'vim9script',
22571966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
22581966c248SBram Moolenaar      ], 'E475:')
22591966c248SBram Moolenaar  CheckScriptFailure([
22601966c248SBram Moolenaar      'vim9script',
22611966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
22621966c248SBram Moolenaar      ], 'E406:')
22631966c248SBram Moolenaar  CheckScriptFailure([
22641966c248SBram Moolenaar      'vim9script',
22651966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
22661966c248SBram Moolenaar      ], 'E475:')
22671966c248SBram Moolenaar
22681966c248SBram Moolenaar  CheckScriptSuccess([
22691966c248SBram Moolenaar      'vim9script',
22701966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
22711966c248SBram Moolenaar      ])
22721966c248SBram Moolenaar  CheckScriptFailure([
22731966c248SBram Moolenaar      'vim9script',
22741966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2275d032f34aSBram Moolenaar      ], 'E402:')
22761966c248SBram Moolenaar
22771966c248SBram Moolenaar  CheckScriptSuccess([
22781966c248SBram Moolenaar      'vim9script',
22791966c248SBram Moolenaar      'syntax sync # comment',
22801966c248SBram Moolenaar      ])
22811966c248SBram Moolenaar  CheckScriptFailure([
22821966c248SBram Moolenaar      'vim9script',
22831966c248SBram Moolenaar      'syntax sync# comment',
22841966c248SBram Moolenaar      ], 'E404:')
22851966c248SBram Moolenaar  CheckScriptSuccess([
22861966c248SBram Moolenaar      'vim9script',
22871966c248SBram Moolenaar      'syntax sync ccomment # comment',
22881966c248SBram Moolenaar      ])
22891966c248SBram Moolenaar  CheckScriptFailure([
22901966c248SBram Moolenaar      'vim9script',
22911966c248SBram Moolenaar      'syntax sync ccomment# comment',
22921966c248SBram Moolenaar      ], 'E404:')
22931966c248SBram Moolenaar
22941966c248SBram Moolenaar  CheckScriptSuccess([
22951966c248SBram Moolenaar      'vim9script',
22961966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
22971966c248SBram Moolenaar      ])
22981966c248SBram Moolenaar  CheckScriptFailure([
22991966c248SBram Moolenaar      'vim9script',
23001966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
23011966c248SBram Moolenaar      ], 'E475:')
2302a72cfb80SBram Moolenaar
2303a72cfb80SBram Moolenaar  CheckScriptSuccess([
2304a72cfb80SBram Moolenaar      'vim9script',
2305a72cfb80SBram Moolenaar      'command Echo echo # comment',
2306a72cfb80SBram Moolenaar      'command Echo # comment',
2307a72cfb80SBram Moolenaar      ])
2308a72cfb80SBram Moolenaar  CheckScriptFailure([
2309a72cfb80SBram Moolenaar      'vim9script',
2310a72cfb80SBram Moolenaar      'command Echo echo# comment',
2311a72cfb80SBram Moolenaar      'Echo',
2312a72cfb80SBram Moolenaar      ], 'E121:')
2313a72cfb80SBram Moolenaar  CheckScriptFailure([
2314a72cfb80SBram Moolenaar      'vim9script',
2315a72cfb80SBram Moolenaar      'command Echo# comment',
2316a72cfb80SBram Moolenaar      ], 'E182:')
2317a72cfb80SBram Moolenaar  CheckScriptFailure([
2318a72cfb80SBram Moolenaar      'vim9script',
2319a72cfb80SBram Moolenaar      'command Echo echo',
2320a72cfb80SBram Moolenaar      'command Echo# comment',
2321a72cfb80SBram Moolenaar      ], 'E182:')
2322a72cfb80SBram Moolenaar
2323a72cfb80SBram Moolenaar  CheckScriptSuccess([
2324a72cfb80SBram Moolenaar      'vim9script',
2325a72cfb80SBram Moolenaar      'function # comment',
2326a72cfb80SBram Moolenaar      ])
2327a72cfb80SBram Moolenaar  CheckScriptFailure([
2328a72cfb80SBram Moolenaar      'vim9script',
23299898107fSBram Moolenaar      'function " comment',
23309898107fSBram Moolenaar      ], 'E129:')
23319898107fSBram Moolenaar  CheckScriptFailure([
23329898107fSBram Moolenaar      'vim9script',
2333a72cfb80SBram Moolenaar      'function# comment',
2334a72cfb80SBram Moolenaar      ], 'E129:')
2335a72cfb80SBram Moolenaar  CheckScriptSuccess([
2336a72cfb80SBram Moolenaar      'vim9script',
2337a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2338a72cfb80SBram Moolenaar      ])
2339a72cfb80SBram Moolenaar  CheckScriptFailure([
2340a72cfb80SBram Moolenaar      'vim9script',
2341a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2342a72cfb80SBram Moolenaar      ], 'E488:')
2343a72cfb80SBram Moolenaar
2344a72cfb80SBram Moolenaar  CheckScriptSuccess([
2345a72cfb80SBram Moolenaar      'vim9script',
23464c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2347a72cfb80SBram Moolenaar      'endfunc',
23484c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2349a72cfb80SBram Moolenaar      ])
2350a72cfb80SBram Moolenaar  CheckScriptFailure([
2351a72cfb80SBram Moolenaar      'vim9script',
23524c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2353a72cfb80SBram Moolenaar      'endfunc',
23544c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2355a72cfb80SBram Moolenaar      ], 'E488:')
2356a72cfb80SBram Moolenaar
2357a72cfb80SBram Moolenaar  CheckScriptSuccess([
2358a72cfb80SBram Moolenaar      'vim9script',
2359a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2360a72cfb80SBram Moolenaar      ])
2361a72cfb80SBram Moolenaar  CheckScriptFailure([
2362a72cfb80SBram Moolenaar      'vim9script',
2363a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2364a72cfb80SBram Moolenaar      ], 'E488:')
2365e7e4838fSBram Moolenaar
2366e7e4838fSBram Moolenaar  CheckScriptFailure([
2367e7e4838fSBram Moolenaar      'def Test() " comment',
2368e7e4838fSBram Moolenaar      'enddef',
2369e7e4838fSBram Moolenaar      ], 'E488:')
2370e7e4838fSBram Moolenaar  CheckScriptFailure([
2371e7e4838fSBram Moolenaar      'vim9script',
2372e7e4838fSBram Moolenaar      'def Test() " comment',
2373e7e4838fSBram Moolenaar      'enddef',
2374e7e4838fSBram Moolenaar      ], 'E488:')
2375e7e4838fSBram Moolenaar
2376e7e4838fSBram Moolenaar  CheckScriptSuccess([
2377e7e4838fSBram Moolenaar      'func Test() " comment',
2378e7e4838fSBram Moolenaar      'endfunc',
2379e7e4838fSBram Moolenaar      ])
23809898107fSBram Moolenaar  CheckScriptSuccess([
2381e7e4838fSBram Moolenaar      'vim9script',
2382e7e4838fSBram Moolenaar      'func Test() " comment',
2383e7e4838fSBram Moolenaar      'endfunc',
23849898107fSBram Moolenaar      ])
2385e7e4838fSBram Moolenaar
2386e7e4838fSBram Moolenaar  CheckScriptSuccess([
2387e7e4838fSBram Moolenaar      'def Test() # comment',
2388e7e4838fSBram Moolenaar      'enddef',
2389e7e4838fSBram Moolenaar      ])
2390e7e4838fSBram Moolenaar  CheckScriptFailure([
2391e7e4838fSBram Moolenaar      'func Test() # comment',
2392e7e4838fSBram Moolenaar      'endfunc',
2393e7e4838fSBram Moolenaar      ], 'E488:')
23942c5ed4e3SBram Moolenaarenddef
23952c5ed4e3SBram Moolenaar
23962c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
23972c5ed4e3SBram Moolenaar  CheckCanRunGui
23982c5ed4e3SBram Moolenaar
23992c5ed4e3SBram Moolenaar  CheckScriptFailure([
24002c5ed4e3SBram Moolenaar      'vim9script',
24012c5ed4e3SBram Moolenaar      'gui#comment'
24022c5ed4e3SBram Moolenaar      ], 'E499:')
24032c5ed4e3SBram Moolenaar  CheckScriptFailure([
24042c5ed4e3SBram Moolenaar      'vim9script',
24052c5ed4e3SBram Moolenaar      'gui -f#comment'
24062c5ed4e3SBram Moolenaar      ], 'E499:')
24077a092245SBram Moolenaarenddef
24087a092245SBram Moolenaar
2409a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
24106797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
24116797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2412a26b9700SBram Moolenaar
2413a26b9700SBram Moolenaar  edit test.vim
2414a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2415a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2416a26b9700SBram Moolenaar
2417a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2418a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2419a26b9700SBram Moolenaar
2420a26b9700SBram Moolenaar  g:entered = 0
2421a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2422a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2423a26b9700SBram Moolenaar
2424a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2425a26b9700SBram Moolenaar
2426a26b9700SBram Moolenaar  au! TabEnter
2427a26b9700SBram Moolenaar  unlet g:entered
2428d72c1bf0SBram Moolenaar
2429d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2430d72c1bf0SBram Moolenaar      'vim9script',
24316797966dSBram Moolenaar      'g:var = 123',
2432e55b1c09SBram Moolenaar      'b:var = 456',
2433e55b1c09SBram Moolenaar      'w:var = 777',
2434e55b1c09SBram Moolenaar      't:var = 888',
2435d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2436d72c1bf0SBram Moolenaar      ])
2437d72c1bf0SBram Moolenaar
2438d72c1bf0SBram Moolenaar  CheckScriptFailure([
2439d72c1bf0SBram Moolenaar      'vim9script',
2440d72c1bf0SBram Moolenaar      'let g:var = 123',
2441e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2442e55b1c09SBram Moolenaar
2443e55b1c09SBram Moolenaar  CheckScriptFailure([
2444e55b1c09SBram Moolenaar      'vim9script',
2445e55b1c09SBram Moolenaar      'let b:var = 123',
2446e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2447e55b1c09SBram Moolenaar
2448e55b1c09SBram Moolenaar  CheckScriptFailure([
2449e55b1c09SBram Moolenaar      'vim9script',
2450e55b1c09SBram Moolenaar      'let w:var = 123',
2451e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2452e55b1c09SBram Moolenaar
2453e55b1c09SBram Moolenaar  CheckScriptFailure([
2454e55b1c09SBram Moolenaar      'vim9script',
2455e55b1c09SBram Moolenaar      'let t:var = 123',
2456e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2457e55b1c09SBram Moolenaar
2458e55b1c09SBram Moolenaar  CheckScriptFailure([
2459e55b1c09SBram Moolenaar      'vim9script',
2460e55b1c09SBram Moolenaar      'let v:version = 123',
2461e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2462e55b1c09SBram Moolenaar
2463e55b1c09SBram Moolenaar  CheckScriptFailure([
2464e55b1c09SBram Moolenaar      'vim9script',
2465e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2466e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
24676797966dSBram Moolenaar
24686797966dSBram Moolenaar  CheckScriptFailure([
24696797966dSBram Moolenaar      'vim9script',
24706797966dSBram Moolenaar      'g:var = 123',
247132e35117SBram Moolenaar      'unlet g:var# comment1',
2472d72c1bf0SBram Moolenaar      ], 'E108:')
2473d72c1bf0SBram Moolenaar
2474d72c1bf0SBram Moolenaar  CheckScriptFailure([
2475d72c1bf0SBram Moolenaar      'let g:var = 123',
2476d72c1bf0SBram Moolenaar      'unlet g:var # something',
2477d72c1bf0SBram Moolenaar      ], 'E488:')
2478faac4104SBram Moolenaar
2479faac4104SBram Moolenaar  CheckScriptSuccess([
2480faac4104SBram Moolenaar      'vim9script',
248132e35117SBram Moolenaar      'if 1 # comment2',
2482faac4104SBram Moolenaar      '  echo "yes"',
2483faac4104SBram Moolenaar      'elseif 2 #comment',
2484faac4104SBram Moolenaar      '  echo "no"',
2485faac4104SBram Moolenaar      'endif',
2486faac4104SBram Moolenaar      ])
2487faac4104SBram Moolenaar
2488faac4104SBram Moolenaar  CheckScriptFailure([
2489faac4104SBram Moolenaar      'vim9script',
249032e35117SBram Moolenaar      'if 1# comment3',
2491faac4104SBram Moolenaar      '  echo "yes"',
2492faac4104SBram Moolenaar      'endif',
2493faac4104SBram Moolenaar      ], 'E15:')
2494faac4104SBram Moolenaar
2495faac4104SBram Moolenaar  CheckScriptFailure([
2496faac4104SBram Moolenaar      'vim9script',
249732e35117SBram Moolenaar      'if 0 # comment4',
2498faac4104SBram Moolenaar      '  echo "yes"',
2499faac4104SBram Moolenaar      'elseif 2#comment',
2500faac4104SBram Moolenaar      '  echo "no"',
2501faac4104SBram Moolenaar      'endif',
2502faac4104SBram Moolenaar      ], 'E15:')
2503faac4104SBram Moolenaar
2504faac4104SBram Moolenaar  CheckScriptSuccess([
2505faac4104SBram Moolenaar      'vim9script',
250632e35117SBram Moolenaar      'let v = 1 # comment5',
2507faac4104SBram Moolenaar      ])
2508faac4104SBram Moolenaar
2509faac4104SBram Moolenaar  CheckScriptFailure([
2510faac4104SBram Moolenaar      'vim9script',
251132e35117SBram Moolenaar      'let v = 1# comment6',
251232e35117SBram Moolenaar      ], 'E15:')
2513faac4104SBram Moolenaar
2514faac4104SBram Moolenaar  CheckScriptSuccess([
2515faac4104SBram Moolenaar      'vim9script',
2516faac4104SBram Moolenaar      'new'
2517faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2518df069eecSBram Moolenaar      ':$',
2519faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2520faac4104SBram Moolenaar      'bwipe!',
2521faac4104SBram Moolenaar      ])
2522faac4104SBram Moolenaar
2523f5be8cdbSBram Moolenaar  CheckScriptFailure([
2524f5be8cdbSBram Moolenaar      'vim9script',
2525f5be8cdbSBram Moolenaar      'new'
2526f5be8cdbSBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2527f5be8cdbSBram Moolenaar      ':$',
2528f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2529f5be8cdbSBram Moolenaar      'bwipe!',
2530f5be8cdbSBram Moolenaar      ], 'E488:')
2531f5be8cdbSBram Moolenaar
2532f5be8cdbSBram Moolenaar  CheckScriptFailure([
2533f5be8cdbSBram Moolenaar      'vim9script',
2534f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2535f5be8cdbSBram Moolenaar      ], 'E477:')
2536a26b9700SBram Moolenaarenddef
2537a26b9700SBram Moolenaar
25387e5bd91dSBram Moolenaardef Test_finish()
25397e5bd91dSBram Moolenaar  let lines =<< trim END
25407e5bd91dSBram Moolenaar    vim9script
25416797966dSBram Moolenaar    g:res = 'one'
25427e5bd91dSBram Moolenaar    if v:false | finish | endif
25436797966dSBram Moolenaar    g:res = 'two'
25447e5bd91dSBram Moolenaar    finish
25456797966dSBram Moolenaar    g:res = 'three'
25467e5bd91dSBram Moolenaar  END
25477e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
25487e5bd91dSBram Moolenaar  source Xfinished
25497e5bd91dSBram Moolenaar  assert_equal('two', g:res)
25507e5bd91dSBram Moolenaar
25517e5bd91dSBram Moolenaar  unlet g:res
25527e5bd91dSBram Moolenaar  delete('Xfinished')
25537e5bd91dSBram Moolenaarenddef
25547e5bd91dSBram Moolenaar
255532e35117SBram Moolenaardef Test_let_func_call()
255632e35117SBram Moolenaar  let lines =<< trim END
255732e35117SBram Moolenaar    vim9script
255832e35117SBram Moolenaar    func GetValue()
255932e35117SBram Moolenaar      if exists('g:count')
256032e35117SBram Moolenaar        let g:count += 1
256132e35117SBram Moolenaar      else
256232e35117SBram Moolenaar        let g:count = 1
256332e35117SBram Moolenaar      endif
256432e35117SBram Moolenaar      return 'this'
256532e35117SBram Moolenaar    endfunc
256632e35117SBram Moolenaar    let val: string = GetValue()
2567f5be8cdbSBram Moolenaar    # env var is always a string
2568df671b46SBram Moolenaar    let env = $TERM
256932e35117SBram Moolenaar  END
257032e35117SBram Moolenaar  writefile(lines, 'Xfinished')
257132e35117SBram Moolenaar  source Xfinished
2572f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
257332e35117SBram Moolenaar  assert_equal(1, g:count)
257432e35117SBram Moolenaar
257532e35117SBram Moolenaar  unlet g:count
257632e35117SBram Moolenaar  delete('Xfinished')
257732e35117SBram Moolenaarenddef
257832e35117SBram Moolenaar
257932e35117SBram Moolenaardef Test_let_missing_type()
258032e35117SBram Moolenaar  let lines =<< trim END
258132e35117SBram Moolenaar    vim9script
2582df671b46SBram Moolenaar    let var = g:unknown
2583227a69deSBram Moolenaar  END
2584822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2585227a69deSBram Moolenaar
2586227a69deSBram Moolenaar  lines =<< trim END
2587227a69deSBram Moolenaar    vim9script
2588227a69deSBram Moolenaar    let nr: number = 123
2589227a69deSBram Moolenaar    let var = nr
2590227a69deSBram Moolenaar  END
2591822ba247SBram Moolenaar  CheckScriptSuccess(lines)
259232e35117SBram Moolenaarenddef
259332e35117SBram Moolenaar
2594c82a5b5dSBram Moolenaardef Test_let_declaration()
2595c82a5b5dSBram Moolenaar  let lines =<< trim END
2596c82a5b5dSBram Moolenaar    vim9script
2597c82a5b5dSBram Moolenaar    let var: string
2598c82a5b5dSBram Moolenaar    g:var_uninit = var
2599c82a5b5dSBram Moolenaar    var = 'text'
2600c82a5b5dSBram Moolenaar    g:var_test = var
2601f5be8cdbSBram Moolenaar    # prefixing s: is optional
2602984dddbeSBram Moolenaar    s:var = 'prefixed'
2603984dddbeSBram Moolenaar    g:var_prefixed = s:var
2604984dddbeSBram Moolenaar
2605984dddbeSBram Moolenaar    let s:other: number
2606984dddbeSBram Moolenaar    other = 1234
2607984dddbeSBram Moolenaar    g:other_var = other
2608c82a5b5dSBram Moolenaar  END
2609c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
2610c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
2611c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
2612984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
2613984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
2614c82a5b5dSBram Moolenaar
2615c82a5b5dSBram Moolenaar  unlet g:var_uninit
2616c82a5b5dSBram Moolenaar  unlet g:var_test
2617984dddbeSBram Moolenaar  unlet g:var_prefixed
2618984dddbeSBram Moolenaar  unlet g:other_var
2619c82a5b5dSBram Moolenaarenddef
2620c82a5b5dSBram Moolenaar
2621c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
2622c5b1c20bSBram Moolenaar  let lines =<< trim END
2623c5b1c20bSBram Moolenaar    vim9script
2624c5b1c20bSBram Moolenaar    const var: string
2625c5b1c20bSBram Moolenaar  END
2626c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
2627c5b1c20bSBram Moolenaar
2628c5b1c20bSBram Moolenaar  lines =<< trim END
2629c5b1c20bSBram Moolenaar    vim9script
2630c5b1c20bSBram Moolenaar    let 9var: string
2631c5b1c20bSBram Moolenaar  END
2632c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
2633c5b1c20bSBram Moolenaarenddef
2634c5b1c20bSBram Moolenaar
263534db91f7SBram Moolenaardef Test_let_type_check()
263634db91f7SBram Moolenaar  let lines =<< trim END
263734db91f7SBram Moolenaar    vim9script
263834db91f7SBram Moolenaar    let var: string
263934db91f7SBram Moolenaar    var = 1234
264034db91f7SBram Moolenaar  END
264134db91f7SBram Moolenaar  CheckScriptFailure(lines, 'E1013:')
2642984dddbeSBram Moolenaar
2643984dddbeSBram Moolenaar  lines =<< trim END
2644984dddbeSBram Moolenaar    vim9script
2645984dddbeSBram Moolenaar    let var:string
2646984dddbeSBram Moolenaar  END
2647984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
2648c5b1c20bSBram Moolenaar
2649c5b1c20bSBram Moolenaar  lines =<< trim END
2650c5b1c20bSBram Moolenaar    vim9script
2651c5b1c20bSBram Moolenaar    let var: asdf
2652c5b1c20bSBram Moolenaar  END
2653c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
265434db91f7SBram Moolenaarenddef
265534db91f7SBram Moolenaar
2656a5d0077eSBram Moolenaardef Test_forward_declaration()
2657a5d0077eSBram Moolenaar  let lines =<< trim END
2658a5d0077eSBram Moolenaar    vim9script
2659a5d0077eSBram Moolenaar    def GetValue(): string
2660a5d0077eSBram Moolenaar      return theVal
2661a5d0077eSBram Moolenaar    enddef
2662a5d0077eSBram Moolenaar    let theVal = 'something'
2663822ba247SBram Moolenaar    g:initVal = GetValue()
2664a5d0077eSBram Moolenaar    theVal = 'else'
2665a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2666a5d0077eSBram Moolenaar  END
2667a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2668a5d0077eSBram Moolenaar  source Xforward
2669a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2670a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2671a5d0077eSBram Moolenaar
2672a5d0077eSBram Moolenaar  unlet g:initVal
2673a5d0077eSBram Moolenaar  unlet g:laterVal
2674a5d0077eSBram Moolenaar  delete('Xforward')
2675a5d0077eSBram Moolenaarenddef
2676a5d0077eSBram Moolenaar
26779721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
26789721fb4eSBram Moolenaar  let legacy_lines =<< trim END
26799721fb4eSBram Moolenaar    source Xvim9_script.vim
26809721fb4eSBram Moolenaar
26819721fb4eSBram Moolenaar    call assert_false(exists('local'))
26829721fb4eSBram Moolenaar    call assert_false(exists('exported'))
26839721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
26849721fb4eSBram Moolenaar    call assert_equal('global', global)
26859721fb4eSBram Moolenaar    call assert_equal('global', g:global)
26869721fb4eSBram Moolenaar
26879721fb4eSBram Moolenaar    " imported variable becomes script-local
26889721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
26899721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
26909721fb4eSBram Moolenaar    call assert_false(exists('exported'))
26919721fb4eSBram Moolenaar
26929721fb4eSBram Moolenaar    " imported function becomes script-local
26939721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
26949721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
26959721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
26969721fb4eSBram Moolenaar  END
26979721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
26989721fb4eSBram Moolenaar
26999721fb4eSBram Moolenaar  let vim9_lines =<< trim END
27009721fb4eSBram Moolenaar    vim9script
27019721fb4eSBram Moolenaar    let local = 'local'
27029721fb4eSBram Moolenaar    g:global = 'global'
27039721fb4eSBram Moolenaar    export let exported = 'exported'
27049721fb4eSBram Moolenaar    export def GetText(): string
27059721fb4eSBram Moolenaar       return 'text'
27069721fb4eSBram Moolenaar    enddef
27079721fb4eSBram Moolenaar  END
27089721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
27099721fb4eSBram Moolenaar
27109721fb4eSBram Moolenaar  source Xlegacy_script.vim
27119721fb4eSBram Moolenaar
27129721fb4eSBram Moolenaar  assert_equal('global', g:global)
2713f5be8cdbSBram Moolenaar  unlet g:global
27149721fb4eSBram Moolenaar
27159721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
27169721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
27179721fb4eSBram Moolenaarenddef
2718a5d0077eSBram Moolenaar
2719eeb27bfeSBram Moolenaardef Test_vim9_copen()
2720eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2721eeb27bfeSBram Moolenaar  copen
2722eeb27bfeSBram Moolenaar  quit
2723eeb27bfeSBram Moolenaarenddef
2724eeb27bfeSBram Moolenaar
27252d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
27262d6b20d6SBram Moolenaardef Test_vim9_autoload()
27272d6b20d6SBram Moolenaar  let lines =<< trim END
27282d6b20d6SBram Moolenaar     vim9script
27292d6b20d6SBram Moolenaar     def foo#test()
27302d6b20d6SBram Moolenaar         echomsg getreg('"')
27312d6b20d6SBram Moolenaar     enddef
27322d6b20d6SBram Moolenaar  END
27332d6b20d6SBram Moolenaar
27342d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
27352d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
27362d6b20d6SBram Moolenaar  let save_rtp = &rtp
27372d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
27382d6b20d6SBram Moolenaar  augroup test
27392d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
27402d6b20d6SBram Moolenaar  augroup END
27412d6b20d6SBram Moolenaar
27422d6b20d6SBram Moolenaar  normal Y
27432d6b20d6SBram Moolenaar
27442d6b20d6SBram Moolenaar  augroup test
27452d6b20d6SBram Moolenaar    autocmd!
27462d6b20d6SBram Moolenaar  augroup END
27472d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
27482d6b20d6SBram Moolenaar  &rtp = save_rtp
27492d6b20d6SBram Moolenaarenddef
27502d6b20d6SBram Moolenaar
2751585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
2752585fea7bSBram Moolenaardef Test_substitute_cmd()
2753585fea7bSBram Moolenaar  new
2754585fea7bSBram Moolenaar  setline(1, 'something')
2755585fea7bSBram Moolenaar  :substitute(some(other(
2756585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
2757585fea7bSBram Moolenaar  bwipe!
2758585fea7bSBram Moolenaar
2759f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
2760585fea7bSBram Moolenaar  let lines =<< trim END
2761585fea7bSBram Moolenaar    vim9script
2762585fea7bSBram Moolenaar    new
2763585fea7bSBram Moolenaar    setline(1, 'something')
2764585fea7bSBram Moolenaar    :substitute(some(other(
2765585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
2766585fea7bSBram Moolenaar    bwipe!
2767585fea7bSBram Moolenaar  END
2768585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
2769585fea7bSBram Moolenaar  source Xvim9lines
2770585fea7bSBram Moolenaar
2771585fea7bSBram Moolenaar  delete('Xvim9lines')
2772585fea7bSBram Moolenaarenddef
2773585fea7bSBram Moolenaar
27748a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
2775