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
7e3d4685fSBram Moolenaarsource shared.vim
88a7d6542SBram Moolenaar
98a7d6542SBram Moolenaardef Test_syntax()
108a7d6542SBram Moolenaar  let var = 234
118a7d6542SBram Moolenaar  let other: list<string> = ['asdf']
128a7d6542SBram Moolenaarenddef
138a7d6542SBram Moolenaar
145d72ce69SBram Moolenaardef Test_range_only()
155d72ce69SBram Moolenaar  new
165d72ce69SBram Moolenaar  setline(1, ['blah', 'Blah'])
175d72ce69SBram Moolenaar  :/Blah/
185d72ce69SBram Moolenaar  assert_equal(2, getcurpos()[1])
19c2af0affSBram Moolenaar  bwipe!
20c2af0affSBram Moolenaar
21c2af0affSBram Moolenaar  # without range commands use current line
22c2af0affSBram Moolenaar  new
23c2af0affSBram Moolenaar  setline(1, ['one', 'two', 'three'])
24c2af0affSBram Moolenaar  :2
25c2af0affSBram Moolenaar  print
26c2af0affSBram Moolenaar  assert_equal('two', Screenline(&lines))
27c2af0affSBram Moolenaar  :3
28c2af0affSBram Moolenaar  list
29c2af0affSBram Moolenaar  assert_equal('three$', Screenline(&lines))
30c2af0affSBram Moolenaar  bwipe!
315d72ce69SBram Moolenaarenddef
325d72ce69SBram Moolenaar
336e587dcbSBram Moolenaarlet s:appendToMe = 'xxx'
346e587dcbSBram Moolenaarlet s:addToMe = 111
35401d9ffbSBram Moolenaarlet g:existing = 'yes'
36a8c17704SBram Moolenaarlet g:inc_counter = 1
37a8c17704SBram Moolenaarlet $SOME_ENV_VAR = 'some'
38a6e67e4fSBram Moolenaarlet g:alist = [7]
39a6e67e4fSBram Moolenaarlet g:astring = 'text'
40f0b9f43cSBram Moolenaarlet g:anumber = 123
416e587dcbSBram Moolenaar
42*ba7c0d7bSBram Moolenaardef Test_assignment_bool()
438a7d6542SBram Moolenaar  let bool1: bool = true
448a7d6542SBram Moolenaar  assert_equal(v:true, bool1)
458a7d6542SBram Moolenaar  let bool2: bool = false
468a7d6542SBram Moolenaar  assert_equal(v:false, bool2)
478a7d6542SBram Moolenaar
4829a86ffeSBram Moolenaar  let bool3: bool = 0
4929a86ffeSBram Moolenaar  assert_equal(0, bool3)
5029a86ffeSBram Moolenaar  let bool4: bool = 1
5129a86ffeSBram Moolenaar  assert_equal(1, bool4)
5229a86ffeSBram Moolenaar
53*ba7c0d7bSBram Moolenaar  let lines =<< trim END
54*ba7c0d7bSBram Moolenaar    vim9script
55*ba7c0d7bSBram Moolenaar    def GetFlag(): bool
56*ba7c0d7bSBram Moolenaar      let flag: bool = 1
57*ba7c0d7bSBram Moolenaar      return flag
58*ba7c0d7bSBram Moolenaar    enddef
59*ba7c0d7bSBram Moolenaar    let flag: bool = GetFlag()
60*ba7c0d7bSBram Moolenaar    flag = 0
61*ba7c0d7bSBram Moolenaar    flag = 1
62*ba7c0d7bSBram Moolenaar  END
63*ba7c0d7bSBram Moolenaar  CheckScriptSuccess(lines)
64*ba7c0d7bSBram Moolenaar  CheckDefAndScriptFailure(['let x: bool = 2'], 'E1012:')
65*ba7c0d7bSBram Moolenaar  CheckDefAndScriptFailure(['let x: bool = -1'], 'E1012:')
66*ba7c0d7bSBram Moolenaar  CheckDefAndScriptFailure(['let x: bool = [1]'], 'E1012:')
67*ba7c0d7bSBram Moolenaar  CheckDefAndScriptFailure(['let x: bool = {}'], 'E1012:')
68*ba7c0d7bSBram Moolenaar  CheckDefAndScriptFailure(['let x: bool = "x"'], 'E1012:')
69*ba7c0d7bSBram Moolenaarenddef
70*ba7c0d7bSBram Moolenaar
71*ba7c0d7bSBram Moolenaardef Test_assignment()
72d2c61705SBram Moolenaar  CheckDefFailure(['let x:string'], 'E1069:')
73d2c61705SBram Moolenaar  CheckDefFailure(['let x:string = "x"'], 'E1069:')
74d2c61705SBram Moolenaar  CheckDefFailure(['let a:string = "x"'], 'E1069:')
75d2c61705SBram Moolenaar  CheckDefFailure(['let lambda = {-> "lambda"}'], 'E704:')
76f93c7feaSBram Moolenaar
774cdb13ceSBram Moolenaar  let nr: number = 1234
78d2c61705SBram Moolenaar  CheckDefFailure(['let nr: number = "asdf"'], 'E1012:')
794cdb13ceSBram Moolenaar
80b209750bSBram Moolenaar  let a: number = 6 #comment
819be61bbbSBram Moolenaar  assert_equal(6, a)
829be61bbbSBram Moolenaar
8342a480bfSBram Moolenaar  if has('channel')
8442a480bfSBram Moolenaar    let chan1: channel
85fbdd08edSBram Moolenaar    let job1: job
86f51cb4e0SBram Moolenaar    let job2: job = job_start('willfail')
8742a480bfSBram Moolenaar  endif
88fbdd08edSBram Moolenaar  if has('float')
89fbdd08edSBram Moolenaar    let float1: float = 3.4
90fbdd08edSBram Moolenaar  endif
915deeb3f1SBram Moolenaar  let Funky1: func
925deeb3f1SBram Moolenaar  let Funky2: func = function('len')
934c17ad94SBram Moolenaar  let Party2: func = funcref('g:Test_syntax')
9442a480bfSBram Moolenaar
95b209750bSBram Moolenaar  g:newvar = 'new'  #comment
96401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
97401d9ffbSBram Moolenaar
98401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
99401d9ffbSBram Moolenaar  g:existing = 'no'
100401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
101401d9ffbSBram Moolenaar
102b283a8a6SBram Moolenaar  v:char = 'abc'
1036e587dcbSBram Moolenaar  assert_equal('abc', v:char)
104b283a8a6SBram Moolenaar
105b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
1066e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
107b283a8a6SBram Moolenaar  $ENVVAR = ''
1086e587dcbSBram Moolenaar
109b5ed2660SBram Moolenaar  let lines =<< trim END
110b5ed2660SBram Moolenaar    vim9script
111b5ed2660SBram Moolenaar    $ENVVAR = 'barfoo'
112b5ed2660SBram Moolenaar    assert_equal('barfoo', $ENVVAR)
113b5ed2660SBram Moolenaar    $ENVVAR = ''
114b5ed2660SBram Moolenaar  END
115d2c61705SBram Moolenaar  CheckScriptSuccess(lines)
116b5ed2660SBram Moolenaar
117fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
118fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
119fd1823e0SBram Moolenaar  s:addToMe += 222
120fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
1210bbf722aSBram Moolenaar  s:newVar = 'new'
1220bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
123a8c17704SBram Moolenaar
124a8c17704SBram Moolenaar  set ts=7
125a8c17704SBram Moolenaar  &ts += 1
126a8c17704SBram Moolenaar  assert_equal(8, &ts)
12780c34ca3SBram Moolenaar  &ts -= 3
12880c34ca3SBram Moolenaar  assert_equal(5, &ts)
12980c34ca3SBram Moolenaar  &ts *= 2
13080c34ca3SBram Moolenaar  assert_equal(10, &ts)
13180c34ca3SBram Moolenaar  &ts /= 3
13280c34ca3SBram Moolenaar  assert_equal(3, &ts)
13380c34ca3SBram Moolenaar  set ts=10
13480c34ca3SBram Moolenaar  &ts %= 4
13580c34ca3SBram Moolenaar  assert_equal(2, &ts)
136b5ed2660SBram Moolenaar
13793ad1471SBram Moolenaar  if has('float')
13893ad1471SBram Moolenaar    let f100: float = 100.0
13993ad1471SBram Moolenaar    f100 /= 5
14093ad1471SBram Moolenaar    assert_equal(20.0, f100)
14193ad1471SBram Moolenaar
14293ad1471SBram Moolenaar    let f200: float = 200.0
14393ad1471SBram Moolenaar    f200 /= 5.0
14493ad1471SBram Moolenaar    assert_equal(40.0, f200)
14593ad1471SBram Moolenaar
14693ad1471SBram Moolenaar    CheckDefFailure(['let nr: number = 200', 'nr /= 5.0'], 'E1012:')
14793ad1471SBram Moolenaar  endif
14893ad1471SBram Moolenaar
149b5ed2660SBram Moolenaar  lines =<< trim END
150b5ed2660SBram Moolenaar    &ts = 6
151b5ed2660SBram Moolenaar    &ts += 3
152b5ed2660SBram Moolenaar    assert_equal(9, &ts)
1532e800955SBram Moolenaar
1542e800955SBram Moolenaar    &l:ts = 6
1552e800955SBram Moolenaar    assert_equal(6, &ts)
1562e800955SBram Moolenaar    &l:ts += 2
1572e800955SBram Moolenaar    assert_equal(8, &ts)
1582e800955SBram Moolenaar
1592e800955SBram Moolenaar    &g:ts = 6
1602e800955SBram Moolenaar    assert_equal(6, &g:ts)
1612e800955SBram Moolenaar    &g:ts += 2
1622e800955SBram Moolenaar    assert_equal(8, &g:ts)
163b5ed2660SBram Moolenaar  END
1642e800955SBram Moolenaar  CheckDefAndScriptSuccess(lines)
165b5ed2660SBram Moolenaar
1660aae4809SBram Moolenaar  CheckDefFailure(['&notex += 3'], 'E113:')
1670aae4809SBram Moolenaar  CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
1680aae4809SBram Moolenaar  CheckDefFailure(['&ts = [7]'], 'E1012:')
1690aae4809SBram Moolenaar  CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list')
1700aae4809SBram Moolenaar  CheckDefFailure(['&ts = "xx"'], 'E1012:')
1710aae4809SBram Moolenaar  CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string')
1720aae4809SBram Moolenaar  CheckDefFailure(['&path += 3'], 'E1012:')
1730aae4809SBram Moolenaar  CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
174cb711abfSBram Moolenaar  # test freeing ISN_STOREOPT
1750aae4809SBram Moolenaar  CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
17680c34ca3SBram Moolenaar  &ts = 8
177a8c17704SBram Moolenaar
1780aae4809SBram Moolenaar  lines =<< trim END
1790aae4809SBram Moolenaar    let save_TI = &t_TI
1800aae4809SBram Moolenaar    &t_TI = ''
1810aae4809SBram Moolenaar    assert_equal('', &t_TI)
1820aae4809SBram Moolenaar    &t_TI = 'xxx'
1830aae4809SBram Moolenaar    assert_equal('xxx', &t_TI)
1840aae4809SBram Moolenaar    &t_TI = save_TI
1850aae4809SBram Moolenaar  END
186*ba7c0d7bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
1870aae4809SBram Moolenaar
1880aae4809SBram Moolenaar  CheckDefFailure(['&t_TI = 123'], 'E1012:')
1890aae4809SBram Moolenaar  CheckScriptFailure(['vim9script', '&t_TI = 123'], 'E928:')
1900aae4809SBram Moolenaar
1910aae4809SBram Moolenaar  CheckDefFailure(['let s:var = 123'], 'E1101:')
1920aae4809SBram Moolenaar  CheckDefFailure(['let s:var: number'], 'E1101:')
19333afa244SBram Moolenaar
194f9b2b496SBram Moolenaar  lines =<< trim END
195f9b2b496SBram Moolenaar    vim9script
196f9b2b496SBram Moolenaar    def SomeFunc()
197f9b2b496SBram Moolenaar      s:var = 123
198f9b2b496SBram Moolenaar    enddef
199f9b2b496SBram Moolenaar    defcompile
200f9b2b496SBram Moolenaar  END
201d2c61705SBram Moolenaar  CheckScriptFailure(lines, 'E1089:')
202f9b2b496SBram Moolenaar
203a8c17704SBram Moolenaar  g:inc_counter += 1
204a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
205a8c17704SBram Moolenaar
206a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
207a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
208d2c61705SBram Moolenaar  CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1051:')
209d2c61705SBram Moolenaar  CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1012:')
210a8c17704SBram Moolenaar
211b5ed2660SBram Moolenaar  lines =<< trim END
212b5ed2660SBram Moolenaar    @c = 'areg'
213b5ed2660SBram Moolenaar    @c ..= 'add'
214b5ed2660SBram Moolenaar    assert_equal('aregadd', @c)
215b5ed2660SBram Moolenaar  END
2162e800955SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2172e800955SBram Moolenaar
218d2c61705SBram Moolenaar  CheckDefFailure(['@a += "more"'], 'E1051:')
219d2c61705SBram Moolenaar  CheckDefFailure(['@a += 123'], 'E1012:')
220b5ed2660SBram Moolenaar
221e69f6d04SBram Moolenaar  v:errmsg = 'none'
222e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
223e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
224d2c61705SBram Moolenaar  CheckDefFailure(['v:errmsg += "more"'], 'E1051:')
225d2c61705SBram Moolenaar  CheckDefFailure(['v:errmsg += 123'], 'E1012:')
22633afa244SBram Moolenaar
22733afa244SBram Moolenaar  # single letter variables
22833afa244SBram Moolenaar  a = 123
22933afa244SBram Moolenaar  assert_equal(123, a)
23033afa244SBram Moolenaar  let b: number
23133afa244SBram Moolenaar  b = 123
23233afa244SBram Moolenaar  assert_equal(123, b)
23333afa244SBram Moolenaar  let g: number
23433afa244SBram Moolenaar  g = 123
23533afa244SBram Moolenaar  assert_equal(123, g)
23633afa244SBram Moolenaar  let s: number
23733afa244SBram Moolenaar  s = 123
23833afa244SBram Moolenaar  assert_equal(123, s)
23933afa244SBram Moolenaar  let t: number
24033afa244SBram Moolenaar  t = 123
24133afa244SBram Moolenaar  assert_equal(123, t)
24233afa244SBram Moolenaar  let v: number
24333afa244SBram Moolenaar  v = 123
24433afa244SBram Moolenaar  assert_equal(123, v)
24533afa244SBram Moolenaar  let w: number
24633afa244SBram Moolenaar  w = 123
24733afa244SBram Moolenaar  assert_equal(123, w)
2485deeb3f1SBram Moolenaarenddef
2495deeb3f1SBram Moolenaar
2503b74b6b4SBram Moolenaardef Test_vim9_single_char_vars()
2513b74b6b4SBram Moolenaar  let lines =<< trim END
2523b74b6b4SBram Moolenaar      vim9script
2533b74b6b4SBram Moolenaar
254f5be8cdbSBram Moolenaar      # single character variable declarations work
2553b74b6b4SBram Moolenaar      let a: string
2563b74b6b4SBram Moolenaar      let b: number
2573b74b6b4SBram Moolenaar      let l: list<any>
2583b74b6b4SBram Moolenaar      let s: string
2593b74b6b4SBram Moolenaar      let t: number
2603b74b6b4SBram Moolenaar      let v: number
2613b74b6b4SBram Moolenaar      let w: number
2623b74b6b4SBram Moolenaar
263f5be8cdbSBram Moolenaar      # script-local variables can be used without s: prefix
2643b74b6b4SBram Moolenaar      a = 'script-a'
2653b74b6b4SBram Moolenaar      b = 111
2663b74b6b4SBram Moolenaar      l = [1, 2, 3]
2673b74b6b4SBram Moolenaar      s = 'script-s'
2683b74b6b4SBram Moolenaar      t = 222
2693b74b6b4SBram Moolenaar      v = 333
2703b74b6b4SBram Moolenaar      w = 444
2713b74b6b4SBram Moolenaar
2723b74b6b4SBram Moolenaar      assert_equal('script-a', a)
2733b74b6b4SBram Moolenaar      assert_equal(111, b)
2743b74b6b4SBram Moolenaar      assert_equal([1, 2, 3], l)
2753b74b6b4SBram Moolenaar      assert_equal('script-s', s)
2763b74b6b4SBram Moolenaar      assert_equal(222, t)
2773b74b6b4SBram Moolenaar      assert_equal(333, v)
2783b74b6b4SBram Moolenaar      assert_equal(444, w)
2793b74b6b4SBram Moolenaar  END
2803b74b6b4SBram Moolenaar  writefile(lines, 'Xsinglechar')
2813b74b6b4SBram Moolenaar  source Xsinglechar
2823b74b6b4SBram Moolenaar  delete('Xsinglechar')
2833b74b6b4SBram Moolenaarenddef
2843b74b6b4SBram Moolenaar
28584370087SBram Moolenaardef Test_assignment_list()
28684370087SBram Moolenaar  let list1: list<bool> = [false, true, false]
28784370087SBram Moolenaar  let list2: list<number> = [1, 2, 3]
28884370087SBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
28984370087SBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
29084370087SBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
29184370087SBram Moolenaar
29284370087SBram Moolenaar  let listS: list<string> = []
29384370087SBram Moolenaar  let listN: list<number> = []
29484370087SBram Moolenaar
29584370087SBram Moolenaar  assert_equal([1, 2, 3], list2)
29684370087SBram Moolenaar  list2[-1] = 99
29784370087SBram Moolenaar  assert_equal([1, 2, 99], list2)
29884370087SBram Moolenaar  list2[-2] = 88
29984370087SBram Moolenaar  assert_equal([1, 88, 99], list2)
30084370087SBram Moolenaar  list2[-3] = 77
30184370087SBram Moolenaar  assert_equal([77, 88, 99], list2)
302dd29f1b0SBram Moolenaar  list2 += [100]
303dd29f1b0SBram Moolenaar  assert_equal([77, 88, 99, 100], list2)
304dd29f1b0SBram Moolenaar
305dd29f1b0SBram Moolenaar  list3 += ['end']
306dd29f1b0SBram Moolenaar  assert_equal(['sdf', 'asdf', 'end'], list3)
307dd29f1b0SBram Moolenaar
308dd29f1b0SBram Moolenaar
309d2c61705SBram Moolenaar  CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
310d2c61705SBram Moolenaar  CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:')
31184370087SBram Moolenaar
31284370087SBram Moolenaar  # type becomes list<any>
31384370087SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
31484370087SBram Moolenaarenddef
31584370087SBram Moolenaar
316b31be3f9SBram Moolenaardef Test_assignment_list_vim9script()
317b31be3f9SBram Moolenaar  let lines =<< trim END
318b31be3f9SBram Moolenaar    vim9script
319b31be3f9SBram Moolenaar    let v1: number
320b31be3f9SBram Moolenaar    let v2: number
321b31be3f9SBram Moolenaar    let v3: number
322b31be3f9SBram Moolenaar    [v1, v2, v3] = [1, 2, 3]
323b31be3f9SBram Moolenaar    assert_equal([1, 2, 3], [v1, v2, v3])
324b31be3f9SBram Moolenaar  END
325d2c61705SBram Moolenaar  CheckScriptSuccess(lines)
326b31be3f9SBram Moolenaarenddef
327b31be3f9SBram Moolenaar
32884370087SBram Moolenaardef Test_assignment_dict()
32984370087SBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
33084370087SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
33184370087SBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
33284370087SBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
33374fae513SBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, two: 0z02}
33484370087SBram Moolenaar
335f5be8cdbSBram Moolenaar  # overwrite
336c785b9a7SBram Moolenaar  dict3['key'] = 'another'
337c785b9a7SBram Moolenaar
33858626872SBram Moolenaar  # empty key can be used
33958626872SBram Moolenaar  let dd = {}
34058626872SBram Moolenaar  dd[""] = 6
34158626872SBram Moolenaar  assert_equal({'': 6}, dd)
34284370087SBram Moolenaar
34384370087SBram Moolenaar  # type becomes dict<any>
34484370087SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
3458e4c8c85SBram Moolenaar
3468e4c8c85SBram Moolenaar  # assignment to script-local dict
3478e4c8c85SBram Moolenaar  let lines =<< trim END
3488e4c8c85SBram Moolenaar    vim9script
3498e4c8c85SBram Moolenaar    let test: dict<any> = {}
3508e4c8c85SBram Moolenaar    def FillDict(): dict<any>
3518e4c8c85SBram Moolenaar      test['a'] = 43
3528e4c8c85SBram Moolenaar      return test
3538e4c8c85SBram Moolenaar    enddef
3548e4c8c85SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3558e4c8c85SBram Moolenaar  END
3568e4c8c85SBram Moolenaar  call CheckScriptSuccess(lines)
3578e4c8c85SBram Moolenaar
3588e4c8c85SBram Moolenaar  lines =<< trim END
3598e4c8c85SBram Moolenaar    vim9script
3608e4c8c85SBram Moolenaar    let test: dict<any>
3618e4c8c85SBram Moolenaar    def FillDict(): dict<any>
3628e4c8c85SBram Moolenaar      test['a'] = 43
3638e4c8c85SBram Moolenaar      return test
3648e4c8c85SBram Moolenaar    enddef
3658e4c8c85SBram Moolenaar    FillDict()
3668e4c8c85SBram Moolenaar  END
3678e4c8c85SBram Moolenaar  call CheckScriptFailure(lines, 'E1103:')
3682caa1594SBram Moolenaar
3692caa1594SBram Moolenaar  # assignment to global dict
3702caa1594SBram Moolenaar  lines =<< trim END
3712caa1594SBram Moolenaar    vim9script
3722caa1594SBram Moolenaar    g:test = {}
3732caa1594SBram Moolenaar    def FillDict(): dict<any>
3742caa1594SBram Moolenaar      g:test['a'] = 43
3752caa1594SBram Moolenaar      return g:test
3762caa1594SBram Moolenaar    enddef
3772caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3782caa1594SBram Moolenaar  END
3792caa1594SBram Moolenaar  call CheckScriptSuccess(lines)
3802caa1594SBram Moolenaar
3812caa1594SBram Moolenaar  # assignment to buffer dict
3822caa1594SBram Moolenaar  lines =<< trim END
3832caa1594SBram Moolenaar    vim9script
3842caa1594SBram Moolenaar    b:test = {}
3852caa1594SBram Moolenaar    def FillDict(): dict<any>
3862caa1594SBram Moolenaar      b:test['a'] = 43
3872caa1594SBram Moolenaar      return b:test
3882caa1594SBram Moolenaar    enddef
3892caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3902caa1594SBram Moolenaar  END
3912caa1594SBram Moolenaar  call CheckScriptSuccess(lines)
39284370087SBram Moolenaarenddef
39384370087SBram Moolenaar
394d3aac291SBram Moolenaardef Test_assignment_local()
395f5be8cdbSBram Moolenaar  # Test in a separated file in order not to the current buffer/window/tab is
396f5be8cdbSBram Moolenaar  # changed.
397d3aac291SBram Moolenaar  let script_lines: list<string> =<< trim END
398d3aac291SBram Moolenaar    let b:existing = 'yes'
399d3aac291SBram Moolenaar    let w:existing = 'yes'
400d3aac291SBram Moolenaar    let t:existing = 'yes'
401d3aac291SBram Moolenaar
402d3aac291SBram Moolenaar    def Test_assignment_local_internal()
403d3aac291SBram Moolenaar      b:newvar = 'new'
404d3aac291SBram Moolenaar      assert_equal('new', b:newvar)
405d3aac291SBram Moolenaar      assert_equal('yes', b:existing)
406d3aac291SBram Moolenaar      b:existing = 'no'
407d3aac291SBram Moolenaar      assert_equal('no', b:existing)
408396f3138SBram Moolenaar      b:existing ..= 'NO'
409396f3138SBram Moolenaar      assert_equal('noNO', b:existing)
410d3aac291SBram Moolenaar
411d3aac291SBram Moolenaar      w:newvar = 'new'
412d3aac291SBram Moolenaar      assert_equal('new', w:newvar)
413d3aac291SBram Moolenaar      assert_equal('yes', w:existing)
414d3aac291SBram Moolenaar      w:existing = 'no'
415d3aac291SBram Moolenaar      assert_equal('no', w:existing)
416396f3138SBram Moolenaar      w:existing ..= 'NO'
417396f3138SBram Moolenaar      assert_equal('noNO', w:existing)
418d3aac291SBram Moolenaar
419d3aac291SBram Moolenaar      t:newvar = 'new'
420d3aac291SBram Moolenaar      assert_equal('new', t:newvar)
421d3aac291SBram Moolenaar      assert_equal('yes', t:existing)
422d3aac291SBram Moolenaar      t:existing = 'no'
423d3aac291SBram Moolenaar      assert_equal('no', t:existing)
424396f3138SBram Moolenaar      t:existing ..= 'NO'
425396f3138SBram Moolenaar      assert_equal('noNO', t:existing)
426d3aac291SBram Moolenaar    enddef
427d3aac291SBram Moolenaar    call Test_assignment_local_internal()
428d3aac291SBram Moolenaar  END
429d3aac291SBram Moolenaar  call CheckScriptSuccess(script_lines)
430d3aac291SBram Moolenaarenddef
431d3aac291SBram Moolenaar
4325deeb3f1SBram Moolenaardef Test_assignment_default()
433e69f6d04SBram Moolenaar
434cb711abfSBram Moolenaar  # Test default values.
435e69f6d04SBram Moolenaar  let thebool: bool
436e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
437e69f6d04SBram Moolenaar
438e69f6d04SBram Moolenaar  let thenumber: number
439e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
440e69f6d04SBram Moolenaar
441e69f6d04SBram Moolenaar  if has('float')
442e69f6d04SBram Moolenaar    let thefloat: float
443e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
444e69f6d04SBram Moolenaar  endif
445e69f6d04SBram Moolenaar
446e69f6d04SBram Moolenaar  let thestring: string
447e69f6d04SBram Moolenaar  assert_equal('', thestring)
448e69f6d04SBram Moolenaar
449e69f6d04SBram Moolenaar  let theblob: blob
450e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
451e69f6d04SBram Moolenaar
4525deeb3f1SBram Moolenaar  let Thefunc: func
4535deeb3f1SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
454e69f6d04SBram Moolenaar
455e69f6d04SBram Moolenaar  let thelist: list<any>
456e69f6d04SBram Moolenaar  assert_equal([], thelist)
457e69f6d04SBram Moolenaar
458e69f6d04SBram Moolenaar  let thedict: dict<any>
459e69f6d04SBram Moolenaar  assert_equal({}, thedict)
460e69f6d04SBram Moolenaar
4612c869deeSBram Moolenaar  if has('channel')
462e69f6d04SBram Moolenaar    let thejob: job
463e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
464e69f6d04SBram Moolenaar
465e69f6d04SBram Moolenaar    let thechannel: channel
466e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
467c785b9a7SBram Moolenaar
468c785b9a7SBram Moolenaar    if has('unix') && executable('cat')
469f5be8cdbSBram Moolenaar      # check with non-null job and channel, types must match
470c785b9a7SBram Moolenaar      thejob = job_start("cat ", #{})
471c785b9a7SBram Moolenaar      thechannel = job_getchannel(thejob)
472c785b9a7SBram Moolenaar      job_stop(thejob, 'kill')
473c785b9a7SBram Moolenaar    endif
4742c869deeSBram Moolenaar  endif
475585fea7bSBram Moolenaar
476585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
477585fea7bSBram Moolenaar  assert_equal(5678, nr)
4788a7d6542SBram Moolenaarenddef
4798a7d6542SBram Moolenaar
48047a519a9SBram Moolenaardef Test_assignment_var_list()
48147a519a9SBram Moolenaar  let v1: string
48247a519a9SBram Moolenaar  let v2: string
4839af78769SBram Moolenaar  let vrem: list<string>
4849af78769SBram Moolenaar  [v1] = ['aaa']
4859af78769SBram Moolenaar  assert_equal('aaa', v1)
4869af78769SBram Moolenaar
48747a519a9SBram Moolenaar  [v1, v2] = ['one', 'two']
48847a519a9SBram Moolenaar  assert_equal('one', v1)
48947a519a9SBram Moolenaar  assert_equal('two', v2)
4909af78769SBram Moolenaar
4919af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two']
4929af78769SBram Moolenaar  assert_equal('one', v1)
4939af78769SBram Moolenaar  assert_equal('two', v2)
4949af78769SBram Moolenaar  assert_equal([], vrem)
4959af78769SBram Moolenaar
4969af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two', 'three']
4979af78769SBram Moolenaar  assert_equal('one', v1)
4989af78769SBram Moolenaar  assert_equal('two', v2)
4999af78769SBram Moolenaar  assert_equal(['three'], vrem)
5001c199f9cSBram Moolenaar
5011c199f9cSBram Moolenaar  [&ts, &sw] = [3, 4]
5021c199f9cSBram Moolenaar  assert_equal(3, &ts)
5031c199f9cSBram Moolenaar  assert_equal(4, &sw)
5041c199f9cSBram Moolenaar  set ts=8 sw=4
50547a519a9SBram Moolenaarenddef
50647a519a9SBram Moolenaar
507c7e44a7eSBram Moolenaardef Test_assignment_vim9script()
508c7e44a7eSBram Moolenaar  let lines =<< trim END
509c7e44a7eSBram Moolenaar    vim9script
510c7e44a7eSBram Moolenaar    def Func(): list<number>
511c7e44a7eSBram Moolenaar      return [1, 2]
512c7e44a7eSBram Moolenaar    enddef
513c7e44a7eSBram Moolenaar    let var1: number
514c7e44a7eSBram Moolenaar    let var2: number
515c7e44a7eSBram Moolenaar    [var1, var2] =
516c7e44a7eSBram Moolenaar          Func()
517c7e44a7eSBram Moolenaar    assert_equal(1, var1)
518c7e44a7eSBram Moolenaar    assert_equal(2, var2)
519c7e44a7eSBram Moolenaar    let ll =
520c7e44a7eSBram Moolenaar          Func()
521c7e44a7eSBram Moolenaar    assert_equal([1, 2], ll)
52283144546SBram Moolenaar
52383144546SBram Moolenaar    @/ = 'text'
52483144546SBram Moolenaar    assert_equal('text', @/)
52583144546SBram Moolenaar    @0 = 'zero'
52683144546SBram Moolenaar    assert_equal('zero', @0)
52783144546SBram Moolenaar    @1 = 'one'
52883144546SBram Moolenaar    assert_equal('one', @1)
52983144546SBram Moolenaar    @9 = 'nine'
53083144546SBram Moolenaar    assert_equal('nine', @9)
53183144546SBram Moolenaar    @- = 'minus'
53283144546SBram Moolenaar    assert_equal('minus', @-)
53383144546SBram Moolenaar    if has('clipboard_working')
53483144546SBram Moolenaar      @* = 'star'
53583144546SBram Moolenaar      assert_equal('star', @*)
53683144546SBram Moolenaar      @+ = 'plus'
53783144546SBram Moolenaar      assert_equal('plus', @+)
53883144546SBram Moolenaar    endif
53995dd9f25SBram Moolenaar
54095dd9f25SBram Moolenaar    let a: number = 123
54195dd9f25SBram Moolenaar    assert_equal(123, a)
54295dd9f25SBram Moolenaar    let s: string = 'yes'
54395dd9f25SBram Moolenaar    assert_equal('yes', s)
54495dd9f25SBram Moolenaar    let b: number = 42
54595dd9f25SBram Moolenaar    assert_equal(42, b)
54695dd9f25SBram Moolenaar    let w: number = 43
54795dd9f25SBram Moolenaar    assert_equal(43, w)
54895dd9f25SBram Moolenaar    let t: number = 44
54995dd9f25SBram Moolenaar    assert_equal(44, t)
550c7e44a7eSBram Moolenaar  END
551c7e44a7eSBram Moolenaar  CheckScriptSuccess(lines)
552c7e44a7eSBram Moolenaarenddef
553c7e44a7eSBram Moolenaar
554cab27678SBram Moolenaardef Mess(): string
555cab27678SBram Moolenaar  v:foldstart = 123
556cab27678SBram Moolenaar  return 'xxx'
557cab27678SBram Moolenaarenddef
558cab27678SBram Moolenaar
559d72c1bf0SBram Moolenaardef Test_assignment_failure()
560d2c61705SBram Moolenaar  CheckDefFailure(['let var=234'], 'E1004:')
561d2c61705SBram Moolenaar  CheckDefFailure(['let var =234'], 'E1004:')
562d2c61705SBram Moolenaar  CheckDefFailure(['let var= 234'], 'E1004:')
5638a7d6542SBram Moolenaar
564d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:')
565d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='")
566d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:')
567d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:')
568d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:')
569d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='")
570d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:')
571d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='")
57263be3d4bSBram Moolenaar
573d2c61705SBram Moolenaar  CheckDefFailure(['let true = 1'], 'E1034:')
574d2c61705SBram Moolenaar  CheckDefFailure(['let false = 1'], 'E1034:')
5758a7d6542SBram Moolenaar
576d2c61705SBram Moolenaar  CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
577d2c61705SBram Moolenaar  CheckDefExecFailure(['let a: number',
5789af78769SBram Moolenaar                       '[a] = test_null_list()'], 'E1093:')
579d2c61705SBram Moolenaar  CheckDefExecFailure(['let a: number',
5809af78769SBram Moolenaar                       '[a] = []'], 'E1093:')
581d2c61705SBram Moolenaar  CheckDefExecFailure(['let x: number',
5829af78769SBram Moolenaar                       'let y: number',
5839af78769SBram Moolenaar                       '[x, y] = [1]'], 'E1093:')
584d2c61705SBram Moolenaar  CheckDefExecFailure(['let x: number',
5859af78769SBram Moolenaar                       'let y: number',
5869af78769SBram Moolenaar                       'let z: list<number>',
5879af78769SBram Moolenaar                       '[x, y; z] = [1]'], 'E1093:')
5889be61bbbSBram Moolenaar
589d2c61705SBram Moolenaar  CheckDefFailure(['let somevar'], "E1022:")
590d2c61705SBram Moolenaar  CheckDefFailure(['let &tabstop = 4'], 'E1052:')
591d2c61705SBram Moolenaar  CheckDefFailure(['&g:option = 5'], 'E113:')
592d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:')
5939be61bbbSBram Moolenaar
594d2c61705SBram Moolenaar  CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
595d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:')
5969be61bbbSBram Moolenaar
597434d72cbSBram Moolenaar  if has('dnd')
598d2c61705SBram Moolenaar    CheckDefFailure(['let @~ = 5'], 'E1066:')
599434d72cbSBram Moolenaar  else
600d2c61705SBram Moolenaar    CheckDefFailure(['let @~ = 5'], 'E354:')
601d2c61705SBram Moolenaar    CheckDefFailure(['@~ = 5'], 'E354:')
602434d72cbSBram Moolenaar  endif
603d2c61705SBram Moolenaar  CheckDefFailure(['let @a = 5'], 'E1066:')
604d2c61705SBram Moolenaar  CheckDefFailure(['let @/ = "x"'], 'E1066:')
605d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:')
6069be61bbbSBram Moolenaar
607d2c61705SBram Moolenaar  CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
608d2c61705SBram Moolenaar  CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
609d2c61705SBram Moolenaar  CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
610d2c61705SBram Moolenaar  CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
6119be61bbbSBram Moolenaar
612d2c61705SBram Moolenaar  CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
613d2c61705SBram Moolenaar  CheckDefFailure(['let xnr += 4'], 'E1020:', 1)
614d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let xnr += 4'], 'E1020:')
615d2c61705SBram Moolenaar  CheckDefFailure(["let xnr = xnr + 1"], 'E1001:', 1)
616d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let xnr = xnr + 4'], 'E121:')
6179be61bbbSBram Moolenaar
618d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1108:')
61933fa29cfSBram Moolenaar
620d2c61705SBram Moolenaar  CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
621d2c61705SBram Moolenaar  CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
6228a7d6542SBram Moolenaar
623d2c61705SBram Moolenaar  CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
624d2c61705SBram Moolenaar  CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
6258a7d6542SBram Moolenaar
626d2c61705SBram Moolenaar  CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
627d2c61705SBram Moolenaar  CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
62842a480bfSBram Moolenaar
629d2c61705SBram Moolenaar  CheckDefFailure(['let var: dict <number>'], 'E1068:')
630d2c61705SBram Moolenaar  CheckDefFailure(['let var: dict<number'], 'E1009:')
631cab27678SBram Moolenaar
632d2c61705SBram Moolenaar  assert_fails('s/^/\=Mess()/n', 'E794:')
633d2c61705SBram Moolenaar  CheckDefFailure(['let var: dict<number'], 'E1009:')
63443e969d3SBram Moolenaar
635d2c61705SBram Moolenaar  CheckDefFailure(['w:foo: number = 10'],
63643e969d3SBram Moolenaar                  'E488: Trailing characters: : number = 1')
637d2c61705SBram Moolenaar  CheckDefFailure(['t:foo: bool = true'],
63843e969d3SBram Moolenaar                  'E488: Trailing characters: : bool = true')
639d2c61705SBram Moolenaar  CheckDefFailure(['b:foo: string = "x"'],
64043e969d3SBram Moolenaar                  'E488: Trailing characters: : string = "x"')
641d2c61705SBram Moolenaar  CheckDefFailure(['g:foo: number = 123'],
64243e969d3SBram Moolenaar                  'E488: Trailing characters: : number = 123')
643d72c1bf0SBram Moolenaarenddef
644d72c1bf0SBram Moolenaar
645d72c1bf0SBram Moolenaardef Test_unlet()
646d72c1bf0SBram Moolenaar  g:somevar = 'yes'
647d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
648d72c1bf0SBram Moolenaar  unlet g:somevar
649d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
650d72c1bf0SBram Moolenaar  unlet! g:somevar
651d72c1bf0SBram Moolenaar
6528436773fSBram Moolenaar  # also works for script-local variable in legacy Vim script
6538436773fSBram Moolenaar  s:somevar = 'legacy'
6548436773fSBram Moolenaar  assert_true(exists('s:somevar'))
6558436773fSBram Moolenaar  unlet s:somevar
6568436773fSBram Moolenaar  assert_false(exists('s:somevar'))
6578436773fSBram Moolenaar  unlet! s:somevar
6588436773fSBram Moolenaar
659d2c61705SBram Moolenaar  CheckScriptFailure([
660d72c1bf0SBram Moolenaar   'vim9script',
661d72c1bf0SBram Moolenaar   'let svar = 123',
662d72c1bf0SBram Moolenaar   'unlet svar',
663d72c1bf0SBram Moolenaar   ], 'E1081:')
664d2c61705SBram Moolenaar  CheckScriptFailure([
665d72c1bf0SBram Moolenaar   'vim9script',
666d72c1bf0SBram Moolenaar   'let svar = 123',
667d72c1bf0SBram Moolenaar   'unlet s:svar',
668d72c1bf0SBram Moolenaar   ], 'E1081:')
669d2c61705SBram Moolenaar  CheckScriptFailure([
670d72c1bf0SBram Moolenaar   'vim9script',
671d72c1bf0SBram Moolenaar   'let svar = 123',
672d72c1bf0SBram Moolenaar   'def Func()',
673d72c1bf0SBram Moolenaar   '  unlet svar',
674d72c1bf0SBram Moolenaar   'enddef',
675822ba247SBram Moolenaar   'defcompile',
676d72c1bf0SBram Moolenaar   ], 'E1081:')
677d2c61705SBram Moolenaar  CheckScriptFailure([
678d72c1bf0SBram Moolenaar   'vim9script',
679d72c1bf0SBram Moolenaar   'let svar = 123',
680d72c1bf0SBram Moolenaar   'def Func()',
681d72c1bf0SBram Moolenaar   '  unlet s:svar',
682d72c1bf0SBram Moolenaar   'enddef',
683822ba247SBram Moolenaar   'defcompile',
684d72c1bf0SBram Moolenaar   ], 'E1081:')
6857bdaea6eSBram Moolenaar
6867bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
6877bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
6887bdaea6eSBram Moolenaar  unlet $ENVVAR
6897bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
690d72c1bf0SBram Moolenaarenddef
691599c89c8SBram Moolenaar
6924c17ad94SBram Moolenaardef Test_delfunction()
693f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
6944c17ad94SBram Moolenaar  CheckScriptSuccess([
6954c17ad94SBram Moolenaar      'vim9script',
6964c17ad94SBram Moolenaar      'func CheckMe()',
6974c17ad94SBram Moolenaar      '  return 123',
6984c17ad94SBram Moolenaar      'endfunc',
6994c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
7004c17ad94SBram Moolenaar      ])
7014c17ad94SBram Moolenaar
702f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
7034c17ad94SBram Moolenaar  CheckScriptFailure([
7044c17ad94SBram Moolenaar      'vim9script',
7054c17ad94SBram Moolenaar      'func DeleteMe1()',
7064c17ad94SBram Moolenaar      'endfunc',
7074c17ad94SBram Moolenaar      'delfunction DeleteMe1',
7084c17ad94SBram Moolenaar      ], 'E1084:')
7094c17ad94SBram Moolenaar  CheckScriptFailure([
7104c17ad94SBram Moolenaar      'vim9script',
7114c17ad94SBram Moolenaar      'func DeleteMe2()',
7124c17ad94SBram Moolenaar      'endfunc',
7134c17ad94SBram Moolenaar      'def DoThat()',
7144c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
7154c17ad94SBram Moolenaar      'enddef',
7164c17ad94SBram Moolenaar      'DoThat()',
7174c17ad94SBram Moolenaar      ], 'E1084:')
7184c17ad94SBram Moolenaar  CheckScriptFailure([
7194c17ad94SBram Moolenaar      'vim9script',
7204c17ad94SBram Moolenaar      'def DeleteMe3()',
7214c17ad94SBram Moolenaar      'enddef',
7224c17ad94SBram Moolenaar      'delfunction DeleteMe3',
7234c17ad94SBram Moolenaar      ], 'E1084:')
7244c17ad94SBram Moolenaar  CheckScriptFailure([
7254c17ad94SBram Moolenaar      'vim9script',
7264c17ad94SBram Moolenaar      'def DeleteMe4()',
7274c17ad94SBram Moolenaar      'enddef',
7284c17ad94SBram Moolenaar      'def DoThat()',
7294c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
7304c17ad94SBram Moolenaar      'enddef',
7314c17ad94SBram Moolenaar      'DoThat()',
7324c17ad94SBram Moolenaar      ], 'E1084:')
733925e9fd6SBram Moolenaar
734925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
735925e9fd6SBram Moolenaar  let lines =<< trim END
736925e9fd6SBram Moolenaar      vim9script
737925e9fd6SBram Moolenaar      def g:Global(): string
738925e9fd6SBram Moolenaar        return "yes"
739925e9fd6SBram Moolenaar      enddef
740925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
741925e9fd6SBram Moolenaar      def! g:Global(): string
742925e9fd6SBram Moolenaar        return "no"
743925e9fd6SBram Moolenaar      enddef
744925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
745925e9fd6SBram Moolenaar      delfunc g:Global
746925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
747925e9fd6SBram Moolenaar  END
748925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
749925e9fd6SBram Moolenaar
750925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
751925e9fd6SBram Moolenaar  lines =<< trim END
752925e9fd6SBram Moolenaar      vim9script
753925e9fd6SBram Moolenaar      func g:Global()
754925e9fd6SBram Moolenaar        return "yes"
755925e9fd6SBram Moolenaar      endfunc
756925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
757925e9fd6SBram Moolenaar      def! g:Global(): string
758925e9fd6SBram Moolenaar        return "no"
759925e9fd6SBram Moolenaar      enddef
760925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
761925e9fd6SBram Moolenaar      delfunc g:Global
762925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
763925e9fd6SBram Moolenaar  END
764925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
765925e9fd6SBram Moolenaar
766925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
767925e9fd6SBram Moolenaar  lines =<< trim END
768925e9fd6SBram Moolenaar      vim9script
769925e9fd6SBram Moolenaar      def g:Global(): string
770925e9fd6SBram Moolenaar        return "yes"
771925e9fd6SBram Moolenaar      enddef
772925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
773925e9fd6SBram Moolenaar      func! g:Global()
774925e9fd6SBram Moolenaar        return "no"
775925e9fd6SBram Moolenaar      endfunc
776925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
777925e9fd6SBram Moolenaar      delfunc g:Global
778925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
779925e9fd6SBram Moolenaar  END
780925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
7814c17ad94SBram Moolenaarenddef
7824c17ad94SBram Moolenaar
783599c89c8SBram Moolenaarfunc Test_wrong_type()
784599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
785599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
786599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
787599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
788599c89c8SBram Moolenaar
789599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
790599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
79142a480bfSBram Moolenaar
79242a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
79342a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
79442a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
79542a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
79642a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
79742a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
79842a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
79942a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
80042a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
80142a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
80242a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
803a0a9f43aSBram Moolenaar
804a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
805a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
8068a7d6542SBram Moolenaarendfunc
8078a7d6542SBram Moolenaar
8088a7d6542SBram Moolenaarfunc Test_const()
8098a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
8108a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
8118a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
8129be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
8138a7d6542SBram Moolenaarendfunc
8148a7d6542SBram Moolenaar
815df069eecSBram Moolenaardef Test_range_no_colon()
816d2c61705SBram Moolenaar  CheckDefFailure(['%s/a/b/'], 'E1050:')
817d2c61705SBram Moolenaar  CheckDefFailure(['+ s/a/b/'], 'E1050:')
818d2c61705SBram Moolenaar  CheckDefFailure(['- s/a/b/'], 'E1050:')
819d2c61705SBram Moolenaar  CheckDefFailure(['. s/a/b/'], 'E1050:')
820df069eecSBram Moolenaarenddef
821df069eecSBram Moolenaar
822df069eecSBram Moolenaar
8238a7d6542SBram Moolenaardef Test_block()
8248a7d6542SBram Moolenaar  let outer = 1
8258a7d6542SBram Moolenaar  {
8268a7d6542SBram Moolenaar    let inner = 2
8278a7d6542SBram Moolenaar    assert_equal(1, outer)
8288a7d6542SBram Moolenaar    assert_equal(2, inner)
8298a7d6542SBram Moolenaar  }
8308a7d6542SBram Moolenaar  assert_equal(1, outer)
8318a7d6542SBram Moolenaarenddef
8328a7d6542SBram Moolenaar
8338a7d6542SBram Moolenaarfunc Test_block_failure()
8348a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
835585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
836585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
8378a7d6542SBram Moolenaarendfunc
8388a7d6542SBram Moolenaar
839d032f34aSBram Moolenaarfunc g:NoSuchFunc()
840d032f34aSBram Moolenaar  echo 'none'
841d032f34aSBram Moolenaarendfunc
842d032f34aSBram Moolenaar
8438a7d6542SBram Moolenaardef Test_try_catch()
8448a7d6542SBram Moolenaar  let l = []
8457a092245SBram Moolenaar  try # comment
8468a7d6542SBram Moolenaar    add(l, '1')
8478a7d6542SBram Moolenaar    throw 'wrong'
8488a7d6542SBram Moolenaar    add(l, '2')
8497a092245SBram Moolenaar  catch # comment
8508a7d6542SBram Moolenaar    add(l, v:exception)
8517a092245SBram Moolenaar  finally # comment
8528a7d6542SBram Moolenaar    add(l, '3')
8537a092245SBram Moolenaar  endtry # comment
8548a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
85568d130c6SBram Moolenaar
856e859312eSBram Moolenaar  l = []
857e859312eSBram Moolenaar  try
858e859312eSBram Moolenaar    try
859e859312eSBram Moolenaar      add(l, '1')
860e859312eSBram Moolenaar      throw 'wrong'
861e859312eSBram Moolenaar      add(l, '2')
862e859312eSBram Moolenaar    catch /right/
863e859312eSBram Moolenaar      add(l, v:exception)
864e859312eSBram Moolenaar    endtry
865e859312eSBram Moolenaar  catch /wrong/
866e859312eSBram Moolenaar    add(l, 'caught')
867e859312eSBram Moolenaar  finally
868e859312eSBram Moolenaar    add(l, 'finally')
869e859312eSBram Moolenaar  endtry
870e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
871e859312eSBram Moolenaar
87268d130c6SBram Moolenaar  let n: number
87368d130c6SBram Moolenaar  try
87468d130c6SBram Moolenaar    n = l[3]
87568d130c6SBram Moolenaar  catch /E684:/
87668d130c6SBram Moolenaar    n = 99
87768d130c6SBram Moolenaar  endtry
87868d130c6SBram Moolenaar  assert_equal(99, n)
87968d130c6SBram Moolenaar
88068d130c6SBram Moolenaar  try
881cc673e74SBram Moolenaar    # string slice returns a string, not a number
88268d130c6SBram Moolenaar    n = g:astring[3]
88356acb094SBram Moolenaar  catch /E1029:/
88468d130c6SBram Moolenaar    n = 77
88568d130c6SBram Moolenaar  endtry
88668d130c6SBram Moolenaar  assert_equal(77, n)
88768d130c6SBram Moolenaar
88868d130c6SBram Moolenaar  try
88968d130c6SBram Moolenaar    n = l[g:astring]
89056acb094SBram Moolenaar  catch /E1029:/
89156acb094SBram Moolenaar    n = 88
89268d130c6SBram Moolenaar  endtry
89356acb094SBram Moolenaar  assert_equal(88, n)
89468d130c6SBram Moolenaar
89568d130c6SBram Moolenaar  try
89668d130c6SBram Moolenaar    n = s:does_not_exist
89768d130c6SBram Moolenaar  catch /E121:/
898f0b9f43cSBram Moolenaar    n = 111
899f0b9f43cSBram Moolenaar  endtry
900f0b9f43cSBram Moolenaar  assert_equal(111, n)
901f0b9f43cSBram Moolenaar
902f0b9f43cSBram Moolenaar  try
903f0b9f43cSBram Moolenaar    n = g:does_not_exist
904f0b9f43cSBram Moolenaar  catch /E121:/
90568d130c6SBram Moolenaar    n = 121
90668d130c6SBram Moolenaar  endtry
90768d130c6SBram Moolenaar  assert_equal(121, n)
90868d130c6SBram Moolenaar
90968d130c6SBram Moolenaar  let d = #{one: 1}
91068d130c6SBram Moolenaar  try
91168d130c6SBram Moolenaar    n = d[g:astring]
91268d130c6SBram Moolenaar  catch /E716:/
91368d130c6SBram Moolenaar    n = 222
91468d130c6SBram Moolenaar  endtry
91568d130c6SBram Moolenaar  assert_equal(222, n)
916f0b9f43cSBram Moolenaar
917f0b9f43cSBram Moolenaar  try
918f0b9f43cSBram Moolenaar    n = -g:astring
919f0b9f43cSBram Moolenaar  catch /E39:/
920f0b9f43cSBram Moolenaar    n = 233
921f0b9f43cSBram Moolenaar  endtry
922f0b9f43cSBram Moolenaar  assert_equal(233, n)
923f0b9f43cSBram Moolenaar
924f0b9f43cSBram Moolenaar  try
925f0b9f43cSBram Moolenaar    n = +g:astring
926f0b9f43cSBram Moolenaar  catch /E1030:/
927f0b9f43cSBram Moolenaar    n = 244
928f0b9f43cSBram Moolenaar  endtry
929f0b9f43cSBram Moolenaar  assert_equal(244, n)
930f0b9f43cSBram Moolenaar
931f0b9f43cSBram Moolenaar  try
932f0b9f43cSBram Moolenaar    n = +g:alist
933f0b9f43cSBram Moolenaar  catch /E745:/
934f0b9f43cSBram Moolenaar    n = 255
935f0b9f43cSBram Moolenaar  endtry
936f0b9f43cSBram Moolenaar  assert_equal(255, n)
937f0b9f43cSBram Moolenaar
938f0b9f43cSBram Moolenaar  let nd: dict<any>
939f0b9f43cSBram Moolenaar  try
940f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
941f0b9f43cSBram Moolenaar  catch /E1029:/
942f0b9f43cSBram Moolenaar    n = 266
943f0b9f43cSBram Moolenaar  endtry
944f0b9f43cSBram Moolenaar  assert_equal(266, n)
945f0b9f43cSBram Moolenaar
946f0b9f43cSBram Moolenaar  try
947f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
948f0b9f43cSBram Moolenaar  catch /E1093:/
949f0b9f43cSBram Moolenaar    n = 277
950f0b9f43cSBram Moolenaar  endtry
951f0b9f43cSBram Moolenaar  assert_equal(277, n)
952f0b9f43cSBram Moolenaar
953e859312eSBram Moolenaar  try
954e859312eSBram Moolenaar    &ts = g:astring
955e859312eSBram Moolenaar  catch /E1029:/
956e859312eSBram Moolenaar    n = 288
957e859312eSBram Moolenaar  endtry
958e859312eSBram Moolenaar  assert_equal(288, n)
959e859312eSBram Moolenaar
960e859312eSBram Moolenaar  try
961e859312eSBram Moolenaar    &backspace = 'asdf'
962e859312eSBram Moolenaar  catch /E474:/
963e859312eSBram Moolenaar    n = 299
964e859312eSBram Moolenaar  endtry
965e859312eSBram Moolenaar  assert_equal(299, n)
966e859312eSBram Moolenaar
967e859312eSBram Moolenaar  l = [1]
968e859312eSBram Moolenaar  try
969e859312eSBram Moolenaar    l[3] = 3
970e859312eSBram Moolenaar  catch /E684:/
971e859312eSBram Moolenaar    n = 300
972e859312eSBram Moolenaar  endtry
973e859312eSBram Moolenaar  assert_equal(300, n)
974e859312eSBram Moolenaar
975e859312eSBram Moolenaar  try
976e859312eSBram Moolenaar    unlet g:does_not_exist
977e859312eSBram Moolenaar  catch /E108:/
978e859312eSBram Moolenaar    n = 322
979e859312eSBram Moolenaar  endtry
980e859312eSBram Moolenaar  assert_equal(322, n)
981e859312eSBram Moolenaar
982e859312eSBram Moolenaar  try
983e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
984e859312eSBram Moolenaar  catch /E721:/
985e859312eSBram Moolenaar    n = 333
986e859312eSBram Moolenaar  endtry
987e859312eSBram Moolenaar  assert_equal(333, n)
988e859312eSBram Moolenaar
989e859312eSBram Moolenaar  try
990e859312eSBram Moolenaar    l = DeletedFunc()
991e859312eSBram Moolenaar  catch /E933:/
992e859312eSBram Moolenaar    n = 344
993e859312eSBram Moolenaar  endtry
994e859312eSBram Moolenaar  assert_equal(344, n)
995d032f34aSBram Moolenaar
996d032f34aSBram Moolenaar  try
997d032f34aSBram Moolenaar    echo len(v:true)
998d032f34aSBram Moolenaar  catch /E701:/
999d032f34aSBram Moolenaar    n = 355
1000d032f34aSBram Moolenaar  endtry
1001d032f34aSBram Moolenaar  assert_equal(355, n)
1002d032f34aSBram Moolenaar
1003d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
1004d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
1005d032f34aSBram Moolenaar  try
1006d032f34aSBram Moolenaar    echo P()
1007d032f34aSBram Moolenaar  catch /E117:/
1008d032f34aSBram Moolenaar    n = 366
1009d032f34aSBram Moolenaar  endtry
1010d032f34aSBram Moolenaar  assert_equal(366, n)
1011d032f34aSBram Moolenaar
1012d032f34aSBram Moolenaar  try
1013d032f34aSBram Moolenaar    echo g:NoSuchFunc()
1014d032f34aSBram Moolenaar  catch /E117:/
1015d032f34aSBram Moolenaar    n = 377
1016d032f34aSBram Moolenaar  endtry
1017d032f34aSBram Moolenaar  assert_equal(377, n)
1018d032f34aSBram Moolenaar
1019d032f34aSBram Moolenaar  try
1020d032f34aSBram Moolenaar    echo g:alist + 4
1021d032f34aSBram Moolenaar  catch /E745:/
1022d032f34aSBram Moolenaar    n = 388
1023d032f34aSBram Moolenaar  endtry
1024d032f34aSBram Moolenaar  assert_equal(388, n)
1025d032f34aSBram Moolenaar
1026d032f34aSBram Moolenaar  try
1027d032f34aSBram Moolenaar    echo 4 + g:alist
1028d032f34aSBram Moolenaar  catch /E745:/
1029d032f34aSBram Moolenaar    n = 399
1030d032f34aSBram Moolenaar  endtry
1031d032f34aSBram Moolenaar  assert_equal(399, n)
1032d032f34aSBram Moolenaar
1033d032f34aSBram Moolenaar  try
1034d032f34aSBram Moolenaar    echo g:alist.member
1035d032f34aSBram Moolenaar  catch /E715:/
1036d032f34aSBram Moolenaar    n = 400
1037d032f34aSBram Moolenaar  endtry
1038d032f34aSBram Moolenaar  assert_equal(400, n)
1039d032f34aSBram Moolenaar
1040d032f34aSBram Moolenaar  try
1041d032f34aSBram Moolenaar    echo d.member
1042d032f34aSBram Moolenaar  catch /E716:/
1043d032f34aSBram Moolenaar    n = 411
1044d032f34aSBram Moolenaar  endtry
1045d032f34aSBram Moolenaar  assert_equal(411, n)
10468a7d6542SBram Moolenaarenddef
10478a7d6542SBram Moolenaar
1048e859312eSBram Moolenaardef DeletedFunc(): list<any>
1049e859312eSBram Moolenaar  return ['delete me']
1050e859312eSBram Moolenaarenddef
1051e859312eSBram Moolenaardefcompile
1052e859312eSBram Moolenaardelfunc DeletedFunc
1053e859312eSBram Moolenaar
1054257cc5eeSBram Moolenaardef ThrowFromDef()
1055a72cfb80SBram Moolenaar  throw "getout" # comment
1056257cc5eeSBram Moolenaarenddef
1057257cc5eeSBram Moolenaar
1058257cc5eeSBram Moolenaarfunc CatchInFunc()
1059257cc5eeSBram Moolenaar  try
1060257cc5eeSBram Moolenaar    call ThrowFromDef()
1061257cc5eeSBram Moolenaar  catch
1062257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
1063257cc5eeSBram Moolenaar  endtry
1064257cc5eeSBram Moolenaarendfunc
1065257cc5eeSBram Moolenaar
1066257cc5eeSBram Moolenaardef CatchInDef()
1067257cc5eeSBram Moolenaar  try
1068257cc5eeSBram Moolenaar    ThrowFromDef()
1069257cc5eeSBram Moolenaar  catch
1070257cc5eeSBram Moolenaar    g:thrown_def = v:exception
1071257cc5eeSBram Moolenaar  endtry
1072257cc5eeSBram Moolenaarenddef
1073257cc5eeSBram Moolenaar
1074f575adffSBram Moolenaardef ReturnFinally(): string
1075f575adffSBram Moolenaar  try
1076f575adffSBram Moolenaar    return 'intry'
1077f575adffSBram Moolenaar  finally
1078f575adffSBram Moolenaar    g:in_finally = 'finally'
1079f575adffSBram Moolenaar  endtry
1080f575adffSBram Moolenaar  return 'end'
1081f575adffSBram Moolenaarenddef
1082f575adffSBram Moolenaar
1083257cc5eeSBram Moolenaardef Test_try_catch_nested()
1084257cc5eeSBram Moolenaar  CatchInFunc()
1085257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
1086257cc5eeSBram Moolenaar
1087257cc5eeSBram Moolenaar  CatchInDef()
1088257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
1089f575adffSBram Moolenaar
1090f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
1091f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
1092f575adffSBram Moolenaarenddef
1093f575adffSBram Moolenaar
1094f575adffSBram Moolenaardef Test_try_catch_match()
1095f575adffSBram Moolenaar  let seq = 'a'
1096f575adffSBram Moolenaar  try
1097f575adffSBram Moolenaar    throw 'something'
1098f575adffSBram Moolenaar  catch /nothing/
1099f575adffSBram Moolenaar    seq ..= 'x'
1100f575adffSBram Moolenaar  catch /some/
1101f575adffSBram Moolenaar    seq ..= 'b'
1102f575adffSBram Moolenaar  catch /asdf/
1103f575adffSBram Moolenaar    seq ..= 'x'
1104e8c4abbbSBram Moolenaar  catch ?a\?sdf?
1105e8c4abbbSBram Moolenaar    seq ..= 'y'
1106f575adffSBram Moolenaar  finally
1107f575adffSBram Moolenaar    seq ..= 'c'
1108f575adffSBram Moolenaar  endtry
1109f575adffSBram Moolenaar  assert_equal('abc', seq)
1110257cc5eeSBram Moolenaarenddef
1111257cc5eeSBram Moolenaar
1112e8c4abbbSBram Moolenaardef Test_try_catch_fails()
1113d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
1114d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1115d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1116d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
1117d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1118d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
1119d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
1120d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1121d2c61705SBram Moolenaar  CheckDefFailure(['if 2', 'endtry'], 'E171:')
1122d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
1123585fea7bSBram Moolenaar
1124d2c61705SBram Moolenaar  CheckDefFailure(['throw'], 'E1015:')
1125d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
1126e8c4abbbSBram Moolenaarenddef
1127e8c4abbbSBram Moolenaar
1128006ad48bSBram Moolenaardef Test_throw_vimscript()
1129f5be8cdbSBram Moolenaar  # only checks line continuation
1130006ad48bSBram Moolenaar  let lines =<< trim END
1131006ad48bSBram Moolenaar      vim9script
1132006ad48bSBram Moolenaar      try
1133006ad48bSBram Moolenaar        throw 'one'
1134006ad48bSBram Moolenaar              .. 'two'
1135006ad48bSBram Moolenaar      catch
1136006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
1137006ad48bSBram Moolenaar      endtry
1138006ad48bSBram Moolenaar  END
1139006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
1140006ad48bSBram Moolenaarenddef
1141006ad48bSBram Moolenaar
1142ed677f55SBram Moolenaardef Test_error_in_nested_function()
1143ed677f55SBram Moolenaar  # an error in a nested :function aborts executin in the calling :def function
1144ed677f55SBram Moolenaar  let lines =<< trim END
1145ed677f55SBram Moolenaar      vim9script
1146ed677f55SBram Moolenaar      def Func()
1147ed677f55SBram Moolenaar        Error()
1148ed677f55SBram Moolenaar        g:test_var = 1
1149ed677f55SBram Moolenaar      enddef
1150ed677f55SBram Moolenaar      func Error() abort
1151ed677f55SBram Moolenaar        eval [][0]
1152ed677f55SBram Moolenaar      endfunc
1153ed677f55SBram Moolenaar      Func()
1154ed677f55SBram Moolenaar  END
1155ed677f55SBram Moolenaar  g:test_var = 0
1156ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
1157ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
1158ed677f55SBram Moolenaarenddef
1159ed677f55SBram Moolenaar
116037c83711SBram Moolenaardef Test_cexpr_vimscript()
1161f5be8cdbSBram Moolenaar  # only checks line continuation
116237c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
116337c83711SBram Moolenaar  let lines =<< trim END
116437c83711SBram Moolenaar      vim9script
116537c83711SBram Moolenaar      cexpr 'File'
116637c83711SBram Moolenaar                .. ' someFile' ..
116737c83711SBram Moolenaar                   ' line 19'
116837c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
116937c83711SBram Moolenaar  END
117037c83711SBram Moolenaar  CheckScriptSuccess(lines)
117137c83711SBram Moolenaar  set errorformat&
117237c83711SBram Moolenaarenddef
117337c83711SBram Moolenaar
1174c9edd6b5SBram Moolenaardef Test_statusline_syntax()
1175c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
1176c9edd6b5SBram Moolenaar  let lines =<< trim END
1177c9edd6b5SBram Moolenaar      vim9script
1178c9edd6b5SBram Moolenaar      func g:Status()
1179c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
1180c9edd6b5SBram Moolenaar      endfunc
1181c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
1182c9edd6b5SBram Moolenaar      redrawstatus
1183c9edd6b5SBram Moolenaar      set laststatus statusline=
1184c9edd6b5SBram Moolenaar  END
1185c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
1186c9edd6b5SBram Moolenaarenddef
1187c9edd6b5SBram Moolenaar
1188b209750bSBram Moolenaardef Test_list_vimscript()
1189b209750bSBram Moolenaar  # checks line continuation and comments
1190b209750bSBram Moolenaar  let lines =<< trim END
1191b209750bSBram Moolenaar      vim9script
1192b209750bSBram Moolenaar      let mylist = [
1193b209750bSBram Moolenaar            'one',
1194b209750bSBram Moolenaar            # comment
1195b209750bSBram Moolenaar            'two', # empty line follows
1196b209750bSBram Moolenaar
1197b209750bSBram Moolenaar            'three',
1198b209750bSBram Moolenaar            ]
1199b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
1200b209750bSBram Moolenaar  END
1201b209750bSBram Moolenaar  CheckScriptSuccess(lines)
120266250c93SBram Moolenaar
120366250c93SBram Moolenaar  # check all lines from heredoc are kept
120466250c93SBram Moolenaar  lines =<< trim END
120566250c93SBram Moolenaar      # comment 1
120666250c93SBram Moolenaar      two
120766250c93SBram Moolenaar      # comment 3
120866250c93SBram Moolenaar
120966250c93SBram Moolenaar      five
121066250c93SBram Moolenaar      # comment 6
121166250c93SBram Moolenaar  END
121266250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
1213b209750bSBram Moolenaarenddef
1214b209750bSBram Moolenaar
12152a1381c3SBram Moolenaarif has('channel')
121640ee466cSBram Moolenaar  let someJob = test_null_job()
121740ee466cSBram Moolenaar
121840ee466cSBram Moolenaar  def FuncWithError()
121940ee466cSBram Moolenaar    echomsg g:someJob
122040ee466cSBram Moolenaar  enddef
122140ee466cSBram Moolenaar
122240ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
122340ee466cSBram Moolenaar    try
122440ee466cSBram Moolenaar      call FuncWithError()
122540ee466cSBram Moolenaar    catch
122640ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
122740ee466cSBram Moolenaar    endtry
122840ee466cSBram Moolenaar  endfunc
12292a1381c3SBram Moolenaarendif
123040ee466cSBram Moolenaar
12318a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
12328a7d6542SBram Moolenaar  vim9script
12338a7d6542SBram Moolenaar  let name: string = 'bob'
12348a7d6542SBram Moolenaar  def Concat(arg: string): string
12358a7d6542SBram Moolenaar    return name .. arg
12368a7d6542SBram Moolenaar  enddef
1237227a69deSBram Moolenaar  g:result = Concat('bie')
1238227a69deSBram Moolenaar  g:localname = name
12398a7d6542SBram Moolenaar
12408a7d6542SBram Moolenaar  export const CONST = 1234
12418a7d6542SBram Moolenaar  export let exported = 9876
12426e587dcbSBram Moolenaar  export let exp_name = 'John'
12438a7d6542SBram Moolenaar  export def Exported(): string
12448a7d6542SBram Moolenaar    return 'Exported'
12458a7d6542SBram Moolenaar  enddef
12468a7d6542SBram MoolenaarEND
12478a7d6542SBram Moolenaar
1248b3ca9824SBram Moolenaardef Undo_export_script_lines()
1249b3ca9824SBram Moolenaar  unlet g:result
1250b3ca9824SBram Moolenaar  unlet g:localname
1251b3ca9824SBram Moolenaarenddef
1252b3ca9824SBram Moolenaar
12535269bd2aSBram Moolenaardef Test_vim9_import_export()
12548a7d6542SBram Moolenaar  let import_script_lines =<< trim END
12558a7d6542SBram Moolenaar    vim9script
12568a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
12578a7d6542SBram Moolenaar    g:imported = exported
12586e587dcbSBram Moolenaar    exported += 3
12596e587dcbSBram Moolenaar    g:imported_added = exported
12608a7d6542SBram Moolenaar    g:imported_func = Exported()
12616e587dcbSBram Moolenaar
126240f4f7a4SBram Moolenaar    def GetExported(): string
126340f4f7a4SBram Moolenaar      let local_dict = #{ref: Exported}
126440f4f7a4SBram Moolenaar      return local_dict.ref()
126540f4f7a4SBram Moolenaar    enddef
126640f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
126740f4f7a4SBram Moolenaar
12686e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
12696e587dcbSBram Moolenaar    g:imported_name = exp_name
12706e587dcbSBram Moolenaar    exp_name ..= ' Doe'
12716e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
12725381c7a1SBram Moolenaar    g:imported_later = exported
12738a7d6542SBram Moolenaar  END
12748a7d6542SBram Moolenaar
12758a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
12768a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
12778a7d6542SBram Moolenaar
12788a7d6542SBram Moolenaar  source Ximport.vim
12798a7d6542SBram Moolenaar
12808a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
12818a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
12828a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
12836e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
12845381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
12858a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
128640f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
12876e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
12886e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
12898a7d6542SBram Moolenaar  assert_false(exists('g:name'))
12908a7d6542SBram Moolenaar
1291b3ca9824SBram Moolenaar  Undo_export_script_lines()
12928a7d6542SBram Moolenaar  unlet g:imported
12936e587dcbSBram Moolenaar  unlet g:imported_added
12945381c7a1SBram Moolenaar  unlet g:imported_later
12958a7d6542SBram Moolenaar  unlet g:imported_func
12966e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
12978a7d6542SBram Moolenaar  delete('Ximport.vim')
1298f2d5c240SBram Moolenaar
12991c991144SBram Moolenaar  # similar, with line breaks
13001c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
13011c991144SBram Moolenaar    vim9script
13021c991144SBram Moolenaar    import {
13031c991144SBram Moolenaar        exported,
13041c991144SBram Moolenaar        Exported,
13051c991144SBram Moolenaar        }
13061c991144SBram Moolenaar        from
13071c991144SBram Moolenaar        './Xexport.vim'
13081c991144SBram Moolenaar    g:imported = exported
13091c991144SBram Moolenaar    exported += 5
13101c991144SBram Moolenaar    g:imported_added = exported
13111c991144SBram Moolenaar    g:imported_func = Exported()
13121c991144SBram Moolenaar  END
13131c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
13141c991144SBram Moolenaar  source Ximport_lbr.vim
13151c991144SBram Moolenaar
13161c991144SBram Moolenaar  assert_equal(9876, g:imported)
13171c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
13181c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
13191c991144SBram Moolenaar
13201c991144SBram Moolenaar  # exported script not sourced again
13211c991144SBram Moolenaar  assert_false(exists('g:result'))
13221c991144SBram Moolenaar  unlet g:imported
13231c991144SBram Moolenaar  unlet g:imported_added
13241c991144SBram Moolenaar  unlet g:imported_func
13251c991144SBram Moolenaar  delete('Ximport_lbr.vim')
13261c991144SBram Moolenaar
13271c991144SBram Moolenaar  # import inside :def function
13285381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
13295381c7a1SBram Moolenaar    vim9script
13305381c7a1SBram Moolenaar    def ImportInDef()
13315381c7a1SBram Moolenaar      import exported from './Xexport.vim'
13325381c7a1SBram Moolenaar      g:imported = exported
13335381c7a1SBram Moolenaar      exported += 7
13345381c7a1SBram Moolenaar      g:imported_added = exported
13355381c7a1SBram Moolenaar    enddef
13365381c7a1SBram Moolenaar    ImportInDef()
13375381c7a1SBram Moolenaar  END
13385381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
13395381c7a1SBram Moolenaar  source Ximport2.vim
1340f5be8cdbSBram Moolenaar  # TODO: this should be 9879
13415381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
13425381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
13435381c7a1SBram Moolenaar  unlet g:imported
13445381c7a1SBram Moolenaar  unlet g:imported_added
13455381c7a1SBram Moolenaar  delete('Ximport2.vim')
13465381c7a1SBram Moolenaar
1347f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
1348f2d5c240SBram Moolenaar    vim9script
1349f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1350f2d5c240SBram Moolenaar    def UseExport()
1351f2d5c240SBram Moolenaar      g:imported = Export.exported
1352f2d5c240SBram Moolenaar    enddef
1353f2d5c240SBram Moolenaar    UseExport()
1354f2d5c240SBram Moolenaar  END
1355f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1356f2d5c240SBram Moolenaar  source Ximport.vim
13575381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1358f2d5c240SBram Moolenaar
1359599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
1360599c89c8SBram Moolenaar    vim9script
1361599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1362599c89c8SBram Moolenaar    def Func()
1363599c89c8SBram Moolenaar      let dummy = 1
1364599c89c8SBram Moolenaar      let imported = Export + dummy
1365599c89c8SBram Moolenaar    enddef
1366822ba247SBram Moolenaar    defcompile
1367599c89c8SBram Moolenaar  END
1368599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
136944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
1370599c89c8SBram Moolenaar
1371599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
1372599c89c8SBram Moolenaar    vim9script
1373599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1374599c89c8SBram Moolenaar    def Func()
1375599c89c8SBram Moolenaar      let imported = Export . exported
1376599c89c8SBram Moolenaar    enddef
1377822ba247SBram Moolenaar    defcompile
1378599c89c8SBram Moolenaar  END
1379599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
138044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
1381599c89c8SBram Moolenaar
1382599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
1383599c89c8SBram Moolenaar    vim9script
1384599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1385599c89c8SBram Moolenaar    def Func()
1386599c89c8SBram Moolenaar      let imported = Export.
1387599c89c8SBram Moolenaar    enddef
1388822ba247SBram Moolenaar    defcompile
1389599c89c8SBram Moolenaar  END
1390599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
139144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1392599c89c8SBram Moolenaar
13931c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
13941c991144SBram Moolenaar    vim9script
13951c991144SBram Moolenaar    import *
13961c991144SBram Moolenaar        as Export
13971c991144SBram Moolenaar        from
13981c991144SBram Moolenaar        './Xexport.vim'
13991c991144SBram Moolenaar    def UseExport()
14001c991144SBram Moolenaar      g:imported = Export.exported
14011c991144SBram Moolenaar    enddef
14021c991144SBram Moolenaar    UseExport()
14031c991144SBram Moolenaar  END
14041c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
14051c991144SBram Moolenaar  source Ximport.vim
14061c991144SBram Moolenaar  assert_equal(9883, g:imported)
14071c991144SBram Moolenaar
1408f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1409f2d5c240SBram Moolenaar    vim9script
1410f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1411f2d5c240SBram Moolenaar  END
1412f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
141344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1414f2d5c240SBram Moolenaar
1415f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1416fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1417fa29c8abSBram Moolenaar    vim9script
1418fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1419fa29c8abSBram Moolenaar  END
1420fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
142144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1422fa29c8abSBram Moolenaar
1423f5be8cdbSBram Moolenaar  # try to import something that is already defined
14245269bd2aSBram Moolenaar  let import_already_defined =<< trim END
14255269bd2aSBram Moolenaar    vim9script
14265269bd2aSBram Moolenaar    let exported = 'something'
14275269bd2aSBram Moolenaar    import exported from './Xexport.vim'
14285269bd2aSBram Moolenaar  END
14295269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
143044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
14315269bd2aSBram Moolenaar
1432f5be8cdbSBram Moolenaar  # try to import something that is already defined
14335269bd2aSBram Moolenaar  import_already_defined =<< trim END
14345269bd2aSBram Moolenaar    vim9script
14355269bd2aSBram Moolenaar    let exported = 'something'
14365269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
14375269bd2aSBram Moolenaar  END
14385269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
143944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
14405269bd2aSBram Moolenaar
1441f5be8cdbSBram Moolenaar  # try to import something that is already defined
14425269bd2aSBram Moolenaar  import_already_defined =<< trim END
14435269bd2aSBram Moolenaar    vim9script
14445269bd2aSBram Moolenaar    let exported = 'something'
14455269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
14465269bd2aSBram Moolenaar  END
14475269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
144844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
14495269bd2aSBram Moolenaar
1450f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1451fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1452fa29c8abSBram Moolenaar    vim9script
1453fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1454fa29c8abSBram Moolenaar  END
1455fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
145644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1457fa29c8abSBram Moolenaar
1458fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1459fa29c8abSBram Moolenaar    vim9script
1460fa29c8abSBram Moolenaar    import name './Xexport.vim'
1461fa29c8abSBram Moolenaar  END
1462fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
146344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1464fa29c8abSBram Moolenaar
1465fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1466fa29c8abSBram Moolenaar    vim9script
1467fa29c8abSBram Moolenaar    import name from Xexport.vim
1468fa29c8abSBram Moolenaar  END
1469fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
147044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
1471fa29c8abSBram Moolenaar
1472fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1473fa29c8abSBram Moolenaar    vim9script
1474fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1475fa29c8abSBram Moolenaar  END
1476fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
147744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1478fa29c8abSBram Moolenaar
1479fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1480fa29c8abSBram Moolenaar    vim9script
1481fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1482fa29c8abSBram Moolenaar  END
14835269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
148444d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1485fa29c8abSBram Moolenaar
1486f2d5c240SBram Moolenaar  delete('Ximport.vim')
14875269bd2aSBram Moolenaar  delete('Ximport3.vim')
14888a7d6542SBram Moolenaar  delete('Xexport.vim')
14898a7d6542SBram Moolenaar
1490f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1491750802b5SBram Moolenaar  set cpo&vi
1492750802b5SBram Moolenaar  let cpo_before = &cpo
1493750802b5SBram Moolenaar  let lines =<< trim END
1494750802b5SBram Moolenaar    vim9script
1495750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1496750802b5SBram Moolenaar  END
1497750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1498750802b5SBram Moolenaar  source Xvim9_script
1499750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1500750802b5SBram Moolenaar  set cpo&vim
1501750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1502750802b5SBram Moolenaar  delete('Xvim9_script')
1503750802b5SBram Moolenaarenddef
1504750802b5SBram Moolenaar
1505803af686SBram Moolenaarfunc g:Trigger()
1506803af686SBram Moolenaar  source Ximport.vim
1507803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1508803af686SBram Moolenaarendfunc
1509803af686SBram Moolenaar
1510803af686SBram Moolenaardef Test_import_export_expr_map()
1511803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1512803af686SBram Moolenaar  let export_lines =<< trim END
1513803af686SBram Moolenaar    vim9script
1514803af686SBram Moolenaar    export def That(): string
1515803af686SBram Moolenaar      return 'yes'
1516803af686SBram Moolenaar    enddef
1517803af686SBram Moolenaar  END
1518803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1519803af686SBram Moolenaar
1520803af686SBram Moolenaar  let import_lines =<< trim END
1521803af686SBram Moolenaar    vim9script
1522803af686SBram Moolenaar    import That from './Xexport_that.vim'
1523803af686SBram Moolenaar    assert_equal('yes', That())
1524803af686SBram Moolenaar  END
1525803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1526803af686SBram Moolenaar
1527803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1528803af686SBram Moolenaar  feedkeys('trigger', "xt")
1529803af686SBram Moolenaar
1530730b2483SBram Moolenaar  delete('Xexport_that.vim')
1531803af686SBram Moolenaar  delete('Ximport.vim')
1532803af686SBram Moolenaar  nunmap trigger
1533803af686SBram Moolenaarenddef
1534803af686SBram Moolenaar
15358e1986e3SBram Moolenaardef Test_import_in_filetype()
15368e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
15378e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
15388e1986e3SBram Moolenaar  let export_lines =<< trim END
15398e1986e3SBram Moolenaar    vim9script
15408e1986e3SBram Moolenaar    export let That = 'yes'
15418e1986e3SBram Moolenaar  END
1542730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
15438e1986e3SBram Moolenaar
15448e1986e3SBram Moolenaar  let import_lines =<< trim END
15458e1986e3SBram Moolenaar    vim9script
1546730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
15478e1986e3SBram Moolenaar    assert_equal('yes', That)
15488e1986e3SBram Moolenaar    g:did_load_mytpe = 1
15498e1986e3SBram Moolenaar  END
15508e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
15518e1986e3SBram Moolenaar
15528e1986e3SBram Moolenaar  let save_rtp = &rtp
15538e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
15548e1986e3SBram Moolenaar
15558e1986e3SBram Moolenaar  filetype plugin on
15568e1986e3SBram Moolenaar  copen
15578e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
15588e1986e3SBram Moolenaar
15598e1986e3SBram Moolenaar  quit!
1560730b2483SBram Moolenaar  delete('Xexport_ft.vim')
15618e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
15628e1986e3SBram Moolenaar  &rtp = save_rtp
15638e1986e3SBram Moolenaarenddef
15648e1986e3SBram Moolenaar
1565efa94447SBram Moolenaardef Test_use_import_in_mapping()
1566efa94447SBram Moolenaar  let lines =<< trim END
1567efa94447SBram Moolenaar      vim9script
1568efa94447SBram Moolenaar      export def Funcx()
1569efa94447SBram Moolenaar        g:result = 42
1570efa94447SBram Moolenaar      enddef
1571efa94447SBram Moolenaar  END
1572efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1573efa94447SBram Moolenaar  lines =<< trim END
1574efa94447SBram Moolenaar      vim9script
1575efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1576b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1577efa94447SBram Moolenaar  END
1578efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1579efa94447SBram Moolenaar
1580efa94447SBram Moolenaar  source Xmapscript.vim
1581b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1582efa94447SBram Moolenaar  assert_equal(42, g:result)
1583efa94447SBram Moolenaar
1584efa94447SBram Moolenaar  unlet g:result
1585efa94447SBram Moolenaar  delete('XsomeExport.vim')
1586efa94447SBram Moolenaar  delete('Xmapscript.vim')
1587b3ca9824SBram Moolenaar  nunmap <F3>
1588efa94447SBram Moolenaarenddef
1589efa94447SBram Moolenaar
1590750802b5SBram Moolenaardef Test_vim9script_fails()
15918a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
15928a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1593750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
15949721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
15959b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1596750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1597750802b5SBram Moolenaar
1598451c2e35SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1012:')
1599c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1600c785b9a7SBram Moolenaar
1601e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1602e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
16038a7d6542SBram Moolenaarenddef
16048a7d6542SBram Moolenaar
1605f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1606101f4810SBram Moolenaar  CheckRunVimInTerminal
1607101f4810SBram Moolenaar
16089bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1609c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
16109bb3eb3eSBram Moolenaarendfunc
16119bb3eb3eSBram Moolenaar
1612c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1613101f4810SBram Moolenaar  let export =<< trim END
1614101f4810SBram Moolenaar    vim9script
1615101f4810SBram Moolenaar    export def Foo(): number
1616101f4810SBram Moolenaar        return 0
1617101f4810SBram Moolenaar    enddef
1618101f4810SBram Moolenaar  END
1619730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1620101f4810SBram Moolenaar
1621730b2483SBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{
16229bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
16239bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1624101f4810SBram Moolenaar
1625730b2483SBram Moolenaar  delete('XexportCmd.vim')
16269bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
16279bb3eb3eSBram Moolenaarenddef
1628101f4810SBram Moolenaar
16294c17ad94SBram Moolenaardef Test_vim9script_reload_import()
16308a7d6542SBram Moolenaar  let lines =<< trim END
16318a7d6542SBram Moolenaar    vim9script
16328a7d6542SBram Moolenaar    const var = ''
16338a7d6542SBram Moolenaar    let valone = 1234
16348a7d6542SBram Moolenaar    def MyFunc(arg: string)
16358a7d6542SBram Moolenaar       valone = 5678
16368a7d6542SBram Moolenaar    enddef
16378a7d6542SBram Moolenaar  END
16388a7d6542SBram Moolenaar  let morelines =<< trim END
16398a7d6542SBram Moolenaar    let valtwo = 222
16408a7d6542SBram Moolenaar    export def GetValtwo(): number
16418a7d6542SBram Moolenaar      return valtwo
16428a7d6542SBram Moolenaar    enddef
16438a7d6542SBram Moolenaar  END
164403afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
16458a7d6542SBram Moolenaar  source Xreload.vim
16468a7d6542SBram Moolenaar  source Xreload.vim
16478a7d6542SBram Moolenaar  source Xreload.vim
16488a7d6542SBram Moolenaar
16498a7d6542SBram Moolenaar  let testlines =<< trim END
16508a7d6542SBram Moolenaar    vim9script
16518a7d6542SBram Moolenaar    def TheFunc()
16528a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
16538a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
16548a7d6542SBram Moolenaar    enddef
16558a7d6542SBram Moolenaar    TheFunc()
16568a7d6542SBram Moolenaar  END
16578a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
16588a7d6542SBram Moolenaar  source Ximport.vim
16598a7d6542SBram Moolenaar
1660f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1661f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
16628a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
16638a7d6542SBram Moolenaar  source Ximport.vim
16648a7d6542SBram Moolenaar
1665f5be8cdbSBram Moolenaar  # cannot declare a var twice
16668a7d6542SBram Moolenaar  lines =<< trim END
16678a7d6542SBram Moolenaar    vim9script
16688a7d6542SBram Moolenaar    let valone = 1234
16698a7d6542SBram Moolenaar    let valone = 5678
16708a7d6542SBram Moolenaar  END
16718a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
167244d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
16738a7d6542SBram Moolenaar
16748a7d6542SBram Moolenaar  delete('Xreload.vim')
16758a7d6542SBram Moolenaar  delete('Ximport.vim')
16768a7d6542SBram Moolenaarenddef
16778a7d6542SBram Moolenaar
167895006e3dSBram Moolenaardef s:RetSome(): string
167995006e3dSBram Moolenaar  return 'some'
168095006e3dSBram Moolenaarenddef
168195006e3dSBram Moolenaar
1682fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1683fe465a01SBram Moolenaar" script-local name.
1684fe465a01SBram Moolenaardef Test_vim9script_funcref()
1685fe465a01SBram Moolenaar  let sortlines =<< trim END
1686fe465a01SBram Moolenaar      vim9script
1687fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1688bed36b93SBram Moolenaar        return i2 - i1
1689fe465a01SBram Moolenaar      enddef
1690fe465a01SBram Moolenaar
1691fe465a01SBram Moolenaar      export def FastSort(): list<number>
1692fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1693fe465a01SBram Moolenaar      enddef
1694fe465a01SBram Moolenaar  END
1695fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1696fe465a01SBram Moolenaar
1697fe465a01SBram Moolenaar  let lines =<< trim END
1698fe465a01SBram Moolenaar    vim9script
1699fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1700fe465a01SBram Moolenaar    def Test()
1701fe465a01SBram Moolenaar      g:result = FastSort()
1702fe465a01SBram Moolenaar    enddef
1703fe465a01SBram Moolenaar    Test()
1704fe465a01SBram Moolenaar  END
1705fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1706fe465a01SBram Moolenaar
1707fe465a01SBram Moolenaar  source Xscript.vim
1708fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1709fe465a01SBram Moolenaar
1710fe465a01SBram Moolenaar  unlet g:result
1711fe465a01SBram Moolenaar  delete('Xsort.vim')
1712fe465a01SBram Moolenaar  delete('Xscript.vim')
171395006e3dSBram Moolenaar
171495006e3dSBram Moolenaar  let Funcref = function('s:RetSome')
171595006e3dSBram Moolenaar  assert_equal('some', Funcref())
1716fe465a01SBram Moolenaarenddef
1717fe465a01SBram Moolenaar
1718601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1719601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1720601e76acSBram Moolenaar" function reference.
1721c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1722c620c055SBram Moolenaar  let filterLines =<< trim END
1723c620c055SBram Moolenaar    vim9script
1724c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1725c620c055SBram Moolenaar      return idx % 2 == 1
1726c620c055SBram Moolenaar    enddef
1727c620c055SBram Moolenaar    export def FastFilter(): list<number>
1728c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1729c620c055SBram Moolenaar    enddef
1730601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1731601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1732601e76acSBram Moolenaar    enddef
1733c620c055SBram Moolenaar  END
1734c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1735c620c055SBram Moolenaar
1736c620c055SBram Moolenaar  let lines =<< trim END
1737c620c055SBram Moolenaar    vim9script
1738601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1739c620c055SBram Moolenaar    def Test()
1740c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1741c620c055SBram Moolenaar    enddef
1742c620c055SBram Moolenaar    Test()
1743601e76acSBram Moolenaar    def TestDirect()
1744601e76acSBram Moolenaar      let x: list<number> = FastFilterDirect()
1745601e76acSBram Moolenaar    enddef
1746601e76acSBram Moolenaar    TestDirect()
1747c620c055SBram Moolenaar  END
1748601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1749c620c055SBram Moolenaar  delete('Xfilter.vim')
1750c620c055SBram Moolenaarenddef
1751c620c055SBram Moolenaar
17524c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
17534c17ad94SBram Moolenaar  let first_lines =<< trim END
17544c17ad94SBram Moolenaar    vim9script
17554c17ad94SBram Moolenaar    def FuncYes(): string
17564c17ad94SBram Moolenaar      return 'yes'
17574c17ad94SBram Moolenaar    enddef
17584c17ad94SBram Moolenaar  END
175903afdcf1SBram Moolenaar  let withno_lines =<< trim END
17604c17ad94SBram Moolenaar    def FuncNo(): string
17614c17ad94SBram Moolenaar      return 'no'
17624c17ad94SBram Moolenaar    enddef
17634c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
17644c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
17654c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
176603afdcf1SBram Moolenaar    enddef
176703afdcf1SBram Moolenaar  END
176803afdcf1SBram Moolenaar  let nono_lines =<< trim END
176903afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
177003afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
177144d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
17724c17ad94SBram Moolenaar    enddef
17734c17ad94SBram Moolenaar  END
17744c17ad94SBram Moolenaar
17754c17ad94SBram Moolenaar  # FuncNo() is defined
177603afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
17774c17ad94SBram Moolenaar  source Xreloaded.vim
17784c17ad94SBram Moolenaar  g:DoCheck(true)
17794c17ad94SBram Moolenaar
17804c17ad94SBram Moolenaar  # FuncNo() is not redefined
178103afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
17824c17ad94SBram Moolenaar  source Xreloaded.vim
178303afdcf1SBram Moolenaar  g:DoCheck()
17844c17ad94SBram Moolenaar
17854c17ad94SBram Moolenaar  # FuncNo() is back
178603afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
17874c17ad94SBram Moolenaar  source Xreloaded.vim
178803afdcf1SBram Moolenaar  g:DoCheck()
17894c17ad94SBram Moolenaar
17904c17ad94SBram Moolenaar  delete('Xreloaded.vim')
17914c17ad94SBram Moolenaarenddef
17924c17ad94SBram Moolenaar
179389483d40SBram Moolenaardef Test_vim9script_reload_delvar()
179489483d40SBram Moolenaar  # write the script with a script-local variable
179589483d40SBram Moolenaar  let lines =<< trim END
179689483d40SBram Moolenaar    vim9script
179789483d40SBram Moolenaar    let var = 'string'
179889483d40SBram Moolenaar  END
179989483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
180089483d40SBram Moolenaar  source XreloadVar.vim
180189483d40SBram Moolenaar
180289483d40SBram Moolenaar  # now write the script using the same variable locally - works
180389483d40SBram Moolenaar  lines =<< trim END
180489483d40SBram Moolenaar    vim9script
180589483d40SBram Moolenaar    def Func()
180689483d40SBram Moolenaar      let var = 'string'
180789483d40SBram Moolenaar    enddef
180889483d40SBram Moolenaar  END
180989483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
181089483d40SBram Moolenaar  source XreloadVar.vim
181189483d40SBram Moolenaar
181289483d40SBram Moolenaar  delete('XreloadVar.vim')
181389483d40SBram Moolenaarenddef
181489483d40SBram Moolenaar
18158a7d6542SBram Moolenaardef Test_import_absolute()
18168a7d6542SBram Moolenaar  let import_lines = [
1817e6085c53SBram Moolenaar        'vim9script',
1818e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1819e6085c53SBram Moolenaar        'def UseExported()',
1820e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1821e6085c53SBram Moolenaar        '  exported = 8888',
1822e6085c53SBram Moolenaar        '  g:imported_after = exported',
1823e6085c53SBram Moolenaar        'enddef',
1824e6085c53SBram Moolenaar        'UseExported()',
1825e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1826e6085c53SBram Moolenaar        ]
18278a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
18288a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
18298a7d6542SBram Moolenaar
18308a7d6542SBram Moolenaar  source Ximport_abs.vim
18318a7d6542SBram Moolenaar
18328a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
18334e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1834675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1835675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1836675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1837675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1838675f716eSBram Moolenaar          'exported = 8888.*' ..
1839675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1840675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1841675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1842675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1843e6085c53SBram Moolenaar        g:import_disassembled)
1844b3ca9824SBram Moolenaar
1845b3ca9824SBram Moolenaar  Undo_export_script_lines()
18468a7d6542SBram Moolenaar  unlet g:imported_abs
18474e12a5dfSBram Moolenaar  unlet g:import_disassembled
18488a7d6542SBram Moolenaar
18498a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
18508a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
18518a7d6542SBram Moolenaarenddef
18528a7d6542SBram Moolenaar
18538a7d6542SBram Moolenaardef Test_import_rtp()
18548a7d6542SBram Moolenaar  let import_lines = [
1855e6085c53SBram Moolenaar        'vim9script',
1856e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1857e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1858e6085c53SBram Moolenaar        ]
18598a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
18608a7d6542SBram Moolenaar  mkdir('import')
18618a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
18628a7d6542SBram Moolenaar
18638a7d6542SBram Moolenaar  let save_rtp = &rtp
18648a7d6542SBram Moolenaar  &rtp = getcwd()
18658a7d6542SBram Moolenaar  source Ximport_rtp.vim
18668a7d6542SBram Moolenaar  &rtp = save_rtp
18678a7d6542SBram Moolenaar
18688a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
18698a7d6542SBram Moolenaar
1870b3ca9824SBram Moolenaar  Undo_export_script_lines()
1871b3ca9824SBram Moolenaar  unlet g:imported_rtp
18728a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
187389483d40SBram Moolenaar  delete('import', 'rf')
18748a7d6542SBram Moolenaarenddef
18758a7d6542SBram Moolenaar
187625e0f586SBram Moolenaardef Test_import_compile_error()
187725e0f586SBram Moolenaar  let export_lines = [
187825e0f586SBram Moolenaar        'vim9script',
187925e0f586SBram Moolenaar        'export def ExpFunc(): string',
188025e0f586SBram Moolenaar        '  return notDefined',
188125e0f586SBram Moolenaar        'enddef',
188225e0f586SBram Moolenaar        ]
188325e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
188425e0f586SBram Moolenaar
188525e0f586SBram Moolenaar  let import_lines = [
188625e0f586SBram Moolenaar        'vim9script',
188725e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
188825e0f586SBram Moolenaar        'def ImpFunc()',
188925e0f586SBram Moolenaar        '  echo ExpFunc()',
189025e0f586SBram Moolenaar        'enddef',
189125e0f586SBram Moolenaar        'defcompile',
189225e0f586SBram Moolenaar        ]
189325e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
189425e0f586SBram Moolenaar
189525e0f586SBram Moolenaar  try
189625e0f586SBram Moolenaar    source Ximport.vim
189725e0f586SBram Moolenaar  catch /E1001/
1898f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
189925e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
190025e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
190125e0f586SBram Moolenaar  endtry
190225e0f586SBram Moolenaar
190325e0f586SBram Moolenaar  delete('Xexported.vim')
190425e0f586SBram Moolenaar  delete('Ximport.vim')
190525e0f586SBram Moolenaarenddef
190625e0f586SBram Moolenaar
1907c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1908c4ce36d4SBram Moolenaar  let lines = [
1909c4ce36d4SBram Moolenaar        'vim9script',
1910c4ce36d4SBram Moolenaar        'def Func()',
1911c4ce36d4SBram Moolenaar        '  eval [][0]',
1912c4ce36d4SBram Moolenaar        'enddef',
1913c4ce36d4SBram Moolenaar        'Func()',
1914c4ce36d4SBram Moolenaar        ]
1915c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1916c4ce36d4SBram Moolenaar
1917c4ce36d4SBram Moolenaar  for count in range(3)
1918c4ce36d4SBram Moolenaar    try
1919c4ce36d4SBram Moolenaar      source Xtestscript.vim
1920c4ce36d4SBram Moolenaar    catch /E684/
1921c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1922c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1923c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1924c4ce36d4SBram Moolenaar    endtry
1925c4ce36d4SBram Moolenaar  endfor
1926c4ce36d4SBram Moolenaar
1927c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1928c4ce36d4SBram Moolenaarenddef
1929c4ce36d4SBram Moolenaar
1930eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1931eef2102eSBram Moolenaar  let export_lines =<< trim END
1932eef2102eSBram Moolenaar      vim9script
1933eef2102eSBram Moolenaar      export def Func()
1934eef2102eSBram Moolenaar        echo 'imported'
1935eef2102eSBram Moolenaar      enddef
1936eef2102eSBram Moolenaar  END
1937eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1938eef2102eSBram Moolenaar
1939eef2102eSBram Moolenaar  let lines =<< trim END
1940eef2102eSBram Moolenaar    vim9script
1941eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1942eef2102eSBram Moolenaar    def Func()
1943eef2102eSBram Moolenaar      echo 'local to function'
1944eef2102eSBram Moolenaar    enddef
1945eef2102eSBram Moolenaar  END
1946eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1947eef2102eSBram Moolenaar
1948eef2102eSBram Moolenaar  lines =<< trim END
1949eef2102eSBram Moolenaar    vim9script
1950eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1951eef2102eSBram Moolenaar    def Outer()
1952eef2102eSBram Moolenaar      def Func()
1953eef2102eSBram Moolenaar        echo 'local to function'
1954eef2102eSBram Moolenaar      enddef
1955eef2102eSBram Moolenaar    enddef
1956eef2102eSBram Moolenaar    defcompile
1957eef2102eSBram Moolenaar  END
1958eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1959eef2102eSBram Moolenaar
1960eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1961eef2102eSBram Moolenaarenddef
1962eef2102eSBram Moolenaar
1963b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1964b9a2cac3SBram Moolenaar  let lines =<< trim END
1965b9a2cac3SBram Moolenaar    vim9script
1966b9a2cac3SBram Moolenaar    def Func()
1967b9a2cac3SBram Moolenaar      echo 'one'
1968b9a2cac3SBram Moolenaar    enddef
1969b9a2cac3SBram Moolenaar    def Func()
1970b9a2cac3SBram Moolenaar      echo 'two'
1971b9a2cac3SBram Moolenaar    enddef
1972b9a2cac3SBram Moolenaar  END
1973b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1974fa211f3cSBram Moolenaar
1975fa211f3cSBram Moolenaar  lines =<< trim END
1976fa211f3cSBram Moolenaar    vim9script
1977fa211f3cSBram Moolenaar    def Foo(): string
1978fa211f3cSBram Moolenaar      return 'foo'
1979fa211f3cSBram Moolenaar      enddef
1980fa211f3cSBram Moolenaar    def Func()
1981fa211f3cSBram Moolenaar      let  Foo = {-> 'lambda'}
1982fa211f3cSBram Moolenaar    enddef
1983fa211f3cSBram Moolenaar    defcompile
1984fa211f3cSBram Moolenaar  END
1985fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1986b9a2cac3SBram Moolenaarenddef
1987b9a2cac3SBram Moolenaar
19888a7d6542SBram Moolenaardef Test_fixed_size_list()
1989f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
19908a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
19918a7d6542SBram Moolenaar  l->remove(0)
19928a7d6542SBram Moolenaar  l->add(5)
19938a7d6542SBram Moolenaar  l->insert(99, 1)
19940f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
19958a7d6542SBram Moolenaarenddef
19968a7d6542SBram Moolenaar
1997ae616494SBram Moolenaardef Test_no_insert_xit()
1998d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
1999d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
2000d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
2001d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
2002d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
2003ae616494SBram Moolenaar
2004ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
2005ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
2006ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
2007ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
2008f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
2009f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
2010f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
2011f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
2012f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
2013ae616494SBram Moolenaarenddef
2014ae616494SBram Moolenaar
2015158906cfSBram Moolenaardef IfElse(what: number): string
2016158906cfSBram Moolenaar  let res = ''
2017158906cfSBram Moolenaar  if what == 1
2018158906cfSBram Moolenaar    res = "one"
2019158906cfSBram Moolenaar  elseif what == 2
2020158906cfSBram Moolenaar    res = "two"
2021a259d8d3SBram Moolenaar  else
2022158906cfSBram Moolenaar    res = "three"
2023a259d8d3SBram Moolenaar  endif
2024158906cfSBram Moolenaar  return res
2025a259d8d3SBram Moolenaarenddef
2026a259d8d3SBram Moolenaar
2027158906cfSBram Moolenaardef Test_if_elseif_else()
2028158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
2029158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
2030158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
20310f18b6d1SBram Moolenaarenddef
20320f18b6d1SBram Moolenaar
2033e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
2034d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
2035d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
2036d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
2037d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
2038d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
2039e8c4abbbSBram Moolenaarenddef
2040e8c4abbbSBram Moolenaar
20416d69bf60SBram Moolenaarlet g:bool_true = v:true
20426d69bf60SBram Moolenaarlet g:bool_false = v:false
20436d69bf60SBram Moolenaar
20446d69bf60SBram Moolenaardef Test_if_const_expr()
20456d69bf60SBram Moolenaar  let res = false
20466d69bf60SBram Moolenaar  if true ? true : false
20476d69bf60SBram Moolenaar    res = true
20486d69bf60SBram Moolenaar  endif
20496d69bf60SBram Moolenaar  assert_equal(true, res)
20506d69bf60SBram Moolenaar
2051585fea7bSBram Moolenaar  g:glob = 2
2052585fea7bSBram Moolenaar  if false
20536797966dSBram Moolenaar    execute('g:glob = 3')
2054585fea7bSBram Moolenaar  endif
2055585fea7bSBram Moolenaar  assert_equal(2, g:glob)
2056585fea7bSBram Moolenaar  if true
20576797966dSBram Moolenaar    execute('g:glob = 3')
2058585fea7bSBram Moolenaar  endif
2059585fea7bSBram Moolenaar  assert_equal(3, g:glob)
2060585fea7bSBram Moolenaar
20616d69bf60SBram Moolenaar  res = false
20626d69bf60SBram Moolenaar  if g:bool_true ? true : false
20636d69bf60SBram Moolenaar    res = true
20646d69bf60SBram Moolenaar  endif
20656d69bf60SBram Moolenaar  assert_equal(true, res)
20666d69bf60SBram Moolenaar
20676d69bf60SBram Moolenaar  res = false
20686d69bf60SBram Moolenaar  if true ? g:bool_true : false
20696d69bf60SBram Moolenaar    res = true
20706d69bf60SBram Moolenaar  endif
20716d69bf60SBram Moolenaar  assert_equal(true, res)
20726d69bf60SBram Moolenaar
20736d69bf60SBram Moolenaar  res = false
20746d69bf60SBram Moolenaar  if true ? true : g:bool_false
20756d69bf60SBram Moolenaar    res = true
20766d69bf60SBram Moolenaar  endif
20776d69bf60SBram Moolenaar  assert_equal(true, res)
20786d69bf60SBram Moolenaar
20796d69bf60SBram Moolenaar  res = false
20806d69bf60SBram Moolenaar  if true ? false : true
20816d69bf60SBram Moolenaar    res = true
20826d69bf60SBram Moolenaar  endif
20836d69bf60SBram Moolenaar  assert_equal(false, res)
20846d69bf60SBram Moolenaar
20856d69bf60SBram Moolenaar  res = false
20866d69bf60SBram Moolenaar  if false ? false : true
20876d69bf60SBram Moolenaar    res = true
20886d69bf60SBram Moolenaar  endif
20896d69bf60SBram Moolenaar  assert_equal(true, res)
20906d69bf60SBram Moolenaar
20916d69bf60SBram Moolenaar  res = false
20926d69bf60SBram Moolenaar  if false ? true : false
20936d69bf60SBram Moolenaar    res = true
20946d69bf60SBram Moolenaar  endif
20956d69bf60SBram Moolenaar  assert_equal(false, res)
20966d69bf60SBram Moolenaar
20976d69bf60SBram Moolenaar  res = false
2098e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2099e8c4abbbSBram Moolenaar    res = true
2100e8c4abbbSBram Moolenaar  endif
2101e8c4abbbSBram Moolenaar  assert_equal(false, res)
2102e8c4abbbSBram Moolenaar
2103e8c4abbbSBram Moolenaar  res = false
21046d69bf60SBram Moolenaar  if true && true
21056d69bf60SBram Moolenaar    res = true
21066d69bf60SBram Moolenaar  endif
21076d69bf60SBram Moolenaar  assert_equal(true, res)
21086d69bf60SBram Moolenaar
21096d69bf60SBram Moolenaar  res = false
21106d69bf60SBram Moolenaar  if true && false
21116d69bf60SBram Moolenaar    res = true
21126d69bf60SBram Moolenaar  endif
21136d69bf60SBram Moolenaar  assert_equal(false, res)
21146d69bf60SBram Moolenaar
21156d69bf60SBram Moolenaar  res = false
21166d69bf60SBram Moolenaar  if g:bool_true && false
21176d69bf60SBram Moolenaar    res = true
21186d69bf60SBram Moolenaar  endif
21196d69bf60SBram Moolenaar  assert_equal(false, res)
21206d69bf60SBram Moolenaar
21216d69bf60SBram Moolenaar  res = false
21226d69bf60SBram Moolenaar  if true && g:bool_false
21236d69bf60SBram Moolenaar    res = true
21246d69bf60SBram Moolenaar  endif
21256d69bf60SBram Moolenaar  assert_equal(false, res)
21266d69bf60SBram Moolenaar
21276d69bf60SBram Moolenaar  res = false
21286d69bf60SBram Moolenaar  if false && false
21296d69bf60SBram Moolenaar    res = true
21306d69bf60SBram Moolenaar  endif
21316d69bf60SBram Moolenaar  assert_equal(false, res)
21326d69bf60SBram Moolenaar
21336d69bf60SBram Moolenaar  res = false
21346d69bf60SBram Moolenaar  if true || false
21356d69bf60SBram Moolenaar    res = true
21366d69bf60SBram Moolenaar  endif
21376d69bf60SBram Moolenaar  assert_equal(true, res)
21386d69bf60SBram Moolenaar
21396d69bf60SBram Moolenaar  res = false
21406d69bf60SBram Moolenaar  if g:bool_true || false
21416d69bf60SBram Moolenaar    res = true
21426d69bf60SBram Moolenaar  endif
21436d69bf60SBram Moolenaar  assert_equal(true, res)
21446d69bf60SBram Moolenaar
21456d69bf60SBram Moolenaar  res = false
21466d69bf60SBram Moolenaar  if true || g:bool_false
21476d69bf60SBram Moolenaar    res = true
21486d69bf60SBram Moolenaar  endif
21496d69bf60SBram Moolenaar  assert_equal(true, res)
21506d69bf60SBram Moolenaar
21516d69bf60SBram Moolenaar  res = false
21526d69bf60SBram Moolenaar  if false || false
21536d69bf60SBram Moolenaar    res = true
21546d69bf60SBram Moolenaar  endif
21556d69bf60SBram Moolenaar  assert_equal(false, res)
21563988f64fSBram Moolenaar
21573988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
21583988f64fSBram Moolenaar  if false | eval 0 | endif
21593988f64fSBram Moolenaar  if false | eval burp + 234 | endif
21603988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
21613988f64fSBram Moolenaar  if false
21623988f64fSBram Moolenaar    burp
21633988f64fSBram Moolenaar  endif
216480c34ca3SBram Moolenaarenddef
21656d69bf60SBram Moolenaar
216680c34ca3SBram Moolenaardef Test_if_const_expr_fails()
2167d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2168d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2169d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
2170d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
21716d69bf60SBram Moolenaarenddef
21726d69bf60SBram Moolenaar
217372abcf42SBram Moolenaardef RunNested(i: number): number
217472abcf42SBram Moolenaar  let x: number = 0
217572abcf42SBram Moolenaar  if i % 2
217672abcf42SBram Moolenaar    if 1
2177f5be8cdbSBram Moolenaar      # comment
217872abcf42SBram Moolenaar    else
2179f5be8cdbSBram Moolenaar      # comment
218072abcf42SBram Moolenaar    endif
218172abcf42SBram Moolenaar    x += 1
218272abcf42SBram Moolenaar  else
218372abcf42SBram Moolenaar    x += 1000
218472abcf42SBram Moolenaar  endif
218572abcf42SBram Moolenaar  return x
218672abcf42SBram Moolenaarenddef
218772abcf42SBram Moolenaar
218872abcf42SBram Moolenaardef Test_nested_if()
218972abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
219072abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
219172abcf42SBram Moolenaarenddef
219272abcf42SBram Moolenaar
2193ad39c094SBram Moolenaardef Test_execute_cmd()
2194ad39c094SBram Moolenaar  new
2195ad39c094SBram Moolenaar  setline(1, 'default')
2196d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
2197ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2198a72cfb80SBram Moolenaar
2199d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
2200a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2201a72cfb80SBram Moolenaar
2202d2c61705SBram Moolenaar  let cmd1 = 'setline(1,'
2203ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
2204a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2205ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2206a72cfb80SBram Moolenaar
2207d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2208ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2209a72cfb80SBram Moolenaar
2210ad39c094SBram Moolenaar  let cmd_first = 'call '
2211ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
2212ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2213ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2214ad39c094SBram Moolenaar  bwipe!
2215585fea7bSBram Moolenaar
22162d6b20d6SBram Moolenaar  let n = true
22172d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
22182d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
22192d6b20d6SBram Moolenaar
2220e5abf7afSBram Moolenaar  echomsg [1, 2, 3] #{a: 1, b: 2}
2221e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2222e5abf7afSBram Moolenaar
2223d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2224d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2225d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2226ad39c094SBram Moolenaarenddef
2227ad39c094SBram Moolenaar
222847e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2229f5be8cdbSBram Moolenaar  # only checks line continuation
223047e880d6SBram Moolenaar  let lines =<< trim END
223147e880d6SBram Moolenaar      vim9script
223247e880d6SBram Moolenaar      execute 'g:someVar'
223347e880d6SBram Moolenaar                .. ' = ' ..
223447e880d6SBram Moolenaar                   '28'
223547e880d6SBram Moolenaar      assert_equal(28, g:someVar)
223647e880d6SBram Moolenaar      unlet g:someVar
223747e880d6SBram Moolenaar  END
223847e880d6SBram Moolenaar  CheckScriptSuccess(lines)
223947e880d6SBram Moolenaarenddef
224047e880d6SBram Moolenaar
2241ad39c094SBram Moolenaardef Test_echo_cmd()
2242a72cfb80SBram Moolenaar  echo 'some' # comment
2243585fea7bSBram Moolenaar  echon 'thing'
2244ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2245ad39c094SBram Moolenaar
2246a72cfb80SBram Moolenaar  echo "some" # comment
2247a72cfb80SBram Moolenaar  echon "thing"
2248a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2249a72cfb80SBram Moolenaar
2250ad39c094SBram Moolenaar  let str1 = 'some'
2251ad39c094SBram Moolenaar  let str2 = 'more'
2252ad39c094SBram Moolenaar  echo str1 str2
2253ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2254a72cfb80SBram Moolenaar
2255d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2256ad39c094SBram Moolenaarenddef
2257ad39c094SBram Moolenaar
2258f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2259f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2260f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2261f93c7feaSBram Moolenaar  echo 'clear'
2262df069eecSBram Moolenaar  :1messages
2263f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2264f93c7feaSBram Moolenaar
2265d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2266f93c7feaSBram Moolenaarenddef
2267f93c7feaSBram Moolenaar
226847e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2269f5be8cdbSBram Moolenaar  # only checks line continuation
227047e880d6SBram Moolenaar  let lines =<< trim END
227147e880d6SBram Moolenaar      vim9script
227247e880d6SBram Moolenaar      echomsg 'here'
227347e880d6SBram Moolenaar                .. ' is ' ..
227447e880d6SBram Moolenaar                   'a message'
227547e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
227647e880d6SBram Moolenaar  END
227747e880d6SBram Moolenaar  CheckScriptSuccess(lines)
227847e880d6SBram Moolenaarenddef
227947e880d6SBram Moolenaar
2280f93c7feaSBram Moolenaardef Test_echoerr_cmd()
228140ee466cSBram Moolenaar  try
228240ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
228340ee466cSBram Moolenaar  catch
228440ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
228540ee466cSBram Moolenaar  endtry
2286f93c7feaSBram Moolenaarenddef
2287f93c7feaSBram Moolenaar
228847e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2289f5be8cdbSBram Moolenaar  # only checks line continuation
229047e880d6SBram Moolenaar  let lines =<< trim END
229147e880d6SBram Moolenaar      vim9script
229247e880d6SBram Moolenaar      try
229347e880d6SBram Moolenaar        echoerr 'this'
229447e880d6SBram Moolenaar                .. ' is ' ..
229547e880d6SBram Moolenaar                   'wrong'
229647e880d6SBram Moolenaar      catch
229747e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
229847e880d6SBram Moolenaar      endtry
229947e880d6SBram Moolenaar  END
230047e880d6SBram Moolenaar  CheckScriptSuccess(lines)
230147e880d6SBram Moolenaarenddef
230247e880d6SBram Moolenaar
230341fe0617SBram Moolenaardef Test_for_outside_of_function()
230441fe0617SBram Moolenaar  let lines =<< trim END
230541fe0617SBram Moolenaar    vim9script
230641fe0617SBram Moolenaar    new
230741fe0617SBram Moolenaar    for var in range(0, 3)
230841fe0617SBram Moolenaar      append(line('$'), var)
230941fe0617SBram Moolenaar    endfor
231041fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
231141fe0617SBram Moolenaar    bwipe!
231241fe0617SBram Moolenaar  END
231341fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
231441fe0617SBram Moolenaar  source Xvim9for.vim
231541fe0617SBram Moolenaar  delete('Xvim9for.vim')
231641fe0617SBram Moolenaarenddef
23178a7d6542SBram Moolenaar
2318e8c4abbbSBram Moolenaardef Test_for_loop()
2319e8c4abbbSBram Moolenaar  let result = ''
2320e8c4abbbSBram Moolenaar  for cnt in range(7)
2321e8c4abbbSBram Moolenaar    if cnt == 4
2322e8c4abbbSBram Moolenaar      break
2323e8c4abbbSBram Moolenaar    endif
2324e8c4abbbSBram Moolenaar    if cnt == 2
2325e8c4abbbSBram Moolenaar      continue
2326e8c4abbbSBram Moolenaar    endif
2327e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2328e8c4abbbSBram Moolenaar  endfor
2329e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
23300ad3e894SBram Moolenaar
23310ad3e894SBram Moolenaar  let concat = ''
23320ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
23330ad3e894SBram Moolenaar    concat ..= str
23340ad3e894SBram Moolenaar  endfor
23350ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
2336e8c4abbbSBram Moolenaarenddef
2337e8c4abbbSBram Moolenaar
2338e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2339675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2340675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2341451c2e35SBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1017:')
2342822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
2343451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
2344675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2345675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2346675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2347e8c4abbbSBram Moolenaarenddef
2348e8c4abbbSBram Moolenaar
2349d0df1aacSBram Moolenaardef Test_while_loop()
2350d0df1aacSBram Moolenaar  let result = ''
2351d0df1aacSBram Moolenaar  let cnt = 0
2352d0df1aacSBram Moolenaar  while cnt < 555
2353d0df1aacSBram Moolenaar    if cnt == 3
2354d0df1aacSBram Moolenaar      break
2355d0df1aacSBram Moolenaar    endif
2356d0df1aacSBram Moolenaar    cnt += 1
2357d0df1aacSBram Moolenaar    if cnt == 2
2358d0df1aacSBram Moolenaar      continue
2359d0df1aacSBram Moolenaar    endif
2360d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2361d0df1aacSBram Moolenaar  endwhile
2362d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2363d0df1aacSBram Moolenaarenddef
2364d0df1aacSBram Moolenaar
2365e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2366675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2367675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2368675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2369675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2370675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2371675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2372675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
2373bd5da371SBram Moolenaarenddef
2374bd5da371SBram Moolenaar
23759645e2d9SBram Moolenaardef Test_interrupt_loop()
237697acfc78SBram Moolenaar  let caught = false
23779645e2d9SBram Moolenaar  let x = 0
237897acfc78SBram Moolenaar  try
23799645e2d9SBram Moolenaar    while 1
23809645e2d9SBram Moolenaar      x += 1
23819645e2d9SBram Moolenaar      if x == 100
23829645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
23839645e2d9SBram Moolenaar      endif
23849645e2d9SBram Moolenaar    endwhile
238597acfc78SBram Moolenaar  catch
238697acfc78SBram Moolenaar    caught = true
238797acfc78SBram Moolenaar    assert_equal(100, x)
238897acfc78SBram Moolenaar  endtry
238997acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
239025859dd7SBram Moolenaar  # consume the CTRL-C
239125859dd7SBram Moolenaar  getchar(0)
23929645e2d9SBram Moolenaarenddef
239320431c9dSBram Moolenaar
23944fdae999SBram Moolenaardef Test_automatic_line_continuation()
23954fdae999SBram Moolenaar  let mylist = [
23964fdae999SBram Moolenaar      'one',
23974fdae999SBram Moolenaar      'two',
23984fdae999SBram Moolenaar      'three',
2399f5be8cdbSBram Moolenaar      ] # comment
24004fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
24014fdae999SBram Moolenaar
24024fdae999SBram Moolenaar  let mydict = {
24034fdae999SBram Moolenaar      'one': 1,
24044fdae999SBram Moolenaar      'two': 2,
24054fdae999SBram Moolenaar      'three':
24064fdae999SBram Moolenaar          3,
2407f5be8cdbSBram Moolenaar      } # comment
24084fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
24094fdae999SBram Moolenaar  mydict = #{
24102c330432SBram Moolenaar      one: 1,  # comment
24112c330432SBram Moolenaar      two:     # comment
24122c330432SBram Moolenaar           2,  # comment
24132c330432SBram Moolenaar      three: 3 # comment
24142c330432SBram Moolenaar      }
24152c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
24162c330432SBram Moolenaar  mydict = #{
24172c330432SBram Moolenaar      one: 1,
24184fdae999SBram Moolenaar      two:
24194fdae999SBram Moolenaar           2,
24202c330432SBram Moolenaar      three: 3
24214fdae999SBram Moolenaar      }
24224fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
2423e6085c53SBram Moolenaar
2424e6085c53SBram Moolenaar  assert_equal(
2425e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2426e6085c53SBram Moolenaar        split('one two three')
2427e6085c53SBram Moolenaar        )
24284fdae999SBram Moolenaarenddef
24294fdae999SBram Moolenaar
24307a092245SBram Moolenaardef Test_vim9_comment()
24317a092245SBram Moolenaar  CheckScriptSuccess([
24327a092245SBram Moolenaar      'vim9script',
24337a092245SBram Moolenaar      '# something',
24347a092245SBram Moolenaar      ])
24357a092245SBram Moolenaar  CheckScriptFailure([
24367a092245SBram Moolenaar      'vim9script',
24377a092245SBram Moolenaar      ':# something',
24387a092245SBram Moolenaar      ], 'E488:')
24397a092245SBram Moolenaar  CheckScriptFailure([
24407a092245SBram Moolenaar      '# something',
24417a092245SBram Moolenaar      ], 'E488:')
24427a092245SBram Moolenaar  CheckScriptFailure([
24437a092245SBram Moolenaar      ':# something',
24447a092245SBram Moolenaar      ], 'E488:')
24457a092245SBram Moolenaar
24464a8d9f2eSBram Moolenaar  { # block start
24474a8d9f2eSBram Moolenaar  } # block end
24484a8d9f2eSBram Moolenaar  CheckDefFailure([
24494a8d9f2eSBram Moolenaar      '{# comment',
24504a8d9f2eSBram Moolenaar      ], 'E488:')
24514a8d9f2eSBram Moolenaar  CheckDefFailure([
24524a8d9f2eSBram Moolenaar      '{',
24534a8d9f2eSBram Moolenaar      '}# comment',
24544a8d9f2eSBram Moolenaar      ], 'E488:')
24554a8d9f2eSBram Moolenaar
24564a8d9f2eSBram Moolenaar  echo "yes" # comment
24574a8d9f2eSBram Moolenaar  CheckDefFailure([
24584a8d9f2eSBram Moolenaar      'echo "yes"# comment',
24594a8d9f2eSBram Moolenaar      ], 'E488:')
24607a092245SBram Moolenaar  CheckScriptSuccess([
24617a092245SBram Moolenaar      'vim9script',
24627a092245SBram Moolenaar      'echo "yes" # something',
24637a092245SBram Moolenaar      ])
24647a092245SBram Moolenaar  CheckScriptFailure([
24657a092245SBram Moolenaar      'vim9script',
24667a092245SBram Moolenaar      'echo "yes"# something',
24677a092245SBram Moolenaar      ], 'E121:')
24687a092245SBram Moolenaar  CheckScriptFailure([
24697a092245SBram Moolenaar      'vim9script',
24707a092245SBram Moolenaar      'echo# something',
24717a092245SBram Moolenaar      ], 'E121:')
24727a092245SBram Moolenaar  CheckScriptFailure([
24737a092245SBram Moolenaar      'echo "yes" # something',
24747a092245SBram Moolenaar      ], 'E121:')
24757a092245SBram Moolenaar
24764a8d9f2eSBram Moolenaar  exe "echo" # comment
24774a8d9f2eSBram Moolenaar  CheckDefFailure([
24784a8d9f2eSBram Moolenaar      'exe "echo"# comment',
24794a8d9f2eSBram Moolenaar      ], 'E488:')
24804a8d9f2eSBram Moolenaar  CheckScriptSuccess([
24814a8d9f2eSBram Moolenaar      'vim9script',
24824a8d9f2eSBram Moolenaar      'exe "echo" # something',
24834a8d9f2eSBram Moolenaar      ])
24844a8d9f2eSBram Moolenaar  CheckScriptFailure([
24854a8d9f2eSBram Moolenaar      'vim9script',
24864a8d9f2eSBram Moolenaar      'exe "echo"# something',
24874a8d9f2eSBram Moolenaar      ], 'E121:')
24884a8d9f2eSBram Moolenaar  CheckDefFailure([
24894a8d9f2eSBram Moolenaar      'exe # comment',
24904a8d9f2eSBram Moolenaar      ], 'E1015:')
24914a8d9f2eSBram Moolenaar  CheckScriptFailure([
24924a8d9f2eSBram Moolenaar      'vim9script',
24934a8d9f2eSBram Moolenaar      'exe# something',
24944a8d9f2eSBram Moolenaar      ], 'E121:')
24954a8d9f2eSBram Moolenaar  CheckScriptFailure([
24964a8d9f2eSBram Moolenaar      'exe "echo" # something',
24974a8d9f2eSBram Moolenaar      ], 'E121:')
24984a8d9f2eSBram Moolenaar
24997a092245SBram Moolenaar  CheckDefFailure([
25007a092245SBram Moolenaar      'try# comment',
25017a092245SBram Moolenaar      '  echo "yes"',
25027a092245SBram Moolenaar      'catch',
25037a092245SBram Moolenaar      'endtry',
25047a092245SBram Moolenaar      ], 'E488:')
25052c5ed4e3SBram Moolenaar  CheckScriptFailure([
25062c5ed4e3SBram Moolenaar      'vim9script',
25072c5ed4e3SBram Moolenaar      'try# comment',
25082c5ed4e3SBram Moolenaar      'echo "yes"',
25092c5ed4e3SBram Moolenaar      ], 'E488:')
25107a092245SBram Moolenaar  CheckDefFailure([
25117a092245SBram Moolenaar      'try',
2512a72cfb80SBram Moolenaar      '  throw#comment',
2513a72cfb80SBram Moolenaar      'catch',
2514a72cfb80SBram Moolenaar      'endtry',
2515a72cfb80SBram Moolenaar      ], 'E1015:')
2516a72cfb80SBram Moolenaar  CheckDefFailure([
2517a72cfb80SBram Moolenaar      'try',
2518a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2519a72cfb80SBram Moolenaar      'catch',
2520a72cfb80SBram Moolenaar      'endtry',
2521a72cfb80SBram Moolenaar      ], 'E488:')
2522a72cfb80SBram Moolenaar  CheckDefFailure([
2523a72cfb80SBram Moolenaar      'try',
25247a092245SBram Moolenaar      '  echo "yes"',
25257a092245SBram Moolenaar      'catch# comment',
25267a092245SBram Moolenaar      'endtry',
25277a092245SBram Moolenaar      ], 'E488:')
25282c5ed4e3SBram Moolenaar  CheckScriptFailure([
25292c5ed4e3SBram Moolenaar      'vim9script',
25302c5ed4e3SBram Moolenaar      'try',
25312c5ed4e3SBram Moolenaar      '  echo "yes"',
25322c5ed4e3SBram Moolenaar      'catch# comment',
25332c5ed4e3SBram Moolenaar      'endtry',
25342c5ed4e3SBram Moolenaar      ], 'E654:')
25352c5ed4e3SBram Moolenaar  CheckDefFailure([
25362c5ed4e3SBram Moolenaar      'try',
25372c5ed4e3SBram Moolenaar      '  echo "yes"',
25382c5ed4e3SBram Moolenaar      'catch /pat/# comment',
25392c5ed4e3SBram Moolenaar      'endtry',
25402c5ed4e3SBram Moolenaar      ], 'E488:')
25417a092245SBram Moolenaar  CheckDefFailure([
25427a092245SBram Moolenaar      'try',
25437a092245SBram Moolenaar      'echo "yes"',
25447a092245SBram Moolenaar      'catch',
25457a092245SBram Moolenaar      'endtry# comment',
25467a092245SBram Moolenaar      ], 'E488:')
25472c5ed4e3SBram Moolenaar  CheckScriptFailure([
25482c5ed4e3SBram Moolenaar      'vim9script',
25492c5ed4e3SBram Moolenaar      'try',
25502c5ed4e3SBram Moolenaar      '  echo "yes"',
25512c5ed4e3SBram Moolenaar      'catch',
25522c5ed4e3SBram Moolenaar      'endtry# comment',
25539b7bf9e9SBram Moolenaar      ], 'E488:')
25542c5ed4e3SBram Moolenaar
25552c5ed4e3SBram Moolenaar  CheckScriptSuccess([
25562c5ed4e3SBram Moolenaar      'vim9script',
25572c5ed4e3SBram Moolenaar      'hi # comment',
25582c5ed4e3SBram Moolenaar      ])
25592c5ed4e3SBram Moolenaar  CheckScriptFailure([
25602c5ed4e3SBram Moolenaar      'vim9script',
25612c5ed4e3SBram Moolenaar      'hi# comment',
25622c5ed4e3SBram Moolenaar      ], 'E416:')
25631966c248SBram Moolenaar  CheckScriptSuccess([
25641966c248SBram Moolenaar      'vim9script',
25651966c248SBram Moolenaar      'hi Search # comment',
25661966c248SBram Moolenaar      ])
25671966c248SBram Moolenaar  CheckScriptFailure([
25681966c248SBram Moolenaar      'vim9script',
25691966c248SBram Moolenaar      'hi Search# comment',
25701966c248SBram Moolenaar      ], 'E416:')
25711966c248SBram Moolenaar  CheckScriptSuccess([
25721966c248SBram Moolenaar      'vim9script',
25731966c248SBram Moolenaar      'hi link This Search # comment',
25741966c248SBram Moolenaar      ])
25751966c248SBram Moolenaar  CheckScriptFailure([
25761966c248SBram Moolenaar      'vim9script',
25771966c248SBram Moolenaar      'hi link This That# comment',
25781966c248SBram Moolenaar      ], 'E413:')
25791966c248SBram Moolenaar  CheckScriptSuccess([
25801966c248SBram Moolenaar      'vim9script',
25811966c248SBram Moolenaar      'hi clear This # comment',
25821966c248SBram Moolenaar      'hi clear # comment',
25831966c248SBram Moolenaar      ])
2584f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2585f5be8cdbSBram Moolenaar  # hi clear This# comment',
25861966c248SBram Moolenaar  CheckScriptFailure([
25871966c248SBram Moolenaar      'vim9script',
25881966c248SBram Moolenaar      'hi clear# comment',
25891966c248SBram Moolenaar      ], 'E416:')
25901966c248SBram Moolenaar
25911966c248SBram Moolenaar  CheckScriptSuccess([
25921966c248SBram Moolenaar      'vim9script',
25931966c248SBram Moolenaar      'hi Group term=bold',
25941966c248SBram Moolenaar      'match Group /todo/ # comment',
25951966c248SBram Moolenaar      ])
25961966c248SBram Moolenaar  CheckScriptFailure([
25971966c248SBram Moolenaar      'vim9script',
25981966c248SBram Moolenaar      'hi Group term=bold',
25991966c248SBram Moolenaar      'match Group /todo/# comment',
26001966c248SBram Moolenaar      ], 'E488:')
26011966c248SBram Moolenaar  CheckScriptSuccess([
26021966c248SBram Moolenaar      'vim9script',
26031966c248SBram Moolenaar      'match # comment',
26041966c248SBram Moolenaar      ])
26051966c248SBram Moolenaar  CheckScriptFailure([
26061966c248SBram Moolenaar      'vim9script',
26071966c248SBram Moolenaar      'match# comment',
26081966c248SBram Moolenaar      ], 'E475:')
26091966c248SBram Moolenaar  CheckScriptSuccess([
26101966c248SBram Moolenaar      'vim9script',
26111966c248SBram Moolenaar      'match none # comment',
26121966c248SBram Moolenaar      ])
26131966c248SBram Moolenaar  CheckScriptFailure([
26141966c248SBram Moolenaar      'vim9script',
26151966c248SBram Moolenaar      'match none# comment',
26161966c248SBram Moolenaar      ], 'E475:')
26171966c248SBram Moolenaar
26181966c248SBram Moolenaar  CheckScriptSuccess([
26191966c248SBram Moolenaar      'vim9script',
26201966c248SBram Moolenaar      'menutrans clear # comment',
26211966c248SBram Moolenaar      ])
26221966c248SBram Moolenaar  CheckScriptFailure([
26231966c248SBram Moolenaar      'vim9script',
26241966c248SBram Moolenaar      'menutrans clear# comment text',
26251966c248SBram Moolenaar      ], 'E474:')
26261966c248SBram Moolenaar
26271966c248SBram Moolenaar  CheckScriptSuccess([
26281966c248SBram Moolenaar      'vim9script',
26291966c248SBram Moolenaar      'syntax clear # comment',
26301966c248SBram Moolenaar      ])
26311966c248SBram Moolenaar  CheckScriptFailure([
26321966c248SBram Moolenaar      'vim9script',
26331966c248SBram Moolenaar      'syntax clear# comment text',
26341966c248SBram Moolenaar      ], 'E28:')
26351966c248SBram Moolenaar  CheckScriptSuccess([
26361966c248SBram Moolenaar      'vim9script',
26371966c248SBram Moolenaar      'syntax keyword Word some',
26381966c248SBram Moolenaar      'syntax clear Word # comment',
26391966c248SBram Moolenaar      ])
26401966c248SBram Moolenaar  CheckScriptFailure([
26411966c248SBram Moolenaar      'vim9script',
26421966c248SBram Moolenaar      'syntax keyword Word some',
26431966c248SBram Moolenaar      'syntax clear Word# comment text',
26441966c248SBram Moolenaar      ], 'E28:')
26451966c248SBram Moolenaar
26461966c248SBram Moolenaar  CheckScriptSuccess([
26471966c248SBram Moolenaar      'vim9script',
26481966c248SBram Moolenaar      'syntax list # comment',
26491966c248SBram Moolenaar      ])
26501966c248SBram Moolenaar  CheckScriptFailure([
26511966c248SBram Moolenaar      'vim9script',
26521966c248SBram Moolenaar      'syntax list# comment text',
26531966c248SBram Moolenaar      ], 'E28:')
26541966c248SBram Moolenaar
26551966c248SBram Moolenaar  CheckScriptSuccess([
26561966c248SBram Moolenaar      'vim9script',
26571966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
26581966c248SBram Moolenaar      ])
26591966c248SBram Moolenaar  CheckScriptFailure([
26601966c248SBram Moolenaar      'vim9script',
26611966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
26621966c248SBram Moolenaar      ], 'E475:')
26631966c248SBram Moolenaar
26641966c248SBram Moolenaar  CheckScriptSuccess([
26651966c248SBram Moolenaar      'vim9script',
26661966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
26671966c248SBram Moolenaar      ])
26681966c248SBram Moolenaar  CheckScriptFailure([
26691966c248SBram Moolenaar      'vim9script',
26701966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
26711966c248SBram Moolenaar      ], 'E789:')
26721966c248SBram Moolenaar
26731966c248SBram Moolenaar  CheckScriptSuccess([
26741966c248SBram Moolenaar      'vim9script',
26751966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
26761966c248SBram Moolenaar      ])
26771966c248SBram Moolenaar  CheckScriptFailure([
26781966c248SBram Moolenaar      'vim9script',
26791966c248SBram Moolenaar      'syntax match Word /pat/# comment',
26801966c248SBram Moolenaar      ], 'E402:')
26811966c248SBram Moolenaar
26821966c248SBram Moolenaar  CheckScriptSuccess([
26831966c248SBram Moolenaar      'vim9script',
26841966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
26851966c248SBram Moolenaar      ])
26861966c248SBram Moolenaar  CheckScriptFailure([
26871966c248SBram Moolenaar      'vim9script',
26881966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
26891966c248SBram Moolenaar      ], 'E475:')
26901966c248SBram Moolenaar  CheckScriptFailure([
26911966c248SBram Moolenaar      'vim9script',
26921966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
26931966c248SBram Moolenaar      ], 'E406:')
26941966c248SBram Moolenaar  CheckScriptFailure([
26951966c248SBram Moolenaar      'vim9script',
26961966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
26971966c248SBram Moolenaar      ], 'E475:')
26981966c248SBram Moolenaar
26991966c248SBram Moolenaar  CheckScriptSuccess([
27001966c248SBram Moolenaar      'vim9script',
27011966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
27021966c248SBram Moolenaar      ])
27031966c248SBram Moolenaar  CheckScriptFailure([
27041966c248SBram Moolenaar      'vim9script',
27051966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2706d032f34aSBram Moolenaar      ], 'E402:')
27071966c248SBram Moolenaar
27081966c248SBram Moolenaar  CheckScriptSuccess([
27091966c248SBram Moolenaar      'vim9script',
27101966c248SBram Moolenaar      'syntax sync # comment',
27111966c248SBram Moolenaar      ])
27121966c248SBram Moolenaar  CheckScriptFailure([
27131966c248SBram Moolenaar      'vim9script',
27141966c248SBram Moolenaar      'syntax sync# comment',
27151966c248SBram Moolenaar      ], 'E404:')
27161966c248SBram Moolenaar  CheckScriptSuccess([
27171966c248SBram Moolenaar      'vim9script',
27181966c248SBram Moolenaar      'syntax sync ccomment # comment',
27191966c248SBram Moolenaar      ])
27201966c248SBram Moolenaar  CheckScriptFailure([
27211966c248SBram Moolenaar      'vim9script',
27221966c248SBram Moolenaar      'syntax sync ccomment# comment',
27231966c248SBram Moolenaar      ], 'E404:')
27241966c248SBram Moolenaar
27251966c248SBram Moolenaar  CheckScriptSuccess([
27261966c248SBram Moolenaar      'vim9script',
27271966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
27281966c248SBram Moolenaar      ])
27291966c248SBram Moolenaar  CheckScriptFailure([
27301966c248SBram Moolenaar      'vim9script',
27311966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
27321966c248SBram Moolenaar      ], 'E475:')
2733a72cfb80SBram Moolenaar
2734a72cfb80SBram Moolenaar  CheckScriptSuccess([
2735a72cfb80SBram Moolenaar      'vim9script',
2736a72cfb80SBram Moolenaar      'command Echo echo # comment',
2737a72cfb80SBram Moolenaar      'command Echo # comment',
2738a72cfb80SBram Moolenaar      ])
2739a72cfb80SBram Moolenaar  CheckScriptFailure([
2740a72cfb80SBram Moolenaar      'vim9script',
2741a72cfb80SBram Moolenaar      'command Echo echo# comment',
2742a72cfb80SBram Moolenaar      'Echo',
2743a72cfb80SBram Moolenaar      ], 'E121:')
2744a72cfb80SBram Moolenaar  CheckScriptFailure([
2745a72cfb80SBram Moolenaar      'vim9script',
2746a72cfb80SBram Moolenaar      'command Echo# comment',
2747a72cfb80SBram Moolenaar      ], 'E182:')
2748a72cfb80SBram Moolenaar  CheckScriptFailure([
2749a72cfb80SBram Moolenaar      'vim9script',
2750a72cfb80SBram Moolenaar      'command Echo echo',
2751a72cfb80SBram Moolenaar      'command Echo# comment',
2752a72cfb80SBram Moolenaar      ], 'E182:')
2753a72cfb80SBram Moolenaar
2754a72cfb80SBram Moolenaar  CheckScriptSuccess([
2755a72cfb80SBram Moolenaar      'vim9script',
2756a72cfb80SBram Moolenaar      'function # comment',
2757a72cfb80SBram Moolenaar      ])
2758a72cfb80SBram Moolenaar  CheckScriptFailure([
2759a72cfb80SBram Moolenaar      'vim9script',
27609898107fSBram Moolenaar      'function " comment',
27619898107fSBram Moolenaar      ], 'E129:')
27629898107fSBram Moolenaar  CheckScriptFailure([
27639898107fSBram Moolenaar      'vim9script',
2764a72cfb80SBram Moolenaar      'function# comment',
2765a72cfb80SBram Moolenaar      ], 'E129:')
2766a72cfb80SBram Moolenaar  CheckScriptSuccess([
2767a72cfb80SBram Moolenaar      'vim9script',
2768a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2769a72cfb80SBram Moolenaar      ])
2770a72cfb80SBram Moolenaar  CheckScriptFailure([
2771a72cfb80SBram Moolenaar      'vim9script',
2772a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2773a72cfb80SBram Moolenaar      ], 'E488:')
2774a72cfb80SBram Moolenaar
2775a72cfb80SBram Moolenaar  CheckScriptSuccess([
2776a72cfb80SBram Moolenaar      'vim9script',
27774c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2778a72cfb80SBram Moolenaar      'endfunc',
27794c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2780a72cfb80SBram Moolenaar      ])
2781a72cfb80SBram Moolenaar  CheckScriptFailure([
2782a72cfb80SBram Moolenaar      'vim9script',
27834c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2784a72cfb80SBram Moolenaar      'endfunc',
27854c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2786a72cfb80SBram Moolenaar      ], 'E488:')
2787a72cfb80SBram Moolenaar
2788a72cfb80SBram Moolenaar  CheckScriptSuccess([
2789a72cfb80SBram Moolenaar      'vim9script',
2790a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2791a72cfb80SBram Moolenaar      ])
2792a72cfb80SBram Moolenaar  CheckScriptFailure([
2793a72cfb80SBram Moolenaar      'vim9script',
2794a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2795a72cfb80SBram Moolenaar      ], 'E488:')
2796e7e4838fSBram Moolenaar
2797e7e4838fSBram Moolenaar  CheckScriptFailure([
2798e7e4838fSBram Moolenaar      'def Test() " comment',
2799e7e4838fSBram Moolenaar      'enddef',
2800e7e4838fSBram Moolenaar      ], 'E488:')
2801e7e4838fSBram Moolenaar  CheckScriptFailure([
2802e7e4838fSBram Moolenaar      'vim9script',
2803e7e4838fSBram Moolenaar      'def Test() " comment',
2804e7e4838fSBram Moolenaar      'enddef',
2805e7e4838fSBram Moolenaar      ], 'E488:')
2806e7e4838fSBram Moolenaar
2807e7e4838fSBram Moolenaar  CheckScriptSuccess([
2808e7e4838fSBram Moolenaar      'func Test() " comment',
2809e7e4838fSBram Moolenaar      'endfunc',
2810e7e4838fSBram Moolenaar      ])
28119898107fSBram Moolenaar  CheckScriptSuccess([
2812e7e4838fSBram Moolenaar      'vim9script',
2813e7e4838fSBram Moolenaar      'func Test() " comment',
2814e7e4838fSBram Moolenaar      'endfunc',
28159898107fSBram Moolenaar      ])
2816e7e4838fSBram Moolenaar
2817e7e4838fSBram Moolenaar  CheckScriptSuccess([
2818e7e4838fSBram Moolenaar      'def Test() # comment',
2819e7e4838fSBram Moolenaar      'enddef',
2820e7e4838fSBram Moolenaar      ])
2821e7e4838fSBram Moolenaar  CheckScriptFailure([
2822e7e4838fSBram Moolenaar      'func Test() # comment',
2823e7e4838fSBram Moolenaar      'endfunc',
2824e7e4838fSBram Moolenaar      ], 'E488:')
28252c5ed4e3SBram Moolenaarenddef
28262c5ed4e3SBram Moolenaar
28272c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
28282c5ed4e3SBram Moolenaar  CheckCanRunGui
28292c5ed4e3SBram Moolenaar
28302c5ed4e3SBram Moolenaar  CheckScriptFailure([
28312c5ed4e3SBram Moolenaar      'vim9script',
28322c5ed4e3SBram Moolenaar      'gui#comment'
28332c5ed4e3SBram Moolenaar      ], 'E499:')
28342c5ed4e3SBram Moolenaar  CheckScriptFailure([
28352c5ed4e3SBram Moolenaar      'vim9script',
28362c5ed4e3SBram Moolenaar      'gui -f#comment'
28372c5ed4e3SBram Moolenaar      ], 'E499:')
28387a092245SBram Moolenaarenddef
28397a092245SBram Moolenaar
2840a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
28416797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
28426797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2843a26b9700SBram Moolenaar
2844a26b9700SBram Moolenaar  edit test.vim
2845a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2846a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2847a26b9700SBram Moolenaar
2848a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2849a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2850a26b9700SBram Moolenaar
2851a26b9700SBram Moolenaar  g:entered = 0
2852a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2853a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2854a26b9700SBram Moolenaar
2855a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2856a26b9700SBram Moolenaar
2857a26b9700SBram Moolenaar  au! TabEnter
2858a26b9700SBram Moolenaar  unlet g:entered
2859d72c1bf0SBram Moolenaar
2860d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2861d72c1bf0SBram Moolenaar      'vim9script',
28626797966dSBram Moolenaar      'g:var = 123',
2863e55b1c09SBram Moolenaar      'b:var = 456',
2864e55b1c09SBram Moolenaar      'w:var = 777',
2865e55b1c09SBram Moolenaar      't:var = 888',
2866d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2867d72c1bf0SBram Moolenaar      ])
2868d72c1bf0SBram Moolenaar
2869d72c1bf0SBram Moolenaar  CheckScriptFailure([
2870d72c1bf0SBram Moolenaar      'vim9script',
2871d72c1bf0SBram Moolenaar      'let g:var = 123',
2872e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2873e55b1c09SBram Moolenaar
2874e55b1c09SBram Moolenaar  CheckScriptFailure([
2875e55b1c09SBram Moolenaar      'vim9script',
2876e55b1c09SBram Moolenaar      'let b:var = 123',
2877e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2878e55b1c09SBram Moolenaar
2879e55b1c09SBram Moolenaar  CheckScriptFailure([
2880e55b1c09SBram Moolenaar      'vim9script',
2881e55b1c09SBram Moolenaar      'let w:var = 123',
2882e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2883e55b1c09SBram Moolenaar
2884e55b1c09SBram Moolenaar  CheckScriptFailure([
2885e55b1c09SBram Moolenaar      'vim9script',
2886e55b1c09SBram Moolenaar      'let t:var = 123',
2887e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2888e55b1c09SBram Moolenaar
2889e55b1c09SBram Moolenaar  CheckScriptFailure([
2890e55b1c09SBram Moolenaar      'vim9script',
2891e55b1c09SBram Moolenaar      'let v:version = 123',
2892e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2893e55b1c09SBram Moolenaar
2894e55b1c09SBram Moolenaar  CheckScriptFailure([
2895e55b1c09SBram Moolenaar      'vim9script',
2896e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2897e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
28986797966dSBram Moolenaar
28996797966dSBram Moolenaar  CheckScriptFailure([
29006797966dSBram Moolenaar      'vim9script',
29016797966dSBram Moolenaar      'g:var = 123',
290232e35117SBram Moolenaar      'unlet g:var# comment1',
2903d72c1bf0SBram Moolenaar      ], 'E108:')
2904d72c1bf0SBram Moolenaar
2905d72c1bf0SBram Moolenaar  CheckScriptFailure([
2906d72c1bf0SBram Moolenaar      'let g:var = 123',
2907d72c1bf0SBram Moolenaar      'unlet g:var # something',
2908d72c1bf0SBram Moolenaar      ], 'E488:')
2909faac4104SBram Moolenaar
2910faac4104SBram Moolenaar  CheckScriptSuccess([
2911faac4104SBram Moolenaar      'vim9script',
291232e35117SBram Moolenaar      'if 1 # comment2',
2913faac4104SBram Moolenaar      '  echo "yes"',
2914faac4104SBram Moolenaar      'elseif 2 #comment',
2915faac4104SBram Moolenaar      '  echo "no"',
2916faac4104SBram Moolenaar      'endif',
2917faac4104SBram Moolenaar      ])
2918faac4104SBram Moolenaar
2919faac4104SBram Moolenaar  CheckScriptFailure([
2920faac4104SBram Moolenaar      'vim9script',
292132e35117SBram Moolenaar      'if 1# comment3',
2922faac4104SBram Moolenaar      '  echo "yes"',
2923faac4104SBram Moolenaar      'endif',
2924faac4104SBram Moolenaar      ], 'E15:')
2925faac4104SBram Moolenaar
2926faac4104SBram Moolenaar  CheckScriptFailure([
2927faac4104SBram Moolenaar      'vim9script',
292832e35117SBram Moolenaar      'if 0 # comment4',
2929faac4104SBram Moolenaar      '  echo "yes"',
2930faac4104SBram Moolenaar      'elseif 2#comment',
2931faac4104SBram Moolenaar      '  echo "no"',
2932faac4104SBram Moolenaar      'endif',
2933faac4104SBram Moolenaar      ], 'E15:')
2934faac4104SBram Moolenaar
2935faac4104SBram Moolenaar  CheckScriptSuccess([
2936faac4104SBram Moolenaar      'vim9script',
293732e35117SBram Moolenaar      'let v = 1 # comment5',
2938faac4104SBram Moolenaar      ])
2939faac4104SBram Moolenaar
2940faac4104SBram Moolenaar  CheckScriptFailure([
2941faac4104SBram Moolenaar      'vim9script',
294232e35117SBram Moolenaar      'let v = 1# comment6',
294332e35117SBram Moolenaar      ], 'E15:')
2944faac4104SBram Moolenaar
2945faac4104SBram Moolenaar  CheckScriptSuccess([
2946faac4104SBram Moolenaar      'vim9script',
2947faac4104SBram Moolenaar      'new'
2948d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2949df069eecSBram Moolenaar      ':$',
2950faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2951faac4104SBram Moolenaar      'bwipe!',
2952faac4104SBram Moolenaar      ])
2953faac4104SBram Moolenaar
2954f5be8cdbSBram Moolenaar  CheckScriptFailure([
2955f5be8cdbSBram Moolenaar      'vim9script',
2956f5be8cdbSBram Moolenaar      'new'
2957d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2958f5be8cdbSBram Moolenaar      ':$',
2959f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2960f5be8cdbSBram Moolenaar      'bwipe!',
2961f5be8cdbSBram Moolenaar      ], 'E488:')
2962f5be8cdbSBram Moolenaar
2963f5be8cdbSBram Moolenaar  CheckScriptFailure([
2964f5be8cdbSBram Moolenaar      'vim9script',
2965f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2966f5be8cdbSBram Moolenaar      ], 'E477:')
2967a26b9700SBram Moolenaarenddef
2968a26b9700SBram Moolenaar
29697e5bd91dSBram Moolenaardef Test_finish()
29707e5bd91dSBram Moolenaar  let lines =<< trim END
29717e5bd91dSBram Moolenaar    vim9script
29726797966dSBram Moolenaar    g:res = 'one'
29737e5bd91dSBram Moolenaar    if v:false | finish | endif
29746797966dSBram Moolenaar    g:res = 'two'
29757e5bd91dSBram Moolenaar    finish
29766797966dSBram Moolenaar    g:res = 'three'
29777e5bd91dSBram Moolenaar  END
29787e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
29797e5bd91dSBram Moolenaar  source Xfinished
29807e5bd91dSBram Moolenaar  assert_equal('two', g:res)
29817e5bd91dSBram Moolenaar
29827e5bd91dSBram Moolenaar  unlet g:res
29837e5bd91dSBram Moolenaar  delete('Xfinished')
29847e5bd91dSBram Moolenaarenddef
29857e5bd91dSBram Moolenaar
298632e35117SBram Moolenaardef Test_let_func_call()
298732e35117SBram Moolenaar  let lines =<< trim END
298832e35117SBram Moolenaar    vim9script
298932e35117SBram Moolenaar    func GetValue()
299032e35117SBram Moolenaar      if exists('g:count')
299132e35117SBram Moolenaar        let g:count += 1
299232e35117SBram Moolenaar      else
299332e35117SBram Moolenaar        let g:count = 1
299432e35117SBram Moolenaar      endif
299532e35117SBram Moolenaar      return 'this'
299632e35117SBram Moolenaar    endfunc
299732e35117SBram Moolenaar    let val: string = GetValue()
2998f5be8cdbSBram Moolenaar    # env var is always a string
2999df671b46SBram Moolenaar    let env = $TERM
300032e35117SBram Moolenaar  END
300132e35117SBram Moolenaar  writefile(lines, 'Xfinished')
300232e35117SBram Moolenaar  source Xfinished
3003f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
300432e35117SBram Moolenaar  assert_equal(1, g:count)
300532e35117SBram Moolenaar
300632e35117SBram Moolenaar  unlet g:count
300732e35117SBram Moolenaar  delete('Xfinished')
300832e35117SBram Moolenaarenddef
300932e35117SBram Moolenaar
301032e35117SBram Moolenaardef Test_let_missing_type()
301132e35117SBram Moolenaar  let lines =<< trim END
301232e35117SBram Moolenaar    vim9script
3013df671b46SBram Moolenaar    let var = g:unknown
3014227a69deSBram Moolenaar  END
3015822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
3016227a69deSBram Moolenaar
3017227a69deSBram Moolenaar  lines =<< trim END
3018227a69deSBram Moolenaar    vim9script
3019227a69deSBram Moolenaar    let nr: number = 123
3020227a69deSBram Moolenaar    let var = nr
3021227a69deSBram Moolenaar  END
3022822ba247SBram Moolenaar  CheckScriptSuccess(lines)
302332e35117SBram Moolenaarenddef
302432e35117SBram Moolenaar
3025c82a5b5dSBram Moolenaardef Test_let_declaration()
3026c82a5b5dSBram Moolenaar  let lines =<< trim END
3027c82a5b5dSBram Moolenaar    vim9script
3028c82a5b5dSBram Moolenaar    let var: string
3029c82a5b5dSBram Moolenaar    g:var_uninit = var
3030c82a5b5dSBram Moolenaar    var = 'text'
3031c82a5b5dSBram Moolenaar    g:var_test = var
3032f5be8cdbSBram Moolenaar    # prefixing s: is optional
3033984dddbeSBram Moolenaar    s:var = 'prefixed'
3034984dddbeSBram Moolenaar    g:var_prefixed = s:var
3035984dddbeSBram Moolenaar
3036984dddbeSBram Moolenaar    let s:other: number
3037984dddbeSBram Moolenaar    other = 1234
3038984dddbeSBram Moolenaar    g:other_var = other
303953b29e48SBram Moolenaar
304053b29e48SBram Moolenaar    # type is inferred
304153b29e48SBram Moolenaar    s:dict = {'a': 222}
304253b29e48SBram Moolenaar    def GetDictVal(key: any)
304353b29e48SBram Moolenaar      g:dict_val = s:dict[key]
304453b29e48SBram Moolenaar    enddef
304553b29e48SBram Moolenaar    GetDictVal('a')
3046c82a5b5dSBram Moolenaar  END
3047c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
3048c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
3049c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
3050984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
3051984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
305253b29e48SBram Moolenaar  assert_equal(222, g:dict_val)
3053c82a5b5dSBram Moolenaar
3054c82a5b5dSBram Moolenaar  unlet g:var_uninit
3055c82a5b5dSBram Moolenaar  unlet g:var_test
3056984dddbeSBram Moolenaar  unlet g:var_prefixed
3057984dddbeSBram Moolenaar  unlet g:other_var
3058c82a5b5dSBram Moolenaarenddef
3059c82a5b5dSBram Moolenaar
3060c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
3061c5b1c20bSBram Moolenaar  let lines =<< trim END
3062c5b1c20bSBram Moolenaar    vim9script
3063c5b1c20bSBram Moolenaar    const var: string
3064c5b1c20bSBram Moolenaar  END
3065c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
3066c5b1c20bSBram Moolenaar
3067c5b1c20bSBram Moolenaar  lines =<< trim END
3068c5b1c20bSBram Moolenaar    vim9script
3069c5b1c20bSBram Moolenaar    let 9var: string
3070c5b1c20bSBram Moolenaar  END
3071c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
3072c5b1c20bSBram Moolenaarenddef
3073c5b1c20bSBram Moolenaar
307434db91f7SBram Moolenaardef Test_let_type_check()
307534db91f7SBram Moolenaar  let lines =<< trim END
307634db91f7SBram Moolenaar    vim9script
307734db91f7SBram Moolenaar    let var: string
307834db91f7SBram Moolenaar    var = 1234
307934db91f7SBram Moolenaar  END
3080451c2e35SBram Moolenaar  CheckScriptFailure(lines, 'E1012:')
3081984dddbeSBram Moolenaar
3082984dddbeSBram Moolenaar  lines =<< trim END
3083984dddbeSBram Moolenaar    vim9script
3084984dddbeSBram Moolenaar    let var:string
3085984dddbeSBram Moolenaar  END
3086984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
3087c5b1c20bSBram Moolenaar
3088c5b1c20bSBram Moolenaar  lines =<< trim END
3089c5b1c20bSBram Moolenaar    vim9script
3090c5b1c20bSBram Moolenaar    let var: asdf
3091c5b1c20bSBram Moolenaar  END
3092c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
3093a71e2633SBram Moolenaar
3094a71e2633SBram Moolenaar  lines =<< trim END
3095a71e2633SBram Moolenaar    vim9script
3096a71e2633SBram Moolenaar    let s:l: list<number>
3097a71e2633SBram Moolenaar    s:l = []
3098a71e2633SBram Moolenaar  END
3099a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
3100a71e2633SBram Moolenaar
3101a71e2633SBram Moolenaar  lines =<< trim END
3102a71e2633SBram Moolenaar    vim9script
3103a71e2633SBram Moolenaar    let s:d: dict<number>
3104a71e2633SBram Moolenaar    s:d = {}
3105a71e2633SBram Moolenaar  END
3106a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
310734db91f7SBram Moolenaarenddef
310834db91f7SBram Moolenaar
3109a5d0077eSBram Moolenaardef Test_forward_declaration()
3110a5d0077eSBram Moolenaar  let lines =<< trim END
3111a5d0077eSBram Moolenaar    vim9script
3112a5d0077eSBram Moolenaar    def GetValue(): string
3113a5d0077eSBram Moolenaar      return theVal
3114a5d0077eSBram Moolenaar    enddef
3115a5d0077eSBram Moolenaar    let theVal = 'something'
3116822ba247SBram Moolenaar    g:initVal = GetValue()
3117a5d0077eSBram Moolenaar    theVal = 'else'
3118a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3119a5d0077eSBram Moolenaar  END
3120a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3121a5d0077eSBram Moolenaar  source Xforward
3122a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3123a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3124a5d0077eSBram Moolenaar
3125a5d0077eSBram Moolenaar  unlet g:initVal
3126a5d0077eSBram Moolenaar  unlet g:laterVal
3127a5d0077eSBram Moolenaar  delete('Xforward')
3128a5d0077eSBram Moolenaarenddef
3129a5d0077eSBram Moolenaar
31309721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
31319721fb4eSBram Moolenaar  let legacy_lines =<< trim END
31329721fb4eSBram Moolenaar    source Xvim9_script.vim
31339721fb4eSBram Moolenaar
31349721fb4eSBram Moolenaar    call assert_false(exists('local'))
31359721fb4eSBram Moolenaar    call assert_false(exists('exported'))
31369721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
31379721fb4eSBram Moolenaar    call assert_equal('global', global)
31389721fb4eSBram Moolenaar    call assert_equal('global', g:global)
31399721fb4eSBram Moolenaar
31409721fb4eSBram Moolenaar    " imported variable becomes script-local
31419721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
31429721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
31439721fb4eSBram Moolenaar    call assert_false(exists('exported'))
31449721fb4eSBram Moolenaar
31459721fb4eSBram Moolenaar    " imported function becomes script-local
31469721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
31479721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
31489721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
31499721fb4eSBram Moolenaar  END
31509721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
31519721fb4eSBram Moolenaar
31529721fb4eSBram Moolenaar  let vim9_lines =<< trim END
31539721fb4eSBram Moolenaar    vim9script
31549721fb4eSBram Moolenaar    let local = 'local'
31559721fb4eSBram Moolenaar    g:global = 'global'
31569721fb4eSBram Moolenaar    export let exported = 'exported'
31579721fb4eSBram Moolenaar    export def GetText(): string
31589721fb4eSBram Moolenaar       return 'text'
31599721fb4eSBram Moolenaar    enddef
31609721fb4eSBram Moolenaar  END
31619721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
31629721fb4eSBram Moolenaar
31639721fb4eSBram Moolenaar  source Xlegacy_script.vim
31649721fb4eSBram Moolenaar
31659721fb4eSBram Moolenaar  assert_equal('global', g:global)
3166f5be8cdbSBram Moolenaar  unlet g:global
31679721fb4eSBram Moolenaar
31689721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
31699721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
31709721fb4eSBram Moolenaarenddef
3171a5d0077eSBram Moolenaar
31727d699701SBram Moolenaarfunc Test_vim9script_not_global()
31737d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
31747d699701SBram Moolenaar  let vim9lines =<< trim END
31757d699701SBram Moolenaar    vim9script
31767d699701SBram Moolenaar    let var = 'local'
31777d699701SBram Moolenaar    func TheFunc()
31787d699701SBram Moolenaar      echo 'local'
31797d699701SBram Moolenaar    endfunc
31807d699701SBram Moolenaar    def DefFunc()
31817d699701SBram Moolenaar      echo 'local'
31827d699701SBram Moolenaar    enddef
31837d699701SBram Moolenaar  END
31847d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
31857d699701SBram Moolenaar  source Xvim9script.vim
31867d699701SBram Moolenaar  try
31877d699701SBram Moolenaar    echo g:var
31887d699701SBram Moolenaar    assert_report('did not fail')
31897d699701SBram Moolenaar  catch /E121:/
31907d699701SBram Moolenaar    " caught
31917d699701SBram Moolenaar  endtry
31927d699701SBram Moolenaar  try
31937d699701SBram Moolenaar    call TheFunc()
31947d699701SBram Moolenaar    assert_report('did not fail')
31957d699701SBram Moolenaar  catch /E117:/
31967d699701SBram Moolenaar    " caught
31977d699701SBram Moolenaar  endtry
31987d699701SBram Moolenaar  try
31997d699701SBram Moolenaar    call DefFunc()
32007d699701SBram Moolenaar    assert_report('did not fail')
32017d699701SBram Moolenaar  catch /E117:/
32027d699701SBram Moolenaar    " caught
32037d699701SBram Moolenaar  endtry
32047d699701SBram Moolenaar
320525859dd7SBram Moolenaar  call delete('Xvim9script.vim')
32067d699701SBram Moolenaarendfunc
32077d699701SBram Moolenaar
3208eeb27bfeSBram Moolenaardef Test_vim9_copen()
3209eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3210eeb27bfeSBram Moolenaar  copen
3211eeb27bfeSBram Moolenaar  quit
3212eeb27bfeSBram Moolenaarenddef
3213eeb27bfeSBram Moolenaar
32142d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
32152d6b20d6SBram Moolenaardef Test_vim9_autoload()
32162d6b20d6SBram Moolenaar  let lines =<< trim END
32172d6b20d6SBram Moolenaar     vim9script
32182d6b20d6SBram Moolenaar     def foo#test()
32192d6b20d6SBram Moolenaar         echomsg getreg('"')
32202d6b20d6SBram Moolenaar     enddef
32212d6b20d6SBram Moolenaar  END
32222d6b20d6SBram Moolenaar
32232d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
32242d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
32252d6b20d6SBram Moolenaar  let save_rtp = &rtp
32262d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
32272d6b20d6SBram Moolenaar  augroup test
32282d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
32292d6b20d6SBram Moolenaar  augroup END
32302d6b20d6SBram Moolenaar
32312d6b20d6SBram Moolenaar  normal Y
32322d6b20d6SBram Moolenaar
32332d6b20d6SBram Moolenaar  augroup test
32342d6b20d6SBram Moolenaar    autocmd!
32352d6b20d6SBram Moolenaar  augroup END
32362d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
32372d6b20d6SBram Moolenaar  &rtp = save_rtp
32382d6b20d6SBram Moolenaarenddef
32392d6b20d6SBram Moolenaar
324081e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
324181e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
324281e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
324381e17fbeSBram Moolenaar  let lines =<< trim END
324481e17fbeSBram Moolenaar    let s:counter = 1
324581e17fbeSBram Moolenaar    def s:Func()
324681e17fbeSBram Moolenaar      au! CursorHold
324781e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
324881e17fbeSBram Moolenaar    enddef
324981e17fbeSBram Moolenaar    call s:Func()
325081e17fbeSBram Moolenaar    doau CursorHold
325181e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
325281e17fbeSBram Moolenaar    au! CursorHold
325381e17fbeSBram Moolenaar  END
325481e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
325581e17fbeSBram Moolenaarenddef
325681e17fbeSBram Moolenaar
32573896a105SBram Moolenaardef Test_cmdline_win()
32583896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
32593896a105SBram Moolenaar  # the command line window.
32603896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
32613896a105SBram Moolenaar  let export_lines =<< trim END
32623896a105SBram Moolenaar    vim9script
32633896a105SBram Moolenaar    export let That = 'yes'
32643896a105SBram Moolenaar  END
32653896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
32663896a105SBram Moolenaar  let import_lines =<< trim END
32673896a105SBram Moolenaar    vim9script
32683896a105SBram Moolenaar    import That from './Xexport.vim'
32693896a105SBram Moolenaar  END
32703896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
32713896a105SBram Moolenaar  let save_rtp = &rtp
32723896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
32733896a105SBram Moolenaar  syntax on
32743896a105SBram Moolenaar  augroup CmdWin
32753896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
32763896a105SBram Moolenaar  augroup END
32773896a105SBram Moolenaar  # this will open and also close the cmdline window
32783896a105SBram Moolenaar  feedkeys('q:', 'xt')
32793896a105SBram Moolenaar  assert_equal('yes', g:got_there)
32803896a105SBram Moolenaar
32813896a105SBram Moolenaar  augroup CmdWin
32823896a105SBram Moolenaar    au!
32833896a105SBram Moolenaar  augroup END
32843896a105SBram Moolenaar  &rtp = save_rtp
32853896a105SBram Moolenaar  delete('rtp', 'rf')
32863896a105SBram Moolenaarenddef
32873896a105SBram Moolenaar
3288e3d4685fSBram Moolenaardef Test_invalid_sid()
3289e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
329025859dd7SBram Moolenaar
3291e3d4685fSBram Moolenaar  if RunVim([], ['wq Xdidit'], '+"func <SNR>1_func"')
3292d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3293e3d4685fSBram Moolenaar  endif
3294e3d4685fSBram Moolenaar  delete('Xdidit')
3295e3d4685fSBram Moolenaarenddef
3296e3d4685fSBram Moolenaar
3297585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3298585fea7bSBram Moolenaardef Test_substitute_cmd()
3299585fea7bSBram Moolenaar  new
3300585fea7bSBram Moolenaar  setline(1, 'something')
3301585fea7bSBram Moolenaar  :substitute(some(other(
3302585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3303585fea7bSBram Moolenaar  bwipe!
3304585fea7bSBram Moolenaar
3305f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3306585fea7bSBram Moolenaar  let lines =<< trim END
3307585fea7bSBram Moolenaar    vim9script
3308585fea7bSBram Moolenaar    new
3309585fea7bSBram Moolenaar    setline(1, 'something')
3310585fea7bSBram Moolenaar    :substitute(some(other(
3311585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3312585fea7bSBram Moolenaar    bwipe!
3313585fea7bSBram Moolenaar  END
3314585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3315585fea7bSBram Moolenaar  source Xvim9lines
3316585fea7bSBram Moolenaar
3317585fea7bSBram Moolenaar  delete('Xvim9lines')
3318585fea7bSBram Moolenaarenddef
3319585fea7bSBram Moolenaar
33208a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3321