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
428a7d6542SBram Moolenaardef Test_assignment()
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
48*29a86ffeSBram Moolenaar  let bool3: bool = 0
49*29a86ffeSBram Moolenaar  assert_equal(0, bool3)
50*29a86ffeSBram Moolenaar  let bool4: bool = 1
51*29a86ffeSBram Moolenaar  assert_equal(1, bool4)
52*29a86ffeSBram Moolenaar
53d2c61705SBram Moolenaar  CheckDefFailure(['let x:string'], 'E1069:')
54d2c61705SBram Moolenaar  CheckDefFailure(['let x:string = "x"'], 'E1069:')
55d2c61705SBram Moolenaar  CheckDefFailure(['let a:string = "x"'], 'E1069:')
56d2c61705SBram Moolenaar  CheckDefFailure(['let lambda = {-> "lambda"}'], 'E704:')
57f93c7feaSBram Moolenaar
584cdb13ceSBram Moolenaar  let nr: number = 1234
59d2c61705SBram Moolenaar  CheckDefFailure(['let nr: number = "asdf"'], 'E1012:')
604cdb13ceSBram Moolenaar
61b209750bSBram Moolenaar  let a: number = 6 #comment
629be61bbbSBram Moolenaar  assert_equal(6, a)
639be61bbbSBram Moolenaar
6442a480bfSBram Moolenaar  if has('channel')
6542a480bfSBram Moolenaar    let chan1: channel
66fbdd08edSBram Moolenaar    let job1: job
67f51cb4e0SBram Moolenaar    let job2: job = job_start('willfail')
6842a480bfSBram Moolenaar  endif
69fbdd08edSBram Moolenaar  if has('float')
70fbdd08edSBram Moolenaar    let float1: float = 3.4
71fbdd08edSBram Moolenaar  endif
725deeb3f1SBram Moolenaar  let Funky1: func
735deeb3f1SBram Moolenaar  let Funky2: func = function('len')
744c17ad94SBram Moolenaar  let Party2: func = funcref('g:Test_syntax')
7542a480bfSBram Moolenaar
76b209750bSBram Moolenaar  g:newvar = 'new'  #comment
77401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
78401d9ffbSBram Moolenaar
79401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
80401d9ffbSBram Moolenaar  g:existing = 'no'
81401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
82401d9ffbSBram Moolenaar
83b283a8a6SBram Moolenaar  v:char = 'abc'
846e587dcbSBram Moolenaar  assert_equal('abc', v:char)
85b283a8a6SBram Moolenaar
86b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
876e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
88b283a8a6SBram Moolenaar  $ENVVAR = ''
896e587dcbSBram Moolenaar
90b5ed2660SBram Moolenaar  let lines =<< trim END
91b5ed2660SBram Moolenaar    vim9script
92b5ed2660SBram Moolenaar    $ENVVAR = 'barfoo'
93b5ed2660SBram Moolenaar    assert_equal('barfoo', $ENVVAR)
94b5ed2660SBram Moolenaar    $ENVVAR = ''
95b5ed2660SBram Moolenaar  END
96d2c61705SBram Moolenaar  CheckScriptSuccess(lines)
97b5ed2660SBram Moolenaar
98fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
99fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
100fd1823e0SBram Moolenaar  s:addToMe += 222
101fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
1020bbf722aSBram Moolenaar  s:newVar = 'new'
1030bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
104a8c17704SBram Moolenaar
105a8c17704SBram Moolenaar  set ts=7
106a8c17704SBram Moolenaar  &ts += 1
107a8c17704SBram Moolenaar  assert_equal(8, &ts)
10880c34ca3SBram Moolenaar  &ts -= 3
10980c34ca3SBram Moolenaar  assert_equal(5, &ts)
11080c34ca3SBram Moolenaar  &ts *= 2
11180c34ca3SBram Moolenaar  assert_equal(10, &ts)
11280c34ca3SBram Moolenaar  &ts /= 3
11380c34ca3SBram Moolenaar  assert_equal(3, &ts)
11480c34ca3SBram Moolenaar  set ts=10
11580c34ca3SBram Moolenaar  &ts %= 4
11680c34ca3SBram Moolenaar  assert_equal(2, &ts)
117b5ed2660SBram Moolenaar
11893ad1471SBram Moolenaar  if has('float')
11993ad1471SBram Moolenaar    let f100: float = 100.0
12093ad1471SBram Moolenaar    f100 /= 5
12193ad1471SBram Moolenaar    assert_equal(20.0, f100)
12293ad1471SBram Moolenaar
12393ad1471SBram Moolenaar    let f200: float = 200.0
12493ad1471SBram Moolenaar    f200 /= 5.0
12593ad1471SBram Moolenaar    assert_equal(40.0, f200)
12693ad1471SBram Moolenaar
12793ad1471SBram Moolenaar    CheckDefFailure(['let nr: number = 200', 'nr /= 5.0'], 'E1012:')
12893ad1471SBram Moolenaar  endif
12993ad1471SBram Moolenaar
130b5ed2660SBram Moolenaar  lines =<< trim END
131b5ed2660SBram Moolenaar    &ts = 6
132b5ed2660SBram Moolenaar    &ts += 3
133b5ed2660SBram Moolenaar    assert_equal(9, &ts)
1342e800955SBram Moolenaar
1352e800955SBram Moolenaar    &l:ts = 6
1362e800955SBram Moolenaar    assert_equal(6, &ts)
1372e800955SBram Moolenaar    &l:ts += 2
1382e800955SBram Moolenaar    assert_equal(8, &ts)
1392e800955SBram Moolenaar
1402e800955SBram Moolenaar    &g:ts = 6
1412e800955SBram Moolenaar    assert_equal(6, &g:ts)
1422e800955SBram Moolenaar    &g:ts += 2
1432e800955SBram Moolenaar    assert_equal(8, &g:ts)
144b5ed2660SBram Moolenaar  END
1452e800955SBram Moolenaar  CheckDefAndScriptSuccess(lines)
146b5ed2660SBram Moolenaar
1470aae4809SBram Moolenaar  CheckDefFailure(['&notex += 3'], 'E113:')
1480aae4809SBram Moolenaar  CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
1490aae4809SBram Moolenaar  CheckDefFailure(['&ts = [7]'], 'E1012:')
1500aae4809SBram Moolenaar  CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list')
1510aae4809SBram Moolenaar  CheckDefFailure(['&ts = "xx"'], 'E1012:')
1520aae4809SBram Moolenaar  CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string')
1530aae4809SBram Moolenaar  CheckDefFailure(['&path += 3'], 'E1012:')
1540aae4809SBram Moolenaar  CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
155cb711abfSBram Moolenaar  # test freeing ISN_STOREOPT
1560aae4809SBram Moolenaar  CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
15780c34ca3SBram Moolenaar  &ts = 8
158a8c17704SBram Moolenaar
1590aae4809SBram Moolenaar  lines =<< trim END
1600aae4809SBram Moolenaar    let save_TI = &t_TI
1610aae4809SBram Moolenaar    &t_TI = ''
1620aae4809SBram Moolenaar    assert_equal('', &t_TI)
1630aae4809SBram Moolenaar    &t_TI = 'xxx'
1640aae4809SBram Moolenaar    assert_equal('xxx', &t_TI)
1650aae4809SBram Moolenaar    &t_TI = save_TI
1660aae4809SBram Moolenaar  END
1670aae4809SBram Moolenaar  CheckDefSuccess(lines)
1680aae4809SBram Moolenaar  CheckScriptSuccess(['vim9script'] + lines)
1690aae4809SBram Moolenaar
1700aae4809SBram Moolenaar  CheckDefFailure(['&t_TI = 123'], 'E1012:')
1710aae4809SBram Moolenaar  CheckScriptFailure(['vim9script', '&t_TI = 123'], 'E928:')
1720aae4809SBram Moolenaar
1730aae4809SBram Moolenaar  CheckDefFailure(['let s:var = 123'], 'E1101:')
1740aae4809SBram Moolenaar  CheckDefFailure(['let s:var: number'], 'E1101:')
17533afa244SBram Moolenaar
176f9b2b496SBram Moolenaar  lines =<< trim END
177f9b2b496SBram Moolenaar    vim9script
178f9b2b496SBram Moolenaar    def SomeFunc()
179f9b2b496SBram Moolenaar      s:var = 123
180f9b2b496SBram Moolenaar    enddef
181f9b2b496SBram Moolenaar    defcompile
182f9b2b496SBram Moolenaar  END
183d2c61705SBram Moolenaar  CheckScriptFailure(lines, 'E1089:')
184f9b2b496SBram Moolenaar
185a8c17704SBram Moolenaar  g:inc_counter += 1
186a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
187a8c17704SBram Moolenaar
188a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
189a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
190d2c61705SBram Moolenaar  CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1051:')
191d2c61705SBram Moolenaar  CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1012:')
192a8c17704SBram Moolenaar
193b5ed2660SBram Moolenaar  lines =<< trim END
194b5ed2660SBram Moolenaar    @c = 'areg'
195b5ed2660SBram Moolenaar    @c ..= 'add'
196b5ed2660SBram Moolenaar    assert_equal('aregadd', @c)
197b5ed2660SBram Moolenaar  END
1982e800955SBram Moolenaar  CheckDefAndScriptSuccess(lines)
1992e800955SBram Moolenaar
200d2c61705SBram Moolenaar  CheckDefFailure(['@a += "more"'], 'E1051:')
201d2c61705SBram Moolenaar  CheckDefFailure(['@a += 123'], 'E1012:')
202b5ed2660SBram Moolenaar
203e69f6d04SBram Moolenaar  v:errmsg = 'none'
204e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
205e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
206d2c61705SBram Moolenaar  CheckDefFailure(['v:errmsg += "more"'], 'E1051:')
207d2c61705SBram Moolenaar  CheckDefFailure(['v:errmsg += 123'], 'E1012:')
20833afa244SBram Moolenaar
20933afa244SBram Moolenaar  # single letter variables
21033afa244SBram Moolenaar  a = 123
21133afa244SBram Moolenaar  assert_equal(123, a)
21233afa244SBram Moolenaar  let b: number
21333afa244SBram Moolenaar  b = 123
21433afa244SBram Moolenaar  assert_equal(123, b)
21533afa244SBram Moolenaar  let g: number
21633afa244SBram Moolenaar  g = 123
21733afa244SBram Moolenaar  assert_equal(123, g)
21833afa244SBram Moolenaar  let s: number
21933afa244SBram Moolenaar  s = 123
22033afa244SBram Moolenaar  assert_equal(123, s)
22133afa244SBram Moolenaar  let t: number
22233afa244SBram Moolenaar  t = 123
22333afa244SBram Moolenaar  assert_equal(123, t)
22433afa244SBram Moolenaar  let v: number
22533afa244SBram Moolenaar  v = 123
22633afa244SBram Moolenaar  assert_equal(123, v)
22733afa244SBram Moolenaar  let w: number
22833afa244SBram Moolenaar  w = 123
22933afa244SBram Moolenaar  assert_equal(123, w)
2305deeb3f1SBram Moolenaarenddef
2315deeb3f1SBram Moolenaar
2323b74b6b4SBram Moolenaardef Test_vim9_single_char_vars()
2333b74b6b4SBram Moolenaar  let lines =<< trim END
2343b74b6b4SBram Moolenaar      vim9script
2353b74b6b4SBram Moolenaar
236f5be8cdbSBram Moolenaar      # single character variable declarations work
2373b74b6b4SBram Moolenaar      let a: string
2383b74b6b4SBram Moolenaar      let b: number
2393b74b6b4SBram Moolenaar      let l: list<any>
2403b74b6b4SBram Moolenaar      let s: string
2413b74b6b4SBram Moolenaar      let t: number
2423b74b6b4SBram Moolenaar      let v: number
2433b74b6b4SBram Moolenaar      let w: number
2443b74b6b4SBram Moolenaar
245f5be8cdbSBram Moolenaar      # script-local variables can be used without s: prefix
2463b74b6b4SBram Moolenaar      a = 'script-a'
2473b74b6b4SBram Moolenaar      b = 111
2483b74b6b4SBram Moolenaar      l = [1, 2, 3]
2493b74b6b4SBram Moolenaar      s = 'script-s'
2503b74b6b4SBram Moolenaar      t = 222
2513b74b6b4SBram Moolenaar      v = 333
2523b74b6b4SBram Moolenaar      w = 444
2533b74b6b4SBram Moolenaar
2543b74b6b4SBram Moolenaar      assert_equal('script-a', a)
2553b74b6b4SBram Moolenaar      assert_equal(111, b)
2563b74b6b4SBram Moolenaar      assert_equal([1, 2, 3], l)
2573b74b6b4SBram Moolenaar      assert_equal('script-s', s)
2583b74b6b4SBram Moolenaar      assert_equal(222, t)
2593b74b6b4SBram Moolenaar      assert_equal(333, v)
2603b74b6b4SBram Moolenaar      assert_equal(444, w)
2613b74b6b4SBram Moolenaar  END
2623b74b6b4SBram Moolenaar  writefile(lines, 'Xsinglechar')
2633b74b6b4SBram Moolenaar  source Xsinglechar
2643b74b6b4SBram Moolenaar  delete('Xsinglechar')
2653b74b6b4SBram Moolenaarenddef
2663b74b6b4SBram Moolenaar
26784370087SBram Moolenaardef Test_assignment_list()
26884370087SBram Moolenaar  let list1: list<bool> = [false, true, false]
26984370087SBram Moolenaar  let list2: list<number> = [1, 2, 3]
27084370087SBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
27184370087SBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
27284370087SBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
27384370087SBram Moolenaar
27484370087SBram Moolenaar  let listS: list<string> = []
27584370087SBram Moolenaar  let listN: list<number> = []
27684370087SBram Moolenaar
27784370087SBram Moolenaar  assert_equal([1, 2, 3], list2)
27884370087SBram Moolenaar  list2[-1] = 99
27984370087SBram Moolenaar  assert_equal([1, 2, 99], list2)
28084370087SBram Moolenaar  list2[-2] = 88
28184370087SBram Moolenaar  assert_equal([1, 88, 99], list2)
28284370087SBram Moolenaar  list2[-3] = 77
28384370087SBram Moolenaar  assert_equal([77, 88, 99], list2)
284dd29f1b0SBram Moolenaar  list2 += [100]
285dd29f1b0SBram Moolenaar  assert_equal([77, 88, 99, 100], list2)
286dd29f1b0SBram Moolenaar
287dd29f1b0SBram Moolenaar  list3 += ['end']
288dd29f1b0SBram Moolenaar  assert_equal(['sdf', 'asdf', 'end'], list3)
289dd29f1b0SBram Moolenaar
290dd29f1b0SBram Moolenaar
291d2c61705SBram Moolenaar  CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
292d2c61705SBram Moolenaar  CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:')
29384370087SBram Moolenaar
29484370087SBram Moolenaar  # type becomes list<any>
29584370087SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
29684370087SBram Moolenaarenddef
29784370087SBram Moolenaar
298b31be3f9SBram Moolenaardef Test_assignment_list_vim9script()
299b31be3f9SBram Moolenaar  let lines =<< trim END
300b31be3f9SBram Moolenaar    vim9script
301b31be3f9SBram Moolenaar    let v1: number
302b31be3f9SBram Moolenaar    let v2: number
303b31be3f9SBram Moolenaar    let v3: number
304b31be3f9SBram Moolenaar    [v1, v2, v3] = [1, 2, 3]
305b31be3f9SBram Moolenaar    assert_equal([1, 2, 3], [v1, v2, v3])
306b31be3f9SBram Moolenaar  END
307d2c61705SBram Moolenaar  CheckScriptSuccess(lines)
308b31be3f9SBram Moolenaarenddef
309b31be3f9SBram Moolenaar
31084370087SBram Moolenaardef Test_assignment_dict()
31184370087SBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
31284370087SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
31384370087SBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
31484370087SBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
31574fae513SBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, two: 0z02}
31684370087SBram Moolenaar
317f5be8cdbSBram Moolenaar  # overwrite
318c785b9a7SBram Moolenaar  dict3['key'] = 'another'
319c785b9a7SBram Moolenaar
32058626872SBram Moolenaar  # empty key can be used
32158626872SBram Moolenaar  let dd = {}
32258626872SBram Moolenaar  dd[""] = 6
32358626872SBram Moolenaar  assert_equal({'': 6}, dd)
32484370087SBram Moolenaar
32584370087SBram Moolenaar  # type becomes dict<any>
32684370087SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
3278e4c8c85SBram Moolenaar
3288e4c8c85SBram Moolenaar  # assignment to script-local dict
3298e4c8c85SBram Moolenaar  let lines =<< trim END
3308e4c8c85SBram Moolenaar    vim9script
3318e4c8c85SBram Moolenaar    let test: dict<any> = {}
3328e4c8c85SBram Moolenaar    def FillDict(): dict<any>
3338e4c8c85SBram Moolenaar      test['a'] = 43
3348e4c8c85SBram Moolenaar      return test
3358e4c8c85SBram Moolenaar    enddef
3368e4c8c85SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3378e4c8c85SBram Moolenaar  END
3388e4c8c85SBram Moolenaar  call CheckScriptSuccess(lines)
3398e4c8c85SBram Moolenaar
3408e4c8c85SBram Moolenaar  lines =<< trim END
3418e4c8c85SBram Moolenaar    vim9script
3428e4c8c85SBram Moolenaar    let test: dict<any>
3438e4c8c85SBram Moolenaar    def FillDict(): dict<any>
3448e4c8c85SBram Moolenaar      test['a'] = 43
3458e4c8c85SBram Moolenaar      return test
3468e4c8c85SBram Moolenaar    enddef
3478e4c8c85SBram Moolenaar    FillDict()
3488e4c8c85SBram Moolenaar  END
3498e4c8c85SBram Moolenaar  call CheckScriptFailure(lines, 'E1103:')
3502caa1594SBram Moolenaar
3512caa1594SBram Moolenaar  # assignment to global dict
3522caa1594SBram Moolenaar  lines =<< trim END
3532caa1594SBram Moolenaar    vim9script
3542caa1594SBram Moolenaar    g:test = {}
3552caa1594SBram Moolenaar    def FillDict(): dict<any>
3562caa1594SBram Moolenaar      g:test['a'] = 43
3572caa1594SBram Moolenaar      return g:test
3582caa1594SBram Moolenaar    enddef
3592caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3602caa1594SBram Moolenaar  END
3612caa1594SBram Moolenaar  call CheckScriptSuccess(lines)
3622caa1594SBram Moolenaar
3632caa1594SBram Moolenaar  # assignment to buffer dict
3642caa1594SBram Moolenaar  lines =<< trim END
3652caa1594SBram Moolenaar    vim9script
3662caa1594SBram Moolenaar    b:test = {}
3672caa1594SBram Moolenaar    def FillDict(): dict<any>
3682caa1594SBram Moolenaar      b:test['a'] = 43
3692caa1594SBram Moolenaar      return b:test
3702caa1594SBram Moolenaar    enddef
3712caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3722caa1594SBram Moolenaar  END
3732caa1594SBram Moolenaar  call CheckScriptSuccess(lines)
37484370087SBram Moolenaarenddef
37584370087SBram Moolenaar
376d3aac291SBram Moolenaardef Test_assignment_local()
377f5be8cdbSBram Moolenaar  # Test in a separated file in order not to the current buffer/window/tab is
378f5be8cdbSBram Moolenaar  # changed.
379d3aac291SBram Moolenaar  let script_lines: list<string> =<< trim END
380d3aac291SBram Moolenaar    let b:existing = 'yes'
381d3aac291SBram Moolenaar    let w:existing = 'yes'
382d3aac291SBram Moolenaar    let t:existing = 'yes'
383d3aac291SBram Moolenaar
384d3aac291SBram Moolenaar    def Test_assignment_local_internal()
385d3aac291SBram Moolenaar      b:newvar = 'new'
386d3aac291SBram Moolenaar      assert_equal('new', b:newvar)
387d3aac291SBram Moolenaar      assert_equal('yes', b:existing)
388d3aac291SBram Moolenaar      b:existing = 'no'
389d3aac291SBram Moolenaar      assert_equal('no', b:existing)
390396f3138SBram Moolenaar      b:existing ..= 'NO'
391396f3138SBram Moolenaar      assert_equal('noNO', b:existing)
392d3aac291SBram Moolenaar
393d3aac291SBram Moolenaar      w:newvar = 'new'
394d3aac291SBram Moolenaar      assert_equal('new', w:newvar)
395d3aac291SBram Moolenaar      assert_equal('yes', w:existing)
396d3aac291SBram Moolenaar      w:existing = 'no'
397d3aac291SBram Moolenaar      assert_equal('no', w:existing)
398396f3138SBram Moolenaar      w:existing ..= 'NO'
399396f3138SBram Moolenaar      assert_equal('noNO', w:existing)
400d3aac291SBram Moolenaar
401d3aac291SBram Moolenaar      t:newvar = 'new'
402d3aac291SBram Moolenaar      assert_equal('new', t:newvar)
403d3aac291SBram Moolenaar      assert_equal('yes', t:existing)
404d3aac291SBram Moolenaar      t:existing = 'no'
405d3aac291SBram Moolenaar      assert_equal('no', t:existing)
406396f3138SBram Moolenaar      t:existing ..= 'NO'
407396f3138SBram Moolenaar      assert_equal('noNO', t:existing)
408d3aac291SBram Moolenaar    enddef
409d3aac291SBram Moolenaar    call Test_assignment_local_internal()
410d3aac291SBram Moolenaar  END
411d3aac291SBram Moolenaar  call CheckScriptSuccess(script_lines)
412d3aac291SBram Moolenaarenddef
413d3aac291SBram Moolenaar
4145deeb3f1SBram Moolenaardef Test_assignment_default()
415e69f6d04SBram Moolenaar
416cb711abfSBram Moolenaar  # Test default values.
417e69f6d04SBram Moolenaar  let thebool: bool
418e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
419e69f6d04SBram Moolenaar
420e69f6d04SBram Moolenaar  let thenumber: number
421e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
422e69f6d04SBram Moolenaar
423e69f6d04SBram Moolenaar  if has('float')
424e69f6d04SBram Moolenaar    let thefloat: float
425e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
426e69f6d04SBram Moolenaar  endif
427e69f6d04SBram Moolenaar
428e69f6d04SBram Moolenaar  let thestring: string
429e69f6d04SBram Moolenaar  assert_equal('', thestring)
430e69f6d04SBram Moolenaar
431e69f6d04SBram Moolenaar  let theblob: blob
432e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
433e69f6d04SBram Moolenaar
4345deeb3f1SBram Moolenaar  let Thefunc: func
4355deeb3f1SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
436e69f6d04SBram Moolenaar
437e69f6d04SBram Moolenaar  let thelist: list<any>
438e69f6d04SBram Moolenaar  assert_equal([], thelist)
439e69f6d04SBram Moolenaar
440e69f6d04SBram Moolenaar  let thedict: dict<any>
441e69f6d04SBram Moolenaar  assert_equal({}, thedict)
442e69f6d04SBram Moolenaar
4432c869deeSBram Moolenaar  if has('channel')
444e69f6d04SBram Moolenaar    let thejob: job
445e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
446e69f6d04SBram Moolenaar
447e69f6d04SBram Moolenaar    let thechannel: channel
448e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
449c785b9a7SBram Moolenaar
450c785b9a7SBram Moolenaar    if has('unix') && executable('cat')
451f5be8cdbSBram Moolenaar      # check with non-null job and channel, types must match
452c785b9a7SBram Moolenaar      thejob = job_start("cat ", #{})
453c785b9a7SBram Moolenaar      thechannel = job_getchannel(thejob)
454c785b9a7SBram Moolenaar      job_stop(thejob, 'kill')
455c785b9a7SBram Moolenaar    endif
4562c869deeSBram Moolenaar  endif
457585fea7bSBram Moolenaar
458585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
459585fea7bSBram Moolenaar  assert_equal(5678, nr)
4608a7d6542SBram Moolenaarenddef
4618a7d6542SBram Moolenaar
46247a519a9SBram Moolenaardef Test_assignment_var_list()
46347a519a9SBram Moolenaar  let v1: string
46447a519a9SBram Moolenaar  let v2: string
4659af78769SBram Moolenaar  let vrem: list<string>
4669af78769SBram Moolenaar  [v1] = ['aaa']
4679af78769SBram Moolenaar  assert_equal('aaa', v1)
4689af78769SBram Moolenaar
46947a519a9SBram Moolenaar  [v1, v2] = ['one', 'two']
47047a519a9SBram Moolenaar  assert_equal('one', v1)
47147a519a9SBram Moolenaar  assert_equal('two', v2)
4729af78769SBram Moolenaar
4739af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two']
4749af78769SBram Moolenaar  assert_equal('one', v1)
4759af78769SBram Moolenaar  assert_equal('two', v2)
4769af78769SBram Moolenaar  assert_equal([], vrem)
4779af78769SBram Moolenaar
4789af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two', 'three']
4799af78769SBram Moolenaar  assert_equal('one', v1)
4809af78769SBram Moolenaar  assert_equal('two', v2)
4819af78769SBram Moolenaar  assert_equal(['three'], vrem)
4821c199f9cSBram Moolenaar
4831c199f9cSBram Moolenaar  [&ts, &sw] = [3, 4]
4841c199f9cSBram Moolenaar  assert_equal(3, &ts)
4851c199f9cSBram Moolenaar  assert_equal(4, &sw)
4861c199f9cSBram Moolenaar  set ts=8 sw=4
48747a519a9SBram Moolenaarenddef
48847a519a9SBram Moolenaar
489c7e44a7eSBram Moolenaardef Test_assignment_vim9script()
490c7e44a7eSBram Moolenaar  let lines =<< trim END
491c7e44a7eSBram Moolenaar    vim9script
492c7e44a7eSBram Moolenaar    def Func(): list<number>
493c7e44a7eSBram Moolenaar      return [1, 2]
494c7e44a7eSBram Moolenaar    enddef
495c7e44a7eSBram Moolenaar    let var1: number
496c7e44a7eSBram Moolenaar    let var2: number
497c7e44a7eSBram Moolenaar    [var1, var2] =
498c7e44a7eSBram Moolenaar          Func()
499c7e44a7eSBram Moolenaar    assert_equal(1, var1)
500c7e44a7eSBram Moolenaar    assert_equal(2, var2)
501c7e44a7eSBram Moolenaar    let ll =
502c7e44a7eSBram Moolenaar          Func()
503c7e44a7eSBram Moolenaar    assert_equal([1, 2], ll)
50483144546SBram Moolenaar
50583144546SBram Moolenaar    @/ = 'text'
50683144546SBram Moolenaar    assert_equal('text', @/)
50783144546SBram Moolenaar    @0 = 'zero'
50883144546SBram Moolenaar    assert_equal('zero', @0)
50983144546SBram Moolenaar    @1 = 'one'
51083144546SBram Moolenaar    assert_equal('one', @1)
51183144546SBram Moolenaar    @9 = 'nine'
51283144546SBram Moolenaar    assert_equal('nine', @9)
51383144546SBram Moolenaar    @- = 'minus'
51483144546SBram Moolenaar    assert_equal('minus', @-)
51583144546SBram Moolenaar    if has('clipboard_working')
51683144546SBram Moolenaar      @* = 'star'
51783144546SBram Moolenaar      assert_equal('star', @*)
51883144546SBram Moolenaar      @+ = 'plus'
51983144546SBram Moolenaar      assert_equal('plus', @+)
52083144546SBram Moolenaar    endif
52195dd9f25SBram Moolenaar
52295dd9f25SBram Moolenaar    let a: number = 123
52395dd9f25SBram Moolenaar    assert_equal(123, a)
52495dd9f25SBram Moolenaar    let s: string = 'yes'
52595dd9f25SBram Moolenaar    assert_equal('yes', s)
52695dd9f25SBram Moolenaar    let b: number = 42
52795dd9f25SBram Moolenaar    assert_equal(42, b)
52895dd9f25SBram Moolenaar    let w: number = 43
52995dd9f25SBram Moolenaar    assert_equal(43, w)
53095dd9f25SBram Moolenaar    let t: number = 44
53195dd9f25SBram Moolenaar    assert_equal(44, t)
532c7e44a7eSBram Moolenaar  END
533c7e44a7eSBram Moolenaar  CheckScriptSuccess(lines)
534c7e44a7eSBram Moolenaarenddef
535c7e44a7eSBram Moolenaar
536cab27678SBram Moolenaardef Mess(): string
537cab27678SBram Moolenaar  v:foldstart = 123
538cab27678SBram Moolenaar  return 'xxx'
539cab27678SBram Moolenaarenddef
540cab27678SBram Moolenaar
541d72c1bf0SBram Moolenaardef Test_assignment_failure()
542d2c61705SBram Moolenaar  CheckDefFailure(['let var=234'], 'E1004:')
543d2c61705SBram Moolenaar  CheckDefFailure(['let var =234'], 'E1004:')
544d2c61705SBram Moolenaar  CheckDefFailure(['let var= 234'], 'E1004:')
5458a7d6542SBram Moolenaar
546d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:')
547d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='")
548d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:')
549d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:')
550d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:')
551d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='")
552d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:')
553d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='")
55463be3d4bSBram Moolenaar
555d2c61705SBram Moolenaar  CheckDefFailure(['let true = 1'], 'E1034:')
556d2c61705SBram Moolenaar  CheckDefFailure(['let false = 1'], 'E1034:')
5578a7d6542SBram Moolenaar
558d2c61705SBram Moolenaar  CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
559d2c61705SBram Moolenaar  CheckDefExecFailure(['let a: number',
5609af78769SBram Moolenaar                       '[a] = test_null_list()'], 'E1093:')
561d2c61705SBram Moolenaar  CheckDefExecFailure(['let a: number',
5629af78769SBram Moolenaar                       '[a] = []'], 'E1093:')
563d2c61705SBram Moolenaar  CheckDefExecFailure(['let x: number',
5649af78769SBram Moolenaar                       'let y: number',
5659af78769SBram Moolenaar                       '[x, y] = [1]'], 'E1093:')
566d2c61705SBram Moolenaar  CheckDefExecFailure(['let x: number',
5679af78769SBram Moolenaar                       'let y: number',
5689af78769SBram Moolenaar                       'let z: list<number>',
5699af78769SBram Moolenaar                       '[x, y; z] = [1]'], 'E1093:')
5709be61bbbSBram Moolenaar
571d2c61705SBram Moolenaar  CheckDefFailure(['let somevar'], "E1022:")
572d2c61705SBram Moolenaar  CheckDefFailure(['let &tabstop = 4'], 'E1052:')
573d2c61705SBram Moolenaar  CheckDefFailure(['&g:option = 5'], 'E113:')
574d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:')
5759be61bbbSBram Moolenaar
576d2c61705SBram Moolenaar  CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
577d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:')
5789be61bbbSBram Moolenaar
579434d72cbSBram Moolenaar  if has('dnd')
580d2c61705SBram Moolenaar    CheckDefFailure(['let @~ = 5'], 'E1066:')
581434d72cbSBram Moolenaar  else
582d2c61705SBram Moolenaar    CheckDefFailure(['let @~ = 5'], 'E354:')
583d2c61705SBram Moolenaar    CheckDefFailure(['@~ = 5'], 'E354:')
584434d72cbSBram Moolenaar  endif
585d2c61705SBram Moolenaar  CheckDefFailure(['let @a = 5'], 'E1066:')
586d2c61705SBram Moolenaar  CheckDefFailure(['let @/ = "x"'], 'E1066:')
587d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:')
5889be61bbbSBram Moolenaar
589d2c61705SBram Moolenaar  CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
590d2c61705SBram Moolenaar  CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
591d2c61705SBram Moolenaar  CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
592d2c61705SBram Moolenaar  CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
5939be61bbbSBram Moolenaar
594d2c61705SBram Moolenaar  CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
595d2c61705SBram Moolenaar  CheckDefFailure(['let xnr += 4'], 'E1020:', 1)
596d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let xnr += 4'], 'E1020:')
597d2c61705SBram Moolenaar  CheckDefFailure(["let xnr = xnr + 1"], 'E1001:', 1)
598d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let xnr = xnr + 4'], 'E121:')
5999be61bbbSBram Moolenaar
600d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1108:')
60133fa29cfSBram Moolenaar
602d2c61705SBram Moolenaar  CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
603d2c61705SBram Moolenaar  CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
6048a7d6542SBram Moolenaar
605d2c61705SBram Moolenaar  CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
606d2c61705SBram Moolenaar  CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
6078a7d6542SBram Moolenaar
608d2c61705SBram Moolenaar  CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
609d2c61705SBram Moolenaar  CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
61042a480bfSBram Moolenaar
611d2c61705SBram Moolenaar  CheckDefFailure(['let var: dict <number>'], 'E1068:')
612d2c61705SBram Moolenaar  CheckDefFailure(['let var: dict<number'], 'E1009:')
613cab27678SBram Moolenaar
614d2c61705SBram Moolenaar  assert_fails('s/^/\=Mess()/n', 'E794:')
615d2c61705SBram Moolenaar  CheckDefFailure(['let var: dict<number'], 'E1009:')
61643e969d3SBram Moolenaar
617d2c61705SBram Moolenaar  CheckDefFailure(['w:foo: number = 10'],
61843e969d3SBram Moolenaar                  'E488: Trailing characters: : number = 1')
619d2c61705SBram Moolenaar  CheckDefFailure(['t:foo: bool = true'],
62043e969d3SBram Moolenaar                  'E488: Trailing characters: : bool = true')
621d2c61705SBram Moolenaar  CheckDefFailure(['b:foo: string = "x"'],
62243e969d3SBram Moolenaar                  'E488: Trailing characters: : string = "x"')
623d2c61705SBram Moolenaar  CheckDefFailure(['g:foo: number = 123'],
62443e969d3SBram Moolenaar                  'E488: Trailing characters: : number = 123')
625d72c1bf0SBram Moolenaarenddef
626d72c1bf0SBram Moolenaar
627d72c1bf0SBram Moolenaardef Test_unlet()
628d72c1bf0SBram Moolenaar  g:somevar = 'yes'
629d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
630d72c1bf0SBram Moolenaar  unlet g:somevar
631d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
632d72c1bf0SBram Moolenaar  unlet! g:somevar
633d72c1bf0SBram Moolenaar
6348436773fSBram Moolenaar  # also works for script-local variable in legacy Vim script
6358436773fSBram Moolenaar  s:somevar = 'legacy'
6368436773fSBram Moolenaar  assert_true(exists('s:somevar'))
6378436773fSBram Moolenaar  unlet s:somevar
6388436773fSBram Moolenaar  assert_false(exists('s:somevar'))
6398436773fSBram Moolenaar  unlet! s:somevar
6408436773fSBram Moolenaar
641d2c61705SBram Moolenaar  CheckScriptFailure([
642d72c1bf0SBram Moolenaar   'vim9script',
643d72c1bf0SBram Moolenaar   'let svar = 123',
644d72c1bf0SBram Moolenaar   'unlet svar',
645d72c1bf0SBram Moolenaar   ], 'E1081:')
646d2c61705SBram Moolenaar  CheckScriptFailure([
647d72c1bf0SBram Moolenaar   'vim9script',
648d72c1bf0SBram Moolenaar   'let svar = 123',
649d72c1bf0SBram Moolenaar   'unlet s:svar',
650d72c1bf0SBram Moolenaar   ], 'E1081:')
651d2c61705SBram Moolenaar  CheckScriptFailure([
652d72c1bf0SBram Moolenaar   'vim9script',
653d72c1bf0SBram Moolenaar   'let svar = 123',
654d72c1bf0SBram Moolenaar   'def Func()',
655d72c1bf0SBram Moolenaar   '  unlet svar',
656d72c1bf0SBram Moolenaar   'enddef',
657822ba247SBram Moolenaar   'defcompile',
658d72c1bf0SBram Moolenaar   ], 'E1081:')
659d2c61705SBram Moolenaar  CheckScriptFailure([
660d72c1bf0SBram Moolenaar   'vim9script',
661d72c1bf0SBram Moolenaar   'let svar = 123',
662d72c1bf0SBram Moolenaar   'def Func()',
663d72c1bf0SBram Moolenaar   '  unlet s:svar',
664d72c1bf0SBram Moolenaar   'enddef',
665822ba247SBram Moolenaar   'defcompile',
666d72c1bf0SBram Moolenaar   ], 'E1081:')
6677bdaea6eSBram Moolenaar
6687bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
6697bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
6707bdaea6eSBram Moolenaar  unlet $ENVVAR
6717bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
672d72c1bf0SBram Moolenaarenddef
673599c89c8SBram Moolenaar
6744c17ad94SBram Moolenaardef Test_delfunction()
675f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
6764c17ad94SBram Moolenaar  CheckScriptSuccess([
6774c17ad94SBram Moolenaar      'vim9script',
6784c17ad94SBram Moolenaar      'func CheckMe()',
6794c17ad94SBram Moolenaar      '  return 123',
6804c17ad94SBram Moolenaar      'endfunc',
6814c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
6824c17ad94SBram Moolenaar      ])
6834c17ad94SBram Moolenaar
684f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
6854c17ad94SBram Moolenaar  CheckScriptFailure([
6864c17ad94SBram Moolenaar      'vim9script',
6874c17ad94SBram Moolenaar      'func DeleteMe1()',
6884c17ad94SBram Moolenaar      'endfunc',
6894c17ad94SBram Moolenaar      'delfunction DeleteMe1',
6904c17ad94SBram Moolenaar      ], 'E1084:')
6914c17ad94SBram Moolenaar  CheckScriptFailure([
6924c17ad94SBram Moolenaar      'vim9script',
6934c17ad94SBram Moolenaar      'func DeleteMe2()',
6944c17ad94SBram Moolenaar      'endfunc',
6954c17ad94SBram Moolenaar      'def DoThat()',
6964c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
6974c17ad94SBram Moolenaar      'enddef',
6984c17ad94SBram Moolenaar      'DoThat()',
6994c17ad94SBram Moolenaar      ], 'E1084:')
7004c17ad94SBram Moolenaar  CheckScriptFailure([
7014c17ad94SBram Moolenaar      'vim9script',
7024c17ad94SBram Moolenaar      'def DeleteMe3()',
7034c17ad94SBram Moolenaar      'enddef',
7044c17ad94SBram Moolenaar      'delfunction DeleteMe3',
7054c17ad94SBram Moolenaar      ], 'E1084:')
7064c17ad94SBram Moolenaar  CheckScriptFailure([
7074c17ad94SBram Moolenaar      'vim9script',
7084c17ad94SBram Moolenaar      'def DeleteMe4()',
7094c17ad94SBram Moolenaar      'enddef',
7104c17ad94SBram Moolenaar      'def DoThat()',
7114c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
7124c17ad94SBram Moolenaar      'enddef',
7134c17ad94SBram Moolenaar      'DoThat()',
7144c17ad94SBram Moolenaar      ], 'E1084:')
715925e9fd6SBram Moolenaar
716925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
717925e9fd6SBram Moolenaar  let lines =<< trim END
718925e9fd6SBram Moolenaar      vim9script
719925e9fd6SBram Moolenaar      def g:Global(): string
720925e9fd6SBram Moolenaar        return "yes"
721925e9fd6SBram Moolenaar      enddef
722925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
723925e9fd6SBram Moolenaar      def! g:Global(): string
724925e9fd6SBram Moolenaar        return "no"
725925e9fd6SBram Moolenaar      enddef
726925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
727925e9fd6SBram Moolenaar      delfunc g:Global
728925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
729925e9fd6SBram Moolenaar  END
730925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
731925e9fd6SBram Moolenaar
732925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
733925e9fd6SBram Moolenaar  lines =<< trim END
734925e9fd6SBram Moolenaar      vim9script
735925e9fd6SBram Moolenaar      func g:Global()
736925e9fd6SBram Moolenaar        return "yes"
737925e9fd6SBram Moolenaar      endfunc
738925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
739925e9fd6SBram Moolenaar      def! g:Global(): string
740925e9fd6SBram Moolenaar        return "no"
741925e9fd6SBram Moolenaar      enddef
742925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
743925e9fd6SBram Moolenaar      delfunc g:Global
744925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
745925e9fd6SBram Moolenaar  END
746925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
747925e9fd6SBram Moolenaar
748925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
749925e9fd6SBram Moolenaar  lines =<< trim END
750925e9fd6SBram Moolenaar      vim9script
751925e9fd6SBram Moolenaar      def g:Global(): string
752925e9fd6SBram Moolenaar        return "yes"
753925e9fd6SBram Moolenaar      enddef
754925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
755925e9fd6SBram Moolenaar      func! g:Global()
756925e9fd6SBram Moolenaar        return "no"
757925e9fd6SBram Moolenaar      endfunc
758925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
759925e9fd6SBram Moolenaar      delfunc g:Global
760925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
761925e9fd6SBram Moolenaar  END
762925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
7634c17ad94SBram Moolenaarenddef
7644c17ad94SBram Moolenaar
765599c89c8SBram Moolenaarfunc Test_wrong_type()
766599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
767599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
768599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
769599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
770599c89c8SBram Moolenaar
771599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
772599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
77342a480bfSBram Moolenaar
77442a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
77542a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
77642a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
77742a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
77842a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
77942a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
78042a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
78142a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
78242a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
78342a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
78442a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
785a0a9f43aSBram Moolenaar
786a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
787a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
7888a7d6542SBram Moolenaarendfunc
7898a7d6542SBram Moolenaar
7908a7d6542SBram Moolenaarfunc Test_const()
7918a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
7928a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
7938a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
7949be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
7958a7d6542SBram Moolenaarendfunc
7968a7d6542SBram Moolenaar
797df069eecSBram Moolenaardef Test_range_no_colon()
798d2c61705SBram Moolenaar  CheckDefFailure(['%s/a/b/'], 'E1050:')
799d2c61705SBram Moolenaar  CheckDefFailure(['+ s/a/b/'], 'E1050:')
800d2c61705SBram Moolenaar  CheckDefFailure(['- s/a/b/'], 'E1050:')
801d2c61705SBram Moolenaar  CheckDefFailure(['. s/a/b/'], 'E1050:')
802df069eecSBram Moolenaarenddef
803df069eecSBram Moolenaar
804df069eecSBram Moolenaar
8058a7d6542SBram Moolenaardef Test_block()
8068a7d6542SBram Moolenaar  let outer = 1
8078a7d6542SBram Moolenaar  {
8088a7d6542SBram Moolenaar    let inner = 2
8098a7d6542SBram Moolenaar    assert_equal(1, outer)
8108a7d6542SBram Moolenaar    assert_equal(2, inner)
8118a7d6542SBram Moolenaar  }
8128a7d6542SBram Moolenaar  assert_equal(1, outer)
8138a7d6542SBram Moolenaarenddef
8148a7d6542SBram Moolenaar
8158a7d6542SBram Moolenaarfunc Test_block_failure()
8168a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
817585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
818585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
8198a7d6542SBram Moolenaarendfunc
8208a7d6542SBram Moolenaar
821d032f34aSBram Moolenaarfunc g:NoSuchFunc()
822d032f34aSBram Moolenaar  echo 'none'
823d032f34aSBram Moolenaarendfunc
824d032f34aSBram Moolenaar
8258a7d6542SBram Moolenaardef Test_try_catch()
8268a7d6542SBram Moolenaar  let l = []
8277a092245SBram Moolenaar  try # comment
8288a7d6542SBram Moolenaar    add(l, '1')
8298a7d6542SBram Moolenaar    throw 'wrong'
8308a7d6542SBram Moolenaar    add(l, '2')
8317a092245SBram Moolenaar  catch # comment
8328a7d6542SBram Moolenaar    add(l, v:exception)
8337a092245SBram Moolenaar  finally # comment
8348a7d6542SBram Moolenaar    add(l, '3')
8357a092245SBram Moolenaar  endtry # comment
8368a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
83768d130c6SBram Moolenaar
838e859312eSBram Moolenaar  l = []
839e859312eSBram Moolenaar  try
840e859312eSBram Moolenaar    try
841e859312eSBram Moolenaar      add(l, '1')
842e859312eSBram Moolenaar      throw 'wrong'
843e859312eSBram Moolenaar      add(l, '2')
844e859312eSBram Moolenaar    catch /right/
845e859312eSBram Moolenaar      add(l, v:exception)
846e859312eSBram Moolenaar    endtry
847e859312eSBram Moolenaar  catch /wrong/
848e859312eSBram Moolenaar    add(l, 'caught')
849e859312eSBram Moolenaar  finally
850e859312eSBram Moolenaar    add(l, 'finally')
851e859312eSBram Moolenaar  endtry
852e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
853e859312eSBram Moolenaar
85468d130c6SBram Moolenaar  let n: number
85568d130c6SBram Moolenaar  try
85668d130c6SBram Moolenaar    n = l[3]
85768d130c6SBram Moolenaar  catch /E684:/
85868d130c6SBram Moolenaar    n = 99
85968d130c6SBram Moolenaar  endtry
86068d130c6SBram Moolenaar  assert_equal(99, n)
86168d130c6SBram Moolenaar
86268d130c6SBram Moolenaar  try
863cc673e74SBram Moolenaar    # string slice returns a string, not a number
86468d130c6SBram Moolenaar    n = g:astring[3]
86556acb094SBram Moolenaar  catch /E1029:/
86668d130c6SBram Moolenaar    n = 77
86768d130c6SBram Moolenaar  endtry
86868d130c6SBram Moolenaar  assert_equal(77, n)
86968d130c6SBram Moolenaar
87068d130c6SBram Moolenaar  try
87168d130c6SBram Moolenaar    n = l[g:astring]
87256acb094SBram Moolenaar  catch /E1029:/
87356acb094SBram Moolenaar    n = 88
87468d130c6SBram Moolenaar  endtry
87556acb094SBram Moolenaar  assert_equal(88, n)
87668d130c6SBram Moolenaar
87768d130c6SBram Moolenaar  try
87868d130c6SBram Moolenaar    n = s:does_not_exist
87968d130c6SBram Moolenaar  catch /E121:/
880f0b9f43cSBram Moolenaar    n = 111
881f0b9f43cSBram Moolenaar  endtry
882f0b9f43cSBram Moolenaar  assert_equal(111, n)
883f0b9f43cSBram Moolenaar
884f0b9f43cSBram Moolenaar  try
885f0b9f43cSBram Moolenaar    n = g:does_not_exist
886f0b9f43cSBram Moolenaar  catch /E121:/
88768d130c6SBram Moolenaar    n = 121
88868d130c6SBram Moolenaar  endtry
88968d130c6SBram Moolenaar  assert_equal(121, n)
89068d130c6SBram Moolenaar
89168d130c6SBram Moolenaar  let d = #{one: 1}
89268d130c6SBram Moolenaar  try
89368d130c6SBram Moolenaar    n = d[g:astring]
89468d130c6SBram Moolenaar  catch /E716:/
89568d130c6SBram Moolenaar    n = 222
89668d130c6SBram Moolenaar  endtry
89768d130c6SBram Moolenaar  assert_equal(222, n)
898f0b9f43cSBram Moolenaar
899f0b9f43cSBram Moolenaar  try
900f0b9f43cSBram Moolenaar    n = -g:astring
901f0b9f43cSBram Moolenaar  catch /E39:/
902f0b9f43cSBram Moolenaar    n = 233
903f0b9f43cSBram Moolenaar  endtry
904f0b9f43cSBram Moolenaar  assert_equal(233, n)
905f0b9f43cSBram Moolenaar
906f0b9f43cSBram Moolenaar  try
907f0b9f43cSBram Moolenaar    n = +g:astring
908f0b9f43cSBram Moolenaar  catch /E1030:/
909f0b9f43cSBram Moolenaar    n = 244
910f0b9f43cSBram Moolenaar  endtry
911f0b9f43cSBram Moolenaar  assert_equal(244, n)
912f0b9f43cSBram Moolenaar
913f0b9f43cSBram Moolenaar  try
914f0b9f43cSBram Moolenaar    n = +g:alist
915f0b9f43cSBram Moolenaar  catch /E745:/
916f0b9f43cSBram Moolenaar    n = 255
917f0b9f43cSBram Moolenaar  endtry
918f0b9f43cSBram Moolenaar  assert_equal(255, n)
919f0b9f43cSBram Moolenaar
920f0b9f43cSBram Moolenaar  let nd: dict<any>
921f0b9f43cSBram Moolenaar  try
922f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
923f0b9f43cSBram Moolenaar  catch /E1029:/
924f0b9f43cSBram Moolenaar    n = 266
925f0b9f43cSBram Moolenaar  endtry
926f0b9f43cSBram Moolenaar  assert_equal(266, n)
927f0b9f43cSBram Moolenaar
928f0b9f43cSBram Moolenaar  try
929f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
930f0b9f43cSBram Moolenaar  catch /E1093:/
931f0b9f43cSBram Moolenaar    n = 277
932f0b9f43cSBram Moolenaar  endtry
933f0b9f43cSBram Moolenaar  assert_equal(277, n)
934f0b9f43cSBram Moolenaar
935e859312eSBram Moolenaar  try
936e859312eSBram Moolenaar    &ts = g:astring
937e859312eSBram Moolenaar  catch /E1029:/
938e859312eSBram Moolenaar    n = 288
939e859312eSBram Moolenaar  endtry
940e859312eSBram Moolenaar  assert_equal(288, n)
941e859312eSBram Moolenaar
942e859312eSBram Moolenaar  try
943e859312eSBram Moolenaar    &backspace = 'asdf'
944e859312eSBram Moolenaar  catch /E474:/
945e859312eSBram Moolenaar    n = 299
946e859312eSBram Moolenaar  endtry
947e859312eSBram Moolenaar  assert_equal(299, n)
948e859312eSBram Moolenaar
949e859312eSBram Moolenaar  l = [1]
950e859312eSBram Moolenaar  try
951e859312eSBram Moolenaar    l[3] = 3
952e859312eSBram Moolenaar  catch /E684:/
953e859312eSBram Moolenaar    n = 300
954e859312eSBram Moolenaar  endtry
955e859312eSBram Moolenaar  assert_equal(300, n)
956e859312eSBram Moolenaar
957e859312eSBram Moolenaar  try
958e859312eSBram Moolenaar    unlet g:does_not_exist
959e859312eSBram Moolenaar  catch /E108:/
960e859312eSBram Moolenaar    n = 322
961e859312eSBram Moolenaar  endtry
962e859312eSBram Moolenaar  assert_equal(322, n)
963e859312eSBram Moolenaar
964e859312eSBram Moolenaar  try
965e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
966e859312eSBram Moolenaar  catch /E721:/
967e859312eSBram Moolenaar    n = 333
968e859312eSBram Moolenaar  endtry
969e859312eSBram Moolenaar  assert_equal(333, n)
970e859312eSBram Moolenaar
971e859312eSBram Moolenaar  try
972e859312eSBram Moolenaar    l = DeletedFunc()
973e859312eSBram Moolenaar  catch /E933:/
974e859312eSBram Moolenaar    n = 344
975e859312eSBram Moolenaar  endtry
976e859312eSBram Moolenaar  assert_equal(344, n)
977d032f34aSBram Moolenaar
978d032f34aSBram Moolenaar  try
979d032f34aSBram Moolenaar    echo len(v:true)
980d032f34aSBram Moolenaar  catch /E701:/
981d032f34aSBram Moolenaar    n = 355
982d032f34aSBram Moolenaar  endtry
983d032f34aSBram Moolenaar  assert_equal(355, n)
984d032f34aSBram Moolenaar
985d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
986d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
987d032f34aSBram Moolenaar  try
988d032f34aSBram Moolenaar    echo P()
989d032f34aSBram Moolenaar  catch /E117:/
990d032f34aSBram Moolenaar    n = 366
991d032f34aSBram Moolenaar  endtry
992d032f34aSBram Moolenaar  assert_equal(366, n)
993d032f34aSBram Moolenaar
994d032f34aSBram Moolenaar  try
995d032f34aSBram Moolenaar    echo g:NoSuchFunc()
996d032f34aSBram Moolenaar  catch /E117:/
997d032f34aSBram Moolenaar    n = 377
998d032f34aSBram Moolenaar  endtry
999d032f34aSBram Moolenaar  assert_equal(377, n)
1000d032f34aSBram Moolenaar
1001d032f34aSBram Moolenaar  try
1002d032f34aSBram Moolenaar    echo g:alist + 4
1003d032f34aSBram Moolenaar  catch /E745:/
1004d032f34aSBram Moolenaar    n = 388
1005d032f34aSBram Moolenaar  endtry
1006d032f34aSBram Moolenaar  assert_equal(388, n)
1007d032f34aSBram Moolenaar
1008d032f34aSBram Moolenaar  try
1009d032f34aSBram Moolenaar    echo 4 + g:alist
1010d032f34aSBram Moolenaar  catch /E745:/
1011d032f34aSBram Moolenaar    n = 399
1012d032f34aSBram Moolenaar  endtry
1013d032f34aSBram Moolenaar  assert_equal(399, n)
1014d032f34aSBram Moolenaar
1015d032f34aSBram Moolenaar  try
1016d032f34aSBram Moolenaar    echo g:alist.member
1017d032f34aSBram Moolenaar  catch /E715:/
1018d032f34aSBram Moolenaar    n = 400
1019d032f34aSBram Moolenaar  endtry
1020d032f34aSBram Moolenaar  assert_equal(400, n)
1021d032f34aSBram Moolenaar
1022d032f34aSBram Moolenaar  try
1023d032f34aSBram Moolenaar    echo d.member
1024d032f34aSBram Moolenaar  catch /E716:/
1025d032f34aSBram Moolenaar    n = 411
1026d032f34aSBram Moolenaar  endtry
1027d032f34aSBram Moolenaar  assert_equal(411, n)
10288a7d6542SBram Moolenaarenddef
10298a7d6542SBram Moolenaar
1030e859312eSBram Moolenaardef DeletedFunc(): list<any>
1031e859312eSBram Moolenaar  return ['delete me']
1032e859312eSBram Moolenaarenddef
1033e859312eSBram Moolenaardefcompile
1034e859312eSBram Moolenaardelfunc DeletedFunc
1035e859312eSBram Moolenaar
1036257cc5eeSBram Moolenaardef ThrowFromDef()
1037a72cfb80SBram Moolenaar  throw "getout" # comment
1038257cc5eeSBram Moolenaarenddef
1039257cc5eeSBram Moolenaar
1040257cc5eeSBram Moolenaarfunc CatchInFunc()
1041257cc5eeSBram Moolenaar  try
1042257cc5eeSBram Moolenaar    call ThrowFromDef()
1043257cc5eeSBram Moolenaar  catch
1044257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
1045257cc5eeSBram Moolenaar  endtry
1046257cc5eeSBram Moolenaarendfunc
1047257cc5eeSBram Moolenaar
1048257cc5eeSBram Moolenaardef CatchInDef()
1049257cc5eeSBram Moolenaar  try
1050257cc5eeSBram Moolenaar    ThrowFromDef()
1051257cc5eeSBram Moolenaar  catch
1052257cc5eeSBram Moolenaar    g:thrown_def = v:exception
1053257cc5eeSBram Moolenaar  endtry
1054257cc5eeSBram Moolenaarenddef
1055257cc5eeSBram Moolenaar
1056f575adffSBram Moolenaardef ReturnFinally(): string
1057f575adffSBram Moolenaar  try
1058f575adffSBram Moolenaar    return 'intry'
1059f575adffSBram Moolenaar  finally
1060f575adffSBram Moolenaar    g:in_finally = 'finally'
1061f575adffSBram Moolenaar  endtry
1062f575adffSBram Moolenaar  return 'end'
1063f575adffSBram Moolenaarenddef
1064f575adffSBram Moolenaar
1065257cc5eeSBram Moolenaardef Test_try_catch_nested()
1066257cc5eeSBram Moolenaar  CatchInFunc()
1067257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
1068257cc5eeSBram Moolenaar
1069257cc5eeSBram Moolenaar  CatchInDef()
1070257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
1071f575adffSBram Moolenaar
1072f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
1073f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
1074f575adffSBram Moolenaarenddef
1075f575adffSBram Moolenaar
1076f575adffSBram Moolenaardef Test_try_catch_match()
1077f575adffSBram Moolenaar  let seq = 'a'
1078f575adffSBram Moolenaar  try
1079f575adffSBram Moolenaar    throw 'something'
1080f575adffSBram Moolenaar  catch /nothing/
1081f575adffSBram Moolenaar    seq ..= 'x'
1082f575adffSBram Moolenaar  catch /some/
1083f575adffSBram Moolenaar    seq ..= 'b'
1084f575adffSBram Moolenaar  catch /asdf/
1085f575adffSBram Moolenaar    seq ..= 'x'
1086e8c4abbbSBram Moolenaar  catch ?a\?sdf?
1087e8c4abbbSBram Moolenaar    seq ..= 'y'
1088f575adffSBram Moolenaar  finally
1089f575adffSBram Moolenaar    seq ..= 'c'
1090f575adffSBram Moolenaar  endtry
1091f575adffSBram Moolenaar  assert_equal('abc', seq)
1092257cc5eeSBram Moolenaarenddef
1093257cc5eeSBram Moolenaar
1094e8c4abbbSBram Moolenaardef Test_try_catch_fails()
1095d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
1096d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1097d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1098d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
1099d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1100d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
1101d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
1102d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1103d2c61705SBram Moolenaar  CheckDefFailure(['if 2', 'endtry'], 'E171:')
1104d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
1105585fea7bSBram Moolenaar
1106d2c61705SBram Moolenaar  CheckDefFailure(['throw'], 'E1015:')
1107d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
1108e8c4abbbSBram Moolenaarenddef
1109e8c4abbbSBram Moolenaar
1110006ad48bSBram Moolenaardef Test_throw_vimscript()
1111f5be8cdbSBram Moolenaar  # only checks line continuation
1112006ad48bSBram Moolenaar  let lines =<< trim END
1113006ad48bSBram Moolenaar      vim9script
1114006ad48bSBram Moolenaar      try
1115006ad48bSBram Moolenaar        throw 'one'
1116006ad48bSBram Moolenaar              .. 'two'
1117006ad48bSBram Moolenaar      catch
1118006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
1119006ad48bSBram Moolenaar      endtry
1120006ad48bSBram Moolenaar  END
1121006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
1122006ad48bSBram Moolenaarenddef
1123006ad48bSBram Moolenaar
1124ed677f55SBram Moolenaardef Test_error_in_nested_function()
1125ed677f55SBram Moolenaar  # an error in a nested :function aborts executin in the calling :def function
1126ed677f55SBram Moolenaar  let lines =<< trim END
1127ed677f55SBram Moolenaar      vim9script
1128ed677f55SBram Moolenaar      def Func()
1129ed677f55SBram Moolenaar        Error()
1130ed677f55SBram Moolenaar        g:test_var = 1
1131ed677f55SBram Moolenaar      enddef
1132ed677f55SBram Moolenaar      func Error() abort
1133ed677f55SBram Moolenaar        eval [][0]
1134ed677f55SBram Moolenaar      endfunc
1135ed677f55SBram Moolenaar      Func()
1136ed677f55SBram Moolenaar  END
1137ed677f55SBram Moolenaar  g:test_var = 0
1138ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
1139ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
1140ed677f55SBram Moolenaarenddef
1141ed677f55SBram Moolenaar
114237c83711SBram Moolenaardef Test_cexpr_vimscript()
1143f5be8cdbSBram Moolenaar  # only checks line continuation
114437c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
114537c83711SBram Moolenaar  let lines =<< trim END
114637c83711SBram Moolenaar      vim9script
114737c83711SBram Moolenaar      cexpr 'File'
114837c83711SBram Moolenaar                .. ' someFile' ..
114937c83711SBram Moolenaar                   ' line 19'
115037c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
115137c83711SBram Moolenaar  END
115237c83711SBram Moolenaar  CheckScriptSuccess(lines)
115337c83711SBram Moolenaar  set errorformat&
115437c83711SBram Moolenaarenddef
115537c83711SBram Moolenaar
1156c9edd6b5SBram Moolenaardef Test_statusline_syntax()
1157c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
1158c9edd6b5SBram Moolenaar  let lines =<< trim END
1159c9edd6b5SBram Moolenaar      vim9script
1160c9edd6b5SBram Moolenaar      func g:Status()
1161c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
1162c9edd6b5SBram Moolenaar      endfunc
1163c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
1164c9edd6b5SBram Moolenaar      redrawstatus
1165c9edd6b5SBram Moolenaar      set laststatus statusline=
1166c9edd6b5SBram Moolenaar  END
1167c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
1168c9edd6b5SBram Moolenaarenddef
1169c9edd6b5SBram Moolenaar
1170b209750bSBram Moolenaardef Test_list_vimscript()
1171b209750bSBram Moolenaar  # checks line continuation and comments
1172b209750bSBram Moolenaar  let lines =<< trim END
1173b209750bSBram Moolenaar      vim9script
1174b209750bSBram Moolenaar      let mylist = [
1175b209750bSBram Moolenaar            'one',
1176b209750bSBram Moolenaar            # comment
1177b209750bSBram Moolenaar            'two', # empty line follows
1178b209750bSBram Moolenaar
1179b209750bSBram Moolenaar            'three',
1180b209750bSBram Moolenaar            ]
1181b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
1182b209750bSBram Moolenaar  END
1183b209750bSBram Moolenaar  CheckScriptSuccess(lines)
118466250c93SBram Moolenaar
118566250c93SBram Moolenaar  # check all lines from heredoc are kept
118666250c93SBram Moolenaar  lines =<< trim END
118766250c93SBram Moolenaar      # comment 1
118866250c93SBram Moolenaar      two
118966250c93SBram Moolenaar      # comment 3
119066250c93SBram Moolenaar
119166250c93SBram Moolenaar      five
119266250c93SBram Moolenaar      # comment 6
119366250c93SBram Moolenaar  END
119466250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
1195b209750bSBram Moolenaarenddef
1196b209750bSBram Moolenaar
11972a1381c3SBram Moolenaarif has('channel')
119840ee466cSBram Moolenaar  let someJob = test_null_job()
119940ee466cSBram Moolenaar
120040ee466cSBram Moolenaar  def FuncWithError()
120140ee466cSBram Moolenaar    echomsg g:someJob
120240ee466cSBram Moolenaar  enddef
120340ee466cSBram Moolenaar
120440ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
120540ee466cSBram Moolenaar    try
120640ee466cSBram Moolenaar      call FuncWithError()
120740ee466cSBram Moolenaar    catch
120840ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
120940ee466cSBram Moolenaar    endtry
121040ee466cSBram Moolenaar  endfunc
12112a1381c3SBram Moolenaarendif
121240ee466cSBram Moolenaar
12138a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
12148a7d6542SBram Moolenaar  vim9script
12158a7d6542SBram Moolenaar  let name: string = 'bob'
12168a7d6542SBram Moolenaar  def Concat(arg: string): string
12178a7d6542SBram Moolenaar    return name .. arg
12188a7d6542SBram Moolenaar  enddef
1219227a69deSBram Moolenaar  g:result = Concat('bie')
1220227a69deSBram Moolenaar  g:localname = name
12218a7d6542SBram Moolenaar
12228a7d6542SBram Moolenaar  export const CONST = 1234
12238a7d6542SBram Moolenaar  export let exported = 9876
12246e587dcbSBram Moolenaar  export let exp_name = 'John'
12258a7d6542SBram Moolenaar  export def Exported(): string
12268a7d6542SBram Moolenaar    return 'Exported'
12278a7d6542SBram Moolenaar  enddef
12288a7d6542SBram MoolenaarEND
12298a7d6542SBram Moolenaar
1230b3ca9824SBram Moolenaardef Undo_export_script_lines()
1231b3ca9824SBram Moolenaar  unlet g:result
1232b3ca9824SBram Moolenaar  unlet g:localname
1233b3ca9824SBram Moolenaarenddef
1234b3ca9824SBram Moolenaar
12355269bd2aSBram Moolenaardef Test_vim9_import_export()
12368a7d6542SBram Moolenaar  let import_script_lines =<< trim END
12378a7d6542SBram Moolenaar    vim9script
12388a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
12398a7d6542SBram Moolenaar    g:imported = exported
12406e587dcbSBram Moolenaar    exported += 3
12416e587dcbSBram Moolenaar    g:imported_added = exported
12428a7d6542SBram Moolenaar    g:imported_func = Exported()
12436e587dcbSBram Moolenaar
124440f4f7a4SBram Moolenaar    def GetExported(): string
124540f4f7a4SBram Moolenaar      let local_dict = #{ref: Exported}
124640f4f7a4SBram Moolenaar      return local_dict.ref()
124740f4f7a4SBram Moolenaar    enddef
124840f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
124940f4f7a4SBram Moolenaar
12506e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
12516e587dcbSBram Moolenaar    g:imported_name = exp_name
12526e587dcbSBram Moolenaar    exp_name ..= ' Doe'
12536e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
12545381c7a1SBram Moolenaar    g:imported_later = exported
12558a7d6542SBram Moolenaar  END
12568a7d6542SBram Moolenaar
12578a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
12588a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
12598a7d6542SBram Moolenaar
12608a7d6542SBram Moolenaar  source Ximport.vim
12618a7d6542SBram Moolenaar
12628a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
12638a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
12648a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
12656e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
12665381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
12678a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
126840f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
12696e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
12706e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
12718a7d6542SBram Moolenaar  assert_false(exists('g:name'))
12728a7d6542SBram Moolenaar
1273b3ca9824SBram Moolenaar  Undo_export_script_lines()
12748a7d6542SBram Moolenaar  unlet g:imported
12756e587dcbSBram Moolenaar  unlet g:imported_added
12765381c7a1SBram Moolenaar  unlet g:imported_later
12778a7d6542SBram Moolenaar  unlet g:imported_func
12786e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
12798a7d6542SBram Moolenaar  delete('Ximport.vim')
1280f2d5c240SBram Moolenaar
12811c991144SBram Moolenaar  # similar, with line breaks
12821c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
12831c991144SBram Moolenaar    vim9script
12841c991144SBram Moolenaar    import {
12851c991144SBram Moolenaar        exported,
12861c991144SBram Moolenaar        Exported,
12871c991144SBram Moolenaar        }
12881c991144SBram Moolenaar        from
12891c991144SBram Moolenaar        './Xexport.vim'
12901c991144SBram Moolenaar    g:imported = exported
12911c991144SBram Moolenaar    exported += 5
12921c991144SBram Moolenaar    g:imported_added = exported
12931c991144SBram Moolenaar    g:imported_func = Exported()
12941c991144SBram Moolenaar  END
12951c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
12961c991144SBram Moolenaar  source Ximport_lbr.vim
12971c991144SBram Moolenaar
12981c991144SBram Moolenaar  assert_equal(9876, g:imported)
12991c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
13001c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
13011c991144SBram Moolenaar
13021c991144SBram Moolenaar  # exported script not sourced again
13031c991144SBram Moolenaar  assert_false(exists('g:result'))
13041c991144SBram Moolenaar  unlet g:imported
13051c991144SBram Moolenaar  unlet g:imported_added
13061c991144SBram Moolenaar  unlet g:imported_func
13071c991144SBram Moolenaar  delete('Ximport_lbr.vim')
13081c991144SBram Moolenaar
13091c991144SBram Moolenaar  # import inside :def function
13105381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
13115381c7a1SBram Moolenaar    vim9script
13125381c7a1SBram Moolenaar    def ImportInDef()
13135381c7a1SBram Moolenaar      import exported from './Xexport.vim'
13145381c7a1SBram Moolenaar      g:imported = exported
13155381c7a1SBram Moolenaar      exported += 7
13165381c7a1SBram Moolenaar      g:imported_added = exported
13175381c7a1SBram Moolenaar    enddef
13185381c7a1SBram Moolenaar    ImportInDef()
13195381c7a1SBram Moolenaar  END
13205381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
13215381c7a1SBram Moolenaar  source Ximport2.vim
1322f5be8cdbSBram Moolenaar  # TODO: this should be 9879
13235381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
13245381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
13255381c7a1SBram Moolenaar  unlet g:imported
13265381c7a1SBram Moolenaar  unlet g:imported_added
13275381c7a1SBram Moolenaar  delete('Ximport2.vim')
13285381c7a1SBram Moolenaar
1329f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
1330f2d5c240SBram Moolenaar    vim9script
1331f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1332f2d5c240SBram Moolenaar    def UseExport()
1333f2d5c240SBram Moolenaar      g:imported = Export.exported
1334f2d5c240SBram Moolenaar    enddef
1335f2d5c240SBram Moolenaar    UseExport()
1336f2d5c240SBram Moolenaar  END
1337f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1338f2d5c240SBram Moolenaar  source Ximport.vim
13395381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1340f2d5c240SBram Moolenaar
1341599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
1342599c89c8SBram Moolenaar    vim9script
1343599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1344599c89c8SBram Moolenaar    def Func()
1345599c89c8SBram Moolenaar      let dummy = 1
1346599c89c8SBram Moolenaar      let imported = Export + dummy
1347599c89c8SBram Moolenaar    enddef
1348822ba247SBram Moolenaar    defcompile
1349599c89c8SBram Moolenaar  END
1350599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
135144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
1352599c89c8SBram Moolenaar
1353599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
1354599c89c8SBram Moolenaar    vim9script
1355599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1356599c89c8SBram Moolenaar    def Func()
1357599c89c8SBram Moolenaar      let imported = Export . exported
1358599c89c8SBram Moolenaar    enddef
1359822ba247SBram Moolenaar    defcompile
1360599c89c8SBram Moolenaar  END
1361599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
136244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
1363599c89c8SBram Moolenaar
1364599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
1365599c89c8SBram Moolenaar    vim9script
1366599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1367599c89c8SBram Moolenaar    def Func()
1368599c89c8SBram Moolenaar      let imported = Export.
1369599c89c8SBram Moolenaar    enddef
1370822ba247SBram Moolenaar    defcompile
1371599c89c8SBram Moolenaar  END
1372599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
137344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1374599c89c8SBram Moolenaar
13751c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
13761c991144SBram Moolenaar    vim9script
13771c991144SBram Moolenaar    import *
13781c991144SBram Moolenaar        as Export
13791c991144SBram Moolenaar        from
13801c991144SBram Moolenaar        './Xexport.vim'
13811c991144SBram Moolenaar    def UseExport()
13821c991144SBram Moolenaar      g:imported = Export.exported
13831c991144SBram Moolenaar    enddef
13841c991144SBram Moolenaar    UseExport()
13851c991144SBram Moolenaar  END
13861c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
13871c991144SBram Moolenaar  source Ximport.vim
13881c991144SBram Moolenaar  assert_equal(9883, g:imported)
13891c991144SBram Moolenaar
1390f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1391f2d5c240SBram Moolenaar    vim9script
1392f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1393f2d5c240SBram Moolenaar  END
1394f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
139544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1396f2d5c240SBram Moolenaar
1397f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1398fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1399fa29c8abSBram Moolenaar    vim9script
1400fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1401fa29c8abSBram Moolenaar  END
1402fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
140344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1404fa29c8abSBram Moolenaar
1405f5be8cdbSBram Moolenaar  # try to import something that is already defined
14065269bd2aSBram Moolenaar  let import_already_defined =<< trim END
14075269bd2aSBram Moolenaar    vim9script
14085269bd2aSBram Moolenaar    let exported = 'something'
14095269bd2aSBram Moolenaar    import exported from './Xexport.vim'
14105269bd2aSBram Moolenaar  END
14115269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
141244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
14135269bd2aSBram Moolenaar
1414f5be8cdbSBram Moolenaar  # try to import something that is already defined
14155269bd2aSBram Moolenaar  import_already_defined =<< trim END
14165269bd2aSBram Moolenaar    vim9script
14175269bd2aSBram Moolenaar    let exported = 'something'
14185269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
14195269bd2aSBram Moolenaar  END
14205269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
142144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
14225269bd2aSBram Moolenaar
1423f5be8cdbSBram Moolenaar  # try to import something that is already defined
14245269bd2aSBram Moolenaar  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  # import a very long name, requires making a copy
1433fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1434fa29c8abSBram Moolenaar    vim9script
1435fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1436fa29c8abSBram Moolenaar  END
1437fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
143844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1439fa29c8abSBram Moolenaar
1440fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1441fa29c8abSBram Moolenaar    vim9script
1442fa29c8abSBram Moolenaar    import name './Xexport.vim'
1443fa29c8abSBram Moolenaar  END
1444fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
144544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1446fa29c8abSBram Moolenaar
1447fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1448fa29c8abSBram Moolenaar    vim9script
1449fa29c8abSBram Moolenaar    import name from Xexport.vim
1450fa29c8abSBram Moolenaar  END
1451fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
145244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
1453fa29c8abSBram Moolenaar
1454fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1455fa29c8abSBram Moolenaar    vim9script
1456fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1457fa29c8abSBram Moolenaar  END
1458fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
145944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1460fa29c8abSBram Moolenaar
1461fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1462fa29c8abSBram Moolenaar    vim9script
1463fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1464fa29c8abSBram Moolenaar  END
14655269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
146644d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1467fa29c8abSBram Moolenaar
1468f2d5c240SBram Moolenaar  delete('Ximport.vim')
14695269bd2aSBram Moolenaar  delete('Ximport3.vim')
14708a7d6542SBram Moolenaar  delete('Xexport.vim')
14718a7d6542SBram Moolenaar
1472f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1473750802b5SBram Moolenaar  set cpo&vi
1474750802b5SBram Moolenaar  let cpo_before = &cpo
1475750802b5SBram Moolenaar  let lines =<< trim END
1476750802b5SBram Moolenaar    vim9script
1477750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1478750802b5SBram Moolenaar  END
1479750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1480750802b5SBram Moolenaar  source Xvim9_script
1481750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1482750802b5SBram Moolenaar  set cpo&vim
1483750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1484750802b5SBram Moolenaar  delete('Xvim9_script')
1485750802b5SBram Moolenaarenddef
1486750802b5SBram Moolenaar
1487803af686SBram Moolenaarfunc g:Trigger()
1488803af686SBram Moolenaar  source Ximport.vim
1489803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1490803af686SBram Moolenaarendfunc
1491803af686SBram Moolenaar
1492803af686SBram Moolenaardef Test_import_export_expr_map()
1493803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1494803af686SBram Moolenaar  let export_lines =<< trim END
1495803af686SBram Moolenaar    vim9script
1496803af686SBram Moolenaar    export def That(): string
1497803af686SBram Moolenaar      return 'yes'
1498803af686SBram Moolenaar    enddef
1499803af686SBram Moolenaar  END
1500803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1501803af686SBram Moolenaar
1502803af686SBram Moolenaar  let import_lines =<< trim END
1503803af686SBram Moolenaar    vim9script
1504803af686SBram Moolenaar    import That from './Xexport_that.vim'
1505803af686SBram Moolenaar    assert_equal('yes', That())
1506803af686SBram Moolenaar  END
1507803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1508803af686SBram Moolenaar
1509803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1510803af686SBram Moolenaar  feedkeys('trigger', "xt")
1511803af686SBram Moolenaar
1512730b2483SBram Moolenaar  delete('Xexport_that.vim')
1513803af686SBram Moolenaar  delete('Ximport.vim')
1514803af686SBram Moolenaar  nunmap trigger
1515803af686SBram Moolenaarenddef
1516803af686SBram Moolenaar
15178e1986e3SBram Moolenaardef Test_import_in_filetype()
15188e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
15198e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
15208e1986e3SBram Moolenaar  let export_lines =<< trim END
15218e1986e3SBram Moolenaar    vim9script
15228e1986e3SBram Moolenaar    export let That = 'yes'
15238e1986e3SBram Moolenaar  END
1524730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
15258e1986e3SBram Moolenaar
15268e1986e3SBram Moolenaar  let import_lines =<< trim END
15278e1986e3SBram Moolenaar    vim9script
1528730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
15298e1986e3SBram Moolenaar    assert_equal('yes', That)
15308e1986e3SBram Moolenaar    g:did_load_mytpe = 1
15318e1986e3SBram Moolenaar  END
15328e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
15338e1986e3SBram Moolenaar
15348e1986e3SBram Moolenaar  let save_rtp = &rtp
15358e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
15368e1986e3SBram Moolenaar
15378e1986e3SBram Moolenaar  filetype plugin on
15388e1986e3SBram Moolenaar  copen
15398e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
15408e1986e3SBram Moolenaar
15418e1986e3SBram Moolenaar  quit!
1542730b2483SBram Moolenaar  delete('Xexport_ft.vim')
15438e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
15448e1986e3SBram Moolenaar  &rtp = save_rtp
15458e1986e3SBram Moolenaarenddef
15468e1986e3SBram Moolenaar
1547efa94447SBram Moolenaardef Test_use_import_in_mapping()
1548efa94447SBram Moolenaar  let lines =<< trim END
1549efa94447SBram Moolenaar      vim9script
1550efa94447SBram Moolenaar      export def Funcx()
1551efa94447SBram Moolenaar        g:result = 42
1552efa94447SBram Moolenaar      enddef
1553efa94447SBram Moolenaar  END
1554efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1555efa94447SBram Moolenaar  lines =<< trim END
1556efa94447SBram Moolenaar      vim9script
1557efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1558b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1559efa94447SBram Moolenaar  END
1560efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1561efa94447SBram Moolenaar
1562efa94447SBram Moolenaar  source Xmapscript.vim
1563b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1564efa94447SBram Moolenaar  assert_equal(42, g:result)
1565efa94447SBram Moolenaar
1566efa94447SBram Moolenaar  unlet g:result
1567efa94447SBram Moolenaar  delete('XsomeExport.vim')
1568efa94447SBram Moolenaar  delete('Xmapscript.vim')
1569b3ca9824SBram Moolenaar  nunmap <F3>
1570efa94447SBram Moolenaarenddef
1571efa94447SBram Moolenaar
1572750802b5SBram Moolenaardef Test_vim9script_fails()
15738a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
15748a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1575750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
15769721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
15779b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1578750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1579750802b5SBram Moolenaar
1580451c2e35SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1012:')
1581c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1582c785b9a7SBram Moolenaar
1583e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1584e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
15858a7d6542SBram Moolenaarenddef
15868a7d6542SBram Moolenaar
1587f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1588101f4810SBram Moolenaar  CheckRunVimInTerminal
1589101f4810SBram Moolenaar
15909bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1591c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
15929bb3eb3eSBram Moolenaarendfunc
15939bb3eb3eSBram Moolenaar
1594c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1595101f4810SBram Moolenaar  let export =<< trim END
1596101f4810SBram Moolenaar    vim9script
1597101f4810SBram Moolenaar    export def Foo(): number
1598101f4810SBram Moolenaar        return 0
1599101f4810SBram Moolenaar    enddef
1600101f4810SBram Moolenaar  END
1601730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1602101f4810SBram Moolenaar
1603730b2483SBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{
16049bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
16059bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1606101f4810SBram Moolenaar
1607730b2483SBram Moolenaar  delete('XexportCmd.vim')
16089bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
16099bb3eb3eSBram Moolenaarenddef
1610101f4810SBram Moolenaar
16114c17ad94SBram Moolenaardef Test_vim9script_reload_import()
16128a7d6542SBram Moolenaar  let lines =<< trim END
16138a7d6542SBram Moolenaar    vim9script
16148a7d6542SBram Moolenaar    const var = ''
16158a7d6542SBram Moolenaar    let valone = 1234
16168a7d6542SBram Moolenaar    def MyFunc(arg: string)
16178a7d6542SBram Moolenaar       valone = 5678
16188a7d6542SBram Moolenaar    enddef
16198a7d6542SBram Moolenaar  END
16208a7d6542SBram Moolenaar  let morelines =<< trim END
16218a7d6542SBram Moolenaar    let valtwo = 222
16228a7d6542SBram Moolenaar    export def GetValtwo(): number
16238a7d6542SBram Moolenaar      return valtwo
16248a7d6542SBram Moolenaar    enddef
16258a7d6542SBram Moolenaar  END
162603afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
16278a7d6542SBram Moolenaar  source Xreload.vim
16288a7d6542SBram Moolenaar  source Xreload.vim
16298a7d6542SBram Moolenaar  source Xreload.vim
16308a7d6542SBram Moolenaar
16318a7d6542SBram Moolenaar  let testlines =<< trim END
16328a7d6542SBram Moolenaar    vim9script
16338a7d6542SBram Moolenaar    def TheFunc()
16348a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
16358a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
16368a7d6542SBram Moolenaar    enddef
16378a7d6542SBram Moolenaar    TheFunc()
16388a7d6542SBram Moolenaar  END
16398a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
16408a7d6542SBram Moolenaar  source Ximport.vim
16418a7d6542SBram Moolenaar
1642f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1643f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
16448a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
16458a7d6542SBram Moolenaar  source Ximport.vim
16468a7d6542SBram Moolenaar
1647f5be8cdbSBram Moolenaar  # cannot declare a var twice
16488a7d6542SBram Moolenaar  lines =<< trim END
16498a7d6542SBram Moolenaar    vim9script
16508a7d6542SBram Moolenaar    let valone = 1234
16518a7d6542SBram Moolenaar    let valone = 5678
16528a7d6542SBram Moolenaar  END
16538a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
165444d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
16558a7d6542SBram Moolenaar
16568a7d6542SBram Moolenaar  delete('Xreload.vim')
16578a7d6542SBram Moolenaar  delete('Ximport.vim')
16588a7d6542SBram Moolenaarenddef
16598a7d6542SBram Moolenaar
166095006e3dSBram Moolenaardef s:RetSome(): string
166195006e3dSBram Moolenaar  return 'some'
166295006e3dSBram Moolenaarenddef
166395006e3dSBram Moolenaar
1664fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1665fe465a01SBram Moolenaar" script-local name.
1666fe465a01SBram Moolenaardef Test_vim9script_funcref()
1667fe465a01SBram Moolenaar  let sortlines =<< trim END
1668fe465a01SBram Moolenaar      vim9script
1669fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1670bed36b93SBram Moolenaar        return i2 - i1
1671fe465a01SBram Moolenaar      enddef
1672fe465a01SBram Moolenaar
1673fe465a01SBram Moolenaar      export def FastSort(): list<number>
1674fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1675fe465a01SBram Moolenaar      enddef
1676fe465a01SBram Moolenaar  END
1677fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1678fe465a01SBram Moolenaar
1679fe465a01SBram Moolenaar  let lines =<< trim END
1680fe465a01SBram Moolenaar    vim9script
1681fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1682fe465a01SBram Moolenaar    def Test()
1683fe465a01SBram Moolenaar      g:result = FastSort()
1684fe465a01SBram Moolenaar    enddef
1685fe465a01SBram Moolenaar    Test()
1686fe465a01SBram Moolenaar  END
1687fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1688fe465a01SBram Moolenaar
1689fe465a01SBram Moolenaar  source Xscript.vim
1690fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1691fe465a01SBram Moolenaar
1692fe465a01SBram Moolenaar  unlet g:result
1693fe465a01SBram Moolenaar  delete('Xsort.vim')
1694fe465a01SBram Moolenaar  delete('Xscript.vim')
169595006e3dSBram Moolenaar
169695006e3dSBram Moolenaar  let Funcref = function('s:RetSome')
169795006e3dSBram Moolenaar  assert_equal('some', Funcref())
1698fe465a01SBram Moolenaarenddef
1699fe465a01SBram Moolenaar
1700601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1701601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1702601e76acSBram Moolenaar" function reference.
1703c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1704c620c055SBram Moolenaar  let filterLines =<< trim END
1705c620c055SBram Moolenaar    vim9script
1706c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1707c620c055SBram Moolenaar      return idx % 2 == 1
1708c620c055SBram Moolenaar    enddef
1709c620c055SBram Moolenaar    export def FastFilter(): list<number>
1710c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1711c620c055SBram Moolenaar    enddef
1712601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1713601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1714601e76acSBram Moolenaar    enddef
1715c620c055SBram Moolenaar  END
1716c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1717c620c055SBram Moolenaar
1718c620c055SBram Moolenaar  let lines =<< trim END
1719c620c055SBram Moolenaar    vim9script
1720601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1721c620c055SBram Moolenaar    def Test()
1722c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1723c620c055SBram Moolenaar    enddef
1724c620c055SBram Moolenaar    Test()
1725601e76acSBram Moolenaar    def TestDirect()
1726601e76acSBram Moolenaar      let x: list<number> = FastFilterDirect()
1727601e76acSBram Moolenaar    enddef
1728601e76acSBram Moolenaar    TestDirect()
1729c620c055SBram Moolenaar  END
1730601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1731c620c055SBram Moolenaar  delete('Xfilter.vim')
1732c620c055SBram Moolenaarenddef
1733c620c055SBram Moolenaar
17344c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
17354c17ad94SBram Moolenaar  let first_lines =<< trim END
17364c17ad94SBram Moolenaar    vim9script
17374c17ad94SBram Moolenaar    def FuncYes(): string
17384c17ad94SBram Moolenaar      return 'yes'
17394c17ad94SBram Moolenaar    enddef
17404c17ad94SBram Moolenaar  END
174103afdcf1SBram Moolenaar  let withno_lines =<< trim END
17424c17ad94SBram Moolenaar    def FuncNo(): string
17434c17ad94SBram Moolenaar      return 'no'
17444c17ad94SBram Moolenaar    enddef
17454c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
17464c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
17474c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
174803afdcf1SBram Moolenaar    enddef
174903afdcf1SBram Moolenaar  END
175003afdcf1SBram Moolenaar  let nono_lines =<< trim END
175103afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
175203afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
175344d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
17544c17ad94SBram Moolenaar    enddef
17554c17ad94SBram Moolenaar  END
17564c17ad94SBram Moolenaar
17574c17ad94SBram Moolenaar  # FuncNo() is defined
175803afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
17594c17ad94SBram Moolenaar  source Xreloaded.vim
17604c17ad94SBram Moolenaar  g:DoCheck(true)
17614c17ad94SBram Moolenaar
17624c17ad94SBram Moolenaar  # FuncNo() is not redefined
176303afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
17644c17ad94SBram Moolenaar  source Xreloaded.vim
176503afdcf1SBram Moolenaar  g:DoCheck()
17664c17ad94SBram Moolenaar
17674c17ad94SBram Moolenaar  # FuncNo() is back
176803afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
17694c17ad94SBram Moolenaar  source Xreloaded.vim
177003afdcf1SBram Moolenaar  g:DoCheck()
17714c17ad94SBram Moolenaar
17724c17ad94SBram Moolenaar  delete('Xreloaded.vim')
17734c17ad94SBram Moolenaarenddef
17744c17ad94SBram Moolenaar
177589483d40SBram Moolenaardef Test_vim9script_reload_delvar()
177689483d40SBram Moolenaar  # write the script with a script-local variable
177789483d40SBram Moolenaar  let lines =<< trim END
177889483d40SBram Moolenaar    vim9script
177989483d40SBram Moolenaar    let var = 'string'
178089483d40SBram Moolenaar  END
178189483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
178289483d40SBram Moolenaar  source XreloadVar.vim
178389483d40SBram Moolenaar
178489483d40SBram Moolenaar  # now write the script using the same variable locally - works
178589483d40SBram Moolenaar  lines =<< trim END
178689483d40SBram Moolenaar    vim9script
178789483d40SBram Moolenaar    def Func()
178889483d40SBram Moolenaar      let var = 'string'
178989483d40SBram Moolenaar    enddef
179089483d40SBram Moolenaar  END
179189483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
179289483d40SBram Moolenaar  source XreloadVar.vim
179389483d40SBram Moolenaar
179489483d40SBram Moolenaar  delete('XreloadVar.vim')
179589483d40SBram Moolenaarenddef
179689483d40SBram Moolenaar
17978a7d6542SBram Moolenaardef Test_import_absolute()
17988a7d6542SBram Moolenaar  let import_lines = [
1799e6085c53SBram Moolenaar        'vim9script',
1800e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1801e6085c53SBram Moolenaar        'def UseExported()',
1802e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1803e6085c53SBram Moolenaar        '  exported = 8888',
1804e6085c53SBram Moolenaar        '  g:imported_after = exported',
1805e6085c53SBram Moolenaar        'enddef',
1806e6085c53SBram Moolenaar        'UseExported()',
1807e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1808e6085c53SBram Moolenaar        ]
18098a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
18108a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
18118a7d6542SBram Moolenaar
18128a7d6542SBram Moolenaar  source Ximport_abs.vim
18138a7d6542SBram Moolenaar
18148a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
18154e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1816675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1817675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1818675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1819675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1820675f716eSBram Moolenaar          'exported = 8888.*' ..
1821675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1822675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1823675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1824675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1825e6085c53SBram Moolenaar        g:import_disassembled)
1826b3ca9824SBram Moolenaar
1827b3ca9824SBram Moolenaar  Undo_export_script_lines()
18288a7d6542SBram Moolenaar  unlet g:imported_abs
18294e12a5dfSBram Moolenaar  unlet g:import_disassembled
18308a7d6542SBram Moolenaar
18318a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
18328a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
18338a7d6542SBram Moolenaarenddef
18348a7d6542SBram Moolenaar
18358a7d6542SBram Moolenaardef Test_import_rtp()
18368a7d6542SBram Moolenaar  let import_lines = [
1837e6085c53SBram Moolenaar        'vim9script',
1838e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1839e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1840e6085c53SBram Moolenaar        ]
18418a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
18428a7d6542SBram Moolenaar  mkdir('import')
18438a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
18448a7d6542SBram Moolenaar
18458a7d6542SBram Moolenaar  let save_rtp = &rtp
18468a7d6542SBram Moolenaar  &rtp = getcwd()
18478a7d6542SBram Moolenaar  source Ximport_rtp.vim
18488a7d6542SBram Moolenaar  &rtp = save_rtp
18498a7d6542SBram Moolenaar
18508a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
18518a7d6542SBram Moolenaar
1852b3ca9824SBram Moolenaar  Undo_export_script_lines()
1853b3ca9824SBram Moolenaar  unlet g:imported_rtp
18548a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
185589483d40SBram Moolenaar  delete('import', 'rf')
18568a7d6542SBram Moolenaarenddef
18578a7d6542SBram Moolenaar
185825e0f586SBram Moolenaardef Test_import_compile_error()
185925e0f586SBram Moolenaar  let export_lines = [
186025e0f586SBram Moolenaar        'vim9script',
186125e0f586SBram Moolenaar        'export def ExpFunc(): string',
186225e0f586SBram Moolenaar        '  return notDefined',
186325e0f586SBram Moolenaar        'enddef',
186425e0f586SBram Moolenaar        ]
186525e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
186625e0f586SBram Moolenaar
186725e0f586SBram Moolenaar  let import_lines = [
186825e0f586SBram Moolenaar        'vim9script',
186925e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
187025e0f586SBram Moolenaar        'def ImpFunc()',
187125e0f586SBram Moolenaar        '  echo ExpFunc()',
187225e0f586SBram Moolenaar        'enddef',
187325e0f586SBram Moolenaar        'defcompile',
187425e0f586SBram Moolenaar        ]
187525e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
187625e0f586SBram Moolenaar
187725e0f586SBram Moolenaar  try
187825e0f586SBram Moolenaar    source Ximport.vim
187925e0f586SBram Moolenaar  catch /E1001/
1880f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
188125e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
188225e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
188325e0f586SBram Moolenaar  endtry
188425e0f586SBram Moolenaar
188525e0f586SBram Moolenaar  delete('Xexported.vim')
188625e0f586SBram Moolenaar  delete('Ximport.vim')
188725e0f586SBram Moolenaarenddef
188825e0f586SBram Moolenaar
1889c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1890c4ce36d4SBram Moolenaar  let lines = [
1891c4ce36d4SBram Moolenaar        'vim9script',
1892c4ce36d4SBram Moolenaar        'def Func()',
1893c4ce36d4SBram Moolenaar        '  eval [][0]',
1894c4ce36d4SBram Moolenaar        'enddef',
1895c4ce36d4SBram Moolenaar        'Func()',
1896c4ce36d4SBram Moolenaar        ]
1897c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1898c4ce36d4SBram Moolenaar
1899c4ce36d4SBram Moolenaar  for count in range(3)
1900c4ce36d4SBram Moolenaar    try
1901c4ce36d4SBram Moolenaar      source Xtestscript.vim
1902c4ce36d4SBram Moolenaar    catch /E684/
1903c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1904c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1905c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1906c4ce36d4SBram Moolenaar    endtry
1907c4ce36d4SBram Moolenaar  endfor
1908c4ce36d4SBram Moolenaar
1909c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1910c4ce36d4SBram Moolenaarenddef
1911c4ce36d4SBram Moolenaar
1912eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1913eef2102eSBram Moolenaar  let export_lines =<< trim END
1914eef2102eSBram Moolenaar      vim9script
1915eef2102eSBram Moolenaar      export def Func()
1916eef2102eSBram Moolenaar        echo 'imported'
1917eef2102eSBram Moolenaar      enddef
1918eef2102eSBram Moolenaar  END
1919eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1920eef2102eSBram Moolenaar
1921eef2102eSBram Moolenaar  let lines =<< trim END
1922eef2102eSBram Moolenaar    vim9script
1923eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1924eef2102eSBram Moolenaar    def Func()
1925eef2102eSBram Moolenaar      echo 'local to function'
1926eef2102eSBram Moolenaar    enddef
1927eef2102eSBram Moolenaar  END
1928eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1929eef2102eSBram Moolenaar
1930eef2102eSBram Moolenaar  lines =<< trim END
1931eef2102eSBram Moolenaar    vim9script
1932eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1933eef2102eSBram Moolenaar    def Outer()
1934eef2102eSBram Moolenaar      def Func()
1935eef2102eSBram Moolenaar        echo 'local to function'
1936eef2102eSBram Moolenaar      enddef
1937eef2102eSBram Moolenaar    enddef
1938eef2102eSBram Moolenaar    defcompile
1939eef2102eSBram Moolenaar  END
1940eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1941eef2102eSBram Moolenaar
1942eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1943eef2102eSBram Moolenaarenddef
1944eef2102eSBram Moolenaar
1945b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1946b9a2cac3SBram Moolenaar  let lines =<< trim END
1947b9a2cac3SBram Moolenaar    vim9script
1948b9a2cac3SBram Moolenaar    def Func()
1949b9a2cac3SBram Moolenaar      echo 'one'
1950b9a2cac3SBram Moolenaar    enddef
1951b9a2cac3SBram Moolenaar    def Func()
1952b9a2cac3SBram Moolenaar      echo 'two'
1953b9a2cac3SBram Moolenaar    enddef
1954b9a2cac3SBram Moolenaar  END
1955b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1956fa211f3cSBram Moolenaar
1957fa211f3cSBram Moolenaar  lines =<< trim END
1958fa211f3cSBram Moolenaar    vim9script
1959fa211f3cSBram Moolenaar    def Foo(): string
1960fa211f3cSBram Moolenaar      return 'foo'
1961fa211f3cSBram Moolenaar      enddef
1962fa211f3cSBram Moolenaar    def Func()
1963fa211f3cSBram Moolenaar      let  Foo = {-> 'lambda'}
1964fa211f3cSBram Moolenaar    enddef
1965fa211f3cSBram Moolenaar    defcompile
1966fa211f3cSBram Moolenaar  END
1967fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1968b9a2cac3SBram Moolenaarenddef
1969b9a2cac3SBram Moolenaar
19708a7d6542SBram Moolenaardef Test_fixed_size_list()
1971f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
19728a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
19738a7d6542SBram Moolenaar  l->remove(0)
19748a7d6542SBram Moolenaar  l->add(5)
19758a7d6542SBram Moolenaar  l->insert(99, 1)
19760f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
19778a7d6542SBram Moolenaarenddef
19788a7d6542SBram Moolenaar
1979ae616494SBram Moolenaardef Test_no_insert_xit()
1980d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
1981d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
1982d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
1983d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
1984d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
1985ae616494SBram Moolenaar
1986ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1987ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1988ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1989ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1990f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1991f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1992f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1993f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1994f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1995ae616494SBram Moolenaarenddef
1996ae616494SBram Moolenaar
1997158906cfSBram Moolenaardef IfElse(what: number): string
1998158906cfSBram Moolenaar  let res = ''
1999158906cfSBram Moolenaar  if what == 1
2000158906cfSBram Moolenaar    res = "one"
2001158906cfSBram Moolenaar  elseif what == 2
2002158906cfSBram Moolenaar    res = "two"
2003a259d8d3SBram Moolenaar  else
2004158906cfSBram Moolenaar    res = "three"
2005a259d8d3SBram Moolenaar  endif
2006158906cfSBram Moolenaar  return res
2007a259d8d3SBram Moolenaarenddef
2008a259d8d3SBram Moolenaar
2009158906cfSBram Moolenaardef Test_if_elseif_else()
2010158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
2011158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
2012158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
20130f18b6d1SBram Moolenaarenddef
20140f18b6d1SBram Moolenaar
2015e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
2016d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
2017d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
2018d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
2019d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
2020d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
2021e8c4abbbSBram Moolenaarenddef
2022e8c4abbbSBram Moolenaar
20236d69bf60SBram Moolenaarlet g:bool_true = v:true
20246d69bf60SBram Moolenaarlet g:bool_false = v:false
20256d69bf60SBram Moolenaar
20266d69bf60SBram Moolenaardef Test_if_const_expr()
20276d69bf60SBram Moolenaar  let res = false
20286d69bf60SBram Moolenaar  if true ? true : false
20296d69bf60SBram Moolenaar    res = true
20306d69bf60SBram Moolenaar  endif
20316d69bf60SBram Moolenaar  assert_equal(true, res)
20326d69bf60SBram Moolenaar
2033585fea7bSBram Moolenaar  g:glob = 2
2034585fea7bSBram Moolenaar  if false
20356797966dSBram Moolenaar    execute('g:glob = 3')
2036585fea7bSBram Moolenaar  endif
2037585fea7bSBram Moolenaar  assert_equal(2, g:glob)
2038585fea7bSBram Moolenaar  if true
20396797966dSBram Moolenaar    execute('g:glob = 3')
2040585fea7bSBram Moolenaar  endif
2041585fea7bSBram Moolenaar  assert_equal(3, g:glob)
2042585fea7bSBram Moolenaar
20436d69bf60SBram Moolenaar  res = false
20446d69bf60SBram Moolenaar  if g:bool_true ? true : false
20456d69bf60SBram Moolenaar    res = true
20466d69bf60SBram Moolenaar  endif
20476d69bf60SBram Moolenaar  assert_equal(true, res)
20486d69bf60SBram Moolenaar
20496d69bf60SBram Moolenaar  res = false
20506d69bf60SBram Moolenaar  if true ? g:bool_true : false
20516d69bf60SBram Moolenaar    res = true
20526d69bf60SBram Moolenaar  endif
20536d69bf60SBram Moolenaar  assert_equal(true, res)
20546d69bf60SBram Moolenaar
20556d69bf60SBram Moolenaar  res = false
20566d69bf60SBram Moolenaar  if true ? true : g:bool_false
20576d69bf60SBram Moolenaar    res = true
20586d69bf60SBram Moolenaar  endif
20596d69bf60SBram Moolenaar  assert_equal(true, res)
20606d69bf60SBram Moolenaar
20616d69bf60SBram Moolenaar  res = false
20626d69bf60SBram Moolenaar  if true ? false : true
20636d69bf60SBram Moolenaar    res = true
20646d69bf60SBram Moolenaar  endif
20656d69bf60SBram Moolenaar  assert_equal(false, res)
20666d69bf60SBram Moolenaar
20676d69bf60SBram Moolenaar  res = false
20686d69bf60SBram Moolenaar  if false ? false : true
20696d69bf60SBram Moolenaar    res = true
20706d69bf60SBram Moolenaar  endif
20716d69bf60SBram Moolenaar  assert_equal(true, res)
20726d69bf60SBram Moolenaar
20736d69bf60SBram Moolenaar  res = false
20746d69bf60SBram Moolenaar  if false ? true : false
20756d69bf60SBram Moolenaar    res = true
20766d69bf60SBram Moolenaar  endif
20776d69bf60SBram Moolenaar  assert_equal(false, res)
20786d69bf60SBram Moolenaar
20796d69bf60SBram Moolenaar  res = false
2080e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2081e8c4abbbSBram Moolenaar    res = true
2082e8c4abbbSBram Moolenaar  endif
2083e8c4abbbSBram Moolenaar  assert_equal(false, res)
2084e8c4abbbSBram Moolenaar
2085e8c4abbbSBram Moolenaar  res = false
20866d69bf60SBram Moolenaar  if true && true
20876d69bf60SBram Moolenaar    res = true
20886d69bf60SBram Moolenaar  endif
20896d69bf60SBram Moolenaar  assert_equal(true, res)
20906d69bf60SBram Moolenaar
20916d69bf60SBram Moolenaar  res = false
20926d69bf60SBram Moolenaar  if true && false
20936d69bf60SBram Moolenaar    res = true
20946d69bf60SBram Moolenaar  endif
20956d69bf60SBram Moolenaar  assert_equal(false, res)
20966d69bf60SBram Moolenaar
20976d69bf60SBram Moolenaar  res = false
20986d69bf60SBram Moolenaar  if g:bool_true && false
20996d69bf60SBram Moolenaar    res = true
21006d69bf60SBram Moolenaar  endif
21016d69bf60SBram Moolenaar  assert_equal(false, res)
21026d69bf60SBram Moolenaar
21036d69bf60SBram Moolenaar  res = false
21046d69bf60SBram Moolenaar  if true && g:bool_false
21056d69bf60SBram Moolenaar    res = true
21066d69bf60SBram Moolenaar  endif
21076d69bf60SBram Moolenaar  assert_equal(false, res)
21086d69bf60SBram Moolenaar
21096d69bf60SBram Moolenaar  res = false
21106d69bf60SBram Moolenaar  if false && false
21116d69bf60SBram Moolenaar    res = true
21126d69bf60SBram Moolenaar  endif
21136d69bf60SBram Moolenaar  assert_equal(false, res)
21146d69bf60SBram Moolenaar
21156d69bf60SBram Moolenaar  res = false
21166d69bf60SBram Moolenaar  if true || false
21176d69bf60SBram Moolenaar    res = true
21186d69bf60SBram Moolenaar  endif
21196d69bf60SBram Moolenaar  assert_equal(true, res)
21206d69bf60SBram Moolenaar
21216d69bf60SBram Moolenaar  res = false
21226d69bf60SBram Moolenaar  if g:bool_true || false
21236d69bf60SBram Moolenaar    res = true
21246d69bf60SBram Moolenaar  endif
21256d69bf60SBram Moolenaar  assert_equal(true, res)
21266d69bf60SBram Moolenaar
21276d69bf60SBram Moolenaar  res = false
21286d69bf60SBram Moolenaar  if true || g:bool_false
21296d69bf60SBram Moolenaar    res = true
21306d69bf60SBram Moolenaar  endif
21316d69bf60SBram Moolenaar  assert_equal(true, res)
21326d69bf60SBram Moolenaar
21336d69bf60SBram Moolenaar  res = false
21346d69bf60SBram Moolenaar  if false || false
21356d69bf60SBram Moolenaar    res = true
21366d69bf60SBram Moolenaar  endif
21376d69bf60SBram Moolenaar  assert_equal(false, res)
21383988f64fSBram Moolenaar
21393988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
21403988f64fSBram Moolenaar  if false | eval 0 | endif
21413988f64fSBram Moolenaar  if false | eval burp + 234 | endif
21423988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
21433988f64fSBram Moolenaar  if false
21443988f64fSBram Moolenaar    burp
21453988f64fSBram Moolenaar  endif
214680c34ca3SBram Moolenaarenddef
21476d69bf60SBram Moolenaar
214880c34ca3SBram Moolenaardef Test_if_const_expr_fails()
2149d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2150d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2151d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
2152d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
21536d69bf60SBram Moolenaarenddef
21546d69bf60SBram Moolenaar
215572abcf42SBram Moolenaardef RunNested(i: number): number
215672abcf42SBram Moolenaar  let x: number = 0
215772abcf42SBram Moolenaar  if i % 2
215872abcf42SBram Moolenaar    if 1
2159f5be8cdbSBram Moolenaar      # comment
216072abcf42SBram Moolenaar    else
2161f5be8cdbSBram Moolenaar      # comment
216272abcf42SBram Moolenaar    endif
216372abcf42SBram Moolenaar    x += 1
216472abcf42SBram Moolenaar  else
216572abcf42SBram Moolenaar    x += 1000
216672abcf42SBram Moolenaar  endif
216772abcf42SBram Moolenaar  return x
216872abcf42SBram Moolenaarenddef
216972abcf42SBram Moolenaar
217072abcf42SBram Moolenaardef Test_nested_if()
217172abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
217272abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
217372abcf42SBram Moolenaarenddef
217472abcf42SBram Moolenaar
2175ad39c094SBram Moolenaardef Test_execute_cmd()
2176ad39c094SBram Moolenaar  new
2177ad39c094SBram Moolenaar  setline(1, 'default')
2178d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
2179ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2180a72cfb80SBram Moolenaar
2181d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
2182a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2183a72cfb80SBram Moolenaar
2184d2c61705SBram Moolenaar  let cmd1 = 'setline(1,'
2185ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
2186a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2187ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2188a72cfb80SBram Moolenaar
2189d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2190ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2191a72cfb80SBram Moolenaar
2192ad39c094SBram Moolenaar  let cmd_first = 'call '
2193ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
2194ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2195ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2196ad39c094SBram Moolenaar  bwipe!
2197585fea7bSBram Moolenaar
21982d6b20d6SBram Moolenaar  let n = true
21992d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
22002d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
22012d6b20d6SBram Moolenaar
2202e5abf7afSBram Moolenaar  echomsg [1, 2, 3] #{a: 1, b: 2}
2203e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2204e5abf7afSBram Moolenaar
2205d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2206d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2207d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2208ad39c094SBram Moolenaarenddef
2209ad39c094SBram Moolenaar
221047e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2211f5be8cdbSBram Moolenaar  # only checks line continuation
221247e880d6SBram Moolenaar  let lines =<< trim END
221347e880d6SBram Moolenaar      vim9script
221447e880d6SBram Moolenaar      execute 'g:someVar'
221547e880d6SBram Moolenaar                .. ' = ' ..
221647e880d6SBram Moolenaar                   '28'
221747e880d6SBram Moolenaar      assert_equal(28, g:someVar)
221847e880d6SBram Moolenaar      unlet g:someVar
221947e880d6SBram Moolenaar  END
222047e880d6SBram Moolenaar  CheckScriptSuccess(lines)
222147e880d6SBram Moolenaarenddef
222247e880d6SBram Moolenaar
2223ad39c094SBram Moolenaardef Test_echo_cmd()
2224a72cfb80SBram Moolenaar  echo 'some' # comment
2225585fea7bSBram Moolenaar  echon 'thing'
2226ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2227ad39c094SBram Moolenaar
2228a72cfb80SBram Moolenaar  echo "some" # comment
2229a72cfb80SBram Moolenaar  echon "thing"
2230a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2231a72cfb80SBram Moolenaar
2232ad39c094SBram Moolenaar  let str1 = 'some'
2233ad39c094SBram Moolenaar  let str2 = 'more'
2234ad39c094SBram Moolenaar  echo str1 str2
2235ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2236a72cfb80SBram Moolenaar
2237d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2238ad39c094SBram Moolenaarenddef
2239ad39c094SBram Moolenaar
2240f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2241f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2242f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2243f93c7feaSBram Moolenaar  echo 'clear'
2244df069eecSBram Moolenaar  :1messages
2245f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2246f93c7feaSBram Moolenaar
2247d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2248f93c7feaSBram Moolenaarenddef
2249f93c7feaSBram Moolenaar
225047e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2251f5be8cdbSBram Moolenaar  # only checks line continuation
225247e880d6SBram Moolenaar  let lines =<< trim END
225347e880d6SBram Moolenaar      vim9script
225447e880d6SBram Moolenaar      echomsg 'here'
225547e880d6SBram Moolenaar                .. ' is ' ..
225647e880d6SBram Moolenaar                   'a message'
225747e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
225847e880d6SBram Moolenaar  END
225947e880d6SBram Moolenaar  CheckScriptSuccess(lines)
226047e880d6SBram Moolenaarenddef
226147e880d6SBram Moolenaar
2262f93c7feaSBram Moolenaardef Test_echoerr_cmd()
226340ee466cSBram Moolenaar  try
226440ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
226540ee466cSBram Moolenaar  catch
226640ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
226740ee466cSBram Moolenaar  endtry
2268f93c7feaSBram Moolenaarenddef
2269f93c7feaSBram Moolenaar
227047e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2271f5be8cdbSBram Moolenaar  # only checks line continuation
227247e880d6SBram Moolenaar  let lines =<< trim END
227347e880d6SBram Moolenaar      vim9script
227447e880d6SBram Moolenaar      try
227547e880d6SBram Moolenaar        echoerr 'this'
227647e880d6SBram Moolenaar                .. ' is ' ..
227747e880d6SBram Moolenaar                   'wrong'
227847e880d6SBram Moolenaar      catch
227947e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
228047e880d6SBram Moolenaar      endtry
228147e880d6SBram Moolenaar  END
228247e880d6SBram Moolenaar  CheckScriptSuccess(lines)
228347e880d6SBram Moolenaarenddef
228447e880d6SBram Moolenaar
228541fe0617SBram Moolenaardef Test_for_outside_of_function()
228641fe0617SBram Moolenaar  let lines =<< trim END
228741fe0617SBram Moolenaar    vim9script
228841fe0617SBram Moolenaar    new
228941fe0617SBram Moolenaar    for var in range(0, 3)
229041fe0617SBram Moolenaar      append(line('$'), var)
229141fe0617SBram Moolenaar    endfor
229241fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
229341fe0617SBram Moolenaar    bwipe!
229441fe0617SBram Moolenaar  END
229541fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
229641fe0617SBram Moolenaar  source Xvim9for.vim
229741fe0617SBram Moolenaar  delete('Xvim9for.vim')
229841fe0617SBram Moolenaarenddef
22998a7d6542SBram Moolenaar
2300e8c4abbbSBram Moolenaardef Test_for_loop()
2301e8c4abbbSBram Moolenaar  let result = ''
2302e8c4abbbSBram Moolenaar  for cnt in range(7)
2303e8c4abbbSBram Moolenaar    if cnt == 4
2304e8c4abbbSBram Moolenaar      break
2305e8c4abbbSBram Moolenaar    endif
2306e8c4abbbSBram Moolenaar    if cnt == 2
2307e8c4abbbSBram Moolenaar      continue
2308e8c4abbbSBram Moolenaar    endif
2309e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2310e8c4abbbSBram Moolenaar  endfor
2311e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
23120ad3e894SBram Moolenaar
23130ad3e894SBram Moolenaar  let concat = ''
23140ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
23150ad3e894SBram Moolenaar    concat ..= str
23160ad3e894SBram Moolenaar  endfor
23170ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
2318e8c4abbbSBram Moolenaarenddef
2319e8c4abbbSBram Moolenaar
2320e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2321675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2322675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2323451c2e35SBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1017:')
2324822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
2325451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
2326675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2327675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2328675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2329e8c4abbbSBram Moolenaarenddef
2330e8c4abbbSBram Moolenaar
2331d0df1aacSBram Moolenaardef Test_while_loop()
2332d0df1aacSBram Moolenaar  let result = ''
2333d0df1aacSBram Moolenaar  let cnt = 0
2334d0df1aacSBram Moolenaar  while cnt < 555
2335d0df1aacSBram Moolenaar    if cnt == 3
2336d0df1aacSBram Moolenaar      break
2337d0df1aacSBram Moolenaar    endif
2338d0df1aacSBram Moolenaar    cnt += 1
2339d0df1aacSBram Moolenaar    if cnt == 2
2340d0df1aacSBram Moolenaar      continue
2341d0df1aacSBram Moolenaar    endif
2342d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2343d0df1aacSBram Moolenaar  endwhile
2344d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2345d0df1aacSBram Moolenaarenddef
2346d0df1aacSBram Moolenaar
2347e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2348675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2349675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2350675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2351675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2352675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2353675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2354675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
2355bd5da371SBram Moolenaarenddef
2356bd5da371SBram Moolenaar
23579645e2d9SBram Moolenaardef Test_interrupt_loop()
235897acfc78SBram Moolenaar  let caught = false
23599645e2d9SBram Moolenaar  let x = 0
236097acfc78SBram Moolenaar  try
23619645e2d9SBram Moolenaar    while 1
23629645e2d9SBram Moolenaar      x += 1
23639645e2d9SBram Moolenaar      if x == 100
23649645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
23659645e2d9SBram Moolenaar      endif
23669645e2d9SBram Moolenaar    endwhile
236797acfc78SBram Moolenaar  catch
236897acfc78SBram Moolenaar    caught = true
236997acfc78SBram Moolenaar    assert_equal(100, x)
237097acfc78SBram Moolenaar  endtry
237197acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
237225859dd7SBram Moolenaar  # consume the CTRL-C
237325859dd7SBram Moolenaar  getchar(0)
23749645e2d9SBram Moolenaarenddef
237520431c9dSBram Moolenaar
23764fdae999SBram Moolenaardef Test_automatic_line_continuation()
23774fdae999SBram Moolenaar  let mylist = [
23784fdae999SBram Moolenaar      'one',
23794fdae999SBram Moolenaar      'two',
23804fdae999SBram Moolenaar      'three',
2381f5be8cdbSBram Moolenaar      ] # comment
23824fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
23834fdae999SBram Moolenaar
23844fdae999SBram Moolenaar  let mydict = {
23854fdae999SBram Moolenaar      'one': 1,
23864fdae999SBram Moolenaar      'two': 2,
23874fdae999SBram Moolenaar      'three':
23884fdae999SBram Moolenaar          3,
2389f5be8cdbSBram Moolenaar      } # comment
23904fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
23914fdae999SBram Moolenaar  mydict = #{
23922c330432SBram Moolenaar      one: 1,  # comment
23932c330432SBram Moolenaar      two:     # comment
23942c330432SBram Moolenaar           2,  # comment
23952c330432SBram Moolenaar      three: 3 # comment
23962c330432SBram Moolenaar      }
23972c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
23982c330432SBram Moolenaar  mydict = #{
23992c330432SBram Moolenaar      one: 1,
24004fdae999SBram Moolenaar      two:
24014fdae999SBram Moolenaar           2,
24022c330432SBram Moolenaar      three: 3
24034fdae999SBram Moolenaar      }
24044fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
2405e6085c53SBram Moolenaar
2406e6085c53SBram Moolenaar  assert_equal(
2407e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2408e6085c53SBram Moolenaar        split('one two three')
2409e6085c53SBram Moolenaar        )
24104fdae999SBram Moolenaarenddef
24114fdae999SBram Moolenaar
24127a092245SBram Moolenaardef Test_vim9_comment()
24137a092245SBram Moolenaar  CheckScriptSuccess([
24147a092245SBram Moolenaar      'vim9script',
24157a092245SBram Moolenaar      '# something',
24167a092245SBram Moolenaar      ])
24177a092245SBram Moolenaar  CheckScriptFailure([
24187a092245SBram Moolenaar      'vim9script',
24197a092245SBram Moolenaar      ':# something',
24207a092245SBram Moolenaar      ], 'E488:')
24217a092245SBram Moolenaar  CheckScriptFailure([
24227a092245SBram Moolenaar      '# something',
24237a092245SBram Moolenaar      ], 'E488:')
24247a092245SBram Moolenaar  CheckScriptFailure([
24257a092245SBram Moolenaar      ':# something',
24267a092245SBram Moolenaar      ], 'E488:')
24277a092245SBram Moolenaar
24284a8d9f2eSBram Moolenaar  { # block start
24294a8d9f2eSBram Moolenaar  } # block end
24304a8d9f2eSBram Moolenaar  CheckDefFailure([
24314a8d9f2eSBram Moolenaar      '{# comment',
24324a8d9f2eSBram Moolenaar      ], 'E488:')
24334a8d9f2eSBram Moolenaar  CheckDefFailure([
24344a8d9f2eSBram Moolenaar      '{',
24354a8d9f2eSBram Moolenaar      '}# comment',
24364a8d9f2eSBram Moolenaar      ], 'E488:')
24374a8d9f2eSBram Moolenaar
24384a8d9f2eSBram Moolenaar  echo "yes" # comment
24394a8d9f2eSBram Moolenaar  CheckDefFailure([
24404a8d9f2eSBram Moolenaar      'echo "yes"# comment',
24414a8d9f2eSBram Moolenaar      ], 'E488:')
24427a092245SBram Moolenaar  CheckScriptSuccess([
24437a092245SBram Moolenaar      'vim9script',
24447a092245SBram Moolenaar      'echo "yes" # something',
24457a092245SBram Moolenaar      ])
24467a092245SBram Moolenaar  CheckScriptFailure([
24477a092245SBram Moolenaar      'vim9script',
24487a092245SBram Moolenaar      'echo "yes"# something',
24497a092245SBram Moolenaar      ], 'E121:')
24507a092245SBram Moolenaar  CheckScriptFailure([
24517a092245SBram Moolenaar      'vim9script',
24527a092245SBram Moolenaar      'echo# something',
24537a092245SBram Moolenaar      ], 'E121:')
24547a092245SBram Moolenaar  CheckScriptFailure([
24557a092245SBram Moolenaar      'echo "yes" # something',
24567a092245SBram Moolenaar      ], 'E121:')
24577a092245SBram Moolenaar
24584a8d9f2eSBram Moolenaar  exe "echo" # comment
24594a8d9f2eSBram Moolenaar  CheckDefFailure([
24604a8d9f2eSBram Moolenaar      'exe "echo"# comment',
24614a8d9f2eSBram Moolenaar      ], 'E488:')
24624a8d9f2eSBram Moolenaar  CheckScriptSuccess([
24634a8d9f2eSBram Moolenaar      'vim9script',
24644a8d9f2eSBram Moolenaar      'exe "echo" # something',
24654a8d9f2eSBram Moolenaar      ])
24664a8d9f2eSBram Moolenaar  CheckScriptFailure([
24674a8d9f2eSBram Moolenaar      'vim9script',
24684a8d9f2eSBram Moolenaar      'exe "echo"# something',
24694a8d9f2eSBram Moolenaar      ], 'E121:')
24704a8d9f2eSBram Moolenaar  CheckDefFailure([
24714a8d9f2eSBram Moolenaar      'exe # comment',
24724a8d9f2eSBram Moolenaar      ], 'E1015:')
24734a8d9f2eSBram Moolenaar  CheckScriptFailure([
24744a8d9f2eSBram Moolenaar      'vim9script',
24754a8d9f2eSBram Moolenaar      'exe# something',
24764a8d9f2eSBram Moolenaar      ], 'E121:')
24774a8d9f2eSBram Moolenaar  CheckScriptFailure([
24784a8d9f2eSBram Moolenaar      'exe "echo" # something',
24794a8d9f2eSBram Moolenaar      ], 'E121:')
24804a8d9f2eSBram Moolenaar
24817a092245SBram Moolenaar  CheckDefFailure([
24827a092245SBram Moolenaar      'try# comment',
24837a092245SBram Moolenaar      '  echo "yes"',
24847a092245SBram Moolenaar      'catch',
24857a092245SBram Moolenaar      'endtry',
24867a092245SBram Moolenaar      ], 'E488:')
24872c5ed4e3SBram Moolenaar  CheckScriptFailure([
24882c5ed4e3SBram Moolenaar      'vim9script',
24892c5ed4e3SBram Moolenaar      'try# comment',
24902c5ed4e3SBram Moolenaar      'echo "yes"',
24912c5ed4e3SBram Moolenaar      ], 'E488:')
24927a092245SBram Moolenaar  CheckDefFailure([
24937a092245SBram Moolenaar      'try',
2494a72cfb80SBram Moolenaar      '  throw#comment',
2495a72cfb80SBram Moolenaar      'catch',
2496a72cfb80SBram Moolenaar      'endtry',
2497a72cfb80SBram Moolenaar      ], 'E1015:')
2498a72cfb80SBram Moolenaar  CheckDefFailure([
2499a72cfb80SBram Moolenaar      'try',
2500a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2501a72cfb80SBram Moolenaar      'catch',
2502a72cfb80SBram Moolenaar      'endtry',
2503a72cfb80SBram Moolenaar      ], 'E488:')
2504a72cfb80SBram Moolenaar  CheckDefFailure([
2505a72cfb80SBram Moolenaar      'try',
25067a092245SBram Moolenaar      '  echo "yes"',
25077a092245SBram Moolenaar      'catch# comment',
25087a092245SBram Moolenaar      'endtry',
25097a092245SBram Moolenaar      ], 'E488:')
25102c5ed4e3SBram Moolenaar  CheckScriptFailure([
25112c5ed4e3SBram Moolenaar      'vim9script',
25122c5ed4e3SBram Moolenaar      'try',
25132c5ed4e3SBram Moolenaar      '  echo "yes"',
25142c5ed4e3SBram Moolenaar      'catch# comment',
25152c5ed4e3SBram Moolenaar      'endtry',
25162c5ed4e3SBram Moolenaar      ], 'E654:')
25172c5ed4e3SBram Moolenaar  CheckDefFailure([
25182c5ed4e3SBram Moolenaar      'try',
25192c5ed4e3SBram Moolenaar      '  echo "yes"',
25202c5ed4e3SBram Moolenaar      'catch /pat/# comment',
25212c5ed4e3SBram Moolenaar      'endtry',
25222c5ed4e3SBram Moolenaar      ], 'E488:')
25237a092245SBram Moolenaar  CheckDefFailure([
25247a092245SBram Moolenaar      'try',
25257a092245SBram Moolenaar      'echo "yes"',
25267a092245SBram Moolenaar      'catch',
25277a092245SBram Moolenaar      'endtry# comment',
25287a092245SBram Moolenaar      ], 'E488:')
25292c5ed4e3SBram Moolenaar  CheckScriptFailure([
25302c5ed4e3SBram Moolenaar      'vim9script',
25312c5ed4e3SBram Moolenaar      'try',
25322c5ed4e3SBram Moolenaar      '  echo "yes"',
25332c5ed4e3SBram Moolenaar      'catch',
25342c5ed4e3SBram Moolenaar      'endtry# comment',
25359b7bf9e9SBram Moolenaar      ], 'E488:')
25362c5ed4e3SBram Moolenaar
25372c5ed4e3SBram Moolenaar  CheckScriptSuccess([
25382c5ed4e3SBram Moolenaar      'vim9script',
25392c5ed4e3SBram Moolenaar      'hi # comment',
25402c5ed4e3SBram Moolenaar      ])
25412c5ed4e3SBram Moolenaar  CheckScriptFailure([
25422c5ed4e3SBram Moolenaar      'vim9script',
25432c5ed4e3SBram Moolenaar      'hi# comment',
25442c5ed4e3SBram Moolenaar      ], 'E416:')
25451966c248SBram Moolenaar  CheckScriptSuccess([
25461966c248SBram Moolenaar      'vim9script',
25471966c248SBram Moolenaar      'hi Search # comment',
25481966c248SBram Moolenaar      ])
25491966c248SBram Moolenaar  CheckScriptFailure([
25501966c248SBram Moolenaar      'vim9script',
25511966c248SBram Moolenaar      'hi Search# comment',
25521966c248SBram Moolenaar      ], 'E416:')
25531966c248SBram Moolenaar  CheckScriptSuccess([
25541966c248SBram Moolenaar      'vim9script',
25551966c248SBram Moolenaar      'hi link This Search # comment',
25561966c248SBram Moolenaar      ])
25571966c248SBram Moolenaar  CheckScriptFailure([
25581966c248SBram Moolenaar      'vim9script',
25591966c248SBram Moolenaar      'hi link This That# comment',
25601966c248SBram Moolenaar      ], 'E413:')
25611966c248SBram Moolenaar  CheckScriptSuccess([
25621966c248SBram Moolenaar      'vim9script',
25631966c248SBram Moolenaar      'hi clear This # comment',
25641966c248SBram Moolenaar      'hi clear # comment',
25651966c248SBram Moolenaar      ])
2566f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2567f5be8cdbSBram Moolenaar  # hi clear This# comment',
25681966c248SBram Moolenaar  CheckScriptFailure([
25691966c248SBram Moolenaar      'vim9script',
25701966c248SBram Moolenaar      'hi clear# comment',
25711966c248SBram Moolenaar      ], 'E416:')
25721966c248SBram Moolenaar
25731966c248SBram Moolenaar  CheckScriptSuccess([
25741966c248SBram Moolenaar      'vim9script',
25751966c248SBram Moolenaar      'hi Group term=bold',
25761966c248SBram Moolenaar      'match Group /todo/ # comment',
25771966c248SBram Moolenaar      ])
25781966c248SBram Moolenaar  CheckScriptFailure([
25791966c248SBram Moolenaar      'vim9script',
25801966c248SBram Moolenaar      'hi Group term=bold',
25811966c248SBram Moolenaar      'match Group /todo/# comment',
25821966c248SBram Moolenaar      ], 'E488:')
25831966c248SBram Moolenaar  CheckScriptSuccess([
25841966c248SBram Moolenaar      'vim9script',
25851966c248SBram Moolenaar      'match # comment',
25861966c248SBram Moolenaar      ])
25871966c248SBram Moolenaar  CheckScriptFailure([
25881966c248SBram Moolenaar      'vim9script',
25891966c248SBram Moolenaar      'match# comment',
25901966c248SBram Moolenaar      ], 'E475:')
25911966c248SBram Moolenaar  CheckScriptSuccess([
25921966c248SBram Moolenaar      'vim9script',
25931966c248SBram Moolenaar      'match none # comment',
25941966c248SBram Moolenaar      ])
25951966c248SBram Moolenaar  CheckScriptFailure([
25961966c248SBram Moolenaar      'vim9script',
25971966c248SBram Moolenaar      'match none# comment',
25981966c248SBram Moolenaar      ], 'E475:')
25991966c248SBram Moolenaar
26001966c248SBram Moolenaar  CheckScriptSuccess([
26011966c248SBram Moolenaar      'vim9script',
26021966c248SBram Moolenaar      'menutrans clear # comment',
26031966c248SBram Moolenaar      ])
26041966c248SBram Moolenaar  CheckScriptFailure([
26051966c248SBram Moolenaar      'vim9script',
26061966c248SBram Moolenaar      'menutrans clear# comment text',
26071966c248SBram Moolenaar      ], 'E474:')
26081966c248SBram Moolenaar
26091966c248SBram Moolenaar  CheckScriptSuccess([
26101966c248SBram Moolenaar      'vim9script',
26111966c248SBram Moolenaar      'syntax clear # comment',
26121966c248SBram Moolenaar      ])
26131966c248SBram Moolenaar  CheckScriptFailure([
26141966c248SBram Moolenaar      'vim9script',
26151966c248SBram Moolenaar      'syntax clear# comment text',
26161966c248SBram Moolenaar      ], 'E28:')
26171966c248SBram Moolenaar  CheckScriptSuccess([
26181966c248SBram Moolenaar      'vim9script',
26191966c248SBram Moolenaar      'syntax keyword Word some',
26201966c248SBram Moolenaar      'syntax clear Word # comment',
26211966c248SBram Moolenaar      ])
26221966c248SBram Moolenaar  CheckScriptFailure([
26231966c248SBram Moolenaar      'vim9script',
26241966c248SBram Moolenaar      'syntax keyword Word some',
26251966c248SBram Moolenaar      'syntax clear Word# comment text',
26261966c248SBram Moolenaar      ], 'E28:')
26271966c248SBram Moolenaar
26281966c248SBram Moolenaar  CheckScriptSuccess([
26291966c248SBram Moolenaar      'vim9script',
26301966c248SBram Moolenaar      'syntax list # comment',
26311966c248SBram Moolenaar      ])
26321966c248SBram Moolenaar  CheckScriptFailure([
26331966c248SBram Moolenaar      'vim9script',
26341966c248SBram Moolenaar      'syntax list# comment text',
26351966c248SBram Moolenaar      ], 'E28:')
26361966c248SBram Moolenaar
26371966c248SBram Moolenaar  CheckScriptSuccess([
26381966c248SBram Moolenaar      'vim9script',
26391966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
26401966c248SBram Moolenaar      ])
26411966c248SBram Moolenaar  CheckScriptFailure([
26421966c248SBram Moolenaar      'vim9script',
26431966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
26441966c248SBram Moolenaar      ], 'E475:')
26451966c248SBram Moolenaar
26461966c248SBram Moolenaar  CheckScriptSuccess([
26471966c248SBram Moolenaar      'vim9script',
26481966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
26491966c248SBram Moolenaar      ])
26501966c248SBram Moolenaar  CheckScriptFailure([
26511966c248SBram Moolenaar      'vim9script',
26521966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
26531966c248SBram Moolenaar      ], 'E789:')
26541966c248SBram Moolenaar
26551966c248SBram Moolenaar  CheckScriptSuccess([
26561966c248SBram Moolenaar      'vim9script',
26571966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
26581966c248SBram Moolenaar      ])
26591966c248SBram Moolenaar  CheckScriptFailure([
26601966c248SBram Moolenaar      'vim9script',
26611966c248SBram Moolenaar      'syntax match Word /pat/# comment',
26621966c248SBram Moolenaar      ], 'E402:')
26631966c248SBram Moolenaar
26641966c248SBram Moolenaar  CheckScriptSuccess([
26651966c248SBram Moolenaar      'vim9script',
26661966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
26671966c248SBram Moolenaar      ])
26681966c248SBram Moolenaar  CheckScriptFailure([
26691966c248SBram Moolenaar      'vim9script',
26701966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
26711966c248SBram Moolenaar      ], 'E475:')
26721966c248SBram Moolenaar  CheckScriptFailure([
26731966c248SBram Moolenaar      'vim9script',
26741966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
26751966c248SBram Moolenaar      ], 'E406:')
26761966c248SBram Moolenaar  CheckScriptFailure([
26771966c248SBram Moolenaar      'vim9script',
26781966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
26791966c248SBram Moolenaar      ], 'E475:')
26801966c248SBram Moolenaar
26811966c248SBram Moolenaar  CheckScriptSuccess([
26821966c248SBram Moolenaar      'vim9script',
26831966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
26841966c248SBram Moolenaar      ])
26851966c248SBram Moolenaar  CheckScriptFailure([
26861966c248SBram Moolenaar      'vim9script',
26871966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2688d032f34aSBram Moolenaar      ], 'E402:')
26891966c248SBram Moolenaar
26901966c248SBram Moolenaar  CheckScriptSuccess([
26911966c248SBram Moolenaar      'vim9script',
26921966c248SBram Moolenaar      'syntax sync # comment',
26931966c248SBram Moolenaar      ])
26941966c248SBram Moolenaar  CheckScriptFailure([
26951966c248SBram Moolenaar      'vim9script',
26961966c248SBram Moolenaar      'syntax sync# comment',
26971966c248SBram Moolenaar      ], 'E404:')
26981966c248SBram Moolenaar  CheckScriptSuccess([
26991966c248SBram Moolenaar      'vim9script',
27001966c248SBram Moolenaar      'syntax sync ccomment # comment',
27011966c248SBram Moolenaar      ])
27021966c248SBram Moolenaar  CheckScriptFailure([
27031966c248SBram Moolenaar      'vim9script',
27041966c248SBram Moolenaar      'syntax sync ccomment# comment',
27051966c248SBram Moolenaar      ], 'E404:')
27061966c248SBram Moolenaar
27071966c248SBram Moolenaar  CheckScriptSuccess([
27081966c248SBram Moolenaar      'vim9script',
27091966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
27101966c248SBram Moolenaar      ])
27111966c248SBram Moolenaar  CheckScriptFailure([
27121966c248SBram Moolenaar      'vim9script',
27131966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
27141966c248SBram Moolenaar      ], 'E475:')
2715a72cfb80SBram Moolenaar
2716a72cfb80SBram Moolenaar  CheckScriptSuccess([
2717a72cfb80SBram Moolenaar      'vim9script',
2718a72cfb80SBram Moolenaar      'command Echo echo # comment',
2719a72cfb80SBram Moolenaar      'command Echo # comment',
2720a72cfb80SBram Moolenaar      ])
2721a72cfb80SBram Moolenaar  CheckScriptFailure([
2722a72cfb80SBram Moolenaar      'vim9script',
2723a72cfb80SBram Moolenaar      'command Echo echo# comment',
2724a72cfb80SBram Moolenaar      'Echo',
2725a72cfb80SBram Moolenaar      ], 'E121:')
2726a72cfb80SBram Moolenaar  CheckScriptFailure([
2727a72cfb80SBram Moolenaar      'vim9script',
2728a72cfb80SBram Moolenaar      'command Echo# comment',
2729a72cfb80SBram Moolenaar      ], 'E182:')
2730a72cfb80SBram Moolenaar  CheckScriptFailure([
2731a72cfb80SBram Moolenaar      'vim9script',
2732a72cfb80SBram Moolenaar      'command Echo echo',
2733a72cfb80SBram Moolenaar      'command Echo# comment',
2734a72cfb80SBram Moolenaar      ], 'E182:')
2735a72cfb80SBram Moolenaar
2736a72cfb80SBram Moolenaar  CheckScriptSuccess([
2737a72cfb80SBram Moolenaar      'vim9script',
2738a72cfb80SBram Moolenaar      'function # comment',
2739a72cfb80SBram Moolenaar      ])
2740a72cfb80SBram Moolenaar  CheckScriptFailure([
2741a72cfb80SBram Moolenaar      'vim9script',
27429898107fSBram Moolenaar      'function " comment',
27439898107fSBram Moolenaar      ], 'E129:')
27449898107fSBram Moolenaar  CheckScriptFailure([
27459898107fSBram Moolenaar      'vim9script',
2746a72cfb80SBram Moolenaar      'function# comment',
2747a72cfb80SBram Moolenaar      ], 'E129:')
2748a72cfb80SBram Moolenaar  CheckScriptSuccess([
2749a72cfb80SBram Moolenaar      'vim9script',
2750a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2751a72cfb80SBram Moolenaar      ])
2752a72cfb80SBram Moolenaar  CheckScriptFailure([
2753a72cfb80SBram Moolenaar      'vim9script',
2754a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2755a72cfb80SBram Moolenaar      ], 'E488:')
2756a72cfb80SBram Moolenaar
2757a72cfb80SBram Moolenaar  CheckScriptSuccess([
2758a72cfb80SBram Moolenaar      'vim9script',
27594c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2760a72cfb80SBram Moolenaar      'endfunc',
27614c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2762a72cfb80SBram Moolenaar      ])
2763a72cfb80SBram Moolenaar  CheckScriptFailure([
2764a72cfb80SBram Moolenaar      'vim9script',
27654c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2766a72cfb80SBram Moolenaar      'endfunc',
27674c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2768a72cfb80SBram Moolenaar      ], 'E488:')
2769a72cfb80SBram Moolenaar
2770a72cfb80SBram Moolenaar  CheckScriptSuccess([
2771a72cfb80SBram Moolenaar      'vim9script',
2772a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2773a72cfb80SBram Moolenaar      ])
2774a72cfb80SBram Moolenaar  CheckScriptFailure([
2775a72cfb80SBram Moolenaar      'vim9script',
2776a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2777a72cfb80SBram Moolenaar      ], 'E488:')
2778e7e4838fSBram Moolenaar
2779e7e4838fSBram Moolenaar  CheckScriptFailure([
2780e7e4838fSBram Moolenaar      'def Test() " comment',
2781e7e4838fSBram Moolenaar      'enddef',
2782e7e4838fSBram Moolenaar      ], 'E488:')
2783e7e4838fSBram Moolenaar  CheckScriptFailure([
2784e7e4838fSBram Moolenaar      'vim9script',
2785e7e4838fSBram Moolenaar      'def Test() " comment',
2786e7e4838fSBram Moolenaar      'enddef',
2787e7e4838fSBram Moolenaar      ], 'E488:')
2788e7e4838fSBram Moolenaar
2789e7e4838fSBram Moolenaar  CheckScriptSuccess([
2790e7e4838fSBram Moolenaar      'func Test() " comment',
2791e7e4838fSBram Moolenaar      'endfunc',
2792e7e4838fSBram Moolenaar      ])
27939898107fSBram Moolenaar  CheckScriptSuccess([
2794e7e4838fSBram Moolenaar      'vim9script',
2795e7e4838fSBram Moolenaar      'func Test() " comment',
2796e7e4838fSBram Moolenaar      'endfunc',
27979898107fSBram Moolenaar      ])
2798e7e4838fSBram Moolenaar
2799e7e4838fSBram Moolenaar  CheckScriptSuccess([
2800e7e4838fSBram Moolenaar      'def Test() # comment',
2801e7e4838fSBram Moolenaar      'enddef',
2802e7e4838fSBram Moolenaar      ])
2803e7e4838fSBram Moolenaar  CheckScriptFailure([
2804e7e4838fSBram Moolenaar      'func Test() # comment',
2805e7e4838fSBram Moolenaar      'endfunc',
2806e7e4838fSBram Moolenaar      ], 'E488:')
28072c5ed4e3SBram Moolenaarenddef
28082c5ed4e3SBram Moolenaar
28092c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
28102c5ed4e3SBram Moolenaar  CheckCanRunGui
28112c5ed4e3SBram Moolenaar
28122c5ed4e3SBram Moolenaar  CheckScriptFailure([
28132c5ed4e3SBram Moolenaar      'vim9script',
28142c5ed4e3SBram Moolenaar      'gui#comment'
28152c5ed4e3SBram Moolenaar      ], 'E499:')
28162c5ed4e3SBram Moolenaar  CheckScriptFailure([
28172c5ed4e3SBram Moolenaar      'vim9script',
28182c5ed4e3SBram Moolenaar      'gui -f#comment'
28192c5ed4e3SBram Moolenaar      ], 'E499:')
28207a092245SBram Moolenaarenddef
28217a092245SBram Moolenaar
2822a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
28236797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
28246797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2825a26b9700SBram Moolenaar
2826a26b9700SBram Moolenaar  edit test.vim
2827a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2828a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2829a26b9700SBram Moolenaar
2830a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2831a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2832a26b9700SBram Moolenaar
2833a26b9700SBram Moolenaar  g:entered = 0
2834a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2835a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2836a26b9700SBram Moolenaar
2837a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2838a26b9700SBram Moolenaar
2839a26b9700SBram Moolenaar  au! TabEnter
2840a26b9700SBram Moolenaar  unlet g:entered
2841d72c1bf0SBram Moolenaar
2842d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2843d72c1bf0SBram Moolenaar      'vim9script',
28446797966dSBram Moolenaar      'g:var = 123',
2845e55b1c09SBram Moolenaar      'b:var = 456',
2846e55b1c09SBram Moolenaar      'w:var = 777',
2847e55b1c09SBram Moolenaar      't:var = 888',
2848d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2849d72c1bf0SBram Moolenaar      ])
2850d72c1bf0SBram Moolenaar
2851d72c1bf0SBram Moolenaar  CheckScriptFailure([
2852d72c1bf0SBram Moolenaar      'vim9script',
2853d72c1bf0SBram Moolenaar      'let g:var = 123',
2854e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2855e55b1c09SBram Moolenaar
2856e55b1c09SBram Moolenaar  CheckScriptFailure([
2857e55b1c09SBram Moolenaar      'vim9script',
2858e55b1c09SBram Moolenaar      'let b:var = 123',
2859e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2860e55b1c09SBram Moolenaar
2861e55b1c09SBram Moolenaar  CheckScriptFailure([
2862e55b1c09SBram Moolenaar      'vim9script',
2863e55b1c09SBram Moolenaar      'let w:var = 123',
2864e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2865e55b1c09SBram Moolenaar
2866e55b1c09SBram Moolenaar  CheckScriptFailure([
2867e55b1c09SBram Moolenaar      'vim9script',
2868e55b1c09SBram Moolenaar      'let t:var = 123',
2869e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2870e55b1c09SBram Moolenaar
2871e55b1c09SBram Moolenaar  CheckScriptFailure([
2872e55b1c09SBram Moolenaar      'vim9script',
2873e55b1c09SBram Moolenaar      'let v:version = 123',
2874e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2875e55b1c09SBram Moolenaar
2876e55b1c09SBram Moolenaar  CheckScriptFailure([
2877e55b1c09SBram Moolenaar      'vim9script',
2878e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2879e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
28806797966dSBram Moolenaar
28816797966dSBram Moolenaar  CheckScriptFailure([
28826797966dSBram Moolenaar      'vim9script',
28836797966dSBram Moolenaar      'g:var = 123',
288432e35117SBram Moolenaar      'unlet g:var# comment1',
2885d72c1bf0SBram Moolenaar      ], 'E108:')
2886d72c1bf0SBram Moolenaar
2887d72c1bf0SBram Moolenaar  CheckScriptFailure([
2888d72c1bf0SBram Moolenaar      'let g:var = 123',
2889d72c1bf0SBram Moolenaar      'unlet g:var # something',
2890d72c1bf0SBram Moolenaar      ], 'E488:')
2891faac4104SBram Moolenaar
2892faac4104SBram Moolenaar  CheckScriptSuccess([
2893faac4104SBram Moolenaar      'vim9script',
289432e35117SBram Moolenaar      'if 1 # comment2',
2895faac4104SBram Moolenaar      '  echo "yes"',
2896faac4104SBram Moolenaar      'elseif 2 #comment',
2897faac4104SBram Moolenaar      '  echo "no"',
2898faac4104SBram Moolenaar      'endif',
2899faac4104SBram Moolenaar      ])
2900faac4104SBram Moolenaar
2901faac4104SBram Moolenaar  CheckScriptFailure([
2902faac4104SBram Moolenaar      'vim9script',
290332e35117SBram Moolenaar      'if 1# comment3',
2904faac4104SBram Moolenaar      '  echo "yes"',
2905faac4104SBram Moolenaar      'endif',
2906faac4104SBram Moolenaar      ], 'E15:')
2907faac4104SBram Moolenaar
2908faac4104SBram Moolenaar  CheckScriptFailure([
2909faac4104SBram Moolenaar      'vim9script',
291032e35117SBram Moolenaar      'if 0 # comment4',
2911faac4104SBram Moolenaar      '  echo "yes"',
2912faac4104SBram Moolenaar      'elseif 2#comment',
2913faac4104SBram Moolenaar      '  echo "no"',
2914faac4104SBram Moolenaar      'endif',
2915faac4104SBram Moolenaar      ], 'E15:')
2916faac4104SBram Moolenaar
2917faac4104SBram Moolenaar  CheckScriptSuccess([
2918faac4104SBram Moolenaar      'vim9script',
291932e35117SBram Moolenaar      'let v = 1 # comment5',
2920faac4104SBram Moolenaar      ])
2921faac4104SBram Moolenaar
2922faac4104SBram Moolenaar  CheckScriptFailure([
2923faac4104SBram Moolenaar      'vim9script',
292432e35117SBram Moolenaar      'let v = 1# comment6',
292532e35117SBram Moolenaar      ], 'E15:')
2926faac4104SBram Moolenaar
2927faac4104SBram Moolenaar  CheckScriptSuccess([
2928faac4104SBram Moolenaar      'vim9script',
2929faac4104SBram Moolenaar      'new'
2930d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2931df069eecSBram Moolenaar      ':$',
2932faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2933faac4104SBram Moolenaar      'bwipe!',
2934faac4104SBram Moolenaar      ])
2935faac4104SBram Moolenaar
2936f5be8cdbSBram Moolenaar  CheckScriptFailure([
2937f5be8cdbSBram Moolenaar      'vim9script',
2938f5be8cdbSBram Moolenaar      'new'
2939d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2940f5be8cdbSBram Moolenaar      ':$',
2941f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2942f5be8cdbSBram Moolenaar      'bwipe!',
2943f5be8cdbSBram Moolenaar      ], 'E488:')
2944f5be8cdbSBram Moolenaar
2945f5be8cdbSBram Moolenaar  CheckScriptFailure([
2946f5be8cdbSBram Moolenaar      'vim9script',
2947f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2948f5be8cdbSBram Moolenaar      ], 'E477:')
2949a26b9700SBram Moolenaarenddef
2950a26b9700SBram Moolenaar
29517e5bd91dSBram Moolenaardef Test_finish()
29527e5bd91dSBram Moolenaar  let lines =<< trim END
29537e5bd91dSBram Moolenaar    vim9script
29546797966dSBram Moolenaar    g:res = 'one'
29557e5bd91dSBram Moolenaar    if v:false | finish | endif
29566797966dSBram Moolenaar    g:res = 'two'
29577e5bd91dSBram Moolenaar    finish
29586797966dSBram Moolenaar    g:res = 'three'
29597e5bd91dSBram Moolenaar  END
29607e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
29617e5bd91dSBram Moolenaar  source Xfinished
29627e5bd91dSBram Moolenaar  assert_equal('two', g:res)
29637e5bd91dSBram Moolenaar
29647e5bd91dSBram Moolenaar  unlet g:res
29657e5bd91dSBram Moolenaar  delete('Xfinished')
29667e5bd91dSBram Moolenaarenddef
29677e5bd91dSBram Moolenaar
296832e35117SBram Moolenaardef Test_let_func_call()
296932e35117SBram Moolenaar  let lines =<< trim END
297032e35117SBram Moolenaar    vim9script
297132e35117SBram Moolenaar    func GetValue()
297232e35117SBram Moolenaar      if exists('g:count')
297332e35117SBram Moolenaar        let g:count += 1
297432e35117SBram Moolenaar      else
297532e35117SBram Moolenaar        let g:count = 1
297632e35117SBram Moolenaar      endif
297732e35117SBram Moolenaar      return 'this'
297832e35117SBram Moolenaar    endfunc
297932e35117SBram Moolenaar    let val: string = GetValue()
2980f5be8cdbSBram Moolenaar    # env var is always a string
2981df671b46SBram Moolenaar    let env = $TERM
298232e35117SBram Moolenaar  END
298332e35117SBram Moolenaar  writefile(lines, 'Xfinished')
298432e35117SBram Moolenaar  source Xfinished
2985f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
298632e35117SBram Moolenaar  assert_equal(1, g:count)
298732e35117SBram Moolenaar
298832e35117SBram Moolenaar  unlet g:count
298932e35117SBram Moolenaar  delete('Xfinished')
299032e35117SBram Moolenaarenddef
299132e35117SBram Moolenaar
299232e35117SBram Moolenaardef Test_let_missing_type()
299332e35117SBram Moolenaar  let lines =<< trim END
299432e35117SBram Moolenaar    vim9script
2995df671b46SBram Moolenaar    let var = g:unknown
2996227a69deSBram Moolenaar  END
2997822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2998227a69deSBram Moolenaar
2999227a69deSBram Moolenaar  lines =<< trim END
3000227a69deSBram Moolenaar    vim9script
3001227a69deSBram Moolenaar    let nr: number = 123
3002227a69deSBram Moolenaar    let var = nr
3003227a69deSBram Moolenaar  END
3004822ba247SBram Moolenaar  CheckScriptSuccess(lines)
300532e35117SBram Moolenaarenddef
300632e35117SBram Moolenaar
3007c82a5b5dSBram Moolenaardef Test_let_declaration()
3008c82a5b5dSBram Moolenaar  let lines =<< trim END
3009c82a5b5dSBram Moolenaar    vim9script
3010c82a5b5dSBram Moolenaar    let var: string
3011c82a5b5dSBram Moolenaar    g:var_uninit = var
3012c82a5b5dSBram Moolenaar    var = 'text'
3013c82a5b5dSBram Moolenaar    g:var_test = var
3014f5be8cdbSBram Moolenaar    # prefixing s: is optional
3015984dddbeSBram Moolenaar    s:var = 'prefixed'
3016984dddbeSBram Moolenaar    g:var_prefixed = s:var
3017984dddbeSBram Moolenaar
3018984dddbeSBram Moolenaar    let s:other: number
3019984dddbeSBram Moolenaar    other = 1234
3020984dddbeSBram Moolenaar    g:other_var = other
302153b29e48SBram Moolenaar
302253b29e48SBram Moolenaar    # type is inferred
302353b29e48SBram Moolenaar    s:dict = {'a': 222}
302453b29e48SBram Moolenaar    def GetDictVal(key: any)
302553b29e48SBram Moolenaar      g:dict_val = s:dict[key]
302653b29e48SBram Moolenaar    enddef
302753b29e48SBram Moolenaar    GetDictVal('a')
3028c82a5b5dSBram Moolenaar  END
3029c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
3030c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
3031c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
3032984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
3033984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
303453b29e48SBram Moolenaar  assert_equal(222, g:dict_val)
3035c82a5b5dSBram Moolenaar
3036c82a5b5dSBram Moolenaar  unlet g:var_uninit
3037c82a5b5dSBram Moolenaar  unlet g:var_test
3038984dddbeSBram Moolenaar  unlet g:var_prefixed
3039984dddbeSBram Moolenaar  unlet g:other_var
3040c82a5b5dSBram Moolenaarenddef
3041c82a5b5dSBram Moolenaar
3042c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
3043c5b1c20bSBram Moolenaar  let lines =<< trim END
3044c5b1c20bSBram Moolenaar    vim9script
3045c5b1c20bSBram Moolenaar    const var: string
3046c5b1c20bSBram Moolenaar  END
3047c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
3048c5b1c20bSBram Moolenaar
3049c5b1c20bSBram Moolenaar  lines =<< trim END
3050c5b1c20bSBram Moolenaar    vim9script
3051c5b1c20bSBram Moolenaar    let 9var: string
3052c5b1c20bSBram Moolenaar  END
3053c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
3054c5b1c20bSBram Moolenaarenddef
3055c5b1c20bSBram Moolenaar
305634db91f7SBram Moolenaardef Test_let_type_check()
305734db91f7SBram Moolenaar  let lines =<< trim END
305834db91f7SBram Moolenaar    vim9script
305934db91f7SBram Moolenaar    let var: string
306034db91f7SBram Moolenaar    var = 1234
306134db91f7SBram Moolenaar  END
3062451c2e35SBram Moolenaar  CheckScriptFailure(lines, 'E1012:')
3063984dddbeSBram Moolenaar
3064984dddbeSBram Moolenaar  lines =<< trim END
3065984dddbeSBram Moolenaar    vim9script
3066984dddbeSBram Moolenaar    let var:string
3067984dddbeSBram Moolenaar  END
3068984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
3069c5b1c20bSBram Moolenaar
3070c5b1c20bSBram Moolenaar  lines =<< trim END
3071c5b1c20bSBram Moolenaar    vim9script
3072c5b1c20bSBram Moolenaar    let var: asdf
3073c5b1c20bSBram Moolenaar  END
3074c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
3075a71e2633SBram Moolenaar
3076a71e2633SBram Moolenaar  lines =<< trim END
3077a71e2633SBram Moolenaar    vim9script
3078a71e2633SBram Moolenaar    let s:l: list<number>
3079a71e2633SBram Moolenaar    s:l = []
3080a71e2633SBram Moolenaar  END
3081a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
3082a71e2633SBram Moolenaar
3083a71e2633SBram Moolenaar  lines =<< trim END
3084a71e2633SBram Moolenaar    vim9script
3085a71e2633SBram Moolenaar    let s:d: dict<number>
3086a71e2633SBram Moolenaar    s:d = {}
3087a71e2633SBram Moolenaar  END
3088a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
308934db91f7SBram Moolenaarenddef
309034db91f7SBram Moolenaar
3091a5d0077eSBram Moolenaardef Test_forward_declaration()
3092a5d0077eSBram Moolenaar  let lines =<< trim END
3093a5d0077eSBram Moolenaar    vim9script
3094a5d0077eSBram Moolenaar    def GetValue(): string
3095a5d0077eSBram Moolenaar      return theVal
3096a5d0077eSBram Moolenaar    enddef
3097a5d0077eSBram Moolenaar    let theVal = 'something'
3098822ba247SBram Moolenaar    g:initVal = GetValue()
3099a5d0077eSBram Moolenaar    theVal = 'else'
3100a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3101a5d0077eSBram Moolenaar  END
3102a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3103a5d0077eSBram Moolenaar  source Xforward
3104a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3105a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3106a5d0077eSBram Moolenaar
3107a5d0077eSBram Moolenaar  unlet g:initVal
3108a5d0077eSBram Moolenaar  unlet g:laterVal
3109a5d0077eSBram Moolenaar  delete('Xforward')
3110a5d0077eSBram Moolenaarenddef
3111a5d0077eSBram Moolenaar
31129721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
31139721fb4eSBram Moolenaar  let legacy_lines =<< trim END
31149721fb4eSBram Moolenaar    source Xvim9_script.vim
31159721fb4eSBram Moolenaar
31169721fb4eSBram Moolenaar    call assert_false(exists('local'))
31179721fb4eSBram Moolenaar    call assert_false(exists('exported'))
31189721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
31199721fb4eSBram Moolenaar    call assert_equal('global', global)
31209721fb4eSBram Moolenaar    call assert_equal('global', g:global)
31219721fb4eSBram Moolenaar
31229721fb4eSBram Moolenaar    " imported variable becomes script-local
31239721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
31249721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
31259721fb4eSBram Moolenaar    call assert_false(exists('exported'))
31269721fb4eSBram Moolenaar
31279721fb4eSBram Moolenaar    " imported function becomes script-local
31289721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
31299721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
31309721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
31319721fb4eSBram Moolenaar  END
31329721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
31339721fb4eSBram Moolenaar
31349721fb4eSBram Moolenaar  let vim9_lines =<< trim END
31359721fb4eSBram Moolenaar    vim9script
31369721fb4eSBram Moolenaar    let local = 'local'
31379721fb4eSBram Moolenaar    g:global = 'global'
31389721fb4eSBram Moolenaar    export let exported = 'exported'
31399721fb4eSBram Moolenaar    export def GetText(): string
31409721fb4eSBram Moolenaar       return 'text'
31419721fb4eSBram Moolenaar    enddef
31429721fb4eSBram Moolenaar  END
31439721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
31449721fb4eSBram Moolenaar
31459721fb4eSBram Moolenaar  source Xlegacy_script.vim
31469721fb4eSBram Moolenaar
31479721fb4eSBram Moolenaar  assert_equal('global', g:global)
3148f5be8cdbSBram Moolenaar  unlet g:global
31499721fb4eSBram Moolenaar
31509721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
31519721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
31529721fb4eSBram Moolenaarenddef
3153a5d0077eSBram Moolenaar
31547d699701SBram Moolenaarfunc Test_vim9script_not_global()
31557d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
31567d699701SBram Moolenaar  let vim9lines =<< trim END
31577d699701SBram Moolenaar    vim9script
31587d699701SBram Moolenaar    let var = 'local'
31597d699701SBram Moolenaar    func TheFunc()
31607d699701SBram Moolenaar      echo 'local'
31617d699701SBram Moolenaar    endfunc
31627d699701SBram Moolenaar    def DefFunc()
31637d699701SBram Moolenaar      echo 'local'
31647d699701SBram Moolenaar    enddef
31657d699701SBram Moolenaar  END
31667d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
31677d699701SBram Moolenaar  source Xvim9script.vim
31687d699701SBram Moolenaar  try
31697d699701SBram Moolenaar    echo g:var
31707d699701SBram Moolenaar    assert_report('did not fail')
31717d699701SBram Moolenaar  catch /E121:/
31727d699701SBram Moolenaar    " caught
31737d699701SBram Moolenaar  endtry
31747d699701SBram Moolenaar  try
31757d699701SBram Moolenaar    call TheFunc()
31767d699701SBram Moolenaar    assert_report('did not fail')
31777d699701SBram Moolenaar  catch /E117:/
31787d699701SBram Moolenaar    " caught
31797d699701SBram Moolenaar  endtry
31807d699701SBram Moolenaar  try
31817d699701SBram Moolenaar    call DefFunc()
31827d699701SBram Moolenaar    assert_report('did not fail')
31837d699701SBram Moolenaar  catch /E117:/
31847d699701SBram Moolenaar    " caught
31857d699701SBram Moolenaar  endtry
31867d699701SBram Moolenaar
318725859dd7SBram Moolenaar  call delete('Xvim9script.vim')
31887d699701SBram Moolenaarendfunc
31897d699701SBram Moolenaar
3190eeb27bfeSBram Moolenaardef Test_vim9_copen()
3191eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3192eeb27bfeSBram Moolenaar  copen
3193eeb27bfeSBram Moolenaar  quit
3194eeb27bfeSBram Moolenaarenddef
3195eeb27bfeSBram Moolenaar
31962d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
31972d6b20d6SBram Moolenaardef Test_vim9_autoload()
31982d6b20d6SBram Moolenaar  let lines =<< trim END
31992d6b20d6SBram Moolenaar     vim9script
32002d6b20d6SBram Moolenaar     def foo#test()
32012d6b20d6SBram Moolenaar         echomsg getreg('"')
32022d6b20d6SBram Moolenaar     enddef
32032d6b20d6SBram Moolenaar  END
32042d6b20d6SBram Moolenaar
32052d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
32062d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
32072d6b20d6SBram Moolenaar  let save_rtp = &rtp
32082d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
32092d6b20d6SBram Moolenaar  augroup test
32102d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
32112d6b20d6SBram Moolenaar  augroup END
32122d6b20d6SBram Moolenaar
32132d6b20d6SBram Moolenaar  normal Y
32142d6b20d6SBram Moolenaar
32152d6b20d6SBram Moolenaar  augroup test
32162d6b20d6SBram Moolenaar    autocmd!
32172d6b20d6SBram Moolenaar  augroup END
32182d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
32192d6b20d6SBram Moolenaar  &rtp = save_rtp
32202d6b20d6SBram Moolenaarenddef
32212d6b20d6SBram Moolenaar
322281e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
322381e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
322481e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
322581e17fbeSBram Moolenaar  let lines =<< trim END
322681e17fbeSBram Moolenaar    let s:counter = 1
322781e17fbeSBram Moolenaar    def s:Func()
322881e17fbeSBram Moolenaar      au! CursorHold
322981e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
323081e17fbeSBram Moolenaar    enddef
323181e17fbeSBram Moolenaar    call s:Func()
323281e17fbeSBram Moolenaar    doau CursorHold
323381e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
323481e17fbeSBram Moolenaar    au! CursorHold
323581e17fbeSBram Moolenaar  END
323681e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
323781e17fbeSBram Moolenaarenddef
323881e17fbeSBram Moolenaar
32393896a105SBram Moolenaardef Test_cmdline_win()
32403896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
32413896a105SBram Moolenaar  # the command line window.
32423896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
32433896a105SBram Moolenaar  let export_lines =<< trim END
32443896a105SBram Moolenaar    vim9script
32453896a105SBram Moolenaar    export let That = 'yes'
32463896a105SBram Moolenaar  END
32473896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
32483896a105SBram Moolenaar  let import_lines =<< trim END
32493896a105SBram Moolenaar    vim9script
32503896a105SBram Moolenaar    import That from './Xexport.vim'
32513896a105SBram Moolenaar  END
32523896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
32533896a105SBram Moolenaar  let save_rtp = &rtp
32543896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
32553896a105SBram Moolenaar  syntax on
32563896a105SBram Moolenaar  augroup CmdWin
32573896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
32583896a105SBram Moolenaar  augroup END
32593896a105SBram Moolenaar  # this will open and also close the cmdline window
32603896a105SBram Moolenaar  feedkeys('q:', 'xt')
32613896a105SBram Moolenaar  assert_equal('yes', g:got_there)
32623896a105SBram Moolenaar
32633896a105SBram Moolenaar  augroup CmdWin
32643896a105SBram Moolenaar    au!
32653896a105SBram Moolenaar  augroup END
32663896a105SBram Moolenaar  &rtp = save_rtp
32673896a105SBram Moolenaar  delete('rtp', 'rf')
32683896a105SBram Moolenaarenddef
32693896a105SBram Moolenaar
3270e3d4685fSBram Moolenaardef Test_invalid_sid()
3271e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
327225859dd7SBram Moolenaar
3273e3d4685fSBram Moolenaar  if RunVim([], ['wq Xdidit'], '+"func <SNR>1_func"')
3274d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3275e3d4685fSBram Moolenaar  endif
3276e3d4685fSBram Moolenaar  delete('Xdidit')
3277e3d4685fSBram Moolenaarenddef
3278e3d4685fSBram Moolenaar
3279585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3280585fea7bSBram Moolenaardef Test_substitute_cmd()
3281585fea7bSBram Moolenaar  new
3282585fea7bSBram Moolenaar  setline(1, 'something')
3283585fea7bSBram Moolenaar  :substitute(some(other(
3284585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3285585fea7bSBram Moolenaar  bwipe!
3286585fea7bSBram Moolenaar
3287f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3288585fea7bSBram Moolenaar  let lines =<< trim END
3289585fea7bSBram Moolenaar    vim9script
3290585fea7bSBram Moolenaar    new
3291585fea7bSBram Moolenaar    setline(1, 'something')
3292585fea7bSBram Moolenaar    :substitute(some(other(
3293585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3294585fea7bSBram Moolenaar    bwipe!
3295585fea7bSBram Moolenaar  END
3296585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3297585fea7bSBram Moolenaar  source Xvim9lines
3298585fea7bSBram Moolenaar
3299585fea7bSBram Moolenaar  delete('Xvim9lines')
3300585fea7bSBram Moolenaarenddef
3301585fea7bSBram Moolenaar
33028a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3303