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
24784370087SBram Moolenaar  call CheckDefExecFailure(['let dd = {}', 'dd[""] = 6'], 'E713:')
24884370087SBram Moolenaar
24984370087SBram Moolenaar  # type becomes dict<any>
25084370087SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
25184370087SBram Moolenaarenddef
25284370087SBram Moolenaar
253d3aac291SBram Moolenaardef Test_assignment_local()
254f5be8cdbSBram Moolenaar  # Test in a separated file in order not to the current buffer/window/tab is
255f5be8cdbSBram Moolenaar  # changed.
256d3aac291SBram Moolenaar  let script_lines: list<string> =<< trim END
257d3aac291SBram Moolenaar    let b:existing = 'yes'
258d3aac291SBram Moolenaar    let w:existing = 'yes'
259d3aac291SBram Moolenaar    let t:existing = 'yes'
260d3aac291SBram Moolenaar
261d3aac291SBram Moolenaar    def Test_assignment_local_internal()
262d3aac291SBram Moolenaar      b:newvar = 'new'
263d3aac291SBram Moolenaar      assert_equal('new', b:newvar)
264d3aac291SBram Moolenaar      assert_equal('yes', b:existing)
265d3aac291SBram Moolenaar      b:existing = 'no'
266d3aac291SBram Moolenaar      assert_equal('no', b:existing)
267396f3138SBram Moolenaar      b:existing ..= 'NO'
268396f3138SBram Moolenaar      assert_equal('noNO', b:existing)
269d3aac291SBram Moolenaar
270d3aac291SBram Moolenaar      w:newvar = 'new'
271d3aac291SBram Moolenaar      assert_equal('new', w:newvar)
272d3aac291SBram Moolenaar      assert_equal('yes', w:existing)
273d3aac291SBram Moolenaar      w:existing = 'no'
274d3aac291SBram Moolenaar      assert_equal('no', w:existing)
275396f3138SBram Moolenaar      w:existing ..= 'NO'
276396f3138SBram Moolenaar      assert_equal('noNO', w:existing)
277d3aac291SBram Moolenaar
278d3aac291SBram Moolenaar      t:newvar = 'new'
279d3aac291SBram Moolenaar      assert_equal('new', t:newvar)
280d3aac291SBram Moolenaar      assert_equal('yes', t:existing)
281d3aac291SBram Moolenaar      t:existing = 'no'
282d3aac291SBram Moolenaar      assert_equal('no', t:existing)
283396f3138SBram Moolenaar      t:existing ..= 'NO'
284396f3138SBram Moolenaar      assert_equal('noNO', t:existing)
285d3aac291SBram Moolenaar    enddef
286d3aac291SBram Moolenaar    call Test_assignment_local_internal()
287d3aac291SBram Moolenaar  END
288d3aac291SBram Moolenaar  call CheckScriptSuccess(script_lines)
289d3aac291SBram Moolenaarenddef
290d3aac291SBram Moolenaar
2915deeb3f1SBram Moolenaardef Test_assignment_default()
292e69f6d04SBram Moolenaar
293cb711abfSBram Moolenaar  # Test default values.
294e69f6d04SBram Moolenaar  let thebool: bool
295e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
296e69f6d04SBram Moolenaar
297e69f6d04SBram Moolenaar  let thenumber: number
298e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
299e69f6d04SBram Moolenaar
300e69f6d04SBram Moolenaar  if has('float')
301e69f6d04SBram Moolenaar    let thefloat: float
302e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
303e69f6d04SBram Moolenaar  endif
304e69f6d04SBram Moolenaar
305e69f6d04SBram Moolenaar  let thestring: string
306e69f6d04SBram Moolenaar  assert_equal('', thestring)
307e69f6d04SBram Moolenaar
308e69f6d04SBram Moolenaar  let theblob: blob
309e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
310e69f6d04SBram Moolenaar
3115deeb3f1SBram Moolenaar  let Thefunc: func
3125deeb3f1SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
313e69f6d04SBram Moolenaar
314e69f6d04SBram Moolenaar  let thelist: list<any>
315e69f6d04SBram Moolenaar  assert_equal([], thelist)
316e69f6d04SBram Moolenaar
317e69f6d04SBram Moolenaar  let thedict: dict<any>
318e69f6d04SBram Moolenaar  assert_equal({}, thedict)
319e69f6d04SBram Moolenaar
3202c869deeSBram Moolenaar  if has('channel')
321e69f6d04SBram Moolenaar    let thejob: job
322e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
323e69f6d04SBram Moolenaar
324e69f6d04SBram Moolenaar    let thechannel: channel
325e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
326c785b9a7SBram Moolenaar
327c785b9a7SBram Moolenaar    if has('unix') && executable('cat')
328f5be8cdbSBram Moolenaar      # check with non-null job and channel, types must match
329c785b9a7SBram Moolenaar      thejob = job_start("cat ", #{})
330c785b9a7SBram Moolenaar      thechannel = job_getchannel(thejob)
331c785b9a7SBram Moolenaar      job_stop(thejob, 'kill')
332c785b9a7SBram Moolenaar    endif
3332c869deeSBram Moolenaar  endif
334585fea7bSBram Moolenaar
335585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
336585fea7bSBram Moolenaar  assert_equal(5678, nr)
3378a7d6542SBram Moolenaarenddef
3388a7d6542SBram Moolenaar
33947a519a9SBram Moolenaardef Test_assignment_var_list()
34047a519a9SBram Moolenaar  let v1: string
34147a519a9SBram Moolenaar  let v2: string
3429af78769SBram Moolenaar  let vrem: list<string>
3439af78769SBram Moolenaar  [v1] = ['aaa']
3449af78769SBram Moolenaar  assert_equal('aaa', v1)
3459af78769SBram Moolenaar
34647a519a9SBram Moolenaar  [v1, v2] = ['one', 'two']
34747a519a9SBram Moolenaar  assert_equal('one', v1)
34847a519a9SBram Moolenaar  assert_equal('two', v2)
3499af78769SBram Moolenaar
3509af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two']
3519af78769SBram Moolenaar  assert_equal('one', v1)
3529af78769SBram Moolenaar  assert_equal('two', v2)
3539af78769SBram Moolenaar  assert_equal([], vrem)
3549af78769SBram Moolenaar
3559af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two', 'three']
3569af78769SBram Moolenaar  assert_equal('one', v1)
3579af78769SBram Moolenaar  assert_equal('two', v2)
3589af78769SBram Moolenaar  assert_equal(['three'], vrem)
35947a519a9SBram Moolenaarenddef
36047a519a9SBram Moolenaar
361*c7e44a7eSBram Moolenaardef Test_assignment_vim9script()
362*c7e44a7eSBram Moolenaar  let lines =<< trim END
363*c7e44a7eSBram Moolenaar    vim9script
364*c7e44a7eSBram Moolenaar    def Func(): list<number>
365*c7e44a7eSBram Moolenaar      return [1, 2]
366*c7e44a7eSBram Moolenaar    enddef
367*c7e44a7eSBram Moolenaar    let var1: number
368*c7e44a7eSBram Moolenaar    let var2: number
369*c7e44a7eSBram Moolenaar    [var1, var2] =
370*c7e44a7eSBram Moolenaar          Func()
371*c7e44a7eSBram Moolenaar    assert_equal(1, var1)
372*c7e44a7eSBram Moolenaar    assert_equal(2, var2)
373*c7e44a7eSBram Moolenaar    let ll =
374*c7e44a7eSBram Moolenaar          Func()
375*c7e44a7eSBram Moolenaar    assert_equal([1, 2], ll)
376*c7e44a7eSBram Moolenaar  END
377*c7e44a7eSBram Moolenaar  CheckScriptSuccess(lines)
378*c7e44a7eSBram Moolenaarenddef
379*c7e44a7eSBram Moolenaar
380cab27678SBram Moolenaardef Mess(): string
381cab27678SBram Moolenaar  v:foldstart = 123
382cab27678SBram Moolenaar  return 'xxx'
383cab27678SBram Moolenaarenddef
384cab27678SBram Moolenaar
385d72c1bf0SBram Moolenaardef Test_assignment_failure()
3868a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
3878a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
3888a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
3898a7d6542SBram Moolenaar
39063be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:')
39163be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='")
39263be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:')
39363be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:')
39463be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:')
39563be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='")
39663be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:')
39763be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='")
39863be3d4bSBram Moolenaar
3998a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
4008a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
4018a7d6542SBram Moolenaar
4029b7bf9e9SBram Moolenaar  call CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
4039af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
4049af78769SBram Moolenaar                            '[a] = test_null_list()'], 'E1093:')
4059af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
4069af78769SBram Moolenaar                            '[a] = []'], 'E1093:')
4079af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
4089af78769SBram Moolenaar                            'let y: number',
4099af78769SBram Moolenaar                            '[x, y] = [1]'], 'E1093:')
4109af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
4119af78769SBram Moolenaar                            'let y: number',
4129af78769SBram Moolenaar                            'let z: list<number>',
4139af78769SBram Moolenaar                            '[x, y; z] = [1]'], 'E1093:')
4149be61bbbSBram Moolenaar
415e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
4169be61bbbSBram Moolenaar  call CheckDefFailure(['let &option'], 'E1052:')
4179be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
4189be61bbbSBram Moolenaar
419e55b1c09SBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
4209be61bbbSBram Moolenaar
4219be61bbbSBram Moolenaar  call CheckDefFailure(['let @~ = 5'], 'E354:')
4229be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
4239be61bbbSBram Moolenaar
424e55b1c09SBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
425e55b1c09SBram Moolenaar  call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
426e55b1c09SBram Moolenaar  call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
427e55b1c09SBram Moolenaar  call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
4289be61bbbSBram Moolenaar
4299be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
4309be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
4319be61bbbSBram Moolenaar
432822ba247SBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:')
43333fa29cfSBram Moolenaar
4348a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
4358a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
4368a7d6542SBram Moolenaar
4378a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
4388a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
4398a7d6542SBram Moolenaar
4408a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
4418a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
44242a480bfSBram Moolenaar
443d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
44442a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
445cab27678SBram Moolenaar
446cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
447cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
44843e969d3SBram Moolenaar
44943e969d3SBram Moolenaar  call CheckDefFailure(['w:foo: number = 10'],
45043e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 1')
45143e969d3SBram Moolenaar  call CheckDefFailure(['t:foo: bool = true'],
45243e969d3SBram Moolenaar                       'E488: Trailing characters: : bool = true')
45343e969d3SBram Moolenaar  call CheckDefFailure(['b:foo: string = "x"'],
45443e969d3SBram Moolenaar                       'E488: Trailing characters: : string = "x"')
45543e969d3SBram Moolenaar  call CheckDefFailure(['g:foo: number = 123'],
45643e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 123')
457d72c1bf0SBram Moolenaarenddef
458d72c1bf0SBram Moolenaar
459d72c1bf0SBram Moolenaardef Test_unlet()
460d72c1bf0SBram Moolenaar  g:somevar = 'yes'
461d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
462d72c1bf0SBram Moolenaar  unlet g:somevar
463d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
464d72c1bf0SBram Moolenaar  unlet! g:somevar
465d72c1bf0SBram Moolenaar
466d72c1bf0SBram Moolenaar  call CheckScriptFailure([
467d72c1bf0SBram Moolenaar        'vim9script',
468d72c1bf0SBram Moolenaar        'let svar = 123',
469d72c1bf0SBram Moolenaar        'unlet svar',
470d72c1bf0SBram Moolenaar        ], 'E1081:')
471d72c1bf0SBram Moolenaar  call CheckScriptFailure([
472d72c1bf0SBram Moolenaar        'vim9script',
473d72c1bf0SBram Moolenaar        'let svar = 123',
474d72c1bf0SBram Moolenaar        'unlet s:svar',
475d72c1bf0SBram Moolenaar        ], 'E1081:')
476d72c1bf0SBram Moolenaar  call CheckScriptFailure([
477d72c1bf0SBram Moolenaar        'vim9script',
478d72c1bf0SBram Moolenaar        'let svar = 123',
479d72c1bf0SBram Moolenaar        'def Func()',
480d72c1bf0SBram Moolenaar        '  unlet svar',
481d72c1bf0SBram Moolenaar        'enddef',
482822ba247SBram Moolenaar        'defcompile',
483d72c1bf0SBram Moolenaar        ], 'E1081:')
484d72c1bf0SBram Moolenaar  call CheckScriptFailure([
485d72c1bf0SBram Moolenaar        'vim9script',
486d72c1bf0SBram Moolenaar        'let svar = 123',
487d72c1bf0SBram Moolenaar        'def Func()',
488d72c1bf0SBram Moolenaar        '  unlet s:svar',
489d72c1bf0SBram Moolenaar        'enddef',
490822ba247SBram Moolenaar        'defcompile',
491d72c1bf0SBram Moolenaar        ], 'E1081:')
4927bdaea6eSBram Moolenaar
4937bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
4947bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
4957bdaea6eSBram Moolenaar  unlet $ENVVAR
4967bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
497d72c1bf0SBram Moolenaarenddef
498599c89c8SBram Moolenaar
4994c17ad94SBram Moolenaardef Test_delfunction()
500f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
5014c17ad94SBram Moolenaar  CheckScriptSuccess([
5024c17ad94SBram Moolenaar      'vim9script',
5034c17ad94SBram Moolenaar      'func CheckMe()',
5044c17ad94SBram Moolenaar      '  return 123',
5054c17ad94SBram Moolenaar      'endfunc',
5064c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
5074c17ad94SBram Moolenaar      ])
5084c17ad94SBram Moolenaar
509f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
5104c17ad94SBram Moolenaar  CheckScriptFailure([
5114c17ad94SBram Moolenaar      'vim9script',
5124c17ad94SBram Moolenaar      'func DeleteMe1()',
5134c17ad94SBram Moolenaar      'endfunc',
5144c17ad94SBram Moolenaar      'delfunction DeleteMe1',
5154c17ad94SBram Moolenaar      ], 'E1084:')
5164c17ad94SBram Moolenaar  CheckScriptFailure([
5174c17ad94SBram Moolenaar      'vim9script',
5184c17ad94SBram Moolenaar      'func DeleteMe2()',
5194c17ad94SBram Moolenaar      'endfunc',
5204c17ad94SBram Moolenaar      'def DoThat()',
5214c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
5224c17ad94SBram Moolenaar      'enddef',
5234c17ad94SBram Moolenaar      'DoThat()',
5244c17ad94SBram Moolenaar      ], 'E1084:')
5254c17ad94SBram Moolenaar  CheckScriptFailure([
5264c17ad94SBram Moolenaar      'vim9script',
5274c17ad94SBram Moolenaar      'def DeleteMe3()',
5284c17ad94SBram Moolenaar      'enddef',
5294c17ad94SBram Moolenaar      'delfunction DeleteMe3',
5304c17ad94SBram Moolenaar      ], 'E1084:')
5314c17ad94SBram Moolenaar  CheckScriptFailure([
5324c17ad94SBram Moolenaar      'vim9script',
5334c17ad94SBram Moolenaar      'def DeleteMe4()',
5344c17ad94SBram Moolenaar      'enddef',
5354c17ad94SBram Moolenaar      'def DoThat()',
5364c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
5374c17ad94SBram Moolenaar      'enddef',
5384c17ad94SBram Moolenaar      'DoThat()',
5394c17ad94SBram Moolenaar      ], 'E1084:')
540925e9fd6SBram Moolenaar
541925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
542925e9fd6SBram Moolenaar  let lines =<< trim END
543925e9fd6SBram Moolenaar      vim9script
544925e9fd6SBram Moolenaar      def g:Global(): string
545925e9fd6SBram Moolenaar        return "yes"
546925e9fd6SBram Moolenaar      enddef
547925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
548925e9fd6SBram Moolenaar      def! g:Global(): string
549925e9fd6SBram Moolenaar        return "no"
550925e9fd6SBram Moolenaar      enddef
551925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
552925e9fd6SBram Moolenaar      delfunc g:Global
553925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
554925e9fd6SBram Moolenaar  END
555925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
556925e9fd6SBram Moolenaar
557925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
558925e9fd6SBram Moolenaar  lines =<< trim END
559925e9fd6SBram Moolenaar      vim9script
560925e9fd6SBram Moolenaar      func g:Global()
561925e9fd6SBram Moolenaar        return "yes"
562925e9fd6SBram Moolenaar      endfunc
563925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
564925e9fd6SBram Moolenaar      def! g:Global(): string
565925e9fd6SBram Moolenaar        return "no"
566925e9fd6SBram Moolenaar      enddef
567925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
568925e9fd6SBram Moolenaar      delfunc g:Global
569925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
570925e9fd6SBram Moolenaar  END
571925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
572925e9fd6SBram Moolenaar
573925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
574925e9fd6SBram Moolenaar  lines =<< trim END
575925e9fd6SBram Moolenaar      vim9script
576925e9fd6SBram Moolenaar      def g:Global(): string
577925e9fd6SBram Moolenaar        return "yes"
578925e9fd6SBram Moolenaar      enddef
579925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
580925e9fd6SBram Moolenaar      func! g:Global()
581925e9fd6SBram Moolenaar        return "no"
582925e9fd6SBram Moolenaar      endfunc
583925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
584925e9fd6SBram Moolenaar      delfunc g:Global
585925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
586925e9fd6SBram Moolenaar  END
587925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
5884c17ad94SBram Moolenaarenddef
5894c17ad94SBram Moolenaar
590599c89c8SBram Moolenaarfunc Test_wrong_type()
591599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
592599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
593599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
594599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
595599c89c8SBram Moolenaar
596599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
597599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
59842a480bfSBram Moolenaar
59942a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
60042a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
60142a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
60242a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
60342a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
60442a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
60542a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
60642a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
60742a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
60842a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
60942a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
610a0a9f43aSBram Moolenaar
611a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
612a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
6138a7d6542SBram Moolenaarendfunc
6148a7d6542SBram Moolenaar
6158a7d6542SBram Moolenaarfunc Test_const()
6168a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
6178a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
6188a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
6199be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
6208a7d6542SBram Moolenaarendfunc
6218a7d6542SBram Moolenaar
622df069eecSBram Moolenaardef Test_range_no_colon()
623df069eecSBram Moolenaar  call CheckDefFailure(['%s/a/b/'], 'E1050:')
624df069eecSBram Moolenaar  call CheckDefFailure(['+ s/a/b/'], 'E1050:')
625df069eecSBram Moolenaar  call CheckDefFailure(['- s/a/b/'], 'E1050:')
626df069eecSBram Moolenaar  call CheckDefFailure(['. s/a/b/'], 'E1050:')
627df069eecSBram Moolenaarenddef
628df069eecSBram Moolenaar
629df069eecSBram Moolenaar
6308a7d6542SBram Moolenaardef Test_block()
6318a7d6542SBram Moolenaar  let outer = 1
6328a7d6542SBram Moolenaar  {
6338a7d6542SBram Moolenaar    let inner = 2
6348a7d6542SBram Moolenaar    assert_equal(1, outer)
6358a7d6542SBram Moolenaar    assert_equal(2, inner)
6368a7d6542SBram Moolenaar  }
6378a7d6542SBram Moolenaar  assert_equal(1, outer)
6388a7d6542SBram Moolenaarenddef
6398a7d6542SBram Moolenaar
6408a7d6542SBram Moolenaarfunc Test_block_failure()
6418a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
642585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
643585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
6448a7d6542SBram Moolenaarendfunc
6458a7d6542SBram Moolenaar
646585fea7bSBram Moolenaardef Test_cmd_modifier()
647585fea7bSBram Moolenaar  tab echo '0'
648585fea7bSBram Moolenaar  call CheckDefFailure(['5tab echo 3'], 'E16:')
649585fea7bSBram Moolenaarenddef
650585fea7bSBram Moolenaar
651d032f34aSBram Moolenaarfunc g:NoSuchFunc()
652d032f34aSBram Moolenaar  echo 'none'
653d032f34aSBram Moolenaarendfunc
654d032f34aSBram Moolenaar
6558a7d6542SBram Moolenaardef Test_try_catch()
6568a7d6542SBram Moolenaar  let l = []
6577a092245SBram Moolenaar  try # comment
6588a7d6542SBram Moolenaar    add(l, '1')
6598a7d6542SBram Moolenaar    throw 'wrong'
6608a7d6542SBram Moolenaar    add(l, '2')
6617a092245SBram Moolenaar  catch # comment
6628a7d6542SBram Moolenaar    add(l, v:exception)
6637a092245SBram Moolenaar  finally # comment
6648a7d6542SBram Moolenaar    add(l, '3')
6657a092245SBram Moolenaar  endtry # comment
6668a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
66768d130c6SBram Moolenaar
668e859312eSBram Moolenaar  l = []
669e859312eSBram Moolenaar  try
670e859312eSBram Moolenaar    try
671e859312eSBram Moolenaar      add(l, '1')
672e859312eSBram Moolenaar      throw 'wrong'
673e859312eSBram Moolenaar      add(l, '2')
674e859312eSBram Moolenaar    catch /right/
675e859312eSBram Moolenaar      add(l, v:exception)
676e859312eSBram Moolenaar    endtry
677e859312eSBram Moolenaar  catch /wrong/
678e859312eSBram Moolenaar    add(l, 'caught')
679e859312eSBram Moolenaar  finally
680e859312eSBram Moolenaar    add(l, 'finally')
681e859312eSBram Moolenaar  endtry
682e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
683e859312eSBram Moolenaar
68468d130c6SBram Moolenaar  let n: number
68568d130c6SBram Moolenaar  try
68668d130c6SBram Moolenaar    n = l[3]
68768d130c6SBram Moolenaar  catch /E684:/
68868d130c6SBram Moolenaar    n = 99
68968d130c6SBram Moolenaar  endtry
69068d130c6SBram Moolenaar  assert_equal(99, n)
69168d130c6SBram Moolenaar
69268d130c6SBram Moolenaar  try
69368d130c6SBram Moolenaar    n = g:astring[3]
69468d130c6SBram Moolenaar  catch /E714:/
69568d130c6SBram Moolenaar    n = 77
69668d130c6SBram Moolenaar  endtry
69768d130c6SBram Moolenaar  assert_equal(77, n)
69868d130c6SBram Moolenaar
69968d130c6SBram Moolenaar  try
70068d130c6SBram Moolenaar    n = l[g:astring]
70168d130c6SBram Moolenaar  catch /E39:/
70268d130c6SBram Moolenaar    n = 77
70368d130c6SBram Moolenaar  endtry
70468d130c6SBram Moolenaar  assert_equal(77, n)
70568d130c6SBram Moolenaar
70668d130c6SBram Moolenaar  try
70768d130c6SBram Moolenaar    n = s:does_not_exist
70868d130c6SBram Moolenaar  catch /E121:/
709f0b9f43cSBram Moolenaar    n = 111
710f0b9f43cSBram Moolenaar  endtry
711f0b9f43cSBram Moolenaar  assert_equal(111, n)
712f0b9f43cSBram Moolenaar
713f0b9f43cSBram Moolenaar  try
714f0b9f43cSBram Moolenaar    n = g:does_not_exist
715f0b9f43cSBram Moolenaar  catch /E121:/
71668d130c6SBram Moolenaar    n = 121
71768d130c6SBram Moolenaar  endtry
71868d130c6SBram Moolenaar  assert_equal(121, n)
71968d130c6SBram Moolenaar
72068d130c6SBram Moolenaar  let d = #{one: 1}
72168d130c6SBram Moolenaar  try
72268d130c6SBram Moolenaar    n = d[g:astring]
72368d130c6SBram Moolenaar  catch /E716:/
72468d130c6SBram Moolenaar    n = 222
72568d130c6SBram Moolenaar  endtry
72668d130c6SBram Moolenaar  assert_equal(222, n)
727f0b9f43cSBram Moolenaar
728f0b9f43cSBram Moolenaar  try
729f0b9f43cSBram Moolenaar    n = -g:astring
730f0b9f43cSBram Moolenaar  catch /E39:/
731f0b9f43cSBram Moolenaar    n = 233
732f0b9f43cSBram Moolenaar  endtry
733f0b9f43cSBram Moolenaar  assert_equal(233, n)
734f0b9f43cSBram Moolenaar
735f0b9f43cSBram Moolenaar  try
736f0b9f43cSBram Moolenaar    n = +g:astring
737f0b9f43cSBram Moolenaar  catch /E1030:/
738f0b9f43cSBram Moolenaar    n = 244
739f0b9f43cSBram Moolenaar  endtry
740f0b9f43cSBram Moolenaar  assert_equal(244, n)
741f0b9f43cSBram Moolenaar
742f0b9f43cSBram Moolenaar  try
743f0b9f43cSBram Moolenaar    n = +g:alist
744f0b9f43cSBram Moolenaar  catch /E745:/
745f0b9f43cSBram Moolenaar    n = 255
746f0b9f43cSBram Moolenaar  endtry
747f0b9f43cSBram Moolenaar  assert_equal(255, n)
748f0b9f43cSBram Moolenaar
749f0b9f43cSBram Moolenaar  let nd: dict<any>
750f0b9f43cSBram Moolenaar  try
751f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
752f0b9f43cSBram Moolenaar  catch /E1029:/
753f0b9f43cSBram Moolenaar    n = 266
754f0b9f43cSBram Moolenaar  endtry
755f0b9f43cSBram Moolenaar  assert_equal(266, n)
756f0b9f43cSBram Moolenaar
757f0b9f43cSBram Moolenaar  try
758f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
759f0b9f43cSBram Moolenaar  catch /E1093:/
760f0b9f43cSBram Moolenaar    n = 277
761f0b9f43cSBram Moolenaar  endtry
762f0b9f43cSBram Moolenaar  assert_equal(277, n)
763f0b9f43cSBram Moolenaar
764e859312eSBram Moolenaar  try
765e859312eSBram Moolenaar    &ts = g:astring
766e859312eSBram Moolenaar  catch /E1029:/
767e859312eSBram Moolenaar    n = 288
768e859312eSBram Moolenaar  endtry
769e859312eSBram Moolenaar  assert_equal(288, n)
770e859312eSBram Moolenaar
771e859312eSBram Moolenaar  try
772e859312eSBram Moolenaar    &backspace = 'asdf'
773e859312eSBram Moolenaar  catch /E474:/
774e859312eSBram Moolenaar    n = 299
775e859312eSBram Moolenaar  endtry
776e859312eSBram Moolenaar  assert_equal(299, n)
777e859312eSBram Moolenaar
778e859312eSBram Moolenaar  l = [1]
779e859312eSBram Moolenaar  try
780e859312eSBram Moolenaar    l[3] = 3
781e859312eSBram Moolenaar  catch /E684:/
782e859312eSBram Moolenaar    n = 300
783e859312eSBram Moolenaar  endtry
784e859312eSBram Moolenaar  assert_equal(300, n)
785e859312eSBram Moolenaar
786e859312eSBram Moolenaar  try
787e859312eSBram Moolenaar    d[''] = 3
788e859312eSBram Moolenaar  catch /E713:/
789e859312eSBram Moolenaar    n = 311
790e859312eSBram Moolenaar  endtry
791e859312eSBram Moolenaar  assert_equal(311, n)
792e859312eSBram Moolenaar
793e859312eSBram Moolenaar  try
794e859312eSBram Moolenaar    unlet g:does_not_exist
795e859312eSBram Moolenaar  catch /E108:/
796e859312eSBram Moolenaar    n = 322
797e859312eSBram Moolenaar  endtry
798e859312eSBram Moolenaar  assert_equal(322, n)
799e859312eSBram Moolenaar
800e859312eSBram Moolenaar  try
801e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
802e859312eSBram Moolenaar  catch /E721:/
803e859312eSBram Moolenaar    n = 333
804e859312eSBram Moolenaar  endtry
805e859312eSBram Moolenaar  assert_equal(333, n)
806e859312eSBram Moolenaar
807e859312eSBram Moolenaar  try
808e859312eSBram Moolenaar    l = DeletedFunc()
809e859312eSBram Moolenaar  catch /E933:/
810e859312eSBram Moolenaar    n = 344
811e859312eSBram Moolenaar  endtry
812e859312eSBram Moolenaar  assert_equal(344, n)
813d032f34aSBram Moolenaar
814d032f34aSBram Moolenaar  try
815d032f34aSBram Moolenaar    echo len(v:true)
816d032f34aSBram Moolenaar  catch /E701:/
817d032f34aSBram Moolenaar    n = 355
818d032f34aSBram Moolenaar  endtry
819d032f34aSBram Moolenaar  assert_equal(355, n)
820d032f34aSBram Moolenaar
821d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
822d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
823d032f34aSBram Moolenaar  try
824d032f34aSBram Moolenaar    echo P()
825d032f34aSBram Moolenaar  catch /E117:/
826d032f34aSBram Moolenaar    n = 366
827d032f34aSBram Moolenaar  endtry
828d032f34aSBram Moolenaar  assert_equal(366, n)
829d032f34aSBram Moolenaar
830d032f34aSBram Moolenaar  try
831d032f34aSBram Moolenaar    echo g:NoSuchFunc()
832d032f34aSBram Moolenaar  catch /E117:/
833d032f34aSBram Moolenaar    n = 377
834d032f34aSBram Moolenaar  endtry
835d032f34aSBram Moolenaar  assert_equal(377, n)
836d032f34aSBram Moolenaar
837d032f34aSBram Moolenaar  try
838d032f34aSBram Moolenaar    echo g:alist + 4
839d032f34aSBram Moolenaar  catch /E745:/
840d032f34aSBram Moolenaar    n = 388
841d032f34aSBram Moolenaar  endtry
842d032f34aSBram Moolenaar  assert_equal(388, n)
843d032f34aSBram Moolenaar
844d032f34aSBram Moolenaar  try
845d032f34aSBram Moolenaar    echo 4 + g:alist
846d032f34aSBram Moolenaar  catch /E745:/
847d032f34aSBram Moolenaar    n = 399
848d032f34aSBram Moolenaar  endtry
849d032f34aSBram Moolenaar  assert_equal(399, n)
850d032f34aSBram Moolenaar
851d032f34aSBram Moolenaar  try
852d032f34aSBram Moolenaar    echo g:alist.member
853d032f34aSBram Moolenaar  catch /E715:/
854d032f34aSBram Moolenaar    n = 400
855d032f34aSBram Moolenaar  endtry
856d032f34aSBram Moolenaar  assert_equal(400, n)
857d032f34aSBram Moolenaar
858d032f34aSBram Moolenaar  try
859d032f34aSBram Moolenaar    echo d.member
860d032f34aSBram Moolenaar  catch /E716:/
861d032f34aSBram Moolenaar    n = 411
862d032f34aSBram Moolenaar  endtry
863d032f34aSBram Moolenaar  assert_equal(411, n)
8648a7d6542SBram Moolenaarenddef
8658a7d6542SBram Moolenaar
866e859312eSBram Moolenaardef DeletedFunc(): list<any>
867e859312eSBram Moolenaar  return ['delete me']
868e859312eSBram Moolenaarenddef
869e859312eSBram Moolenaardefcompile
870e859312eSBram Moolenaardelfunc DeletedFunc
871e859312eSBram Moolenaar
872257cc5eeSBram Moolenaardef ThrowFromDef()
873a72cfb80SBram Moolenaar  throw "getout" # comment
874257cc5eeSBram Moolenaarenddef
875257cc5eeSBram Moolenaar
876257cc5eeSBram Moolenaarfunc CatchInFunc()
877257cc5eeSBram Moolenaar  try
878257cc5eeSBram Moolenaar    call ThrowFromDef()
879257cc5eeSBram Moolenaar  catch
880257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
881257cc5eeSBram Moolenaar  endtry
882257cc5eeSBram Moolenaarendfunc
883257cc5eeSBram Moolenaar
884257cc5eeSBram Moolenaardef CatchInDef()
885257cc5eeSBram Moolenaar  try
886257cc5eeSBram Moolenaar    ThrowFromDef()
887257cc5eeSBram Moolenaar  catch
888257cc5eeSBram Moolenaar    g:thrown_def = v:exception
889257cc5eeSBram Moolenaar  endtry
890257cc5eeSBram Moolenaarenddef
891257cc5eeSBram Moolenaar
892f575adffSBram Moolenaardef ReturnFinally(): string
893f575adffSBram Moolenaar  try
894f575adffSBram Moolenaar    return 'intry'
895f575adffSBram Moolenaar  finally
896f575adffSBram Moolenaar    g:in_finally = 'finally'
897f575adffSBram Moolenaar  endtry
898f575adffSBram Moolenaar  return 'end'
899f575adffSBram Moolenaarenddef
900f575adffSBram Moolenaar
901257cc5eeSBram Moolenaardef Test_try_catch_nested()
902257cc5eeSBram Moolenaar  CatchInFunc()
903257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
904257cc5eeSBram Moolenaar
905257cc5eeSBram Moolenaar  CatchInDef()
906257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
907f575adffSBram Moolenaar
908f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
909f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
910f575adffSBram Moolenaarenddef
911f575adffSBram Moolenaar
912f575adffSBram Moolenaardef Test_try_catch_match()
913f575adffSBram Moolenaar  let seq = 'a'
914f575adffSBram Moolenaar  try
915f575adffSBram Moolenaar    throw 'something'
916f575adffSBram Moolenaar  catch /nothing/
917f575adffSBram Moolenaar    seq ..= 'x'
918f575adffSBram Moolenaar  catch /some/
919f575adffSBram Moolenaar    seq ..= 'b'
920f575adffSBram Moolenaar  catch /asdf/
921f575adffSBram Moolenaar    seq ..= 'x'
922e8c4abbbSBram Moolenaar  catch ?a\?sdf?
923e8c4abbbSBram Moolenaar    seq ..= 'y'
924f575adffSBram Moolenaar  finally
925f575adffSBram Moolenaar    seq ..= 'c'
926f575adffSBram Moolenaar  endtry
927f575adffSBram Moolenaar  assert_equal('abc', seq)
928257cc5eeSBram Moolenaarenddef
929257cc5eeSBram Moolenaar
930e8c4abbbSBram Moolenaardef Test_try_catch_fails()
931e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
932e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
933e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
934585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
935585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
936585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
937585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
938585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
939585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
940585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
941585fea7bSBram Moolenaar
942a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
943585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
944e8c4abbbSBram Moolenaarenddef
945e8c4abbbSBram Moolenaar
946006ad48bSBram Moolenaardef Test_throw_vimscript()
947f5be8cdbSBram Moolenaar  # only checks line continuation
948006ad48bSBram Moolenaar  let lines =<< trim END
949006ad48bSBram Moolenaar      vim9script
950006ad48bSBram Moolenaar      try
951006ad48bSBram Moolenaar        throw 'one'
952006ad48bSBram Moolenaar              .. 'two'
953006ad48bSBram Moolenaar      catch
954006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
955006ad48bSBram Moolenaar      endtry
956006ad48bSBram Moolenaar  END
957006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
958006ad48bSBram Moolenaarenddef
959006ad48bSBram Moolenaar
96037c83711SBram Moolenaardef Test_cexpr_vimscript()
961f5be8cdbSBram Moolenaar  # only checks line continuation
96237c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
96337c83711SBram Moolenaar  let lines =<< trim END
96437c83711SBram Moolenaar      vim9script
96537c83711SBram Moolenaar      cexpr 'File'
96637c83711SBram Moolenaar                .. ' someFile' ..
96737c83711SBram Moolenaar                   ' line 19'
96837c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
96937c83711SBram Moolenaar  END
97037c83711SBram Moolenaar  CheckScriptSuccess(lines)
97137c83711SBram Moolenaar  set errorformat&
97237c83711SBram Moolenaarenddef
97337c83711SBram Moolenaar
974b209750bSBram Moolenaardef Test_list_vimscript()
975b209750bSBram Moolenaar  # checks line continuation and comments
976b209750bSBram Moolenaar  let lines =<< trim END
977b209750bSBram Moolenaar      vim9script
978b209750bSBram Moolenaar      let mylist = [
979b209750bSBram Moolenaar            'one',
980b209750bSBram Moolenaar            # comment
981b209750bSBram Moolenaar            'two', # empty line follows
982b209750bSBram Moolenaar
983b209750bSBram Moolenaar            'three',
984b209750bSBram Moolenaar            ]
985b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
986b209750bSBram Moolenaar  END
987b209750bSBram Moolenaar  CheckScriptSuccess(lines)
988b209750bSBram Moolenaarenddef
989b209750bSBram Moolenaar
9902a1381c3SBram Moolenaarif has('channel')
99140ee466cSBram Moolenaar  let someJob = test_null_job()
99240ee466cSBram Moolenaar
99340ee466cSBram Moolenaar  def FuncWithError()
99440ee466cSBram Moolenaar    echomsg g:someJob
99540ee466cSBram Moolenaar  enddef
99640ee466cSBram Moolenaar
99740ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
99840ee466cSBram Moolenaar    try
99940ee466cSBram Moolenaar      call FuncWithError()
100040ee466cSBram Moolenaar    catch
100140ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
100240ee466cSBram Moolenaar    endtry
100340ee466cSBram Moolenaar  endfunc
10042a1381c3SBram Moolenaarendif
100540ee466cSBram Moolenaar
10068a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
10078a7d6542SBram Moolenaar  vim9script
10088a7d6542SBram Moolenaar  let name: string = 'bob'
10098a7d6542SBram Moolenaar  def Concat(arg: string): string
10108a7d6542SBram Moolenaar    return name .. arg
10118a7d6542SBram Moolenaar  enddef
1012227a69deSBram Moolenaar  g:result = Concat('bie')
1013227a69deSBram Moolenaar  g:localname = name
10148a7d6542SBram Moolenaar
10158a7d6542SBram Moolenaar  export const CONST = 1234
10168a7d6542SBram Moolenaar  export let exported = 9876
10176e587dcbSBram Moolenaar  export let exp_name = 'John'
10188a7d6542SBram Moolenaar  export def Exported(): string
10198a7d6542SBram Moolenaar    return 'Exported'
10208a7d6542SBram Moolenaar  enddef
10218a7d6542SBram MoolenaarEND
10228a7d6542SBram Moolenaar
10235269bd2aSBram Moolenaardef Test_vim9_import_export()
10248a7d6542SBram Moolenaar  let import_script_lines =<< trim END
10258a7d6542SBram Moolenaar    vim9script
10268a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
10278a7d6542SBram Moolenaar    g:imported = exported
10286e587dcbSBram Moolenaar    exported += 3
10296e587dcbSBram Moolenaar    g:imported_added = exported
10308a7d6542SBram Moolenaar    g:imported_func = Exported()
10316e587dcbSBram Moolenaar
103240f4f7a4SBram Moolenaar    def GetExported(): string
103340f4f7a4SBram Moolenaar      let local_dict = #{ref: Exported}
103440f4f7a4SBram Moolenaar      return local_dict.ref()
103540f4f7a4SBram Moolenaar    enddef
103640f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
103740f4f7a4SBram Moolenaar
10386e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
10396e587dcbSBram Moolenaar    g:imported_name = exp_name
10406e587dcbSBram Moolenaar    exp_name ..= ' Doe'
10416e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
10425381c7a1SBram Moolenaar    g:imported_later = exported
10438a7d6542SBram Moolenaar  END
10448a7d6542SBram Moolenaar
10458a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
10468a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
10478a7d6542SBram Moolenaar
10488a7d6542SBram Moolenaar  source Ximport.vim
10498a7d6542SBram Moolenaar
10508a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
10518a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
10528a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
10536e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
10545381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
10558a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
105640f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
10576e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
10586e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
10598a7d6542SBram Moolenaar  assert_false(exists('g:name'))
10608a7d6542SBram Moolenaar
10618a7d6542SBram Moolenaar  unlet g:result
10628a7d6542SBram Moolenaar  unlet g:localname
10638a7d6542SBram Moolenaar  unlet g:imported
10646e587dcbSBram Moolenaar  unlet g:imported_added
10655381c7a1SBram Moolenaar  unlet g:imported_later
10668a7d6542SBram Moolenaar  unlet g:imported_func
10676e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
10688a7d6542SBram Moolenaar  delete('Ximport.vim')
1069f2d5c240SBram Moolenaar
10701c991144SBram Moolenaar  # similar, with line breaks
10711c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
10721c991144SBram Moolenaar    vim9script
10731c991144SBram Moolenaar    import {
10741c991144SBram Moolenaar        exported,
10751c991144SBram Moolenaar        Exported,
10761c991144SBram Moolenaar        }
10771c991144SBram Moolenaar        from
10781c991144SBram Moolenaar        './Xexport.vim'
10791c991144SBram Moolenaar    g:imported = exported
10801c991144SBram Moolenaar    exported += 5
10811c991144SBram Moolenaar    g:imported_added = exported
10821c991144SBram Moolenaar    g:imported_func = Exported()
10831c991144SBram Moolenaar  END
10841c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
10851c991144SBram Moolenaar  source Ximport_lbr.vim
10861c991144SBram Moolenaar
10871c991144SBram Moolenaar  assert_equal(9876, g:imported)
10881c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
10891c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
10901c991144SBram Moolenaar
10911c991144SBram Moolenaar  # exported script not sourced again
10921c991144SBram Moolenaar  assert_false(exists('g:result'))
10931c991144SBram Moolenaar  unlet g:imported
10941c991144SBram Moolenaar  unlet g:imported_added
10951c991144SBram Moolenaar  unlet g:imported_func
10961c991144SBram Moolenaar  delete('Ximport_lbr.vim')
10971c991144SBram Moolenaar
10981c991144SBram Moolenaar  # import inside :def function
10995381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
11005381c7a1SBram Moolenaar    vim9script
11015381c7a1SBram Moolenaar    def ImportInDef()
11025381c7a1SBram Moolenaar      import exported from './Xexport.vim'
11035381c7a1SBram Moolenaar      g:imported = exported
11045381c7a1SBram Moolenaar      exported += 7
11055381c7a1SBram Moolenaar      g:imported_added = exported
11065381c7a1SBram Moolenaar    enddef
11075381c7a1SBram Moolenaar    ImportInDef()
11085381c7a1SBram Moolenaar  END
11095381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
11105381c7a1SBram Moolenaar  source Ximport2.vim
1111f5be8cdbSBram Moolenaar  # TODO: this should be 9879
11125381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
11135381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
11145381c7a1SBram Moolenaar  unlet g:imported
11155381c7a1SBram Moolenaar  unlet g:imported_added
11165381c7a1SBram Moolenaar  delete('Ximport2.vim')
11175381c7a1SBram Moolenaar
1118f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
1119f2d5c240SBram Moolenaar    vim9script
1120f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1121f2d5c240SBram Moolenaar    def UseExport()
1122f2d5c240SBram Moolenaar      g:imported = Export.exported
1123f2d5c240SBram Moolenaar    enddef
1124f2d5c240SBram Moolenaar    UseExport()
1125f2d5c240SBram Moolenaar  END
1126f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1127f2d5c240SBram Moolenaar  source Ximport.vim
11285381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1129f2d5c240SBram Moolenaar
1130599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
1131599c89c8SBram Moolenaar    vim9script
1132599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1133599c89c8SBram Moolenaar    def Func()
1134599c89c8SBram Moolenaar      let dummy = 1
1135599c89c8SBram Moolenaar      let imported = Export + dummy
1136599c89c8SBram Moolenaar    enddef
1137822ba247SBram Moolenaar    defcompile
1138599c89c8SBram Moolenaar  END
1139599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
1140599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
1141599c89c8SBram Moolenaar
1142599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
1143599c89c8SBram Moolenaar    vim9script
1144599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1145599c89c8SBram Moolenaar    def Func()
1146599c89c8SBram Moolenaar      let imported = Export . exported
1147599c89c8SBram Moolenaar    enddef
1148822ba247SBram Moolenaar    defcompile
1149599c89c8SBram Moolenaar  END
1150599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
1151599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1152599c89c8SBram Moolenaar
1153599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
1154599c89c8SBram Moolenaar    vim9script
1155599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1156599c89c8SBram Moolenaar    def Func()
1157599c89c8SBram Moolenaar      let imported = Export.
1158599c89c8SBram Moolenaar    enddef
1159822ba247SBram Moolenaar    defcompile
1160599c89c8SBram Moolenaar  END
1161599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
1162599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1163599c89c8SBram Moolenaar
11641c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
11651c991144SBram Moolenaar    vim9script
11661c991144SBram Moolenaar    import *
11671c991144SBram Moolenaar        as Export
11681c991144SBram Moolenaar        from
11691c991144SBram Moolenaar        './Xexport.vim'
11701c991144SBram Moolenaar    def UseExport()
11711c991144SBram Moolenaar      g:imported = Export.exported
11721c991144SBram Moolenaar    enddef
11731c991144SBram Moolenaar    UseExport()
11741c991144SBram Moolenaar  END
11751c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
11761c991144SBram Moolenaar  source Ximport.vim
11771c991144SBram Moolenaar  assert_equal(9883, g:imported)
11781c991144SBram Moolenaar
1179f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1180f2d5c240SBram Moolenaar    vim9script
1181f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1182f2d5c240SBram Moolenaar  END
1183f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
1184f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
1185f2d5c240SBram Moolenaar
1186f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1187fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1188fa29c8abSBram Moolenaar    vim9script
1189fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1190fa29c8abSBram Moolenaar  END
1191fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
1192fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
1193fa29c8abSBram Moolenaar
1194f5be8cdbSBram Moolenaar  # try to import something that is already defined
11955269bd2aSBram Moolenaar  let import_already_defined =<< trim END
11965269bd2aSBram Moolenaar    vim9script
11975269bd2aSBram Moolenaar    let exported = 'something'
11985269bd2aSBram Moolenaar    import exported from './Xexport.vim'
11995269bd2aSBram Moolenaar  END
12005269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
12015269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
12025269bd2aSBram Moolenaar
1203f5be8cdbSBram Moolenaar  # try to import something that is already defined
12045269bd2aSBram Moolenaar  import_already_defined =<< trim END
12055269bd2aSBram Moolenaar    vim9script
12065269bd2aSBram Moolenaar    let exported = 'something'
12075269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
12085269bd2aSBram Moolenaar  END
12095269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
12105269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
12115269bd2aSBram Moolenaar
1212f5be8cdbSBram Moolenaar  # try to import something that is already defined
12135269bd2aSBram Moolenaar  import_already_defined =<< trim END
12145269bd2aSBram Moolenaar    vim9script
12155269bd2aSBram Moolenaar    let exported = 'something'
12165269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
12175269bd2aSBram Moolenaar  END
12185269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
12195269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
12205269bd2aSBram Moolenaar
1221f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1222fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1223fa29c8abSBram Moolenaar    vim9script
1224fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1225fa29c8abSBram Moolenaar  END
1226fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
1227fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1228fa29c8abSBram Moolenaar
1229fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1230fa29c8abSBram Moolenaar    vim9script
1231fa29c8abSBram Moolenaar    import name './Xexport.vim'
1232fa29c8abSBram Moolenaar  END
1233fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
1234fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
1235fa29c8abSBram Moolenaar
1236fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1237fa29c8abSBram Moolenaar    vim9script
1238fa29c8abSBram Moolenaar    import name from Xexport.vim
1239fa29c8abSBram Moolenaar  END
1240fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
1241fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
1242fa29c8abSBram Moolenaar
1243fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1244fa29c8abSBram Moolenaar    vim9script
1245fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1246fa29c8abSBram Moolenaar  END
1247fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
1248fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
1249fa29c8abSBram Moolenaar
1250fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1251fa29c8abSBram Moolenaar    vim9script
1252fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1253fa29c8abSBram Moolenaar  END
12545269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
12555269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
1256fa29c8abSBram Moolenaar
1257f2d5c240SBram Moolenaar  delete('Ximport.vim')
12585269bd2aSBram Moolenaar  delete('Ximport3.vim')
12598a7d6542SBram Moolenaar  delete('Xexport.vim')
12608a7d6542SBram Moolenaar
1261f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1262750802b5SBram Moolenaar  set cpo&vi
1263750802b5SBram Moolenaar  let cpo_before = &cpo
1264750802b5SBram Moolenaar  let lines =<< trim END
1265750802b5SBram Moolenaar    vim9script
1266750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1267750802b5SBram Moolenaar  END
1268750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1269750802b5SBram Moolenaar  source Xvim9_script
1270750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1271750802b5SBram Moolenaar  set cpo&vim
1272750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1273750802b5SBram Moolenaar  delete('Xvim9_script')
1274750802b5SBram Moolenaarenddef
1275750802b5SBram Moolenaar
1276750802b5SBram Moolenaardef Test_vim9script_fails()
12778a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
12788a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1279750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
12809721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
12819b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1282750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1283750802b5SBram Moolenaar
1284c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:')
1285c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1286c785b9a7SBram Moolenaar
1287750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
1288a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
12898a7d6542SBram Moolenaarenddef
12908a7d6542SBram Moolenaar
1291f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1292101f4810SBram Moolenaar  CheckRunVimInTerminal
1293101f4810SBram Moolenaar
12949bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1295c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
12969bb3eb3eSBram Moolenaarendfunc
12979bb3eb3eSBram Moolenaar
1298c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1299101f4810SBram Moolenaar  let export =<< trim END
1300101f4810SBram Moolenaar    vim9script
1301101f4810SBram Moolenaar    export def Foo(): number
1302101f4810SBram Moolenaar        return 0
1303101f4810SBram Moolenaar    enddef
1304101f4810SBram Moolenaar  END
13059bb3eb3eSBram Moolenaar  writefile(export, 'Xexport.vim')
1306101f4810SBram Moolenaar
13079bb3eb3eSBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{
13089bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
13099bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1310101f4810SBram Moolenaar
13119bb3eb3eSBram Moolenaar  delete('Xexport.vim')
13129bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
13139bb3eb3eSBram Moolenaarenddef
1314101f4810SBram Moolenaar
13154c17ad94SBram Moolenaardef Test_vim9script_reload_import()
13168a7d6542SBram Moolenaar  let lines =<< trim END
13178a7d6542SBram Moolenaar    vim9script
13188a7d6542SBram Moolenaar    const var = ''
13198a7d6542SBram Moolenaar    let valone = 1234
13208a7d6542SBram Moolenaar    def MyFunc(arg: string)
13218a7d6542SBram Moolenaar       valone = 5678
13228a7d6542SBram Moolenaar    enddef
13238a7d6542SBram Moolenaar  END
13248a7d6542SBram Moolenaar  let morelines =<< trim END
13258a7d6542SBram Moolenaar    let valtwo = 222
13268a7d6542SBram Moolenaar    export def GetValtwo(): number
13278a7d6542SBram Moolenaar      return valtwo
13288a7d6542SBram Moolenaar    enddef
13298a7d6542SBram Moolenaar  END
133003afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
13318a7d6542SBram Moolenaar  source Xreload.vim
13328a7d6542SBram Moolenaar  source Xreload.vim
13338a7d6542SBram Moolenaar  source Xreload.vim
13348a7d6542SBram Moolenaar
13358a7d6542SBram Moolenaar  let testlines =<< trim END
13368a7d6542SBram Moolenaar    vim9script
13378a7d6542SBram Moolenaar    def TheFunc()
13388a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
13398a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
13408a7d6542SBram Moolenaar    enddef
13418a7d6542SBram Moolenaar    TheFunc()
13428a7d6542SBram Moolenaar  END
13438a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
13448a7d6542SBram Moolenaar  source Ximport.vim
13458a7d6542SBram Moolenaar
1346f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1347f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
13488a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
13498a7d6542SBram Moolenaar  source Ximport.vim
13508a7d6542SBram Moolenaar
1351f5be8cdbSBram Moolenaar  # cannot declare a var twice
13528a7d6542SBram Moolenaar  lines =<< trim END
13538a7d6542SBram Moolenaar    vim9script
13548a7d6542SBram Moolenaar    let valone = 1234
13558a7d6542SBram Moolenaar    let valone = 5678
13568a7d6542SBram Moolenaar  END
13578a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
13588a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
13598a7d6542SBram Moolenaar
13608a7d6542SBram Moolenaar  delete('Xreload.vim')
13618a7d6542SBram Moolenaar  delete('Ximport.vim')
13628a7d6542SBram Moolenaarenddef
13638a7d6542SBram Moolenaar
1364fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1365fe465a01SBram Moolenaar" script-local name.
1366fe465a01SBram Moolenaardef Test_vim9script_funcref()
1367fe465a01SBram Moolenaar  let sortlines =<< trim END
1368fe465a01SBram Moolenaar      vim9script
1369fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1370bed36b93SBram Moolenaar        return i2 - i1
1371fe465a01SBram Moolenaar      enddef
1372fe465a01SBram Moolenaar
1373fe465a01SBram Moolenaar      export def FastSort(): list<number>
1374fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1375fe465a01SBram Moolenaar      enddef
1376fe465a01SBram Moolenaar  END
1377fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1378fe465a01SBram Moolenaar
1379fe465a01SBram Moolenaar  let lines =<< trim END
1380fe465a01SBram Moolenaar    vim9script
1381fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1382fe465a01SBram Moolenaar    def Test()
1383fe465a01SBram Moolenaar      g:result = FastSort()
1384fe465a01SBram Moolenaar    enddef
1385fe465a01SBram Moolenaar    Test()
1386fe465a01SBram Moolenaar  END
1387fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1388fe465a01SBram Moolenaar
1389fe465a01SBram Moolenaar  source Xscript.vim
1390fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1391fe465a01SBram Moolenaar
1392fe465a01SBram Moolenaar  unlet g:result
1393fe465a01SBram Moolenaar  delete('Xsort.vim')
1394fe465a01SBram Moolenaar  delete('Xscript.vim')
1395fe465a01SBram Moolenaarenddef
1396fe465a01SBram Moolenaar
1397c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the
1398c620c055SBram Moolenaar" script where FastFilter() is called from.
1399c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1400c620c055SBram Moolenaar  let filterLines =<< trim END
1401c620c055SBram Moolenaar    vim9script
1402c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1403c620c055SBram Moolenaar      return idx % 2 == 1
1404c620c055SBram Moolenaar    enddef
1405c620c055SBram Moolenaar    export def FastFilter(): list<number>
1406c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1407c620c055SBram Moolenaar    enddef
1408c620c055SBram Moolenaar  END
1409c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1410c620c055SBram Moolenaar
1411c620c055SBram Moolenaar  let lines =<< trim END
1412c620c055SBram Moolenaar    vim9script
1413c620c055SBram Moolenaar    import {FilterFunc, FastFilter} from './Xfilter.vim'
1414c620c055SBram Moolenaar    def Test()
1415c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1416c620c055SBram Moolenaar    enddef
1417c620c055SBram Moolenaar    Test()
1418c620c055SBram Moolenaar  END
1419c620c055SBram Moolenaar  writefile(lines, 'Ximport.vim')
1420c620c055SBram Moolenaar  assert_fails('source Ximport.vim', 'E121:')
1421c620c055SBram Moolenaar
1422c620c055SBram Moolenaar  delete('Xfilter.vim')
1423c620c055SBram Moolenaar  delete('Ximport.vim')
1424c620c055SBram Moolenaarenddef
1425c620c055SBram Moolenaar
14264c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
14274c17ad94SBram Moolenaar  let first_lines =<< trim END
14284c17ad94SBram Moolenaar    vim9script
14294c17ad94SBram Moolenaar    def FuncYes(): string
14304c17ad94SBram Moolenaar      return 'yes'
14314c17ad94SBram Moolenaar    enddef
14324c17ad94SBram Moolenaar  END
143303afdcf1SBram Moolenaar  let withno_lines =<< trim END
14344c17ad94SBram Moolenaar    def FuncNo(): string
14354c17ad94SBram Moolenaar      return 'no'
14364c17ad94SBram Moolenaar    enddef
14374c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
14384c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
14394c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
144003afdcf1SBram Moolenaar    enddef
144103afdcf1SBram Moolenaar  END
144203afdcf1SBram Moolenaar  let nono_lines =<< trim END
144303afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
144403afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
14454c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
14464c17ad94SBram Moolenaar    enddef
14474c17ad94SBram Moolenaar  END
14484c17ad94SBram Moolenaar
14494c17ad94SBram Moolenaar  # FuncNo() is defined
145003afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
14514c17ad94SBram Moolenaar  source Xreloaded.vim
14524c17ad94SBram Moolenaar  g:DoCheck(true)
14534c17ad94SBram Moolenaar
14544c17ad94SBram Moolenaar  # FuncNo() is not redefined
145503afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
14564c17ad94SBram Moolenaar  source Xreloaded.vim
145703afdcf1SBram Moolenaar  g:DoCheck()
14584c17ad94SBram Moolenaar
14594c17ad94SBram Moolenaar  # FuncNo() is back
146003afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
14614c17ad94SBram Moolenaar  source Xreloaded.vim
146203afdcf1SBram Moolenaar  g:DoCheck()
14634c17ad94SBram Moolenaar
14644c17ad94SBram Moolenaar  delete('Xreloaded.vim')
14654c17ad94SBram Moolenaarenddef
14664c17ad94SBram Moolenaar
146789483d40SBram Moolenaardef Test_vim9script_reload_delvar()
146889483d40SBram Moolenaar  # write the script with a script-local variable
146989483d40SBram Moolenaar  let lines =<< trim END
147089483d40SBram Moolenaar    vim9script
147189483d40SBram Moolenaar    let var = 'string'
147289483d40SBram Moolenaar  END
147389483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
147489483d40SBram Moolenaar  source XreloadVar.vim
147589483d40SBram Moolenaar
147689483d40SBram Moolenaar  # now write the script using the same variable locally - works
147789483d40SBram Moolenaar  lines =<< trim END
147889483d40SBram Moolenaar    vim9script
147989483d40SBram Moolenaar    def Func()
148089483d40SBram Moolenaar      let var = 'string'
148189483d40SBram Moolenaar    enddef
148289483d40SBram Moolenaar  END
148389483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
148489483d40SBram Moolenaar  source XreloadVar.vim
148589483d40SBram Moolenaar
148689483d40SBram Moolenaar  delete('XreloadVar.vim')
148789483d40SBram Moolenaarenddef
148889483d40SBram Moolenaar
14898a7d6542SBram Moolenaardef Test_import_absolute()
14908a7d6542SBram Moolenaar  let import_lines = [
1491e6085c53SBram Moolenaar        'vim9script',
1492e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1493e6085c53SBram Moolenaar        'def UseExported()',
1494e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1495e6085c53SBram Moolenaar        '  exported = 8888',
1496e6085c53SBram Moolenaar        '  g:imported_after = exported',
1497e6085c53SBram Moolenaar        'enddef',
1498e6085c53SBram Moolenaar        'UseExported()',
1499e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1500e6085c53SBram Moolenaar        ]
15018a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
15028a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
15038a7d6542SBram Moolenaar
15048a7d6542SBram Moolenaar  source Ximport_abs.vim
15058a7d6542SBram Moolenaar
15068a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
15074e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1508675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1509675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1510675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1511675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1512675f716eSBram Moolenaar          'exported = 8888.*' ..
1513675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1514675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1515675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1516675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1517e6085c53SBram Moolenaar        g:import_disassembled)
15188a7d6542SBram Moolenaar  unlet g:imported_abs
15194e12a5dfSBram Moolenaar  unlet g:import_disassembled
15208a7d6542SBram Moolenaar
15218a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
15228a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
15238a7d6542SBram Moolenaarenddef
15248a7d6542SBram Moolenaar
15258a7d6542SBram Moolenaardef Test_import_rtp()
15268a7d6542SBram Moolenaar  let import_lines = [
1527e6085c53SBram Moolenaar        'vim9script',
1528e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1529e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1530e6085c53SBram Moolenaar        ]
15318a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
15328a7d6542SBram Moolenaar  mkdir('import')
15338a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
15348a7d6542SBram Moolenaar
15358a7d6542SBram Moolenaar  let save_rtp = &rtp
15368a7d6542SBram Moolenaar  &rtp = getcwd()
15378a7d6542SBram Moolenaar  source Ximport_rtp.vim
15388a7d6542SBram Moolenaar  &rtp = save_rtp
15398a7d6542SBram Moolenaar
15408a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
15418a7d6542SBram Moolenaar  unlet g:imported_rtp
15428a7d6542SBram Moolenaar
15438a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
154489483d40SBram Moolenaar  delete('import', 'rf')
15458a7d6542SBram Moolenaarenddef
15468a7d6542SBram Moolenaar
154725e0f586SBram Moolenaardef Test_import_compile_error()
154825e0f586SBram Moolenaar  let export_lines = [
154925e0f586SBram Moolenaar        'vim9script',
155025e0f586SBram Moolenaar        'export def ExpFunc(): string',
155125e0f586SBram Moolenaar        '  return notDefined',
155225e0f586SBram Moolenaar        'enddef',
155325e0f586SBram Moolenaar        ]
155425e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
155525e0f586SBram Moolenaar
155625e0f586SBram Moolenaar  let import_lines = [
155725e0f586SBram Moolenaar        'vim9script',
155825e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
155925e0f586SBram Moolenaar        'def ImpFunc()',
156025e0f586SBram Moolenaar        '  echo ExpFunc()',
156125e0f586SBram Moolenaar        'enddef',
156225e0f586SBram Moolenaar        'defcompile',
156325e0f586SBram Moolenaar        ]
156425e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
156525e0f586SBram Moolenaar
156625e0f586SBram Moolenaar  try
156725e0f586SBram Moolenaar    source Ximport.vim
156825e0f586SBram Moolenaar  catch /E1001/
1569f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
157025e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
157125e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
157225e0f586SBram Moolenaar  endtry
157325e0f586SBram Moolenaar
157425e0f586SBram Moolenaar  delete('Xexported.vim')
157525e0f586SBram Moolenaar  delete('Ximport.vim')
157625e0f586SBram Moolenaarenddef
157725e0f586SBram Moolenaar
15788a7d6542SBram Moolenaardef Test_fixed_size_list()
1579f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
15808a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
15818a7d6542SBram Moolenaar  l->remove(0)
15828a7d6542SBram Moolenaar  l->add(5)
15838a7d6542SBram Moolenaar  l->insert(99, 1)
15840f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
15858a7d6542SBram Moolenaarenddef
15868a7d6542SBram Moolenaar
1587ae616494SBram Moolenaardef Test_no_insert_xit()
1588ae616494SBram Moolenaar  call CheckDefExecFailure(['x = 1'], 'E1100:')
1589ae616494SBram Moolenaar  call CheckDefExecFailure(['a = 1'], 'E1100:')
1590ae616494SBram Moolenaar  call CheckDefExecFailure(['i = 1'], 'E1100:')
1591ae616494SBram Moolenaar  call CheckDefExecFailure(['c = 1'], 'E1100:')
1592ae616494SBram Moolenaar
1593ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1594ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1595ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1596ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1597ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1598ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1599ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1600ae616494SBram Moolenaarenddef
1601ae616494SBram Moolenaar
1602158906cfSBram Moolenaardef IfElse(what: number): string
1603158906cfSBram Moolenaar  let res = ''
1604158906cfSBram Moolenaar  if what == 1
1605158906cfSBram Moolenaar    res = "one"
1606158906cfSBram Moolenaar  elseif what == 2
1607158906cfSBram Moolenaar    res = "two"
1608a259d8d3SBram Moolenaar  else
1609158906cfSBram Moolenaar    res = "three"
1610a259d8d3SBram Moolenaar  endif
1611158906cfSBram Moolenaar  return res
1612a259d8d3SBram Moolenaarenddef
1613a259d8d3SBram Moolenaar
1614158906cfSBram Moolenaardef Test_if_elseif_else()
1615158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1616158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1617158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
16180f18b6d1SBram Moolenaarenddef
16190f18b6d1SBram Moolenaar
1620e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1621e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1622e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
1623e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
1624e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1625585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
1626e8c4abbbSBram Moolenaarenddef
1627e8c4abbbSBram Moolenaar
16286d69bf60SBram Moolenaarlet g:bool_true = v:true
16296d69bf60SBram Moolenaarlet g:bool_false = v:false
16306d69bf60SBram Moolenaar
16316d69bf60SBram Moolenaardef Test_if_const_expr()
16326d69bf60SBram Moolenaar  let res = false
16336d69bf60SBram Moolenaar  if true ? true : false
16346d69bf60SBram Moolenaar    res = true
16356d69bf60SBram Moolenaar  endif
16366d69bf60SBram Moolenaar  assert_equal(true, res)
16376d69bf60SBram Moolenaar
1638585fea7bSBram Moolenaar  g:glob = 2
1639585fea7bSBram Moolenaar  if false
16406797966dSBram Moolenaar    execute('g:glob = 3')
1641585fea7bSBram Moolenaar  endif
1642585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1643585fea7bSBram Moolenaar  if true
16446797966dSBram Moolenaar    execute('g:glob = 3')
1645585fea7bSBram Moolenaar  endif
1646585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1647585fea7bSBram Moolenaar
16486d69bf60SBram Moolenaar  res = false
16496d69bf60SBram Moolenaar  if g:bool_true ? true : false
16506d69bf60SBram Moolenaar    res = true
16516d69bf60SBram Moolenaar  endif
16526d69bf60SBram Moolenaar  assert_equal(true, res)
16536d69bf60SBram Moolenaar
16546d69bf60SBram Moolenaar  res = false
16556d69bf60SBram Moolenaar  if true ? g:bool_true : false
16566d69bf60SBram Moolenaar    res = true
16576d69bf60SBram Moolenaar  endif
16586d69bf60SBram Moolenaar  assert_equal(true, res)
16596d69bf60SBram Moolenaar
16606d69bf60SBram Moolenaar  res = false
16616d69bf60SBram Moolenaar  if true ? true : g:bool_false
16626d69bf60SBram Moolenaar    res = true
16636d69bf60SBram Moolenaar  endif
16646d69bf60SBram Moolenaar  assert_equal(true, res)
16656d69bf60SBram Moolenaar
16666d69bf60SBram Moolenaar  res = false
16676d69bf60SBram Moolenaar  if true ? false : true
16686d69bf60SBram Moolenaar    res = true
16696d69bf60SBram Moolenaar  endif
16706d69bf60SBram Moolenaar  assert_equal(false, res)
16716d69bf60SBram Moolenaar
16726d69bf60SBram Moolenaar  res = false
16736d69bf60SBram Moolenaar  if false ? false : true
16746d69bf60SBram Moolenaar    res = true
16756d69bf60SBram Moolenaar  endif
16766d69bf60SBram Moolenaar  assert_equal(true, res)
16776d69bf60SBram Moolenaar
16786d69bf60SBram Moolenaar  res = false
16796d69bf60SBram Moolenaar  if false ? true : false
16806d69bf60SBram Moolenaar    res = true
16816d69bf60SBram Moolenaar  endif
16826d69bf60SBram Moolenaar  assert_equal(false, res)
16836d69bf60SBram Moolenaar
16846d69bf60SBram Moolenaar  res = false
1685e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1686e8c4abbbSBram Moolenaar    res = true
1687e8c4abbbSBram Moolenaar  endif
1688e8c4abbbSBram Moolenaar  assert_equal(false, res)
1689e8c4abbbSBram Moolenaar
1690e8c4abbbSBram Moolenaar  res = false
16916d69bf60SBram Moolenaar  if true && true
16926d69bf60SBram Moolenaar    res = true
16936d69bf60SBram Moolenaar  endif
16946d69bf60SBram Moolenaar  assert_equal(true, res)
16956d69bf60SBram Moolenaar
16966d69bf60SBram Moolenaar  res = false
16976d69bf60SBram Moolenaar  if true && false
16986d69bf60SBram Moolenaar    res = true
16996d69bf60SBram Moolenaar  endif
17006d69bf60SBram Moolenaar  assert_equal(false, res)
17016d69bf60SBram Moolenaar
17026d69bf60SBram Moolenaar  res = false
17036d69bf60SBram Moolenaar  if g:bool_true && false
17046d69bf60SBram Moolenaar    res = true
17056d69bf60SBram Moolenaar  endif
17066d69bf60SBram Moolenaar  assert_equal(false, res)
17076d69bf60SBram Moolenaar
17086d69bf60SBram Moolenaar  res = false
17096d69bf60SBram Moolenaar  if true && g:bool_false
17106d69bf60SBram Moolenaar    res = true
17116d69bf60SBram Moolenaar  endif
17126d69bf60SBram Moolenaar  assert_equal(false, res)
17136d69bf60SBram Moolenaar
17146d69bf60SBram Moolenaar  res = false
17156d69bf60SBram Moolenaar  if false && false
17166d69bf60SBram Moolenaar    res = true
17176d69bf60SBram Moolenaar  endif
17186d69bf60SBram Moolenaar  assert_equal(false, res)
17196d69bf60SBram Moolenaar
17206d69bf60SBram Moolenaar  res = false
17216d69bf60SBram Moolenaar  if true || false
17226d69bf60SBram Moolenaar    res = true
17236d69bf60SBram Moolenaar  endif
17246d69bf60SBram Moolenaar  assert_equal(true, res)
17256d69bf60SBram Moolenaar
17266d69bf60SBram Moolenaar  res = false
17276d69bf60SBram Moolenaar  if g:bool_true || false
17286d69bf60SBram Moolenaar    res = true
17296d69bf60SBram Moolenaar  endif
17306d69bf60SBram Moolenaar  assert_equal(true, res)
17316d69bf60SBram Moolenaar
17326d69bf60SBram Moolenaar  res = false
17336d69bf60SBram Moolenaar  if true || g:bool_false
17346d69bf60SBram Moolenaar    res = true
17356d69bf60SBram Moolenaar  endif
17366d69bf60SBram Moolenaar  assert_equal(true, res)
17376d69bf60SBram Moolenaar
17386d69bf60SBram Moolenaar  res = false
17396d69bf60SBram Moolenaar  if false || false
17406d69bf60SBram Moolenaar    res = true
17416d69bf60SBram Moolenaar  endif
17426d69bf60SBram Moolenaar  assert_equal(false, res)
174380c34ca3SBram Moolenaarenddef
17446d69bf60SBram Moolenaar
174580c34ca3SBram Moolenaardef Test_if_const_expr_fails()
174680c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
174780c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1748e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
1749e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
17506d69bf60SBram Moolenaarenddef
17516d69bf60SBram Moolenaar
175272abcf42SBram Moolenaardef RunNested(i: number): number
175372abcf42SBram Moolenaar  let x: number = 0
175472abcf42SBram Moolenaar  if i % 2
175572abcf42SBram Moolenaar    if 1
1756f5be8cdbSBram Moolenaar      # comment
175772abcf42SBram Moolenaar    else
1758f5be8cdbSBram Moolenaar      # comment
175972abcf42SBram Moolenaar    endif
176072abcf42SBram Moolenaar    x += 1
176172abcf42SBram Moolenaar  else
176272abcf42SBram Moolenaar    x += 1000
176372abcf42SBram Moolenaar  endif
176472abcf42SBram Moolenaar  return x
176572abcf42SBram Moolenaarenddef
176672abcf42SBram Moolenaar
176772abcf42SBram Moolenaardef Test_nested_if()
176872abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
176972abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
177072abcf42SBram Moolenaarenddef
177172abcf42SBram Moolenaar
1772ad39c094SBram Moolenaardef Test_execute_cmd()
1773ad39c094SBram Moolenaar  new
1774ad39c094SBram Moolenaar  setline(1, 'default')
1775ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1776ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1777a72cfb80SBram Moolenaar
1778a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
1779a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1780a72cfb80SBram Moolenaar
1781ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
1782ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1783a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1784ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1785a72cfb80SBram Moolenaar
1786ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1787ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1788a72cfb80SBram Moolenaar
1789ad39c094SBram Moolenaar  let cmd_first = 'call '
1790ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1791ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1792ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1793ad39c094SBram Moolenaar  bwipe!
1794585fea7bSBram Moolenaar
17952d6b20d6SBram Moolenaar  let n = true
17962d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
17972d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
17982d6b20d6SBram Moolenaar
1799585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
1800a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
1801ad39c094SBram Moolenaarenddef
1802ad39c094SBram Moolenaar
180347e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1804f5be8cdbSBram Moolenaar  # only checks line continuation
180547e880d6SBram Moolenaar  let lines =<< trim END
180647e880d6SBram Moolenaar      vim9script
180747e880d6SBram Moolenaar      execute 'g:someVar'
180847e880d6SBram Moolenaar                .. ' = ' ..
180947e880d6SBram Moolenaar                   '28'
181047e880d6SBram Moolenaar      assert_equal(28, g:someVar)
181147e880d6SBram Moolenaar      unlet g:someVar
181247e880d6SBram Moolenaar  END
181347e880d6SBram Moolenaar  CheckScriptSuccess(lines)
181447e880d6SBram Moolenaarenddef
181547e880d6SBram Moolenaar
1816ad39c094SBram Moolenaardef Test_echo_cmd()
1817a72cfb80SBram Moolenaar  echo 'some' # comment
1818585fea7bSBram Moolenaar  echon 'thing'
1819ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1820ad39c094SBram Moolenaar
1821a72cfb80SBram Moolenaar  echo "some" # comment
1822a72cfb80SBram Moolenaar  echon "thing"
1823a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1824a72cfb80SBram Moolenaar
1825ad39c094SBram Moolenaar  let str1 = 'some'
1826ad39c094SBram Moolenaar  let str2 = 'more'
1827ad39c094SBram Moolenaar  echo str1 str2
1828ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1829a72cfb80SBram Moolenaar
1830a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1831ad39c094SBram Moolenaarenddef
1832ad39c094SBram Moolenaar
1833f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1834f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1835f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1836f93c7feaSBram Moolenaar  echo 'clear'
1837df069eecSBram Moolenaar  :1messages
1838f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1839f93c7feaSBram Moolenaar
1840f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1841f93c7feaSBram Moolenaarenddef
1842f93c7feaSBram Moolenaar
184347e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
1844f5be8cdbSBram Moolenaar  # only checks line continuation
184547e880d6SBram Moolenaar  let lines =<< trim END
184647e880d6SBram Moolenaar      vim9script
184747e880d6SBram Moolenaar      echomsg 'here'
184847e880d6SBram Moolenaar                .. ' is ' ..
184947e880d6SBram Moolenaar                   'a message'
185047e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
185147e880d6SBram Moolenaar  END
185247e880d6SBram Moolenaar  CheckScriptSuccess(lines)
185347e880d6SBram Moolenaarenddef
185447e880d6SBram Moolenaar
1855f93c7feaSBram Moolenaardef Test_echoerr_cmd()
185640ee466cSBram Moolenaar  try
185740ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
185840ee466cSBram Moolenaar  catch
185940ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
186040ee466cSBram Moolenaar  endtry
1861f93c7feaSBram Moolenaarenddef
1862f93c7feaSBram Moolenaar
186347e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
1864f5be8cdbSBram Moolenaar  # only checks line continuation
186547e880d6SBram Moolenaar  let lines =<< trim END
186647e880d6SBram Moolenaar      vim9script
186747e880d6SBram Moolenaar      try
186847e880d6SBram Moolenaar        echoerr 'this'
186947e880d6SBram Moolenaar                .. ' is ' ..
187047e880d6SBram Moolenaar                   'wrong'
187147e880d6SBram Moolenaar      catch
187247e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
187347e880d6SBram Moolenaar      endtry
187447e880d6SBram Moolenaar  END
187547e880d6SBram Moolenaar  CheckScriptSuccess(lines)
187647e880d6SBram Moolenaarenddef
187747e880d6SBram Moolenaar
187841fe0617SBram Moolenaardef Test_for_outside_of_function()
187941fe0617SBram Moolenaar  let lines =<< trim END
188041fe0617SBram Moolenaar    vim9script
188141fe0617SBram Moolenaar    new
188241fe0617SBram Moolenaar    for var in range(0, 3)
188341fe0617SBram Moolenaar      append(line('$'), var)
188441fe0617SBram Moolenaar    endfor
188541fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
188641fe0617SBram Moolenaar    bwipe!
188741fe0617SBram Moolenaar  END
188841fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
188941fe0617SBram Moolenaar  source Xvim9for.vim
189041fe0617SBram Moolenaar  delete('Xvim9for.vim')
189141fe0617SBram Moolenaarenddef
18928a7d6542SBram Moolenaar
1893e8c4abbbSBram Moolenaardef Test_for_loop()
1894e8c4abbbSBram Moolenaar  let result = ''
1895e8c4abbbSBram Moolenaar  for cnt in range(7)
1896e8c4abbbSBram Moolenaar    if cnt == 4
1897e8c4abbbSBram Moolenaar      break
1898e8c4abbbSBram Moolenaar    endif
1899e8c4abbbSBram Moolenaar    if cnt == 2
1900e8c4abbbSBram Moolenaar      continue
1901e8c4abbbSBram Moolenaar    endif
1902e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1903e8c4abbbSBram Moolenaar  endfor
1904e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
19050ad3e894SBram Moolenaar
19060ad3e894SBram Moolenaar  let concat = ''
19070ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
19080ad3e894SBram Moolenaar    concat ..= str
19090ad3e894SBram Moolenaar  endfor
19100ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
1911e8c4abbbSBram Moolenaarenddef
1912e8c4abbbSBram Moolenaar
1913e8c4abbbSBram Moolenaardef Test_for_loop_fails()
1914675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
1915675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
1916675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
1917822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
19180ad3e894SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1013:')
1919675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
1920675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
1921675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
1922e8c4abbbSBram Moolenaarenddef
1923e8c4abbbSBram Moolenaar
1924d0df1aacSBram Moolenaardef Test_while_loop()
1925d0df1aacSBram Moolenaar  let result = ''
1926d0df1aacSBram Moolenaar  let cnt = 0
1927d0df1aacSBram Moolenaar  while cnt < 555
1928d0df1aacSBram Moolenaar    if cnt == 3
1929d0df1aacSBram Moolenaar      break
1930d0df1aacSBram Moolenaar    endif
1931d0df1aacSBram Moolenaar    cnt += 1
1932d0df1aacSBram Moolenaar    if cnt == 2
1933d0df1aacSBram Moolenaar      continue
1934d0df1aacSBram Moolenaar    endif
1935d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1936d0df1aacSBram Moolenaar  endwhile
1937d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1938d0df1aacSBram Moolenaarenddef
1939d0df1aacSBram Moolenaar
1940e8c4abbbSBram Moolenaardef Test_while_loop_fails()
1941675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
1942675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
1943675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
1944675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
1945675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
1946675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
1947675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
1948bd5da371SBram Moolenaarenddef
1949bd5da371SBram Moolenaar
19509645e2d9SBram Moolenaardef Test_interrupt_loop()
195197acfc78SBram Moolenaar  let caught = false
19529645e2d9SBram Moolenaar  let x = 0
195397acfc78SBram Moolenaar  try
19549645e2d9SBram Moolenaar    while 1
19559645e2d9SBram Moolenaar      x += 1
19569645e2d9SBram Moolenaar      if x == 100
19579645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
19589645e2d9SBram Moolenaar      endif
19599645e2d9SBram Moolenaar    endwhile
196097acfc78SBram Moolenaar  catch
196197acfc78SBram Moolenaar    caught = true
196297acfc78SBram Moolenaar    assert_equal(100, x)
196397acfc78SBram Moolenaar  endtry
196497acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
19659645e2d9SBram Moolenaarenddef
196620431c9dSBram Moolenaar
19674fdae999SBram Moolenaardef Test_automatic_line_continuation()
19684fdae999SBram Moolenaar  let mylist = [
19694fdae999SBram Moolenaar      'one',
19704fdae999SBram Moolenaar      'two',
19714fdae999SBram Moolenaar      'three',
1972f5be8cdbSBram Moolenaar      ] # comment
19734fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
19744fdae999SBram Moolenaar
19754fdae999SBram Moolenaar  let mydict = {
19764fdae999SBram Moolenaar      'one': 1,
19774fdae999SBram Moolenaar      'two': 2,
19784fdae999SBram Moolenaar      'three':
19794fdae999SBram Moolenaar          3,
1980f5be8cdbSBram Moolenaar      } # comment
19814fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
19824fdae999SBram Moolenaar  mydict = #{
19832c330432SBram Moolenaar      one: 1,  # comment
19842c330432SBram Moolenaar      two:     # comment
19852c330432SBram Moolenaar           2,  # comment
19862c330432SBram Moolenaar      three: 3 # comment
19872c330432SBram Moolenaar      }
19882c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
19892c330432SBram Moolenaar  mydict = #{
19902c330432SBram Moolenaar      one: 1,
19914fdae999SBram Moolenaar      two:
19924fdae999SBram Moolenaar           2,
19932c330432SBram Moolenaar      three: 3
19944fdae999SBram Moolenaar      }
19954fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1996e6085c53SBram Moolenaar
1997e6085c53SBram Moolenaar  assert_equal(
1998e6085c53SBram Moolenaar        ['one', 'two', 'three'],
1999e6085c53SBram Moolenaar        split('one two three')
2000e6085c53SBram Moolenaar        )
20014fdae999SBram Moolenaarenddef
20024fdae999SBram Moolenaar
20037a092245SBram Moolenaardef Test_vim9_comment()
20047a092245SBram Moolenaar  CheckScriptSuccess([
20057a092245SBram Moolenaar      'vim9script',
20067a092245SBram Moolenaar      '# something',
20077a092245SBram Moolenaar      ])
20087a092245SBram Moolenaar  CheckScriptFailure([
20097a092245SBram Moolenaar      'vim9script',
20107a092245SBram Moolenaar      ':# something',
20117a092245SBram Moolenaar      ], 'E488:')
20127a092245SBram Moolenaar  CheckScriptFailure([
20137a092245SBram Moolenaar      '# something',
20147a092245SBram Moolenaar      ], 'E488:')
20157a092245SBram Moolenaar  CheckScriptFailure([
20167a092245SBram Moolenaar      ':# something',
20177a092245SBram Moolenaar      ], 'E488:')
20187a092245SBram Moolenaar
20194a8d9f2eSBram Moolenaar  { # block start
20204a8d9f2eSBram Moolenaar  } # block end
20214a8d9f2eSBram Moolenaar  CheckDefFailure([
20224a8d9f2eSBram Moolenaar      '{# comment',
20234a8d9f2eSBram Moolenaar      ], 'E488:')
20244a8d9f2eSBram Moolenaar  CheckDefFailure([
20254a8d9f2eSBram Moolenaar      '{',
20264a8d9f2eSBram Moolenaar      '}# comment',
20274a8d9f2eSBram Moolenaar      ], 'E488:')
20284a8d9f2eSBram Moolenaar
20294a8d9f2eSBram Moolenaar  echo "yes" # comment
20304a8d9f2eSBram Moolenaar  CheckDefFailure([
20314a8d9f2eSBram Moolenaar      'echo "yes"# comment',
20324a8d9f2eSBram Moolenaar      ], 'E488:')
20337a092245SBram Moolenaar  CheckScriptSuccess([
20347a092245SBram Moolenaar      'vim9script',
20357a092245SBram Moolenaar      'echo "yes" # something',
20367a092245SBram Moolenaar      ])
20377a092245SBram Moolenaar  CheckScriptFailure([
20387a092245SBram Moolenaar      'vim9script',
20397a092245SBram Moolenaar      'echo "yes"# something',
20407a092245SBram Moolenaar      ], 'E121:')
20417a092245SBram Moolenaar  CheckScriptFailure([
20427a092245SBram Moolenaar      'vim9script',
20437a092245SBram Moolenaar      'echo# something',
20447a092245SBram Moolenaar      ], 'E121:')
20457a092245SBram Moolenaar  CheckScriptFailure([
20467a092245SBram Moolenaar      'echo "yes" # something',
20477a092245SBram Moolenaar      ], 'E121:')
20487a092245SBram Moolenaar
20494a8d9f2eSBram Moolenaar  exe "echo" # comment
20504a8d9f2eSBram Moolenaar  CheckDefFailure([
20514a8d9f2eSBram Moolenaar      'exe "echo"# comment',
20524a8d9f2eSBram Moolenaar      ], 'E488:')
20534a8d9f2eSBram Moolenaar  CheckScriptSuccess([
20544a8d9f2eSBram Moolenaar      'vim9script',
20554a8d9f2eSBram Moolenaar      'exe "echo" # something',
20564a8d9f2eSBram Moolenaar      ])
20574a8d9f2eSBram Moolenaar  CheckScriptFailure([
20584a8d9f2eSBram Moolenaar      'vim9script',
20594a8d9f2eSBram Moolenaar      'exe "echo"# something',
20604a8d9f2eSBram Moolenaar      ], 'E121:')
20614a8d9f2eSBram Moolenaar  CheckDefFailure([
20624a8d9f2eSBram Moolenaar      'exe # comment',
20634a8d9f2eSBram Moolenaar      ], 'E1015:')
20644a8d9f2eSBram Moolenaar  CheckScriptFailure([
20654a8d9f2eSBram Moolenaar      'vim9script',
20664a8d9f2eSBram Moolenaar      'exe# something',
20674a8d9f2eSBram Moolenaar      ], 'E121:')
20684a8d9f2eSBram Moolenaar  CheckScriptFailure([
20694a8d9f2eSBram Moolenaar      'exe "echo" # something',
20704a8d9f2eSBram Moolenaar      ], 'E121:')
20714a8d9f2eSBram Moolenaar
20727a092245SBram Moolenaar  CheckDefFailure([
20737a092245SBram Moolenaar      'try# comment',
20747a092245SBram Moolenaar      '  echo "yes"',
20757a092245SBram Moolenaar      'catch',
20767a092245SBram Moolenaar      'endtry',
20777a092245SBram Moolenaar      ], 'E488:')
20782c5ed4e3SBram Moolenaar  CheckScriptFailure([
20792c5ed4e3SBram Moolenaar      'vim9script',
20802c5ed4e3SBram Moolenaar      'try# comment',
20812c5ed4e3SBram Moolenaar      'echo "yes"',
20822c5ed4e3SBram Moolenaar      ], 'E488:')
20837a092245SBram Moolenaar  CheckDefFailure([
20847a092245SBram Moolenaar      'try',
2085a72cfb80SBram Moolenaar      '  throw#comment',
2086a72cfb80SBram Moolenaar      'catch',
2087a72cfb80SBram Moolenaar      'endtry',
2088a72cfb80SBram Moolenaar      ], 'E1015:')
2089a72cfb80SBram Moolenaar  CheckDefFailure([
2090a72cfb80SBram Moolenaar      'try',
2091a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2092a72cfb80SBram Moolenaar      'catch',
2093a72cfb80SBram Moolenaar      'endtry',
2094a72cfb80SBram Moolenaar      ], 'E488:')
2095a72cfb80SBram Moolenaar  CheckDefFailure([
2096a72cfb80SBram Moolenaar      'try',
20977a092245SBram Moolenaar      '  echo "yes"',
20987a092245SBram Moolenaar      'catch# comment',
20997a092245SBram Moolenaar      'endtry',
21007a092245SBram Moolenaar      ], 'E488:')
21012c5ed4e3SBram Moolenaar  CheckScriptFailure([
21022c5ed4e3SBram Moolenaar      'vim9script',
21032c5ed4e3SBram Moolenaar      'try',
21042c5ed4e3SBram Moolenaar      '  echo "yes"',
21052c5ed4e3SBram Moolenaar      'catch# comment',
21062c5ed4e3SBram Moolenaar      'endtry',
21072c5ed4e3SBram Moolenaar      ], 'E654:')
21082c5ed4e3SBram Moolenaar  CheckDefFailure([
21092c5ed4e3SBram Moolenaar      'try',
21102c5ed4e3SBram Moolenaar      '  echo "yes"',
21112c5ed4e3SBram Moolenaar      'catch /pat/# comment',
21122c5ed4e3SBram Moolenaar      'endtry',
21132c5ed4e3SBram Moolenaar      ], 'E488:')
21147a092245SBram Moolenaar  CheckDefFailure([
21157a092245SBram Moolenaar      'try',
21167a092245SBram Moolenaar      'echo "yes"',
21177a092245SBram Moolenaar      'catch',
21187a092245SBram Moolenaar      'endtry# comment',
21197a092245SBram Moolenaar      ], 'E488:')
21202c5ed4e3SBram Moolenaar  CheckScriptFailure([
21212c5ed4e3SBram Moolenaar      'vim9script',
21222c5ed4e3SBram Moolenaar      'try',
21232c5ed4e3SBram Moolenaar      '  echo "yes"',
21242c5ed4e3SBram Moolenaar      'catch',
21252c5ed4e3SBram Moolenaar      'endtry# comment',
21269b7bf9e9SBram Moolenaar      ], 'E488:')
21272c5ed4e3SBram Moolenaar
21282c5ed4e3SBram Moolenaar  CheckScriptSuccess([
21292c5ed4e3SBram Moolenaar      'vim9script',
21302c5ed4e3SBram Moolenaar      'hi # comment',
21312c5ed4e3SBram Moolenaar      ])
21322c5ed4e3SBram Moolenaar  CheckScriptFailure([
21332c5ed4e3SBram Moolenaar      'vim9script',
21342c5ed4e3SBram Moolenaar      'hi# comment',
21352c5ed4e3SBram Moolenaar      ], 'E416:')
21361966c248SBram Moolenaar  CheckScriptSuccess([
21371966c248SBram Moolenaar      'vim9script',
21381966c248SBram Moolenaar      'hi Search # comment',
21391966c248SBram Moolenaar      ])
21401966c248SBram Moolenaar  CheckScriptFailure([
21411966c248SBram Moolenaar      'vim9script',
21421966c248SBram Moolenaar      'hi Search# comment',
21431966c248SBram Moolenaar      ], 'E416:')
21441966c248SBram Moolenaar  CheckScriptSuccess([
21451966c248SBram Moolenaar      'vim9script',
21461966c248SBram Moolenaar      'hi link This Search # comment',
21471966c248SBram Moolenaar      ])
21481966c248SBram Moolenaar  CheckScriptFailure([
21491966c248SBram Moolenaar      'vim9script',
21501966c248SBram Moolenaar      'hi link This That# comment',
21511966c248SBram Moolenaar      ], 'E413:')
21521966c248SBram Moolenaar  CheckScriptSuccess([
21531966c248SBram Moolenaar      'vim9script',
21541966c248SBram Moolenaar      'hi clear This # comment',
21551966c248SBram Moolenaar      'hi clear # comment',
21561966c248SBram Moolenaar      ])
2157f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2158f5be8cdbSBram Moolenaar  # hi clear This# comment',
21591966c248SBram Moolenaar  CheckScriptFailure([
21601966c248SBram Moolenaar      'vim9script',
21611966c248SBram Moolenaar      'hi clear# comment',
21621966c248SBram Moolenaar      ], 'E416:')
21631966c248SBram Moolenaar
21641966c248SBram Moolenaar  CheckScriptSuccess([
21651966c248SBram Moolenaar      'vim9script',
21661966c248SBram Moolenaar      'hi Group term=bold',
21671966c248SBram Moolenaar      'match Group /todo/ # comment',
21681966c248SBram Moolenaar      ])
21691966c248SBram Moolenaar  CheckScriptFailure([
21701966c248SBram Moolenaar      'vim9script',
21711966c248SBram Moolenaar      'hi Group term=bold',
21721966c248SBram Moolenaar      'match Group /todo/# comment',
21731966c248SBram Moolenaar      ], 'E488:')
21741966c248SBram Moolenaar  CheckScriptSuccess([
21751966c248SBram Moolenaar      'vim9script',
21761966c248SBram Moolenaar      'match # comment',
21771966c248SBram Moolenaar      ])
21781966c248SBram Moolenaar  CheckScriptFailure([
21791966c248SBram Moolenaar      'vim9script',
21801966c248SBram Moolenaar      'match# comment',
21811966c248SBram Moolenaar      ], 'E475:')
21821966c248SBram Moolenaar  CheckScriptSuccess([
21831966c248SBram Moolenaar      'vim9script',
21841966c248SBram Moolenaar      'match none # comment',
21851966c248SBram Moolenaar      ])
21861966c248SBram Moolenaar  CheckScriptFailure([
21871966c248SBram Moolenaar      'vim9script',
21881966c248SBram Moolenaar      'match none# comment',
21891966c248SBram Moolenaar      ], 'E475:')
21901966c248SBram Moolenaar
21911966c248SBram Moolenaar  CheckScriptSuccess([
21921966c248SBram Moolenaar      'vim9script',
21931966c248SBram Moolenaar      'menutrans clear # comment',
21941966c248SBram Moolenaar      ])
21951966c248SBram Moolenaar  CheckScriptFailure([
21961966c248SBram Moolenaar      'vim9script',
21971966c248SBram Moolenaar      'menutrans clear# comment text',
21981966c248SBram Moolenaar      ], 'E474:')
21991966c248SBram Moolenaar
22001966c248SBram Moolenaar  CheckScriptSuccess([
22011966c248SBram Moolenaar      'vim9script',
22021966c248SBram Moolenaar      'syntax clear # comment',
22031966c248SBram Moolenaar      ])
22041966c248SBram Moolenaar  CheckScriptFailure([
22051966c248SBram Moolenaar      'vim9script',
22061966c248SBram Moolenaar      'syntax clear# comment text',
22071966c248SBram Moolenaar      ], 'E28:')
22081966c248SBram Moolenaar  CheckScriptSuccess([
22091966c248SBram Moolenaar      'vim9script',
22101966c248SBram Moolenaar      'syntax keyword Word some',
22111966c248SBram Moolenaar      'syntax clear Word # comment',
22121966c248SBram Moolenaar      ])
22131966c248SBram Moolenaar  CheckScriptFailure([
22141966c248SBram Moolenaar      'vim9script',
22151966c248SBram Moolenaar      'syntax keyword Word some',
22161966c248SBram Moolenaar      'syntax clear Word# comment text',
22171966c248SBram Moolenaar      ], 'E28:')
22181966c248SBram Moolenaar
22191966c248SBram Moolenaar  CheckScriptSuccess([
22201966c248SBram Moolenaar      'vim9script',
22211966c248SBram Moolenaar      'syntax list # comment',
22221966c248SBram Moolenaar      ])
22231966c248SBram Moolenaar  CheckScriptFailure([
22241966c248SBram Moolenaar      'vim9script',
22251966c248SBram Moolenaar      'syntax list# comment text',
22261966c248SBram Moolenaar      ], 'E28:')
22271966c248SBram Moolenaar
22281966c248SBram Moolenaar  CheckScriptSuccess([
22291966c248SBram Moolenaar      'vim9script',
22301966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
22311966c248SBram Moolenaar      ])
22321966c248SBram Moolenaar  CheckScriptFailure([
22331966c248SBram Moolenaar      'vim9script',
22341966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
22351966c248SBram Moolenaar      ], 'E475:')
22361966c248SBram Moolenaar
22371966c248SBram Moolenaar  CheckScriptSuccess([
22381966c248SBram Moolenaar      'vim9script',
22391966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
22401966c248SBram Moolenaar      ])
22411966c248SBram Moolenaar  CheckScriptFailure([
22421966c248SBram Moolenaar      'vim9script',
22431966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
22441966c248SBram Moolenaar      ], 'E789:')
22451966c248SBram Moolenaar
22461966c248SBram Moolenaar  CheckScriptSuccess([
22471966c248SBram Moolenaar      'vim9script',
22481966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
22491966c248SBram Moolenaar      ])
22501966c248SBram Moolenaar  CheckScriptFailure([
22511966c248SBram Moolenaar      'vim9script',
22521966c248SBram Moolenaar      'syntax match Word /pat/# comment',
22531966c248SBram Moolenaar      ], 'E402:')
22541966c248SBram Moolenaar
22551966c248SBram Moolenaar  CheckScriptSuccess([
22561966c248SBram Moolenaar      'vim9script',
22571966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
22581966c248SBram Moolenaar      ])
22591966c248SBram Moolenaar  CheckScriptFailure([
22601966c248SBram Moolenaar      'vim9script',
22611966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
22621966c248SBram Moolenaar      ], 'E475:')
22631966c248SBram Moolenaar  CheckScriptFailure([
22641966c248SBram Moolenaar      'vim9script',
22651966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
22661966c248SBram Moolenaar      ], 'E406:')
22671966c248SBram Moolenaar  CheckScriptFailure([
22681966c248SBram Moolenaar      'vim9script',
22691966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
22701966c248SBram Moolenaar      ], 'E475:')
22711966c248SBram Moolenaar
22721966c248SBram Moolenaar  CheckScriptSuccess([
22731966c248SBram Moolenaar      'vim9script',
22741966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
22751966c248SBram Moolenaar      ])
22761966c248SBram Moolenaar  CheckScriptFailure([
22771966c248SBram Moolenaar      'vim9script',
22781966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2279d032f34aSBram Moolenaar      ], 'E402:')
22801966c248SBram Moolenaar
22811966c248SBram Moolenaar  CheckScriptSuccess([
22821966c248SBram Moolenaar      'vim9script',
22831966c248SBram Moolenaar      'syntax sync # comment',
22841966c248SBram Moolenaar      ])
22851966c248SBram Moolenaar  CheckScriptFailure([
22861966c248SBram Moolenaar      'vim9script',
22871966c248SBram Moolenaar      'syntax sync# comment',
22881966c248SBram Moolenaar      ], 'E404:')
22891966c248SBram Moolenaar  CheckScriptSuccess([
22901966c248SBram Moolenaar      'vim9script',
22911966c248SBram Moolenaar      'syntax sync ccomment # comment',
22921966c248SBram Moolenaar      ])
22931966c248SBram Moolenaar  CheckScriptFailure([
22941966c248SBram Moolenaar      'vim9script',
22951966c248SBram Moolenaar      'syntax sync ccomment# comment',
22961966c248SBram Moolenaar      ], 'E404:')
22971966c248SBram Moolenaar
22981966c248SBram Moolenaar  CheckScriptSuccess([
22991966c248SBram Moolenaar      'vim9script',
23001966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
23011966c248SBram Moolenaar      ])
23021966c248SBram Moolenaar  CheckScriptFailure([
23031966c248SBram Moolenaar      'vim9script',
23041966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
23051966c248SBram Moolenaar      ], 'E475:')
2306a72cfb80SBram Moolenaar
2307a72cfb80SBram Moolenaar  CheckScriptSuccess([
2308a72cfb80SBram Moolenaar      'vim9script',
2309a72cfb80SBram Moolenaar      'command Echo echo # comment',
2310a72cfb80SBram Moolenaar      'command Echo # comment',
2311a72cfb80SBram Moolenaar      ])
2312a72cfb80SBram Moolenaar  CheckScriptFailure([
2313a72cfb80SBram Moolenaar      'vim9script',
2314a72cfb80SBram Moolenaar      'command Echo echo# comment',
2315a72cfb80SBram Moolenaar      'Echo',
2316a72cfb80SBram Moolenaar      ], 'E121:')
2317a72cfb80SBram Moolenaar  CheckScriptFailure([
2318a72cfb80SBram Moolenaar      'vim9script',
2319a72cfb80SBram Moolenaar      'command Echo# comment',
2320a72cfb80SBram Moolenaar      ], 'E182:')
2321a72cfb80SBram Moolenaar  CheckScriptFailure([
2322a72cfb80SBram Moolenaar      'vim9script',
2323a72cfb80SBram Moolenaar      'command Echo echo',
2324a72cfb80SBram Moolenaar      'command Echo# comment',
2325a72cfb80SBram Moolenaar      ], 'E182:')
2326a72cfb80SBram Moolenaar
2327a72cfb80SBram Moolenaar  CheckScriptSuccess([
2328a72cfb80SBram Moolenaar      'vim9script',
2329a72cfb80SBram Moolenaar      'function # comment',
2330a72cfb80SBram Moolenaar      ])
2331a72cfb80SBram Moolenaar  CheckScriptFailure([
2332a72cfb80SBram Moolenaar      'vim9script',
23339898107fSBram Moolenaar      'function " comment',
23349898107fSBram Moolenaar      ], 'E129:')
23359898107fSBram Moolenaar  CheckScriptFailure([
23369898107fSBram Moolenaar      'vim9script',
2337a72cfb80SBram Moolenaar      'function# comment',
2338a72cfb80SBram Moolenaar      ], 'E129:')
2339a72cfb80SBram Moolenaar  CheckScriptSuccess([
2340a72cfb80SBram Moolenaar      'vim9script',
2341a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2342a72cfb80SBram Moolenaar      ])
2343a72cfb80SBram Moolenaar  CheckScriptFailure([
2344a72cfb80SBram Moolenaar      'vim9script',
2345a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2346a72cfb80SBram Moolenaar      ], 'E488:')
2347a72cfb80SBram Moolenaar
2348a72cfb80SBram Moolenaar  CheckScriptSuccess([
2349a72cfb80SBram Moolenaar      'vim9script',
23504c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2351a72cfb80SBram Moolenaar      'endfunc',
23524c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2353a72cfb80SBram Moolenaar      ])
2354a72cfb80SBram Moolenaar  CheckScriptFailure([
2355a72cfb80SBram Moolenaar      'vim9script',
23564c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2357a72cfb80SBram Moolenaar      'endfunc',
23584c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2359a72cfb80SBram Moolenaar      ], 'E488:')
2360a72cfb80SBram Moolenaar
2361a72cfb80SBram Moolenaar  CheckScriptSuccess([
2362a72cfb80SBram Moolenaar      'vim9script',
2363a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2364a72cfb80SBram Moolenaar      ])
2365a72cfb80SBram Moolenaar  CheckScriptFailure([
2366a72cfb80SBram Moolenaar      'vim9script',
2367a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2368a72cfb80SBram Moolenaar      ], 'E488:')
2369e7e4838fSBram Moolenaar
2370e7e4838fSBram Moolenaar  CheckScriptFailure([
2371e7e4838fSBram Moolenaar      'def Test() " comment',
2372e7e4838fSBram Moolenaar      'enddef',
2373e7e4838fSBram Moolenaar      ], 'E488:')
2374e7e4838fSBram Moolenaar  CheckScriptFailure([
2375e7e4838fSBram Moolenaar      'vim9script',
2376e7e4838fSBram Moolenaar      'def Test() " comment',
2377e7e4838fSBram Moolenaar      'enddef',
2378e7e4838fSBram Moolenaar      ], 'E488:')
2379e7e4838fSBram Moolenaar
2380e7e4838fSBram Moolenaar  CheckScriptSuccess([
2381e7e4838fSBram Moolenaar      'func Test() " comment',
2382e7e4838fSBram Moolenaar      'endfunc',
2383e7e4838fSBram Moolenaar      ])
23849898107fSBram Moolenaar  CheckScriptSuccess([
2385e7e4838fSBram Moolenaar      'vim9script',
2386e7e4838fSBram Moolenaar      'func Test() " comment',
2387e7e4838fSBram Moolenaar      'endfunc',
23889898107fSBram Moolenaar      ])
2389e7e4838fSBram Moolenaar
2390e7e4838fSBram Moolenaar  CheckScriptSuccess([
2391e7e4838fSBram Moolenaar      'def Test() # comment',
2392e7e4838fSBram Moolenaar      'enddef',
2393e7e4838fSBram Moolenaar      ])
2394e7e4838fSBram Moolenaar  CheckScriptFailure([
2395e7e4838fSBram Moolenaar      'func Test() # comment',
2396e7e4838fSBram Moolenaar      'endfunc',
2397e7e4838fSBram Moolenaar      ], 'E488:')
23982c5ed4e3SBram Moolenaarenddef
23992c5ed4e3SBram Moolenaar
24002c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
24012c5ed4e3SBram Moolenaar  CheckCanRunGui
24022c5ed4e3SBram Moolenaar
24032c5ed4e3SBram Moolenaar  CheckScriptFailure([
24042c5ed4e3SBram Moolenaar      'vim9script',
24052c5ed4e3SBram Moolenaar      'gui#comment'
24062c5ed4e3SBram Moolenaar      ], 'E499:')
24072c5ed4e3SBram Moolenaar  CheckScriptFailure([
24082c5ed4e3SBram Moolenaar      'vim9script',
24092c5ed4e3SBram Moolenaar      'gui -f#comment'
24102c5ed4e3SBram Moolenaar      ], 'E499:')
24117a092245SBram Moolenaarenddef
24127a092245SBram Moolenaar
2413a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
24146797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
24156797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2416a26b9700SBram Moolenaar
2417a26b9700SBram Moolenaar  edit test.vim
2418a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2419a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2420a26b9700SBram Moolenaar
2421a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2422a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2423a26b9700SBram Moolenaar
2424a26b9700SBram Moolenaar  g:entered = 0
2425a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2426a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2427a26b9700SBram Moolenaar
2428a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2429a26b9700SBram Moolenaar
2430a26b9700SBram Moolenaar  au! TabEnter
2431a26b9700SBram Moolenaar  unlet g:entered
2432d72c1bf0SBram Moolenaar
2433d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2434d72c1bf0SBram Moolenaar      'vim9script',
24356797966dSBram Moolenaar      'g:var = 123',
2436e55b1c09SBram Moolenaar      'b:var = 456',
2437e55b1c09SBram Moolenaar      'w:var = 777',
2438e55b1c09SBram Moolenaar      't:var = 888',
2439d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2440d72c1bf0SBram Moolenaar      ])
2441d72c1bf0SBram Moolenaar
2442d72c1bf0SBram Moolenaar  CheckScriptFailure([
2443d72c1bf0SBram Moolenaar      'vim9script',
2444d72c1bf0SBram Moolenaar      'let g:var = 123',
2445e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2446e55b1c09SBram Moolenaar
2447e55b1c09SBram Moolenaar  CheckScriptFailure([
2448e55b1c09SBram Moolenaar      'vim9script',
2449e55b1c09SBram Moolenaar      'let b:var = 123',
2450e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2451e55b1c09SBram Moolenaar
2452e55b1c09SBram Moolenaar  CheckScriptFailure([
2453e55b1c09SBram Moolenaar      'vim9script',
2454e55b1c09SBram Moolenaar      'let w:var = 123',
2455e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2456e55b1c09SBram Moolenaar
2457e55b1c09SBram Moolenaar  CheckScriptFailure([
2458e55b1c09SBram Moolenaar      'vim9script',
2459e55b1c09SBram Moolenaar      'let t:var = 123',
2460e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2461e55b1c09SBram Moolenaar
2462e55b1c09SBram Moolenaar  CheckScriptFailure([
2463e55b1c09SBram Moolenaar      'vim9script',
2464e55b1c09SBram Moolenaar      'let v:version = 123',
2465e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2466e55b1c09SBram Moolenaar
2467e55b1c09SBram Moolenaar  CheckScriptFailure([
2468e55b1c09SBram Moolenaar      'vim9script',
2469e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2470e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
24716797966dSBram Moolenaar
24726797966dSBram Moolenaar  CheckScriptFailure([
24736797966dSBram Moolenaar      'vim9script',
24746797966dSBram Moolenaar      'g:var = 123',
247532e35117SBram Moolenaar      'unlet g:var# comment1',
2476d72c1bf0SBram Moolenaar      ], 'E108:')
2477d72c1bf0SBram Moolenaar
2478d72c1bf0SBram Moolenaar  CheckScriptFailure([
2479d72c1bf0SBram Moolenaar      'let g:var = 123',
2480d72c1bf0SBram Moolenaar      'unlet g:var # something',
2481d72c1bf0SBram Moolenaar      ], 'E488:')
2482faac4104SBram Moolenaar
2483faac4104SBram Moolenaar  CheckScriptSuccess([
2484faac4104SBram Moolenaar      'vim9script',
248532e35117SBram Moolenaar      'if 1 # comment2',
2486faac4104SBram Moolenaar      '  echo "yes"',
2487faac4104SBram Moolenaar      'elseif 2 #comment',
2488faac4104SBram Moolenaar      '  echo "no"',
2489faac4104SBram Moolenaar      'endif',
2490faac4104SBram Moolenaar      ])
2491faac4104SBram Moolenaar
2492faac4104SBram Moolenaar  CheckScriptFailure([
2493faac4104SBram Moolenaar      'vim9script',
249432e35117SBram Moolenaar      'if 1# comment3',
2495faac4104SBram Moolenaar      '  echo "yes"',
2496faac4104SBram Moolenaar      'endif',
2497faac4104SBram Moolenaar      ], 'E15:')
2498faac4104SBram Moolenaar
2499faac4104SBram Moolenaar  CheckScriptFailure([
2500faac4104SBram Moolenaar      'vim9script',
250132e35117SBram Moolenaar      'if 0 # comment4',
2502faac4104SBram Moolenaar      '  echo "yes"',
2503faac4104SBram Moolenaar      'elseif 2#comment',
2504faac4104SBram Moolenaar      '  echo "no"',
2505faac4104SBram Moolenaar      'endif',
2506faac4104SBram Moolenaar      ], 'E15:')
2507faac4104SBram Moolenaar
2508faac4104SBram Moolenaar  CheckScriptSuccess([
2509faac4104SBram Moolenaar      'vim9script',
251032e35117SBram Moolenaar      'let v = 1 # comment5',
2511faac4104SBram Moolenaar      ])
2512faac4104SBram Moolenaar
2513faac4104SBram Moolenaar  CheckScriptFailure([
2514faac4104SBram Moolenaar      'vim9script',
251532e35117SBram Moolenaar      'let v = 1# comment6',
251632e35117SBram Moolenaar      ], 'E15:')
2517faac4104SBram Moolenaar
2518faac4104SBram Moolenaar  CheckScriptSuccess([
2519faac4104SBram Moolenaar      'vim9script',
2520faac4104SBram Moolenaar      'new'
2521faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2522df069eecSBram Moolenaar      ':$',
2523faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2524faac4104SBram Moolenaar      'bwipe!',
2525faac4104SBram Moolenaar      ])
2526faac4104SBram Moolenaar
2527f5be8cdbSBram Moolenaar  CheckScriptFailure([
2528f5be8cdbSBram Moolenaar      'vim9script',
2529f5be8cdbSBram Moolenaar      'new'
2530f5be8cdbSBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2531f5be8cdbSBram Moolenaar      ':$',
2532f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2533f5be8cdbSBram Moolenaar      'bwipe!',
2534f5be8cdbSBram Moolenaar      ], 'E488:')
2535f5be8cdbSBram Moolenaar
2536f5be8cdbSBram Moolenaar  CheckScriptFailure([
2537f5be8cdbSBram Moolenaar      'vim9script',
2538f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2539f5be8cdbSBram Moolenaar      ], 'E477:')
2540a26b9700SBram Moolenaarenddef
2541a26b9700SBram Moolenaar
25427e5bd91dSBram Moolenaardef Test_finish()
25437e5bd91dSBram Moolenaar  let lines =<< trim END
25447e5bd91dSBram Moolenaar    vim9script
25456797966dSBram Moolenaar    g:res = 'one'
25467e5bd91dSBram Moolenaar    if v:false | finish | endif
25476797966dSBram Moolenaar    g:res = 'two'
25487e5bd91dSBram Moolenaar    finish
25496797966dSBram Moolenaar    g:res = 'three'
25507e5bd91dSBram Moolenaar  END
25517e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
25527e5bd91dSBram Moolenaar  source Xfinished
25537e5bd91dSBram Moolenaar  assert_equal('two', g:res)
25547e5bd91dSBram Moolenaar
25557e5bd91dSBram Moolenaar  unlet g:res
25567e5bd91dSBram Moolenaar  delete('Xfinished')
25577e5bd91dSBram Moolenaarenddef
25587e5bd91dSBram Moolenaar
255932e35117SBram Moolenaardef Test_let_func_call()
256032e35117SBram Moolenaar  let lines =<< trim END
256132e35117SBram Moolenaar    vim9script
256232e35117SBram Moolenaar    func GetValue()
256332e35117SBram Moolenaar      if exists('g:count')
256432e35117SBram Moolenaar        let g:count += 1
256532e35117SBram Moolenaar      else
256632e35117SBram Moolenaar        let g:count = 1
256732e35117SBram Moolenaar      endif
256832e35117SBram Moolenaar      return 'this'
256932e35117SBram Moolenaar    endfunc
257032e35117SBram Moolenaar    let val: string = GetValue()
2571f5be8cdbSBram Moolenaar    # env var is always a string
2572df671b46SBram Moolenaar    let env = $TERM
257332e35117SBram Moolenaar  END
257432e35117SBram Moolenaar  writefile(lines, 'Xfinished')
257532e35117SBram Moolenaar  source Xfinished
2576f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
257732e35117SBram Moolenaar  assert_equal(1, g:count)
257832e35117SBram Moolenaar
257932e35117SBram Moolenaar  unlet g:count
258032e35117SBram Moolenaar  delete('Xfinished')
258132e35117SBram Moolenaarenddef
258232e35117SBram Moolenaar
258332e35117SBram Moolenaardef Test_let_missing_type()
258432e35117SBram Moolenaar  let lines =<< trim END
258532e35117SBram Moolenaar    vim9script
2586df671b46SBram Moolenaar    let var = g:unknown
2587227a69deSBram Moolenaar  END
2588822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2589227a69deSBram Moolenaar
2590227a69deSBram Moolenaar  lines =<< trim END
2591227a69deSBram Moolenaar    vim9script
2592227a69deSBram Moolenaar    let nr: number = 123
2593227a69deSBram Moolenaar    let var = nr
2594227a69deSBram Moolenaar  END
2595822ba247SBram Moolenaar  CheckScriptSuccess(lines)
259632e35117SBram Moolenaarenddef
259732e35117SBram Moolenaar
2598c82a5b5dSBram Moolenaardef Test_let_declaration()
2599c82a5b5dSBram Moolenaar  let lines =<< trim END
2600c82a5b5dSBram Moolenaar    vim9script
2601c82a5b5dSBram Moolenaar    let var: string
2602c82a5b5dSBram Moolenaar    g:var_uninit = var
2603c82a5b5dSBram Moolenaar    var = 'text'
2604c82a5b5dSBram Moolenaar    g:var_test = var
2605f5be8cdbSBram Moolenaar    # prefixing s: is optional
2606984dddbeSBram Moolenaar    s:var = 'prefixed'
2607984dddbeSBram Moolenaar    g:var_prefixed = s:var
2608984dddbeSBram Moolenaar
2609984dddbeSBram Moolenaar    let s:other: number
2610984dddbeSBram Moolenaar    other = 1234
2611984dddbeSBram Moolenaar    g:other_var = other
2612c82a5b5dSBram Moolenaar  END
2613c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
2614c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
2615c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
2616984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
2617984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
2618c82a5b5dSBram Moolenaar
2619c82a5b5dSBram Moolenaar  unlet g:var_uninit
2620c82a5b5dSBram Moolenaar  unlet g:var_test
2621984dddbeSBram Moolenaar  unlet g:var_prefixed
2622984dddbeSBram Moolenaar  unlet g:other_var
2623c82a5b5dSBram Moolenaarenddef
2624c82a5b5dSBram Moolenaar
2625c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
2626c5b1c20bSBram Moolenaar  let lines =<< trim END
2627c5b1c20bSBram Moolenaar    vim9script
2628c5b1c20bSBram Moolenaar    const var: string
2629c5b1c20bSBram Moolenaar  END
2630c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
2631c5b1c20bSBram Moolenaar
2632c5b1c20bSBram Moolenaar  lines =<< trim END
2633c5b1c20bSBram Moolenaar    vim9script
2634c5b1c20bSBram Moolenaar    let 9var: string
2635c5b1c20bSBram Moolenaar  END
2636c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
2637c5b1c20bSBram Moolenaarenddef
2638c5b1c20bSBram Moolenaar
263934db91f7SBram Moolenaardef Test_let_type_check()
264034db91f7SBram Moolenaar  let lines =<< trim END
264134db91f7SBram Moolenaar    vim9script
264234db91f7SBram Moolenaar    let var: string
264334db91f7SBram Moolenaar    var = 1234
264434db91f7SBram Moolenaar  END
264534db91f7SBram Moolenaar  CheckScriptFailure(lines, 'E1013:')
2646984dddbeSBram Moolenaar
2647984dddbeSBram Moolenaar  lines =<< trim END
2648984dddbeSBram Moolenaar    vim9script
2649984dddbeSBram Moolenaar    let var:string
2650984dddbeSBram Moolenaar  END
2651984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
2652c5b1c20bSBram Moolenaar
2653c5b1c20bSBram Moolenaar  lines =<< trim END
2654c5b1c20bSBram Moolenaar    vim9script
2655c5b1c20bSBram Moolenaar    let var: asdf
2656c5b1c20bSBram Moolenaar  END
2657c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
265834db91f7SBram Moolenaarenddef
265934db91f7SBram Moolenaar
2660a5d0077eSBram Moolenaardef Test_forward_declaration()
2661a5d0077eSBram Moolenaar  let lines =<< trim END
2662a5d0077eSBram Moolenaar    vim9script
2663a5d0077eSBram Moolenaar    def GetValue(): string
2664a5d0077eSBram Moolenaar      return theVal
2665a5d0077eSBram Moolenaar    enddef
2666a5d0077eSBram Moolenaar    let theVal = 'something'
2667822ba247SBram Moolenaar    g:initVal = GetValue()
2668a5d0077eSBram Moolenaar    theVal = 'else'
2669a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2670a5d0077eSBram Moolenaar  END
2671a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2672a5d0077eSBram Moolenaar  source Xforward
2673a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2674a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2675a5d0077eSBram Moolenaar
2676a5d0077eSBram Moolenaar  unlet g:initVal
2677a5d0077eSBram Moolenaar  unlet g:laterVal
2678a5d0077eSBram Moolenaar  delete('Xforward')
2679a5d0077eSBram Moolenaarenddef
2680a5d0077eSBram Moolenaar
26819721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
26829721fb4eSBram Moolenaar  let legacy_lines =<< trim END
26839721fb4eSBram Moolenaar    source Xvim9_script.vim
26849721fb4eSBram Moolenaar
26859721fb4eSBram Moolenaar    call assert_false(exists('local'))
26869721fb4eSBram Moolenaar    call assert_false(exists('exported'))
26879721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
26889721fb4eSBram Moolenaar    call assert_equal('global', global)
26899721fb4eSBram Moolenaar    call assert_equal('global', g:global)
26909721fb4eSBram Moolenaar
26919721fb4eSBram Moolenaar    " imported variable becomes script-local
26929721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
26939721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
26949721fb4eSBram Moolenaar    call assert_false(exists('exported'))
26959721fb4eSBram Moolenaar
26969721fb4eSBram Moolenaar    " imported function becomes script-local
26979721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
26989721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
26999721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
27009721fb4eSBram Moolenaar  END
27019721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
27029721fb4eSBram Moolenaar
27039721fb4eSBram Moolenaar  let vim9_lines =<< trim END
27049721fb4eSBram Moolenaar    vim9script
27059721fb4eSBram Moolenaar    let local = 'local'
27069721fb4eSBram Moolenaar    g:global = 'global'
27079721fb4eSBram Moolenaar    export let exported = 'exported'
27089721fb4eSBram Moolenaar    export def GetText(): string
27099721fb4eSBram Moolenaar       return 'text'
27109721fb4eSBram Moolenaar    enddef
27119721fb4eSBram Moolenaar  END
27129721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
27139721fb4eSBram Moolenaar
27149721fb4eSBram Moolenaar  source Xlegacy_script.vim
27159721fb4eSBram Moolenaar
27169721fb4eSBram Moolenaar  assert_equal('global', g:global)
2717f5be8cdbSBram Moolenaar  unlet g:global
27189721fb4eSBram Moolenaar
27199721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
27209721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
27219721fb4eSBram Moolenaarenddef
2722a5d0077eSBram Moolenaar
2723eeb27bfeSBram Moolenaardef Test_vim9_copen()
2724eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2725eeb27bfeSBram Moolenaar  copen
2726eeb27bfeSBram Moolenaar  quit
2727eeb27bfeSBram Moolenaarenddef
2728eeb27bfeSBram Moolenaar
27292d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
27302d6b20d6SBram Moolenaardef Test_vim9_autoload()
27312d6b20d6SBram Moolenaar  let lines =<< trim END
27322d6b20d6SBram Moolenaar     vim9script
27332d6b20d6SBram Moolenaar     def foo#test()
27342d6b20d6SBram Moolenaar         echomsg getreg('"')
27352d6b20d6SBram Moolenaar     enddef
27362d6b20d6SBram Moolenaar  END
27372d6b20d6SBram Moolenaar
27382d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
27392d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
27402d6b20d6SBram Moolenaar  let save_rtp = &rtp
27412d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
27422d6b20d6SBram Moolenaar  augroup test
27432d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
27442d6b20d6SBram Moolenaar  augroup END
27452d6b20d6SBram Moolenaar
27462d6b20d6SBram Moolenaar  normal Y
27472d6b20d6SBram Moolenaar
27482d6b20d6SBram Moolenaar  augroup test
27492d6b20d6SBram Moolenaar    autocmd!
27502d6b20d6SBram Moolenaar  augroup END
27512d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
27522d6b20d6SBram Moolenaar  &rtp = save_rtp
27532d6b20d6SBram Moolenaarenddef
27542d6b20d6SBram Moolenaar
2755585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
2756585fea7bSBram Moolenaardef Test_substitute_cmd()
2757585fea7bSBram Moolenaar  new
2758585fea7bSBram Moolenaar  setline(1, 'something')
2759585fea7bSBram Moolenaar  :substitute(some(other(
2760585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
2761585fea7bSBram Moolenaar  bwipe!
2762585fea7bSBram Moolenaar
2763f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
2764585fea7bSBram Moolenaar  let lines =<< trim END
2765585fea7bSBram Moolenaar    vim9script
2766585fea7bSBram Moolenaar    new
2767585fea7bSBram Moolenaar    setline(1, 'something')
2768585fea7bSBram Moolenaar    :substitute(some(other(
2769585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
2770585fea7bSBram Moolenaar    bwipe!
2771585fea7bSBram Moolenaar  END
2772585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
2773585fea7bSBram Moolenaar  source Xvim9lines
2774585fea7bSBram Moolenaar
2775585fea7bSBram Moolenaar  delete('Xvim9lines')
2776585fea7bSBram Moolenaarenddef
2777585fea7bSBram Moolenaar
27788a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
2779