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
48f93c7feaSBram Moolenaar  call CheckDefFailure(['let x:string'], 'E1069:')
49f93c7feaSBram Moolenaar  call CheckDefFailure(['let x:string = "x"'], 'E1069:')
501cc2a94fSBram Moolenaar  call CheckDefFailure(['let a:string = "x"'], 'E1069:')
5198b4f145SBram Moolenaar  call CheckDefFailure(['let lambda = {-> "lambda"}'], 'E704:')
52f93c7feaSBram Moolenaar
534cdb13ceSBram Moolenaar  let nr: number = 1234
54451c2e35SBram Moolenaar  call CheckDefFailure(['let nr: number = "asdf"'], 'E1012:')
554cdb13ceSBram Moolenaar
56b209750bSBram Moolenaar  let a: number = 6 #comment
579be61bbbSBram Moolenaar  assert_equal(6, a)
589be61bbbSBram Moolenaar
5942a480bfSBram Moolenaar  if has('channel')
6042a480bfSBram Moolenaar    let chan1: channel
61fbdd08edSBram Moolenaar    let job1: job
62f51cb4e0SBram Moolenaar    let job2: job = job_start('willfail')
6342a480bfSBram Moolenaar  endif
64fbdd08edSBram Moolenaar  if has('float')
65fbdd08edSBram Moolenaar    let float1: float = 3.4
66fbdd08edSBram Moolenaar  endif
675deeb3f1SBram Moolenaar  let Funky1: func
685deeb3f1SBram Moolenaar  let Funky2: func = function('len')
694c17ad94SBram Moolenaar  let Party2: func = funcref('g:Test_syntax')
7042a480bfSBram Moolenaar
71b209750bSBram Moolenaar  g:newvar = 'new'  #comment
72401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
73401d9ffbSBram Moolenaar
74401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
75401d9ffbSBram Moolenaar  g:existing = 'no'
76401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
77401d9ffbSBram Moolenaar
78b283a8a6SBram Moolenaar  v:char = 'abc'
796e587dcbSBram Moolenaar  assert_equal('abc', v:char)
80b283a8a6SBram Moolenaar
81b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
826e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
83b283a8a6SBram Moolenaar  $ENVVAR = ''
846e587dcbSBram Moolenaar
85b5ed2660SBram Moolenaar  let lines =<< trim END
86b5ed2660SBram Moolenaar    vim9script
87b5ed2660SBram Moolenaar    $ENVVAR = 'barfoo'
88b5ed2660SBram Moolenaar    assert_equal('barfoo', $ENVVAR)
89b5ed2660SBram Moolenaar    $ENVVAR = ''
90b5ed2660SBram Moolenaar  END
91b5ed2660SBram Moolenaar  call CheckScriptSuccess(lines)
92b5ed2660SBram Moolenaar
93fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
94fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
95fd1823e0SBram Moolenaar  s:addToMe += 222
96fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
970bbf722aSBram Moolenaar  s:newVar = 'new'
980bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
99a8c17704SBram Moolenaar
100a8c17704SBram Moolenaar  set ts=7
101a8c17704SBram Moolenaar  &ts += 1
102a8c17704SBram Moolenaar  assert_equal(8, &ts)
10380c34ca3SBram Moolenaar  &ts -= 3
10480c34ca3SBram Moolenaar  assert_equal(5, &ts)
10580c34ca3SBram Moolenaar  &ts *= 2
10680c34ca3SBram Moolenaar  assert_equal(10, &ts)
10780c34ca3SBram Moolenaar  &ts /= 3
10880c34ca3SBram Moolenaar  assert_equal(3, &ts)
10980c34ca3SBram Moolenaar  set ts=10
11080c34ca3SBram Moolenaar  &ts %= 4
11180c34ca3SBram Moolenaar  assert_equal(2, &ts)
112b5ed2660SBram Moolenaar
11393ad1471SBram Moolenaar  if has('float')
11493ad1471SBram Moolenaar    let f100: float = 100.0
11593ad1471SBram Moolenaar    f100 /= 5
11693ad1471SBram Moolenaar    assert_equal(20.0, f100)
11793ad1471SBram Moolenaar
11893ad1471SBram Moolenaar    let f200: float = 200.0
11993ad1471SBram Moolenaar    f200 /= 5.0
12093ad1471SBram Moolenaar    assert_equal(40.0, f200)
12193ad1471SBram Moolenaar
12293ad1471SBram Moolenaar    CheckDefFailure(['let nr: number = 200', 'nr /= 5.0'], 'E1012:')
12393ad1471SBram Moolenaar  endif
12493ad1471SBram Moolenaar
125b5ed2660SBram Moolenaar  lines =<< trim END
126b5ed2660SBram Moolenaar    &ts = 6
127b5ed2660SBram Moolenaar    &ts += 3
128b5ed2660SBram Moolenaar    assert_equal(9, &ts)
1292e800955SBram Moolenaar
1302e800955SBram Moolenaar    &l:ts = 6
1312e800955SBram Moolenaar    assert_equal(6, &ts)
1322e800955SBram Moolenaar    &l:ts += 2
1332e800955SBram Moolenaar    assert_equal(8, &ts)
1342e800955SBram Moolenaar
1352e800955SBram Moolenaar    &g:ts = 6
1362e800955SBram Moolenaar    assert_equal(6, &g:ts)
1372e800955SBram Moolenaar    &g:ts += 2
1382e800955SBram Moolenaar    assert_equal(8, &g:ts)
139b5ed2660SBram Moolenaar  END
1402e800955SBram Moolenaar  CheckDefAndScriptSuccess(lines)
141b5ed2660SBram Moolenaar
1420aae4809SBram Moolenaar  CheckDefFailure(['&notex += 3'], 'E113:')
1430aae4809SBram Moolenaar  CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
1440aae4809SBram Moolenaar  CheckDefFailure(['&ts = [7]'], 'E1012:')
1450aae4809SBram Moolenaar  CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list')
1460aae4809SBram Moolenaar  CheckDefFailure(['&ts = "xx"'], 'E1012:')
1470aae4809SBram Moolenaar  CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string')
1480aae4809SBram Moolenaar  CheckDefFailure(['&path += 3'], 'E1012:')
1490aae4809SBram Moolenaar  CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
150cb711abfSBram Moolenaar  # test freeing ISN_STOREOPT
1510aae4809SBram Moolenaar  CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
15280c34ca3SBram Moolenaar  &ts = 8
153a8c17704SBram Moolenaar
1540aae4809SBram Moolenaar  lines =<< trim END
1550aae4809SBram Moolenaar    let save_TI = &t_TI
1560aae4809SBram Moolenaar    &t_TI = ''
1570aae4809SBram Moolenaar    assert_equal('', &t_TI)
1580aae4809SBram Moolenaar    &t_TI = 'xxx'
1590aae4809SBram Moolenaar    assert_equal('xxx', &t_TI)
1600aae4809SBram Moolenaar    &t_TI = save_TI
1610aae4809SBram Moolenaar  END
1620aae4809SBram Moolenaar  CheckDefSuccess(lines)
1630aae4809SBram Moolenaar  CheckScriptSuccess(['vim9script'] + lines)
1640aae4809SBram Moolenaar
1650aae4809SBram Moolenaar  CheckDefFailure(['&t_TI = 123'], 'E1012:')
1660aae4809SBram Moolenaar  CheckScriptFailure(['vim9script', '&t_TI = 123'], 'E928:')
1670aae4809SBram Moolenaar
1680aae4809SBram Moolenaar  CheckDefFailure(['let s:var = 123'], 'E1101:')
1690aae4809SBram Moolenaar  CheckDefFailure(['let s:var: number'], 'E1101:')
17033afa244SBram Moolenaar
171f9b2b496SBram Moolenaar  lines =<< trim END
172f9b2b496SBram Moolenaar    vim9script
173f9b2b496SBram Moolenaar    def SomeFunc()
174f9b2b496SBram Moolenaar      s:var = 123
175f9b2b496SBram Moolenaar    enddef
176f9b2b496SBram Moolenaar    defcompile
177f9b2b496SBram Moolenaar  END
178f9b2b496SBram Moolenaar  call CheckScriptFailure(lines, 'E1089:')
179f9b2b496SBram Moolenaar
180a8c17704SBram Moolenaar  g:inc_counter += 1
181a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
182a8c17704SBram Moolenaar
183a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
184a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
185dd29f1b0SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1051:')
186451c2e35SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1012:')
187a8c17704SBram Moolenaar
188b5ed2660SBram Moolenaar  lines =<< trim END
189b5ed2660SBram Moolenaar    @c = 'areg'
190b5ed2660SBram Moolenaar    @c ..= 'add'
191b5ed2660SBram Moolenaar    assert_equal('aregadd', @c)
192b5ed2660SBram Moolenaar  END
1932e800955SBram Moolenaar  CheckDefAndScriptSuccess(lines)
1942e800955SBram Moolenaar
1952e800955SBram Moolenaar  call CheckDefFailure(['@a += "more"'], 'E1051:')
1962e800955SBram Moolenaar  call CheckDefFailure(['@a += 123'], 'E1012:')
197b5ed2660SBram Moolenaar
198e69f6d04SBram Moolenaar  v:errmsg = 'none'
199e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
200e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
201dd29f1b0SBram Moolenaar  call CheckDefFailure(['v:errmsg += "more"'], 'E1051:')
202451c2e35SBram Moolenaar  call CheckDefFailure(['v:errmsg += 123'], 'E1012:')
20333afa244SBram Moolenaar
20433afa244SBram Moolenaar  # single letter variables
20533afa244SBram Moolenaar  a = 123
20633afa244SBram Moolenaar  assert_equal(123, a)
20733afa244SBram Moolenaar  let b: number
20833afa244SBram Moolenaar  b = 123
20933afa244SBram Moolenaar  assert_equal(123, b)
21033afa244SBram Moolenaar  let g: number
21133afa244SBram Moolenaar  g = 123
21233afa244SBram Moolenaar  assert_equal(123, g)
21333afa244SBram Moolenaar  let s: number
21433afa244SBram Moolenaar  s = 123
21533afa244SBram Moolenaar  assert_equal(123, s)
21633afa244SBram Moolenaar  let t: number
21733afa244SBram Moolenaar  t = 123
21833afa244SBram Moolenaar  assert_equal(123, t)
21933afa244SBram Moolenaar  let v: number
22033afa244SBram Moolenaar  v = 123
22133afa244SBram Moolenaar  assert_equal(123, v)
22233afa244SBram Moolenaar  let w: number
22333afa244SBram Moolenaar  w = 123
22433afa244SBram Moolenaar  assert_equal(123, w)
2255deeb3f1SBram Moolenaarenddef
2265deeb3f1SBram Moolenaar
2273b74b6b4SBram Moolenaardef Test_vim9_single_char_vars()
2283b74b6b4SBram Moolenaar  let lines =<< trim END
2293b74b6b4SBram Moolenaar      vim9script
2303b74b6b4SBram Moolenaar
231f5be8cdbSBram Moolenaar      # single character variable declarations work
2323b74b6b4SBram Moolenaar      let a: string
2333b74b6b4SBram Moolenaar      let b: number
2343b74b6b4SBram Moolenaar      let l: list<any>
2353b74b6b4SBram Moolenaar      let s: string
2363b74b6b4SBram Moolenaar      let t: number
2373b74b6b4SBram Moolenaar      let v: number
2383b74b6b4SBram Moolenaar      let w: number
2393b74b6b4SBram Moolenaar
240f5be8cdbSBram Moolenaar      # script-local variables can be used without s: prefix
2413b74b6b4SBram Moolenaar      a = 'script-a'
2423b74b6b4SBram Moolenaar      b = 111
2433b74b6b4SBram Moolenaar      l = [1, 2, 3]
2443b74b6b4SBram Moolenaar      s = 'script-s'
2453b74b6b4SBram Moolenaar      t = 222
2463b74b6b4SBram Moolenaar      v = 333
2473b74b6b4SBram Moolenaar      w = 444
2483b74b6b4SBram Moolenaar
2493b74b6b4SBram Moolenaar      assert_equal('script-a', a)
2503b74b6b4SBram Moolenaar      assert_equal(111, b)
2513b74b6b4SBram Moolenaar      assert_equal([1, 2, 3], l)
2523b74b6b4SBram Moolenaar      assert_equal('script-s', s)
2533b74b6b4SBram Moolenaar      assert_equal(222, t)
2543b74b6b4SBram Moolenaar      assert_equal(333, v)
2553b74b6b4SBram Moolenaar      assert_equal(444, w)
2563b74b6b4SBram Moolenaar  END
2573b74b6b4SBram Moolenaar  writefile(lines, 'Xsinglechar')
2583b74b6b4SBram Moolenaar  source Xsinglechar
2593b74b6b4SBram Moolenaar  delete('Xsinglechar')
2603b74b6b4SBram Moolenaarenddef
2613b74b6b4SBram Moolenaar
26284370087SBram Moolenaardef Test_assignment_list()
26384370087SBram Moolenaar  let list1: list<bool> = [false, true, false]
26484370087SBram Moolenaar  let list2: list<number> = [1, 2, 3]
26584370087SBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
26684370087SBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
26784370087SBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
26884370087SBram Moolenaar
26984370087SBram Moolenaar  let listS: list<string> = []
27084370087SBram Moolenaar  let listN: list<number> = []
27184370087SBram Moolenaar
27284370087SBram Moolenaar  assert_equal([1, 2, 3], list2)
27384370087SBram Moolenaar  list2[-1] = 99
27484370087SBram Moolenaar  assert_equal([1, 2, 99], list2)
27584370087SBram Moolenaar  list2[-2] = 88
27684370087SBram Moolenaar  assert_equal([1, 88, 99], list2)
27784370087SBram Moolenaar  list2[-3] = 77
27884370087SBram Moolenaar  assert_equal([77, 88, 99], list2)
279dd29f1b0SBram Moolenaar  list2 += [100]
280dd29f1b0SBram Moolenaar  assert_equal([77, 88, 99, 100], list2)
281dd29f1b0SBram Moolenaar
282dd29f1b0SBram Moolenaar  list3 += ['end']
283dd29f1b0SBram Moolenaar  assert_equal(['sdf', 'asdf', 'end'], list3)
284dd29f1b0SBram Moolenaar
285dd29f1b0SBram Moolenaar
28684370087SBram Moolenaar  call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
287c5b1c20bSBram Moolenaar  call CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:')
28884370087SBram Moolenaar
28984370087SBram Moolenaar  # type becomes list<any>
29084370087SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
29184370087SBram Moolenaarenddef
29284370087SBram Moolenaar
293b31be3f9SBram Moolenaardef Test_assignment_list_vim9script()
294b31be3f9SBram Moolenaar  let lines =<< trim END
295b31be3f9SBram Moolenaar    vim9script
296b31be3f9SBram Moolenaar    let v1: number
297b31be3f9SBram Moolenaar    let v2: number
298b31be3f9SBram Moolenaar    let v3: number
299b31be3f9SBram Moolenaar    [v1, v2, v3] = [1, 2, 3]
300b31be3f9SBram Moolenaar    assert_equal([1, 2, 3], [v1, v2, v3])
301b31be3f9SBram Moolenaar  END
302b31be3f9SBram Moolenaar  call CheckScriptSuccess(lines)
303b31be3f9SBram Moolenaarenddef
304b31be3f9SBram Moolenaar
30584370087SBram Moolenaardef Test_assignment_dict()
30684370087SBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
30784370087SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
30884370087SBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
30984370087SBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
31074fae513SBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, two: 0z02}
31184370087SBram Moolenaar
312f5be8cdbSBram Moolenaar  # overwrite
313c785b9a7SBram Moolenaar  dict3['key'] = 'another'
314c785b9a7SBram Moolenaar
31558626872SBram Moolenaar  # empty key can be used
31658626872SBram Moolenaar  let dd = {}
31758626872SBram Moolenaar  dd[""] = 6
31858626872SBram Moolenaar  assert_equal({'': 6}, dd)
31984370087SBram Moolenaar
32084370087SBram Moolenaar  # type becomes dict<any>
32184370087SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
3228e4c8c85SBram Moolenaar
3238e4c8c85SBram Moolenaar  # assignment to script-local dict
3248e4c8c85SBram Moolenaar  let lines =<< trim END
3258e4c8c85SBram Moolenaar    vim9script
3268e4c8c85SBram Moolenaar    let test: dict<any> = {}
3278e4c8c85SBram Moolenaar    def FillDict(): dict<any>
3288e4c8c85SBram Moolenaar      test['a'] = 43
3298e4c8c85SBram Moolenaar      return test
3308e4c8c85SBram Moolenaar    enddef
3318e4c8c85SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3328e4c8c85SBram Moolenaar  END
3338e4c8c85SBram Moolenaar  call CheckScriptSuccess(lines)
3348e4c8c85SBram Moolenaar
3358e4c8c85SBram Moolenaar  lines =<< trim END
3368e4c8c85SBram Moolenaar    vim9script
3378e4c8c85SBram Moolenaar    let test: dict<any>
3388e4c8c85SBram Moolenaar    def FillDict(): dict<any>
3398e4c8c85SBram Moolenaar      test['a'] = 43
3408e4c8c85SBram Moolenaar      return test
3418e4c8c85SBram Moolenaar    enddef
3428e4c8c85SBram Moolenaar    FillDict()
3438e4c8c85SBram Moolenaar  END
3448e4c8c85SBram Moolenaar  call CheckScriptFailure(lines, 'E1103:')
3452caa1594SBram Moolenaar
3462caa1594SBram Moolenaar  # assignment to global dict
3472caa1594SBram Moolenaar  lines =<< trim END
3482caa1594SBram Moolenaar    vim9script
3492caa1594SBram Moolenaar    g:test = {}
3502caa1594SBram Moolenaar    def FillDict(): dict<any>
3512caa1594SBram Moolenaar      g:test['a'] = 43
3522caa1594SBram Moolenaar      return g:test
3532caa1594SBram Moolenaar    enddef
3542caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3552caa1594SBram Moolenaar  END
3562caa1594SBram Moolenaar  call CheckScriptSuccess(lines)
3572caa1594SBram Moolenaar
3582caa1594SBram Moolenaar  # assignment to buffer dict
3592caa1594SBram Moolenaar  lines =<< trim END
3602caa1594SBram Moolenaar    vim9script
3612caa1594SBram Moolenaar    b:test = {}
3622caa1594SBram Moolenaar    def FillDict(): dict<any>
3632caa1594SBram Moolenaar      b:test['a'] = 43
3642caa1594SBram Moolenaar      return b:test
3652caa1594SBram Moolenaar    enddef
3662caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3672caa1594SBram Moolenaar  END
3682caa1594SBram Moolenaar  call CheckScriptSuccess(lines)
36984370087SBram Moolenaarenddef
37084370087SBram Moolenaar
371d3aac291SBram Moolenaardef Test_assignment_local()
372f5be8cdbSBram Moolenaar  # Test in a separated file in order not to the current buffer/window/tab is
373f5be8cdbSBram Moolenaar  # changed.
374d3aac291SBram Moolenaar  let script_lines: list<string> =<< trim END
375d3aac291SBram Moolenaar    let b:existing = 'yes'
376d3aac291SBram Moolenaar    let w:existing = 'yes'
377d3aac291SBram Moolenaar    let t:existing = 'yes'
378d3aac291SBram Moolenaar
379d3aac291SBram Moolenaar    def Test_assignment_local_internal()
380d3aac291SBram Moolenaar      b:newvar = 'new'
381d3aac291SBram Moolenaar      assert_equal('new', b:newvar)
382d3aac291SBram Moolenaar      assert_equal('yes', b:existing)
383d3aac291SBram Moolenaar      b:existing = 'no'
384d3aac291SBram Moolenaar      assert_equal('no', b:existing)
385396f3138SBram Moolenaar      b:existing ..= 'NO'
386396f3138SBram Moolenaar      assert_equal('noNO', b:existing)
387d3aac291SBram Moolenaar
388d3aac291SBram Moolenaar      w:newvar = 'new'
389d3aac291SBram Moolenaar      assert_equal('new', w:newvar)
390d3aac291SBram Moolenaar      assert_equal('yes', w:existing)
391d3aac291SBram Moolenaar      w:existing = 'no'
392d3aac291SBram Moolenaar      assert_equal('no', w:existing)
393396f3138SBram Moolenaar      w:existing ..= 'NO'
394396f3138SBram Moolenaar      assert_equal('noNO', w:existing)
395d3aac291SBram Moolenaar
396d3aac291SBram Moolenaar      t:newvar = 'new'
397d3aac291SBram Moolenaar      assert_equal('new', t:newvar)
398d3aac291SBram Moolenaar      assert_equal('yes', t:existing)
399d3aac291SBram Moolenaar      t:existing = 'no'
400d3aac291SBram Moolenaar      assert_equal('no', t:existing)
401396f3138SBram Moolenaar      t:existing ..= 'NO'
402396f3138SBram Moolenaar      assert_equal('noNO', t:existing)
403d3aac291SBram Moolenaar    enddef
404d3aac291SBram Moolenaar    call Test_assignment_local_internal()
405d3aac291SBram Moolenaar  END
406d3aac291SBram Moolenaar  call CheckScriptSuccess(script_lines)
407d3aac291SBram Moolenaarenddef
408d3aac291SBram Moolenaar
4095deeb3f1SBram Moolenaardef Test_assignment_default()
410e69f6d04SBram Moolenaar
411cb711abfSBram Moolenaar  # Test default values.
412e69f6d04SBram Moolenaar  let thebool: bool
413e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
414e69f6d04SBram Moolenaar
415e69f6d04SBram Moolenaar  let thenumber: number
416e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
417e69f6d04SBram Moolenaar
418e69f6d04SBram Moolenaar  if has('float')
419e69f6d04SBram Moolenaar    let thefloat: float
420e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
421e69f6d04SBram Moolenaar  endif
422e69f6d04SBram Moolenaar
423e69f6d04SBram Moolenaar  let thestring: string
424e69f6d04SBram Moolenaar  assert_equal('', thestring)
425e69f6d04SBram Moolenaar
426e69f6d04SBram Moolenaar  let theblob: blob
427e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
428e69f6d04SBram Moolenaar
4295deeb3f1SBram Moolenaar  let Thefunc: func
4305deeb3f1SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
431e69f6d04SBram Moolenaar
432e69f6d04SBram Moolenaar  let thelist: list<any>
433e69f6d04SBram Moolenaar  assert_equal([], thelist)
434e69f6d04SBram Moolenaar
435e69f6d04SBram Moolenaar  let thedict: dict<any>
436e69f6d04SBram Moolenaar  assert_equal({}, thedict)
437e69f6d04SBram Moolenaar
4382c869deeSBram Moolenaar  if has('channel')
439e69f6d04SBram Moolenaar    let thejob: job
440e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
441e69f6d04SBram Moolenaar
442e69f6d04SBram Moolenaar    let thechannel: channel
443e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
444c785b9a7SBram Moolenaar
445c785b9a7SBram Moolenaar    if has('unix') && executable('cat')
446f5be8cdbSBram Moolenaar      # check with non-null job and channel, types must match
447c785b9a7SBram Moolenaar      thejob = job_start("cat ", #{})
448c785b9a7SBram Moolenaar      thechannel = job_getchannel(thejob)
449c785b9a7SBram Moolenaar      job_stop(thejob, 'kill')
450c785b9a7SBram Moolenaar    endif
4512c869deeSBram Moolenaar  endif
452585fea7bSBram Moolenaar
453585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
454585fea7bSBram Moolenaar  assert_equal(5678, nr)
4558a7d6542SBram Moolenaarenddef
4568a7d6542SBram Moolenaar
45747a519a9SBram Moolenaardef Test_assignment_var_list()
45847a519a9SBram Moolenaar  let v1: string
45947a519a9SBram Moolenaar  let v2: string
4609af78769SBram Moolenaar  let vrem: list<string>
4619af78769SBram Moolenaar  [v1] = ['aaa']
4629af78769SBram Moolenaar  assert_equal('aaa', v1)
4639af78769SBram Moolenaar
46447a519a9SBram Moolenaar  [v1, v2] = ['one', 'two']
46547a519a9SBram Moolenaar  assert_equal('one', v1)
46647a519a9SBram Moolenaar  assert_equal('two', v2)
4679af78769SBram Moolenaar
4689af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two']
4699af78769SBram Moolenaar  assert_equal('one', v1)
4709af78769SBram Moolenaar  assert_equal('two', v2)
4719af78769SBram Moolenaar  assert_equal([], vrem)
4729af78769SBram Moolenaar
4739af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two', 'three']
4749af78769SBram Moolenaar  assert_equal('one', v1)
4759af78769SBram Moolenaar  assert_equal('two', v2)
4769af78769SBram Moolenaar  assert_equal(['three'], vrem)
4771c199f9cSBram Moolenaar
4781c199f9cSBram Moolenaar  [&ts, &sw] = [3, 4]
4791c199f9cSBram Moolenaar  assert_equal(3, &ts)
4801c199f9cSBram Moolenaar  assert_equal(4, &sw)
4811c199f9cSBram Moolenaar  set ts=8 sw=4
48247a519a9SBram Moolenaarenddef
48347a519a9SBram Moolenaar
484c7e44a7eSBram Moolenaardef Test_assignment_vim9script()
485c7e44a7eSBram Moolenaar  let lines =<< trim END
486c7e44a7eSBram Moolenaar    vim9script
487c7e44a7eSBram Moolenaar    def Func(): list<number>
488c7e44a7eSBram Moolenaar      return [1, 2]
489c7e44a7eSBram Moolenaar    enddef
490c7e44a7eSBram Moolenaar    let var1: number
491c7e44a7eSBram Moolenaar    let var2: number
492c7e44a7eSBram Moolenaar    [var1, var2] =
493c7e44a7eSBram Moolenaar          Func()
494c7e44a7eSBram Moolenaar    assert_equal(1, var1)
495c7e44a7eSBram Moolenaar    assert_equal(2, var2)
496c7e44a7eSBram Moolenaar    let ll =
497c7e44a7eSBram Moolenaar          Func()
498c7e44a7eSBram Moolenaar    assert_equal([1, 2], ll)
49983144546SBram Moolenaar
50083144546SBram Moolenaar    @/ = 'text'
50183144546SBram Moolenaar    assert_equal('text', @/)
50283144546SBram Moolenaar    @0 = 'zero'
50383144546SBram Moolenaar    assert_equal('zero', @0)
50483144546SBram Moolenaar    @1 = 'one'
50583144546SBram Moolenaar    assert_equal('one', @1)
50683144546SBram Moolenaar    @9 = 'nine'
50783144546SBram Moolenaar    assert_equal('nine', @9)
50883144546SBram Moolenaar    @- = 'minus'
50983144546SBram Moolenaar    assert_equal('minus', @-)
51083144546SBram Moolenaar    if has('clipboard_working')
51183144546SBram Moolenaar      @* = 'star'
51283144546SBram Moolenaar      assert_equal('star', @*)
51383144546SBram Moolenaar      @+ = 'plus'
51483144546SBram Moolenaar      assert_equal('plus', @+)
51583144546SBram Moolenaar    endif
51695dd9f25SBram Moolenaar
51795dd9f25SBram Moolenaar    let a: number = 123
51895dd9f25SBram Moolenaar    assert_equal(123, a)
51995dd9f25SBram Moolenaar    let s: string = 'yes'
52095dd9f25SBram Moolenaar    assert_equal('yes', s)
52195dd9f25SBram Moolenaar    let b: number = 42
52295dd9f25SBram Moolenaar    assert_equal(42, b)
52395dd9f25SBram Moolenaar    let w: number = 43
52495dd9f25SBram Moolenaar    assert_equal(43, w)
52595dd9f25SBram Moolenaar    let t: number = 44
52695dd9f25SBram Moolenaar    assert_equal(44, t)
527c7e44a7eSBram Moolenaar  END
528c7e44a7eSBram Moolenaar  CheckScriptSuccess(lines)
529c7e44a7eSBram Moolenaarenddef
530c7e44a7eSBram Moolenaar
531cab27678SBram Moolenaardef Mess(): string
532cab27678SBram Moolenaar  v:foldstart = 123
533cab27678SBram Moolenaar  return 'xxx'
534cab27678SBram Moolenaarenddef
535cab27678SBram Moolenaar
536d72c1bf0SBram Moolenaardef Test_assignment_failure()
5378a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
5388a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
5398a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
5408a7d6542SBram Moolenaar
54163be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:')
54263be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='")
54363be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:')
54463be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:')
54563be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:')
54663be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='")
54763be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:')
54863be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='")
54963be3d4bSBram Moolenaar
5508a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
5518a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
5528a7d6542SBram Moolenaar
5539b7bf9e9SBram Moolenaar  call CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
5549af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
5559af78769SBram Moolenaar                            '[a] = test_null_list()'], 'E1093:')
5569af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
5579af78769SBram Moolenaar                            '[a] = []'], 'E1093:')
5589af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
5599af78769SBram Moolenaar                            'let y: number',
5609af78769SBram Moolenaar                            '[x, y] = [1]'], 'E1093:')
5619af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
5629af78769SBram Moolenaar                            'let y: number',
5639af78769SBram Moolenaar                            'let z: list<number>',
5649af78769SBram Moolenaar                            '[x, y; z] = [1]'], 'E1093:')
5659be61bbbSBram Moolenaar
566e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
567c2ee44ccSBram Moolenaar  call CheckDefFailure(['let &tabstop = 4'], 'E1052:')
5689be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
569c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:')
5709be61bbbSBram Moolenaar
571e55b1c09SBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
572c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:')
5739be61bbbSBram Moolenaar
574434d72cbSBram Moolenaar  if has('dnd')
57565821727SBram Moolenaar    call CheckDefFailure(['let @~ = 5'], 'E1066:')
576434d72cbSBram Moolenaar  else
577434d72cbSBram Moolenaar    call CheckDefFailure(['let @~ = 5'], 'E354:')
578434d72cbSBram Moolenaar    call CheckDefFailure(['@~ = 5'], 'E354:')
579434d72cbSBram Moolenaar  endif
5809be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
58165821727SBram Moolenaar  call CheckDefFailure(['let @/ = "x"'], 'E1066:')
582c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:')
5839be61bbbSBram Moolenaar
584e55b1c09SBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
585e55b1c09SBram Moolenaar  call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
586e55b1c09SBram Moolenaar  call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
587e55b1c09SBram Moolenaar  call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
5889be61bbbSBram Moolenaar
5899be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
590122616d9SBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:', 1)
591122616d9SBram Moolenaar  call CheckScriptFailure(['vim9script', 'let xnr += 4'], 'E1020:')
592122616d9SBram Moolenaar  call CheckDefFailure(["let xnr = xnr + 1"], 'E1001:', 1)
593122616d9SBram Moolenaar  call CheckScriptFailure(['vim9script', 'let xnr = xnr + 4'], 'E121:')
5949be61bbbSBram Moolenaar
595451c2e35SBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1108:')
59633fa29cfSBram Moolenaar
5978a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
5988a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
5998a7d6542SBram Moolenaar
6008a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
6018a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
6028a7d6542SBram Moolenaar
6038a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
6048a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
60542a480bfSBram Moolenaar
606d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
60742a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
608cab27678SBram Moolenaar
609cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
610cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
61143e969d3SBram Moolenaar
61243e969d3SBram Moolenaar  call CheckDefFailure(['w:foo: number = 10'],
61343e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 1')
61443e969d3SBram Moolenaar  call CheckDefFailure(['t:foo: bool = true'],
61543e969d3SBram Moolenaar                       'E488: Trailing characters: : bool = true')
61643e969d3SBram Moolenaar  call CheckDefFailure(['b:foo: string = "x"'],
61743e969d3SBram Moolenaar                       'E488: Trailing characters: : string = "x"')
61843e969d3SBram Moolenaar  call CheckDefFailure(['g:foo: number = 123'],
61943e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 123')
620d72c1bf0SBram Moolenaarenddef
621d72c1bf0SBram Moolenaar
622d72c1bf0SBram Moolenaardef Test_unlet()
623d72c1bf0SBram Moolenaar  g:somevar = 'yes'
624d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
625d72c1bf0SBram Moolenaar  unlet g:somevar
626d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
627d72c1bf0SBram Moolenaar  unlet! g:somevar
628d72c1bf0SBram Moolenaar
6298436773fSBram Moolenaar  # also works for script-local variable in legacy Vim script
6308436773fSBram Moolenaar  s:somevar = 'legacy'
6318436773fSBram Moolenaar  assert_true(exists('s:somevar'))
6328436773fSBram Moolenaar  unlet s:somevar
6338436773fSBram Moolenaar  assert_false(exists('s:somevar'))
6348436773fSBram Moolenaar  unlet! s:somevar
6358436773fSBram Moolenaar
636d72c1bf0SBram Moolenaar  call CheckScriptFailure([
637d72c1bf0SBram Moolenaar        'vim9script',
638d72c1bf0SBram Moolenaar        'let svar = 123',
639d72c1bf0SBram Moolenaar        'unlet svar',
640d72c1bf0SBram Moolenaar        ], 'E1081:')
641d72c1bf0SBram Moolenaar  call CheckScriptFailure([
642d72c1bf0SBram Moolenaar        'vim9script',
643d72c1bf0SBram Moolenaar        'let svar = 123',
644d72c1bf0SBram Moolenaar        'unlet s:svar',
645d72c1bf0SBram Moolenaar        ], 'E1081:')
646d72c1bf0SBram Moolenaar  call CheckScriptFailure([
647d72c1bf0SBram Moolenaar        'vim9script',
648d72c1bf0SBram Moolenaar        'let svar = 123',
649d72c1bf0SBram Moolenaar        'def Func()',
650d72c1bf0SBram Moolenaar        '  unlet svar',
651d72c1bf0SBram Moolenaar        'enddef',
652822ba247SBram Moolenaar        'defcompile',
653d72c1bf0SBram Moolenaar        ], 'E1081:')
654d72c1bf0SBram Moolenaar  call CheckScriptFailure([
655d72c1bf0SBram Moolenaar        'vim9script',
656d72c1bf0SBram Moolenaar        'let svar = 123',
657d72c1bf0SBram Moolenaar        'def Func()',
658d72c1bf0SBram Moolenaar        '  unlet s:svar',
659d72c1bf0SBram Moolenaar        'enddef',
660822ba247SBram Moolenaar        'defcompile',
661d72c1bf0SBram Moolenaar        ], 'E1081:')
6627bdaea6eSBram Moolenaar
6637bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
6647bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
6657bdaea6eSBram Moolenaar  unlet $ENVVAR
6667bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
667d72c1bf0SBram Moolenaarenddef
668599c89c8SBram Moolenaar
6694c17ad94SBram Moolenaardef Test_delfunction()
670f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
6714c17ad94SBram Moolenaar  CheckScriptSuccess([
6724c17ad94SBram Moolenaar      'vim9script',
6734c17ad94SBram Moolenaar      'func CheckMe()',
6744c17ad94SBram Moolenaar      '  return 123',
6754c17ad94SBram Moolenaar      'endfunc',
6764c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
6774c17ad94SBram Moolenaar      ])
6784c17ad94SBram Moolenaar
679f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
6804c17ad94SBram Moolenaar  CheckScriptFailure([
6814c17ad94SBram Moolenaar      'vim9script',
6824c17ad94SBram Moolenaar      'func DeleteMe1()',
6834c17ad94SBram Moolenaar      'endfunc',
6844c17ad94SBram Moolenaar      'delfunction DeleteMe1',
6854c17ad94SBram Moolenaar      ], 'E1084:')
6864c17ad94SBram Moolenaar  CheckScriptFailure([
6874c17ad94SBram Moolenaar      'vim9script',
6884c17ad94SBram Moolenaar      'func DeleteMe2()',
6894c17ad94SBram Moolenaar      'endfunc',
6904c17ad94SBram Moolenaar      'def DoThat()',
6914c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
6924c17ad94SBram Moolenaar      'enddef',
6934c17ad94SBram Moolenaar      'DoThat()',
6944c17ad94SBram Moolenaar      ], 'E1084:')
6954c17ad94SBram Moolenaar  CheckScriptFailure([
6964c17ad94SBram Moolenaar      'vim9script',
6974c17ad94SBram Moolenaar      'def DeleteMe3()',
6984c17ad94SBram Moolenaar      'enddef',
6994c17ad94SBram Moolenaar      'delfunction DeleteMe3',
7004c17ad94SBram Moolenaar      ], 'E1084:')
7014c17ad94SBram Moolenaar  CheckScriptFailure([
7024c17ad94SBram Moolenaar      'vim9script',
7034c17ad94SBram Moolenaar      'def DeleteMe4()',
7044c17ad94SBram Moolenaar      'enddef',
7054c17ad94SBram Moolenaar      'def DoThat()',
7064c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
7074c17ad94SBram Moolenaar      'enddef',
7084c17ad94SBram Moolenaar      'DoThat()',
7094c17ad94SBram Moolenaar      ], 'E1084:')
710925e9fd6SBram Moolenaar
711925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
712925e9fd6SBram Moolenaar  let lines =<< trim END
713925e9fd6SBram Moolenaar      vim9script
714925e9fd6SBram Moolenaar      def g:Global(): string
715925e9fd6SBram Moolenaar        return "yes"
716925e9fd6SBram Moolenaar      enddef
717925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
718925e9fd6SBram Moolenaar      def! g:Global(): string
719925e9fd6SBram Moolenaar        return "no"
720925e9fd6SBram Moolenaar      enddef
721925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
722925e9fd6SBram Moolenaar      delfunc g:Global
723925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
724925e9fd6SBram Moolenaar  END
725925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
726925e9fd6SBram Moolenaar
727925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
728925e9fd6SBram Moolenaar  lines =<< trim END
729925e9fd6SBram Moolenaar      vim9script
730925e9fd6SBram Moolenaar      func g:Global()
731925e9fd6SBram Moolenaar        return "yes"
732925e9fd6SBram Moolenaar      endfunc
733925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
734925e9fd6SBram Moolenaar      def! g:Global(): string
735925e9fd6SBram Moolenaar        return "no"
736925e9fd6SBram Moolenaar      enddef
737925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
738925e9fd6SBram Moolenaar      delfunc g:Global
739925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
740925e9fd6SBram Moolenaar  END
741925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
742925e9fd6SBram Moolenaar
743925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
744925e9fd6SBram Moolenaar  lines =<< trim END
745925e9fd6SBram Moolenaar      vim9script
746925e9fd6SBram Moolenaar      def g:Global(): string
747925e9fd6SBram Moolenaar        return "yes"
748925e9fd6SBram Moolenaar      enddef
749925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
750925e9fd6SBram Moolenaar      func! g:Global()
751925e9fd6SBram Moolenaar        return "no"
752925e9fd6SBram Moolenaar      endfunc
753925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
754925e9fd6SBram Moolenaar      delfunc g:Global
755925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
756925e9fd6SBram Moolenaar  END
757925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
7584c17ad94SBram Moolenaarenddef
7594c17ad94SBram Moolenaar
760599c89c8SBram Moolenaarfunc Test_wrong_type()
761599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
762599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
763599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
764599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
765599c89c8SBram Moolenaar
766599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
767599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
76842a480bfSBram Moolenaar
76942a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
77042a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
77142a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
77242a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
77342a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
77442a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
77542a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
77642a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
77742a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
77842a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
77942a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
780a0a9f43aSBram Moolenaar
781a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
782a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
7838a7d6542SBram Moolenaarendfunc
7848a7d6542SBram Moolenaar
7858a7d6542SBram Moolenaarfunc Test_const()
7868a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
7878a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
7888a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
7899be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
7908a7d6542SBram Moolenaarendfunc
7918a7d6542SBram Moolenaar
792df069eecSBram Moolenaardef Test_range_no_colon()
793df069eecSBram Moolenaar  call CheckDefFailure(['%s/a/b/'], 'E1050:')
794df069eecSBram Moolenaar  call CheckDefFailure(['+ s/a/b/'], 'E1050:')
795df069eecSBram Moolenaar  call CheckDefFailure(['- s/a/b/'], 'E1050:')
796df069eecSBram Moolenaar  call CheckDefFailure(['. s/a/b/'], 'E1050:')
797df069eecSBram Moolenaarenddef
798df069eecSBram Moolenaar
799df069eecSBram Moolenaar
8008a7d6542SBram Moolenaardef Test_block()
8018a7d6542SBram Moolenaar  let outer = 1
8028a7d6542SBram Moolenaar  {
8038a7d6542SBram Moolenaar    let inner = 2
8048a7d6542SBram Moolenaar    assert_equal(1, outer)
8058a7d6542SBram Moolenaar    assert_equal(2, inner)
8068a7d6542SBram Moolenaar  }
8078a7d6542SBram Moolenaar  assert_equal(1, outer)
8088a7d6542SBram Moolenaarenddef
8098a7d6542SBram Moolenaar
8108a7d6542SBram Moolenaarfunc Test_block_failure()
8118a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
812585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
813585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
8148a7d6542SBram Moolenaarendfunc
8158a7d6542SBram Moolenaar
816d032f34aSBram Moolenaarfunc g:NoSuchFunc()
817d032f34aSBram Moolenaar  echo 'none'
818d032f34aSBram Moolenaarendfunc
819d032f34aSBram Moolenaar
8208a7d6542SBram Moolenaardef Test_try_catch()
8218a7d6542SBram Moolenaar  let l = []
8227a092245SBram Moolenaar  try # comment
8238a7d6542SBram Moolenaar    add(l, '1')
8248a7d6542SBram Moolenaar    throw 'wrong'
8258a7d6542SBram Moolenaar    add(l, '2')
8267a092245SBram Moolenaar  catch # comment
8278a7d6542SBram Moolenaar    add(l, v:exception)
8287a092245SBram Moolenaar  finally # comment
8298a7d6542SBram Moolenaar    add(l, '3')
8307a092245SBram Moolenaar  endtry # comment
8318a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
83268d130c6SBram Moolenaar
833e859312eSBram Moolenaar  l = []
834e859312eSBram Moolenaar  try
835e859312eSBram Moolenaar    try
836e859312eSBram Moolenaar      add(l, '1')
837e859312eSBram Moolenaar      throw 'wrong'
838e859312eSBram Moolenaar      add(l, '2')
839e859312eSBram Moolenaar    catch /right/
840e859312eSBram Moolenaar      add(l, v:exception)
841e859312eSBram Moolenaar    endtry
842e859312eSBram Moolenaar  catch /wrong/
843e859312eSBram Moolenaar    add(l, 'caught')
844e859312eSBram Moolenaar  finally
845e859312eSBram Moolenaar    add(l, 'finally')
846e859312eSBram Moolenaar  endtry
847e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
848e859312eSBram Moolenaar
84968d130c6SBram Moolenaar  let n: number
85068d130c6SBram Moolenaar  try
85168d130c6SBram Moolenaar    n = l[3]
85268d130c6SBram Moolenaar  catch /E684:/
85368d130c6SBram Moolenaar    n = 99
85468d130c6SBram Moolenaar  endtry
85568d130c6SBram Moolenaar  assert_equal(99, n)
85668d130c6SBram Moolenaar
85768d130c6SBram Moolenaar  try
858cc673e74SBram Moolenaar    # string slice returns a string, not a number
85968d130c6SBram Moolenaar    n = g:astring[3]
86056acb094SBram Moolenaar  catch /E1029:/
86168d130c6SBram Moolenaar    n = 77
86268d130c6SBram Moolenaar  endtry
86368d130c6SBram Moolenaar  assert_equal(77, n)
86468d130c6SBram Moolenaar
86568d130c6SBram Moolenaar  try
86668d130c6SBram Moolenaar    n = l[g:astring]
86756acb094SBram Moolenaar  catch /E1029:/
86856acb094SBram Moolenaar    n = 88
86968d130c6SBram Moolenaar  endtry
87056acb094SBram Moolenaar  assert_equal(88, n)
87168d130c6SBram Moolenaar
87268d130c6SBram Moolenaar  try
87368d130c6SBram Moolenaar    n = s:does_not_exist
87468d130c6SBram Moolenaar  catch /E121:/
875f0b9f43cSBram Moolenaar    n = 111
876f0b9f43cSBram Moolenaar  endtry
877f0b9f43cSBram Moolenaar  assert_equal(111, n)
878f0b9f43cSBram Moolenaar
879f0b9f43cSBram Moolenaar  try
880f0b9f43cSBram Moolenaar    n = g:does_not_exist
881f0b9f43cSBram Moolenaar  catch /E121:/
88268d130c6SBram Moolenaar    n = 121
88368d130c6SBram Moolenaar  endtry
88468d130c6SBram Moolenaar  assert_equal(121, n)
88568d130c6SBram Moolenaar
88668d130c6SBram Moolenaar  let d = #{one: 1}
88768d130c6SBram Moolenaar  try
88868d130c6SBram Moolenaar    n = d[g:astring]
88968d130c6SBram Moolenaar  catch /E716:/
89068d130c6SBram Moolenaar    n = 222
89168d130c6SBram Moolenaar  endtry
89268d130c6SBram Moolenaar  assert_equal(222, n)
893f0b9f43cSBram Moolenaar
894f0b9f43cSBram Moolenaar  try
895f0b9f43cSBram Moolenaar    n = -g:astring
896f0b9f43cSBram Moolenaar  catch /E39:/
897f0b9f43cSBram Moolenaar    n = 233
898f0b9f43cSBram Moolenaar  endtry
899f0b9f43cSBram Moolenaar  assert_equal(233, n)
900f0b9f43cSBram Moolenaar
901f0b9f43cSBram Moolenaar  try
902f0b9f43cSBram Moolenaar    n = +g:astring
903f0b9f43cSBram Moolenaar  catch /E1030:/
904f0b9f43cSBram Moolenaar    n = 244
905f0b9f43cSBram Moolenaar  endtry
906f0b9f43cSBram Moolenaar  assert_equal(244, n)
907f0b9f43cSBram Moolenaar
908f0b9f43cSBram Moolenaar  try
909f0b9f43cSBram Moolenaar    n = +g:alist
910f0b9f43cSBram Moolenaar  catch /E745:/
911f0b9f43cSBram Moolenaar    n = 255
912f0b9f43cSBram Moolenaar  endtry
913f0b9f43cSBram Moolenaar  assert_equal(255, n)
914f0b9f43cSBram Moolenaar
915f0b9f43cSBram Moolenaar  let nd: dict<any>
916f0b9f43cSBram Moolenaar  try
917f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
918f0b9f43cSBram Moolenaar  catch /E1029:/
919f0b9f43cSBram Moolenaar    n = 266
920f0b9f43cSBram Moolenaar  endtry
921f0b9f43cSBram Moolenaar  assert_equal(266, n)
922f0b9f43cSBram Moolenaar
923f0b9f43cSBram Moolenaar  try
924f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
925f0b9f43cSBram Moolenaar  catch /E1093:/
926f0b9f43cSBram Moolenaar    n = 277
927f0b9f43cSBram Moolenaar  endtry
928f0b9f43cSBram Moolenaar  assert_equal(277, n)
929f0b9f43cSBram Moolenaar
930e859312eSBram Moolenaar  try
931e859312eSBram Moolenaar    &ts = g:astring
932e859312eSBram Moolenaar  catch /E1029:/
933e859312eSBram Moolenaar    n = 288
934e859312eSBram Moolenaar  endtry
935e859312eSBram Moolenaar  assert_equal(288, n)
936e859312eSBram Moolenaar
937e859312eSBram Moolenaar  try
938e859312eSBram Moolenaar    &backspace = 'asdf'
939e859312eSBram Moolenaar  catch /E474:/
940e859312eSBram Moolenaar    n = 299
941e859312eSBram Moolenaar  endtry
942e859312eSBram Moolenaar  assert_equal(299, n)
943e859312eSBram Moolenaar
944e859312eSBram Moolenaar  l = [1]
945e859312eSBram Moolenaar  try
946e859312eSBram Moolenaar    l[3] = 3
947e859312eSBram Moolenaar  catch /E684:/
948e859312eSBram Moolenaar    n = 300
949e859312eSBram Moolenaar  endtry
950e859312eSBram Moolenaar  assert_equal(300, n)
951e859312eSBram Moolenaar
952e859312eSBram Moolenaar  try
953e859312eSBram Moolenaar    unlet g:does_not_exist
954e859312eSBram Moolenaar  catch /E108:/
955e859312eSBram Moolenaar    n = 322
956e859312eSBram Moolenaar  endtry
957e859312eSBram Moolenaar  assert_equal(322, n)
958e859312eSBram Moolenaar
959e859312eSBram Moolenaar  try
960e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
961e859312eSBram Moolenaar  catch /E721:/
962e859312eSBram Moolenaar    n = 333
963e859312eSBram Moolenaar  endtry
964e859312eSBram Moolenaar  assert_equal(333, n)
965e859312eSBram Moolenaar
966e859312eSBram Moolenaar  try
967e859312eSBram Moolenaar    l = DeletedFunc()
968e859312eSBram Moolenaar  catch /E933:/
969e859312eSBram Moolenaar    n = 344
970e859312eSBram Moolenaar  endtry
971e859312eSBram Moolenaar  assert_equal(344, n)
972d032f34aSBram Moolenaar
973d032f34aSBram Moolenaar  try
974d032f34aSBram Moolenaar    echo len(v:true)
975d032f34aSBram Moolenaar  catch /E701:/
976d032f34aSBram Moolenaar    n = 355
977d032f34aSBram Moolenaar  endtry
978d032f34aSBram Moolenaar  assert_equal(355, n)
979d032f34aSBram Moolenaar
980d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
981d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
982d032f34aSBram Moolenaar  try
983d032f34aSBram Moolenaar    echo P()
984d032f34aSBram Moolenaar  catch /E117:/
985d032f34aSBram Moolenaar    n = 366
986d032f34aSBram Moolenaar  endtry
987d032f34aSBram Moolenaar  assert_equal(366, n)
988d032f34aSBram Moolenaar
989d032f34aSBram Moolenaar  try
990d032f34aSBram Moolenaar    echo g:NoSuchFunc()
991d032f34aSBram Moolenaar  catch /E117:/
992d032f34aSBram Moolenaar    n = 377
993d032f34aSBram Moolenaar  endtry
994d032f34aSBram Moolenaar  assert_equal(377, n)
995d032f34aSBram Moolenaar
996d032f34aSBram Moolenaar  try
997d032f34aSBram Moolenaar    echo g:alist + 4
998d032f34aSBram Moolenaar  catch /E745:/
999d032f34aSBram Moolenaar    n = 388
1000d032f34aSBram Moolenaar  endtry
1001d032f34aSBram Moolenaar  assert_equal(388, n)
1002d032f34aSBram Moolenaar
1003d032f34aSBram Moolenaar  try
1004d032f34aSBram Moolenaar    echo 4 + g:alist
1005d032f34aSBram Moolenaar  catch /E745:/
1006d032f34aSBram Moolenaar    n = 399
1007d032f34aSBram Moolenaar  endtry
1008d032f34aSBram Moolenaar  assert_equal(399, n)
1009d032f34aSBram Moolenaar
1010d032f34aSBram Moolenaar  try
1011d032f34aSBram Moolenaar    echo g:alist.member
1012d032f34aSBram Moolenaar  catch /E715:/
1013d032f34aSBram Moolenaar    n = 400
1014d032f34aSBram Moolenaar  endtry
1015d032f34aSBram Moolenaar  assert_equal(400, n)
1016d032f34aSBram Moolenaar
1017d032f34aSBram Moolenaar  try
1018d032f34aSBram Moolenaar    echo d.member
1019d032f34aSBram Moolenaar  catch /E716:/
1020d032f34aSBram Moolenaar    n = 411
1021d032f34aSBram Moolenaar  endtry
1022d032f34aSBram Moolenaar  assert_equal(411, n)
10238a7d6542SBram Moolenaarenddef
10248a7d6542SBram Moolenaar
1025e859312eSBram Moolenaardef DeletedFunc(): list<any>
1026e859312eSBram Moolenaar  return ['delete me']
1027e859312eSBram Moolenaarenddef
1028e859312eSBram Moolenaardefcompile
1029e859312eSBram Moolenaardelfunc DeletedFunc
1030e859312eSBram Moolenaar
1031257cc5eeSBram Moolenaardef ThrowFromDef()
1032a72cfb80SBram Moolenaar  throw "getout" # comment
1033257cc5eeSBram Moolenaarenddef
1034257cc5eeSBram Moolenaar
1035257cc5eeSBram Moolenaarfunc CatchInFunc()
1036257cc5eeSBram Moolenaar  try
1037257cc5eeSBram Moolenaar    call ThrowFromDef()
1038257cc5eeSBram Moolenaar  catch
1039257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
1040257cc5eeSBram Moolenaar  endtry
1041257cc5eeSBram Moolenaarendfunc
1042257cc5eeSBram Moolenaar
1043257cc5eeSBram Moolenaardef CatchInDef()
1044257cc5eeSBram Moolenaar  try
1045257cc5eeSBram Moolenaar    ThrowFromDef()
1046257cc5eeSBram Moolenaar  catch
1047257cc5eeSBram Moolenaar    g:thrown_def = v:exception
1048257cc5eeSBram Moolenaar  endtry
1049257cc5eeSBram Moolenaarenddef
1050257cc5eeSBram Moolenaar
1051f575adffSBram Moolenaardef ReturnFinally(): string
1052f575adffSBram Moolenaar  try
1053f575adffSBram Moolenaar    return 'intry'
1054f575adffSBram Moolenaar  finally
1055f575adffSBram Moolenaar    g:in_finally = 'finally'
1056f575adffSBram Moolenaar  endtry
1057f575adffSBram Moolenaar  return 'end'
1058f575adffSBram Moolenaarenddef
1059f575adffSBram Moolenaar
1060257cc5eeSBram Moolenaardef Test_try_catch_nested()
1061257cc5eeSBram Moolenaar  CatchInFunc()
1062257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
1063257cc5eeSBram Moolenaar
1064257cc5eeSBram Moolenaar  CatchInDef()
1065257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
1066f575adffSBram Moolenaar
1067f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
1068f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
1069f575adffSBram Moolenaarenddef
1070f575adffSBram Moolenaar
1071f575adffSBram Moolenaardef Test_try_catch_match()
1072f575adffSBram Moolenaar  let seq = 'a'
1073f575adffSBram Moolenaar  try
1074f575adffSBram Moolenaar    throw 'something'
1075f575adffSBram Moolenaar  catch /nothing/
1076f575adffSBram Moolenaar    seq ..= 'x'
1077f575adffSBram Moolenaar  catch /some/
1078f575adffSBram Moolenaar    seq ..= 'b'
1079f575adffSBram Moolenaar  catch /asdf/
1080f575adffSBram Moolenaar    seq ..= 'x'
1081e8c4abbbSBram Moolenaar  catch ?a\?sdf?
1082e8c4abbbSBram Moolenaar    seq ..= 'y'
1083f575adffSBram Moolenaar  finally
1084f575adffSBram Moolenaar    seq ..= 'c'
1085f575adffSBram Moolenaar  endtry
1086f575adffSBram Moolenaar  assert_equal('abc', seq)
1087257cc5eeSBram Moolenaarenddef
1088257cc5eeSBram Moolenaar
1089e8c4abbbSBram Moolenaardef Test_try_catch_fails()
1090e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
1091e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1092e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1093585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
1094585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1095585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
1096585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
1097585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1098585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
1099585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
1100585fea7bSBram Moolenaar
1101a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
1102585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
1103e8c4abbbSBram Moolenaarenddef
1104e8c4abbbSBram Moolenaar
1105006ad48bSBram Moolenaardef Test_throw_vimscript()
1106f5be8cdbSBram Moolenaar  # only checks line continuation
1107006ad48bSBram Moolenaar  let lines =<< trim END
1108006ad48bSBram Moolenaar      vim9script
1109006ad48bSBram Moolenaar      try
1110006ad48bSBram Moolenaar        throw 'one'
1111006ad48bSBram Moolenaar              .. 'two'
1112006ad48bSBram Moolenaar      catch
1113006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
1114006ad48bSBram Moolenaar      endtry
1115006ad48bSBram Moolenaar  END
1116006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
1117006ad48bSBram Moolenaarenddef
1118006ad48bSBram Moolenaar
1119ed677f55SBram Moolenaardef Test_error_in_nested_function()
1120ed677f55SBram Moolenaar  # an error in a nested :function aborts executin in the calling :def function
1121ed677f55SBram Moolenaar  let lines =<< trim END
1122ed677f55SBram Moolenaar      vim9script
1123ed677f55SBram Moolenaar      def Func()
1124ed677f55SBram Moolenaar        Error()
1125ed677f55SBram Moolenaar        g:test_var = 1
1126ed677f55SBram Moolenaar      enddef
1127ed677f55SBram Moolenaar      func Error() abort
1128ed677f55SBram Moolenaar        eval [][0]
1129ed677f55SBram Moolenaar      endfunc
1130ed677f55SBram Moolenaar      Func()
1131ed677f55SBram Moolenaar  END
1132ed677f55SBram Moolenaar  g:test_var = 0
1133ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
1134ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
1135ed677f55SBram Moolenaarenddef
1136ed677f55SBram Moolenaar
113737c83711SBram Moolenaardef Test_cexpr_vimscript()
1138f5be8cdbSBram Moolenaar  # only checks line continuation
113937c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
114037c83711SBram Moolenaar  let lines =<< trim END
114137c83711SBram Moolenaar      vim9script
114237c83711SBram Moolenaar      cexpr 'File'
114337c83711SBram Moolenaar                .. ' someFile' ..
114437c83711SBram Moolenaar                   ' line 19'
114537c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
114637c83711SBram Moolenaar  END
114737c83711SBram Moolenaar  CheckScriptSuccess(lines)
114837c83711SBram Moolenaar  set errorformat&
114937c83711SBram Moolenaarenddef
115037c83711SBram Moolenaar
1151c9edd6b5SBram Moolenaardef Test_statusline_syntax()
1152c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
1153c9edd6b5SBram Moolenaar  let lines =<< trim END
1154c9edd6b5SBram Moolenaar      vim9script
1155c9edd6b5SBram Moolenaar      func g:Status()
1156c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
1157c9edd6b5SBram Moolenaar      endfunc
1158c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
1159c9edd6b5SBram Moolenaar      redrawstatus
1160c9edd6b5SBram Moolenaar      set laststatus statusline=
1161c9edd6b5SBram Moolenaar  END
1162c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
1163c9edd6b5SBram Moolenaarenddef
1164c9edd6b5SBram Moolenaar
1165b209750bSBram Moolenaardef Test_list_vimscript()
1166b209750bSBram Moolenaar  # checks line continuation and comments
1167b209750bSBram Moolenaar  let lines =<< trim END
1168b209750bSBram Moolenaar      vim9script
1169b209750bSBram Moolenaar      let mylist = [
1170b209750bSBram Moolenaar            'one',
1171b209750bSBram Moolenaar            # comment
1172b209750bSBram Moolenaar            'two', # empty line follows
1173b209750bSBram Moolenaar
1174b209750bSBram Moolenaar            'three',
1175b209750bSBram Moolenaar            ]
1176b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
1177b209750bSBram Moolenaar  END
1178b209750bSBram Moolenaar  CheckScriptSuccess(lines)
117966250c93SBram Moolenaar
118066250c93SBram Moolenaar  # check all lines from heredoc are kept
118166250c93SBram Moolenaar  lines =<< trim END
118266250c93SBram Moolenaar      # comment 1
118366250c93SBram Moolenaar      two
118466250c93SBram Moolenaar      # comment 3
118566250c93SBram Moolenaar
118666250c93SBram Moolenaar      five
118766250c93SBram Moolenaar      # comment 6
118866250c93SBram Moolenaar  END
118966250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
1190b209750bSBram Moolenaarenddef
1191b209750bSBram Moolenaar
11922a1381c3SBram Moolenaarif has('channel')
119340ee466cSBram Moolenaar  let someJob = test_null_job()
119440ee466cSBram Moolenaar
119540ee466cSBram Moolenaar  def FuncWithError()
119640ee466cSBram Moolenaar    echomsg g:someJob
119740ee466cSBram Moolenaar  enddef
119840ee466cSBram Moolenaar
119940ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
120040ee466cSBram Moolenaar    try
120140ee466cSBram Moolenaar      call FuncWithError()
120240ee466cSBram Moolenaar    catch
120340ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
120440ee466cSBram Moolenaar    endtry
120540ee466cSBram Moolenaar  endfunc
12062a1381c3SBram Moolenaarendif
120740ee466cSBram Moolenaar
12088a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
12098a7d6542SBram Moolenaar  vim9script
12108a7d6542SBram Moolenaar  let name: string = 'bob'
12118a7d6542SBram Moolenaar  def Concat(arg: string): string
12128a7d6542SBram Moolenaar    return name .. arg
12138a7d6542SBram Moolenaar  enddef
1214227a69deSBram Moolenaar  g:result = Concat('bie')
1215227a69deSBram Moolenaar  g:localname = name
12168a7d6542SBram Moolenaar
12178a7d6542SBram Moolenaar  export const CONST = 1234
12188a7d6542SBram Moolenaar  export let exported = 9876
12196e587dcbSBram Moolenaar  export let exp_name = 'John'
12208a7d6542SBram Moolenaar  export def Exported(): string
12218a7d6542SBram Moolenaar    return 'Exported'
12228a7d6542SBram Moolenaar  enddef
12238a7d6542SBram MoolenaarEND
12248a7d6542SBram Moolenaar
1225b3ca9824SBram Moolenaardef Undo_export_script_lines()
1226b3ca9824SBram Moolenaar  unlet g:result
1227b3ca9824SBram Moolenaar  unlet g:localname
1228b3ca9824SBram Moolenaarenddef
1229b3ca9824SBram Moolenaar
12305269bd2aSBram Moolenaardef Test_vim9_import_export()
12318a7d6542SBram Moolenaar  let import_script_lines =<< trim END
12328a7d6542SBram Moolenaar    vim9script
12338a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
12348a7d6542SBram Moolenaar    g:imported = exported
12356e587dcbSBram Moolenaar    exported += 3
12366e587dcbSBram Moolenaar    g:imported_added = exported
12378a7d6542SBram Moolenaar    g:imported_func = Exported()
12386e587dcbSBram Moolenaar
123940f4f7a4SBram Moolenaar    def GetExported(): string
124040f4f7a4SBram Moolenaar      let local_dict = #{ref: Exported}
124140f4f7a4SBram Moolenaar      return local_dict.ref()
124240f4f7a4SBram Moolenaar    enddef
124340f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
124440f4f7a4SBram Moolenaar
12456e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
12466e587dcbSBram Moolenaar    g:imported_name = exp_name
12476e587dcbSBram Moolenaar    exp_name ..= ' Doe'
12486e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
12495381c7a1SBram Moolenaar    g:imported_later = exported
12508a7d6542SBram Moolenaar  END
12518a7d6542SBram Moolenaar
12528a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
12538a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
12548a7d6542SBram Moolenaar
12558a7d6542SBram Moolenaar  source Ximport.vim
12568a7d6542SBram Moolenaar
12578a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
12588a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
12598a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
12606e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
12615381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
12628a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
126340f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
12646e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
12656e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
12668a7d6542SBram Moolenaar  assert_false(exists('g:name'))
12678a7d6542SBram Moolenaar
1268b3ca9824SBram Moolenaar  Undo_export_script_lines()
12698a7d6542SBram Moolenaar  unlet g:imported
12706e587dcbSBram Moolenaar  unlet g:imported_added
12715381c7a1SBram Moolenaar  unlet g:imported_later
12728a7d6542SBram Moolenaar  unlet g:imported_func
12736e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
12748a7d6542SBram Moolenaar  delete('Ximport.vim')
1275f2d5c240SBram Moolenaar
12761c991144SBram Moolenaar  # similar, with line breaks
12771c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
12781c991144SBram Moolenaar    vim9script
12791c991144SBram Moolenaar    import {
12801c991144SBram Moolenaar        exported,
12811c991144SBram Moolenaar        Exported,
12821c991144SBram Moolenaar        }
12831c991144SBram Moolenaar        from
12841c991144SBram Moolenaar        './Xexport.vim'
12851c991144SBram Moolenaar    g:imported = exported
12861c991144SBram Moolenaar    exported += 5
12871c991144SBram Moolenaar    g:imported_added = exported
12881c991144SBram Moolenaar    g:imported_func = Exported()
12891c991144SBram Moolenaar  END
12901c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
12911c991144SBram Moolenaar  source Ximport_lbr.vim
12921c991144SBram Moolenaar
12931c991144SBram Moolenaar  assert_equal(9876, g:imported)
12941c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
12951c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
12961c991144SBram Moolenaar
12971c991144SBram Moolenaar  # exported script not sourced again
12981c991144SBram Moolenaar  assert_false(exists('g:result'))
12991c991144SBram Moolenaar  unlet g:imported
13001c991144SBram Moolenaar  unlet g:imported_added
13011c991144SBram Moolenaar  unlet g:imported_func
13021c991144SBram Moolenaar  delete('Ximport_lbr.vim')
13031c991144SBram Moolenaar
13041c991144SBram Moolenaar  # import inside :def function
13055381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
13065381c7a1SBram Moolenaar    vim9script
13075381c7a1SBram Moolenaar    def ImportInDef()
13085381c7a1SBram Moolenaar      import exported from './Xexport.vim'
13095381c7a1SBram Moolenaar      g:imported = exported
13105381c7a1SBram Moolenaar      exported += 7
13115381c7a1SBram Moolenaar      g:imported_added = exported
13125381c7a1SBram Moolenaar    enddef
13135381c7a1SBram Moolenaar    ImportInDef()
13145381c7a1SBram Moolenaar  END
13155381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
13165381c7a1SBram Moolenaar  source Ximport2.vim
1317f5be8cdbSBram Moolenaar  # TODO: this should be 9879
13185381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
13195381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
13205381c7a1SBram Moolenaar  unlet g:imported
13215381c7a1SBram Moolenaar  unlet g:imported_added
13225381c7a1SBram Moolenaar  delete('Ximport2.vim')
13235381c7a1SBram Moolenaar
1324f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
1325f2d5c240SBram Moolenaar    vim9script
1326f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1327f2d5c240SBram Moolenaar    def UseExport()
1328f2d5c240SBram Moolenaar      g:imported = Export.exported
1329f2d5c240SBram Moolenaar    enddef
1330f2d5c240SBram Moolenaar    UseExport()
1331f2d5c240SBram Moolenaar  END
1332f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1333f2d5c240SBram Moolenaar  source Ximport.vim
13345381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1335f2d5c240SBram Moolenaar
1336599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
1337599c89c8SBram Moolenaar    vim9script
1338599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1339599c89c8SBram Moolenaar    def Func()
1340599c89c8SBram Moolenaar      let dummy = 1
1341599c89c8SBram Moolenaar      let imported = Export + dummy
1342599c89c8SBram Moolenaar    enddef
1343822ba247SBram Moolenaar    defcompile
1344599c89c8SBram Moolenaar  END
1345599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
1346599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
1347599c89c8SBram Moolenaar
1348599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
1349599c89c8SBram Moolenaar    vim9script
1350599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1351599c89c8SBram Moolenaar    def Func()
1352599c89c8SBram Moolenaar      let imported = Export . exported
1353599c89c8SBram Moolenaar    enddef
1354822ba247SBram Moolenaar    defcompile
1355599c89c8SBram Moolenaar  END
1356599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
1357599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1358599c89c8SBram Moolenaar
1359599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
1360599c89c8SBram Moolenaar    vim9script
1361599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1362599c89c8SBram Moolenaar    def Func()
1363599c89c8SBram Moolenaar      let imported = Export.
1364599c89c8SBram Moolenaar    enddef
1365822ba247SBram Moolenaar    defcompile
1366599c89c8SBram Moolenaar  END
1367599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
1368599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1369599c89c8SBram Moolenaar
13701c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
13711c991144SBram Moolenaar    vim9script
13721c991144SBram Moolenaar    import *
13731c991144SBram Moolenaar        as Export
13741c991144SBram Moolenaar        from
13751c991144SBram Moolenaar        './Xexport.vim'
13761c991144SBram Moolenaar    def UseExport()
13771c991144SBram Moolenaar      g:imported = Export.exported
13781c991144SBram Moolenaar    enddef
13791c991144SBram Moolenaar    UseExport()
13801c991144SBram Moolenaar  END
13811c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
13821c991144SBram Moolenaar  source Ximport.vim
13831c991144SBram Moolenaar  assert_equal(9883, g:imported)
13841c991144SBram Moolenaar
1385f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1386f2d5c240SBram Moolenaar    vim9script
1387f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1388f2d5c240SBram Moolenaar  END
1389f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
1390f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
1391f2d5c240SBram Moolenaar
1392f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1393fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1394fa29c8abSBram Moolenaar    vim9script
1395fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1396fa29c8abSBram Moolenaar  END
1397fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
1398fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
1399fa29c8abSBram Moolenaar
1400f5be8cdbSBram Moolenaar  # try to import something that is already defined
14015269bd2aSBram Moolenaar  let import_already_defined =<< trim END
14025269bd2aSBram Moolenaar    vim9script
14035269bd2aSBram Moolenaar    let exported = 'something'
14045269bd2aSBram Moolenaar    import exported from './Xexport.vim'
14055269bd2aSBram Moolenaar  END
14065269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
14075269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
14085269bd2aSBram Moolenaar
1409f5be8cdbSBram Moolenaar  # try to import something that is already defined
14105269bd2aSBram Moolenaar  import_already_defined =<< trim END
14115269bd2aSBram Moolenaar    vim9script
14125269bd2aSBram Moolenaar    let exported = 'something'
14135269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
14145269bd2aSBram Moolenaar  END
14155269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
14165269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
14175269bd2aSBram Moolenaar
1418f5be8cdbSBram Moolenaar  # try to import something that is already defined
14195269bd2aSBram Moolenaar  import_already_defined =<< trim END
14205269bd2aSBram Moolenaar    vim9script
14215269bd2aSBram Moolenaar    let exported = 'something'
14225269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
14235269bd2aSBram Moolenaar  END
14245269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
14255269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
14265269bd2aSBram Moolenaar
1427f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1428fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1429fa29c8abSBram Moolenaar    vim9script
1430fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1431fa29c8abSBram Moolenaar  END
1432fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
1433fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1434fa29c8abSBram Moolenaar
1435fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1436fa29c8abSBram Moolenaar    vim9script
1437fa29c8abSBram Moolenaar    import name './Xexport.vim'
1438fa29c8abSBram Moolenaar  END
1439fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
1440fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
1441fa29c8abSBram Moolenaar
1442fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1443fa29c8abSBram Moolenaar    vim9script
1444fa29c8abSBram Moolenaar    import name from Xexport.vim
1445fa29c8abSBram Moolenaar  END
1446fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
1447fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
1448fa29c8abSBram Moolenaar
1449fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1450fa29c8abSBram Moolenaar    vim9script
1451fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1452fa29c8abSBram Moolenaar  END
1453fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
1454fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
1455fa29c8abSBram Moolenaar
1456fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1457fa29c8abSBram Moolenaar    vim9script
1458fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1459fa29c8abSBram Moolenaar  END
14605269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
14615269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
1462fa29c8abSBram Moolenaar
1463f2d5c240SBram Moolenaar  delete('Ximport.vim')
14645269bd2aSBram Moolenaar  delete('Ximport3.vim')
14658a7d6542SBram Moolenaar  delete('Xexport.vim')
14668a7d6542SBram Moolenaar
1467f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1468750802b5SBram Moolenaar  set cpo&vi
1469750802b5SBram Moolenaar  let cpo_before = &cpo
1470750802b5SBram Moolenaar  let lines =<< trim END
1471750802b5SBram Moolenaar    vim9script
1472750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1473750802b5SBram Moolenaar  END
1474750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1475750802b5SBram Moolenaar  source Xvim9_script
1476750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1477750802b5SBram Moolenaar  set cpo&vim
1478750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1479750802b5SBram Moolenaar  delete('Xvim9_script')
1480750802b5SBram Moolenaarenddef
1481750802b5SBram Moolenaar
1482803af686SBram Moolenaarfunc g:Trigger()
1483803af686SBram Moolenaar  source Ximport.vim
1484803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1485803af686SBram Moolenaarendfunc
1486803af686SBram Moolenaar
1487803af686SBram Moolenaardef Test_import_export_expr_map()
1488803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1489803af686SBram Moolenaar  let export_lines =<< trim END
1490803af686SBram Moolenaar    vim9script
1491803af686SBram Moolenaar    export def That(): string
1492803af686SBram Moolenaar      return 'yes'
1493803af686SBram Moolenaar    enddef
1494803af686SBram Moolenaar  END
1495803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1496803af686SBram Moolenaar
1497803af686SBram Moolenaar  let import_lines =<< trim END
1498803af686SBram Moolenaar    vim9script
1499803af686SBram Moolenaar    import That from './Xexport_that.vim'
1500803af686SBram Moolenaar    assert_equal('yes', That())
1501803af686SBram Moolenaar  END
1502803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1503803af686SBram Moolenaar
1504803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1505803af686SBram Moolenaar  feedkeys('trigger', "xt")
1506803af686SBram Moolenaar
1507730b2483SBram Moolenaar  delete('Xexport_that.vim')
1508803af686SBram Moolenaar  delete('Ximport.vim')
1509803af686SBram Moolenaar  nunmap trigger
1510803af686SBram Moolenaarenddef
1511803af686SBram Moolenaar
15128e1986e3SBram Moolenaardef Test_import_in_filetype()
15138e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
15148e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
15158e1986e3SBram Moolenaar  let export_lines =<< trim END
15168e1986e3SBram Moolenaar    vim9script
15178e1986e3SBram Moolenaar    export let That = 'yes'
15188e1986e3SBram Moolenaar  END
1519730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
15208e1986e3SBram Moolenaar
15218e1986e3SBram Moolenaar  let import_lines =<< trim END
15228e1986e3SBram Moolenaar    vim9script
1523730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
15248e1986e3SBram Moolenaar    assert_equal('yes', That)
15258e1986e3SBram Moolenaar    g:did_load_mytpe = 1
15268e1986e3SBram Moolenaar  END
15278e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
15288e1986e3SBram Moolenaar
15298e1986e3SBram Moolenaar  let save_rtp = &rtp
15308e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
15318e1986e3SBram Moolenaar
15328e1986e3SBram Moolenaar  filetype plugin on
15338e1986e3SBram Moolenaar  copen
15348e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
15358e1986e3SBram Moolenaar
15368e1986e3SBram Moolenaar  quit!
1537730b2483SBram Moolenaar  delete('Xexport_ft.vim')
15388e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
15398e1986e3SBram Moolenaar  &rtp = save_rtp
15408e1986e3SBram Moolenaarenddef
15418e1986e3SBram Moolenaar
1542efa94447SBram Moolenaardef Test_use_import_in_mapping()
1543efa94447SBram Moolenaar  let lines =<< trim END
1544efa94447SBram Moolenaar      vim9script
1545efa94447SBram Moolenaar      export def Funcx()
1546efa94447SBram Moolenaar        g:result = 42
1547efa94447SBram Moolenaar      enddef
1548efa94447SBram Moolenaar  END
1549efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1550efa94447SBram Moolenaar  lines =<< trim END
1551efa94447SBram Moolenaar      vim9script
1552efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1553b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1554efa94447SBram Moolenaar  END
1555efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1556efa94447SBram Moolenaar
1557efa94447SBram Moolenaar  source Xmapscript.vim
1558b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1559efa94447SBram Moolenaar  assert_equal(42, g:result)
1560efa94447SBram Moolenaar
1561efa94447SBram Moolenaar  unlet g:result
1562efa94447SBram Moolenaar  delete('XsomeExport.vim')
1563efa94447SBram Moolenaar  delete('Xmapscript.vim')
1564b3ca9824SBram Moolenaar  nunmap <F3>
1565efa94447SBram Moolenaarenddef
1566efa94447SBram Moolenaar
1567750802b5SBram Moolenaardef Test_vim9script_fails()
15688a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
15698a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1570750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
15719721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
15729b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1573750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1574750802b5SBram Moolenaar
1575451c2e35SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1012:')
1576c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1577c785b9a7SBram Moolenaar
1578*e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1579*e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
15808a7d6542SBram Moolenaarenddef
15818a7d6542SBram Moolenaar
1582f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1583101f4810SBram Moolenaar  CheckRunVimInTerminal
1584101f4810SBram Moolenaar
15859bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1586c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
15879bb3eb3eSBram Moolenaarendfunc
15889bb3eb3eSBram Moolenaar
1589c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1590101f4810SBram Moolenaar  let export =<< trim END
1591101f4810SBram Moolenaar    vim9script
1592101f4810SBram Moolenaar    export def Foo(): number
1593101f4810SBram Moolenaar        return 0
1594101f4810SBram Moolenaar    enddef
1595101f4810SBram Moolenaar  END
1596730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1597101f4810SBram Moolenaar
1598730b2483SBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{
15999bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
16009bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1601101f4810SBram Moolenaar
1602730b2483SBram Moolenaar  delete('XexportCmd.vim')
16039bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
16049bb3eb3eSBram Moolenaarenddef
1605101f4810SBram Moolenaar
16064c17ad94SBram Moolenaardef Test_vim9script_reload_import()
16078a7d6542SBram Moolenaar  let lines =<< trim END
16088a7d6542SBram Moolenaar    vim9script
16098a7d6542SBram Moolenaar    const var = ''
16108a7d6542SBram Moolenaar    let valone = 1234
16118a7d6542SBram Moolenaar    def MyFunc(arg: string)
16128a7d6542SBram Moolenaar       valone = 5678
16138a7d6542SBram Moolenaar    enddef
16148a7d6542SBram Moolenaar  END
16158a7d6542SBram Moolenaar  let morelines =<< trim END
16168a7d6542SBram Moolenaar    let valtwo = 222
16178a7d6542SBram Moolenaar    export def GetValtwo(): number
16188a7d6542SBram Moolenaar      return valtwo
16198a7d6542SBram Moolenaar    enddef
16208a7d6542SBram Moolenaar  END
162103afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
16228a7d6542SBram Moolenaar  source Xreload.vim
16238a7d6542SBram Moolenaar  source Xreload.vim
16248a7d6542SBram Moolenaar  source Xreload.vim
16258a7d6542SBram Moolenaar
16268a7d6542SBram Moolenaar  let testlines =<< trim END
16278a7d6542SBram Moolenaar    vim9script
16288a7d6542SBram Moolenaar    def TheFunc()
16298a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
16308a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
16318a7d6542SBram Moolenaar    enddef
16328a7d6542SBram Moolenaar    TheFunc()
16338a7d6542SBram Moolenaar  END
16348a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
16358a7d6542SBram Moolenaar  source Ximport.vim
16368a7d6542SBram Moolenaar
1637f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1638f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
16398a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
16408a7d6542SBram Moolenaar  source Ximport.vim
16418a7d6542SBram Moolenaar
1642f5be8cdbSBram Moolenaar  # cannot declare a var twice
16438a7d6542SBram Moolenaar  lines =<< trim END
16448a7d6542SBram Moolenaar    vim9script
16458a7d6542SBram Moolenaar    let valone = 1234
16468a7d6542SBram Moolenaar    let valone = 5678
16478a7d6542SBram Moolenaar  END
16488a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
16498a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
16508a7d6542SBram Moolenaar
16518a7d6542SBram Moolenaar  delete('Xreload.vim')
16528a7d6542SBram Moolenaar  delete('Ximport.vim')
16538a7d6542SBram Moolenaarenddef
16548a7d6542SBram Moolenaar
165595006e3dSBram Moolenaardef s:RetSome(): string
165695006e3dSBram Moolenaar  return 'some'
165795006e3dSBram Moolenaarenddef
165895006e3dSBram Moolenaar
1659fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1660fe465a01SBram Moolenaar" script-local name.
1661fe465a01SBram Moolenaardef Test_vim9script_funcref()
1662fe465a01SBram Moolenaar  let sortlines =<< trim END
1663fe465a01SBram Moolenaar      vim9script
1664fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1665bed36b93SBram Moolenaar        return i2 - i1
1666fe465a01SBram Moolenaar      enddef
1667fe465a01SBram Moolenaar
1668fe465a01SBram Moolenaar      export def FastSort(): list<number>
1669fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1670fe465a01SBram Moolenaar      enddef
1671fe465a01SBram Moolenaar  END
1672fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1673fe465a01SBram Moolenaar
1674fe465a01SBram Moolenaar  let lines =<< trim END
1675fe465a01SBram Moolenaar    vim9script
1676fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1677fe465a01SBram Moolenaar    def Test()
1678fe465a01SBram Moolenaar      g:result = FastSort()
1679fe465a01SBram Moolenaar    enddef
1680fe465a01SBram Moolenaar    Test()
1681fe465a01SBram Moolenaar  END
1682fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1683fe465a01SBram Moolenaar
1684fe465a01SBram Moolenaar  source Xscript.vim
1685fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1686fe465a01SBram Moolenaar
1687fe465a01SBram Moolenaar  unlet g:result
1688fe465a01SBram Moolenaar  delete('Xsort.vim')
1689fe465a01SBram Moolenaar  delete('Xscript.vim')
169095006e3dSBram Moolenaar
169195006e3dSBram Moolenaar  let Funcref = function('s:RetSome')
169295006e3dSBram Moolenaar  assert_equal('some', Funcref())
1693fe465a01SBram Moolenaarenddef
1694fe465a01SBram Moolenaar
1695601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1696601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1697601e76acSBram Moolenaar" function reference.
1698c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1699c620c055SBram Moolenaar  let filterLines =<< trim END
1700c620c055SBram Moolenaar    vim9script
1701c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1702c620c055SBram Moolenaar      return idx % 2 == 1
1703c620c055SBram Moolenaar    enddef
1704c620c055SBram Moolenaar    export def FastFilter(): list<number>
1705c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1706c620c055SBram Moolenaar    enddef
1707601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1708601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1709601e76acSBram Moolenaar    enddef
1710c620c055SBram Moolenaar  END
1711c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1712c620c055SBram Moolenaar
1713c620c055SBram Moolenaar  let lines =<< trim END
1714c620c055SBram Moolenaar    vim9script
1715601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1716c620c055SBram Moolenaar    def Test()
1717c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1718c620c055SBram Moolenaar    enddef
1719c620c055SBram Moolenaar    Test()
1720601e76acSBram Moolenaar    def TestDirect()
1721601e76acSBram Moolenaar      let x: list<number> = FastFilterDirect()
1722601e76acSBram Moolenaar    enddef
1723601e76acSBram Moolenaar    TestDirect()
1724c620c055SBram Moolenaar  END
1725601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1726c620c055SBram Moolenaar  delete('Xfilter.vim')
1727c620c055SBram Moolenaarenddef
1728c620c055SBram Moolenaar
17294c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
17304c17ad94SBram Moolenaar  let first_lines =<< trim END
17314c17ad94SBram Moolenaar    vim9script
17324c17ad94SBram Moolenaar    def FuncYes(): string
17334c17ad94SBram Moolenaar      return 'yes'
17344c17ad94SBram Moolenaar    enddef
17354c17ad94SBram Moolenaar  END
173603afdcf1SBram Moolenaar  let withno_lines =<< trim END
17374c17ad94SBram Moolenaar    def FuncNo(): string
17384c17ad94SBram Moolenaar      return 'no'
17394c17ad94SBram Moolenaar    enddef
17404c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
17414c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
17424c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
174303afdcf1SBram Moolenaar    enddef
174403afdcf1SBram Moolenaar  END
174503afdcf1SBram Moolenaar  let nono_lines =<< trim END
174603afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
174703afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
17484c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
17494c17ad94SBram Moolenaar    enddef
17504c17ad94SBram Moolenaar  END
17514c17ad94SBram Moolenaar
17524c17ad94SBram Moolenaar  # FuncNo() is defined
175303afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
17544c17ad94SBram Moolenaar  source Xreloaded.vim
17554c17ad94SBram Moolenaar  g:DoCheck(true)
17564c17ad94SBram Moolenaar
17574c17ad94SBram Moolenaar  # FuncNo() is not redefined
175803afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
17594c17ad94SBram Moolenaar  source Xreloaded.vim
176003afdcf1SBram Moolenaar  g:DoCheck()
17614c17ad94SBram Moolenaar
17624c17ad94SBram Moolenaar  # FuncNo() is back
176303afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
17644c17ad94SBram Moolenaar  source Xreloaded.vim
176503afdcf1SBram Moolenaar  g:DoCheck()
17664c17ad94SBram Moolenaar
17674c17ad94SBram Moolenaar  delete('Xreloaded.vim')
17684c17ad94SBram Moolenaarenddef
17694c17ad94SBram Moolenaar
177089483d40SBram Moolenaardef Test_vim9script_reload_delvar()
177189483d40SBram Moolenaar  # write the script with a script-local variable
177289483d40SBram Moolenaar  let lines =<< trim END
177389483d40SBram Moolenaar    vim9script
177489483d40SBram Moolenaar    let var = 'string'
177589483d40SBram Moolenaar  END
177689483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
177789483d40SBram Moolenaar  source XreloadVar.vim
177889483d40SBram Moolenaar
177989483d40SBram Moolenaar  # now write the script using the same variable locally - works
178089483d40SBram Moolenaar  lines =<< trim END
178189483d40SBram Moolenaar    vim9script
178289483d40SBram Moolenaar    def Func()
178389483d40SBram Moolenaar      let var = 'string'
178489483d40SBram Moolenaar    enddef
178589483d40SBram Moolenaar  END
178689483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
178789483d40SBram Moolenaar  source XreloadVar.vim
178889483d40SBram Moolenaar
178989483d40SBram Moolenaar  delete('XreloadVar.vim')
179089483d40SBram Moolenaarenddef
179189483d40SBram Moolenaar
17928a7d6542SBram Moolenaardef Test_import_absolute()
17938a7d6542SBram Moolenaar  let import_lines = [
1794e6085c53SBram Moolenaar        'vim9script',
1795e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1796e6085c53SBram Moolenaar        'def UseExported()',
1797e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1798e6085c53SBram Moolenaar        '  exported = 8888',
1799e6085c53SBram Moolenaar        '  g:imported_after = exported',
1800e6085c53SBram Moolenaar        'enddef',
1801e6085c53SBram Moolenaar        'UseExported()',
1802e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1803e6085c53SBram Moolenaar        ]
18048a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
18058a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
18068a7d6542SBram Moolenaar
18078a7d6542SBram Moolenaar  source Ximport_abs.vim
18088a7d6542SBram Moolenaar
18098a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
18104e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1811675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1812675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1813675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1814675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1815675f716eSBram Moolenaar          'exported = 8888.*' ..
1816675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1817675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1818675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1819675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1820e6085c53SBram Moolenaar        g:import_disassembled)
1821b3ca9824SBram Moolenaar
1822b3ca9824SBram Moolenaar  Undo_export_script_lines()
18238a7d6542SBram Moolenaar  unlet g:imported_abs
18244e12a5dfSBram Moolenaar  unlet g:import_disassembled
18258a7d6542SBram Moolenaar
18268a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
18278a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
18288a7d6542SBram Moolenaarenddef
18298a7d6542SBram Moolenaar
18308a7d6542SBram Moolenaardef Test_import_rtp()
18318a7d6542SBram Moolenaar  let import_lines = [
1832e6085c53SBram Moolenaar        'vim9script',
1833e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1834e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1835e6085c53SBram Moolenaar        ]
18368a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
18378a7d6542SBram Moolenaar  mkdir('import')
18388a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
18398a7d6542SBram Moolenaar
18408a7d6542SBram Moolenaar  let save_rtp = &rtp
18418a7d6542SBram Moolenaar  &rtp = getcwd()
18428a7d6542SBram Moolenaar  source Ximport_rtp.vim
18438a7d6542SBram Moolenaar  &rtp = save_rtp
18448a7d6542SBram Moolenaar
18458a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
18468a7d6542SBram Moolenaar
1847b3ca9824SBram Moolenaar  Undo_export_script_lines()
1848b3ca9824SBram Moolenaar  unlet g:imported_rtp
18498a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
185089483d40SBram Moolenaar  delete('import', 'rf')
18518a7d6542SBram Moolenaarenddef
18528a7d6542SBram Moolenaar
185325e0f586SBram Moolenaardef Test_import_compile_error()
185425e0f586SBram Moolenaar  let export_lines = [
185525e0f586SBram Moolenaar        'vim9script',
185625e0f586SBram Moolenaar        'export def ExpFunc(): string',
185725e0f586SBram Moolenaar        '  return notDefined',
185825e0f586SBram Moolenaar        'enddef',
185925e0f586SBram Moolenaar        ]
186025e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
186125e0f586SBram Moolenaar
186225e0f586SBram Moolenaar  let import_lines = [
186325e0f586SBram Moolenaar        'vim9script',
186425e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
186525e0f586SBram Moolenaar        'def ImpFunc()',
186625e0f586SBram Moolenaar        '  echo ExpFunc()',
186725e0f586SBram Moolenaar        'enddef',
186825e0f586SBram Moolenaar        'defcompile',
186925e0f586SBram Moolenaar        ]
187025e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
187125e0f586SBram Moolenaar
187225e0f586SBram Moolenaar  try
187325e0f586SBram Moolenaar    source Ximport.vim
187425e0f586SBram Moolenaar  catch /E1001/
1875f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
187625e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
187725e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
187825e0f586SBram Moolenaar  endtry
187925e0f586SBram Moolenaar
188025e0f586SBram Moolenaar  delete('Xexported.vim')
188125e0f586SBram Moolenaar  delete('Ximport.vim')
188225e0f586SBram Moolenaarenddef
188325e0f586SBram Moolenaar
1884c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1885c4ce36d4SBram Moolenaar  let lines = [
1886c4ce36d4SBram Moolenaar        'vim9script',
1887c4ce36d4SBram Moolenaar        'def Func()',
1888c4ce36d4SBram Moolenaar        '  eval [][0]',
1889c4ce36d4SBram Moolenaar        'enddef',
1890c4ce36d4SBram Moolenaar        'Func()',
1891c4ce36d4SBram Moolenaar        ]
1892c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1893c4ce36d4SBram Moolenaar
1894c4ce36d4SBram Moolenaar  for count in range(3)
1895c4ce36d4SBram Moolenaar    try
1896c4ce36d4SBram Moolenaar      source Xtestscript.vim
1897c4ce36d4SBram Moolenaar    catch /E684/
1898c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1899c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1900c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1901c4ce36d4SBram Moolenaar    endtry
1902c4ce36d4SBram Moolenaar  endfor
1903c4ce36d4SBram Moolenaar
1904c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1905c4ce36d4SBram Moolenaarenddef
1906c4ce36d4SBram Moolenaar
1907eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1908eef2102eSBram Moolenaar  let export_lines =<< trim END
1909eef2102eSBram Moolenaar      vim9script
1910eef2102eSBram Moolenaar      export def Func()
1911eef2102eSBram Moolenaar        echo 'imported'
1912eef2102eSBram Moolenaar      enddef
1913eef2102eSBram Moolenaar  END
1914eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1915eef2102eSBram Moolenaar
1916eef2102eSBram Moolenaar  let lines =<< trim END
1917eef2102eSBram Moolenaar    vim9script
1918eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1919eef2102eSBram Moolenaar    def Func()
1920eef2102eSBram Moolenaar      echo 'local to function'
1921eef2102eSBram Moolenaar    enddef
1922eef2102eSBram Moolenaar  END
1923eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1924eef2102eSBram Moolenaar
1925eef2102eSBram Moolenaar  lines =<< trim END
1926eef2102eSBram Moolenaar    vim9script
1927eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1928eef2102eSBram Moolenaar    def Outer()
1929eef2102eSBram Moolenaar      def Func()
1930eef2102eSBram Moolenaar        echo 'local to function'
1931eef2102eSBram Moolenaar      enddef
1932eef2102eSBram Moolenaar    enddef
1933eef2102eSBram Moolenaar    defcompile
1934eef2102eSBram Moolenaar  END
1935eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1936eef2102eSBram Moolenaar
1937eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1938eef2102eSBram Moolenaarenddef
1939eef2102eSBram Moolenaar
1940b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1941b9a2cac3SBram Moolenaar  let lines =<< trim END
1942b9a2cac3SBram Moolenaar    vim9script
1943b9a2cac3SBram Moolenaar    def Func()
1944b9a2cac3SBram Moolenaar      echo 'one'
1945b9a2cac3SBram Moolenaar    enddef
1946b9a2cac3SBram Moolenaar    def Func()
1947b9a2cac3SBram Moolenaar      echo 'two'
1948b9a2cac3SBram Moolenaar    enddef
1949b9a2cac3SBram Moolenaar  END
1950b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1951fa211f3cSBram Moolenaar
1952fa211f3cSBram Moolenaar  lines =<< trim END
1953fa211f3cSBram Moolenaar    vim9script
1954fa211f3cSBram Moolenaar    def Foo(): string
1955fa211f3cSBram Moolenaar      return 'foo'
1956fa211f3cSBram Moolenaar      enddef
1957fa211f3cSBram Moolenaar    def Func()
1958fa211f3cSBram Moolenaar      let  Foo = {-> 'lambda'}
1959fa211f3cSBram Moolenaar    enddef
1960fa211f3cSBram Moolenaar    defcompile
1961fa211f3cSBram Moolenaar  END
1962fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1963b9a2cac3SBram Moolenaarenddef
1964b9a2cac3SBram Moolenaar
19658a7d6542SBram Moolenaardef Test_fixed_size_list()
1966f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
19678a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
19688a7d6542SBram Moolenaar  l->remove(0)
19698a7d6542SBram Moolenaar  l->add(5)
19708a7d6542SBram Moolenaar  l->insert(99, 1)
19710f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
19728a7d6542SBram Moolenaarenddef
19738a7d6542SBram Moolenaar
1974ae616494SBram Moolenaardef Test_no_insert_xit()
1975ae616494SBram Moolenaar  call CheckDefExecFailure(['a = 1'], 'E1100:')
1976ae616494SBram Moolenaar  call CheckDefExecFailure(['c = 1'], 'E1100:')
1977f5a48010SBram Moolenaar  call CheckDefExecFailure(['i = 1'], 'E1100:')
1978f5a48010SBram Moolenaar  call CheckDefExecFailure(['t = 1'], 'E1100:')
1979f5a48010SBram Moolenaar  call CheckDefExecFailure(['x = 1'], 'E1100:')
1980ae616494SBram Moolenaar
1981ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1982ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1983ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1984ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1985f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1986f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1987f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1988f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1989f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1990ae616494SBram Moolenaarenddef
1991ae616494SBram Moolenaar
1992158906cfSBram Moolenaardef IfElse(what: number): string
1993158906cfSBram Moolenaar  let res = ''
1994158906cfSBram Moolenaar  if what == 1
1995158906cfSBram Moolenaar    res = "one"
1996158906cfSBram Moolenaar  elseif what == 2
1997158906cfSBram Moolenaar    res = "two"
1998a259d8d3SBram Moolenaar  else
1999158906cfSBram Moolenaar    res = "three"
2000a259d8d3SBram Moolenaar  endif
2001158906cfSBram Moolenaar  return res
2002a259d8d3SBram Moolenaarenddef
2003a259d8d3SBram Moolenaar
2004158906cfSBram Moolenaardef Test_if_elseif_else()
2005158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
2006158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
2007158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
20080f18b6d1SBram Moolenaarenddef
20090f18b6d1SBram Moolenaar
2010e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
2011e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
2012e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
2013e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
2014e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
2015585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
2016e8c4abbbSBram Moolenaarenddef
2017e8c4abbbSBram Moolenaar
20186d69bf60SBram Moolenaarlet g:bool_true = v:true
20196d69bf60SBram Moolenaarlet g:bool_false = v:false
20206d69bf60SBram Moolenaar
20216d69bf60SBram Moolenaardef Test_if_const_expr()
20226d69bf60SBram Moolenaar  let res = false
20236d69bf60SBram Moolenaar  if true ? true : false
20246d69bf60SBram Moolenaar    res = true
20256d69bf60SBram Moolenaar  endif
20266d69bf60SBram Moolenaar  assert_equal(true, res)
20276d69bf60SBram Moolenaar
2028585fea7bSBram Moolenaar  g:glob = 2
2029585fea7bSBram Moolenaar  if false
20306797966dSBram Moolenaar    execute('g:glob = 3')
2031585fea7bSBram Moolenaar  endif
2032585fea7bSBram Moolenaar  assert_equal(2, g:glob)
2033585fea7bSBram Moolenaar  if true
20346797966dSBram Moolenaar    execute('g:glob = 3')
2035585fea7bSBram Moolenaar  endif
2036585fea7bSBram Moolenaar  assert_equal(3, g:glob)
2037585fea7bSBram Moolenaar
20386d69bf60SBram Moolenaar  res = false
20396d69bf60SBram Moolenaar  if g:bool_true ? true : false
20406d69bf60SBram Moolenaar    res = true
20416d69bf60SBram Moolenaar  endif
20426d69bf60SBram Moolenaar  assert_equal(true, res)
20436d69bf60SBram Moolenaar
20446d69bf60SBram Moolenaar  res = false
20456d69bf60SBram Moolenaar  if true ? g:bool_true : false
20466d69bf60SBram Moolenaar    res = true
20476d69bf60SBram Moolenaar  endif
20486d69bf60SBram Moolenaar  assert_equal(true, res)
20496d69bf60SBram Moolenaar
20506d69bf60SBram Moolenaar  res = false
20516d69bf60SBram Moolenaar  if true ? true : g:bool_false
20526d69bf60SBram Moolenaar    res = true
20536d69bf60SBram Moolenaar  endif
20546d69bf60SBram Moolenaar  assert_equal(true, res)
20556d69bf60SBram Moolenaar
20566d69bf60SBram Moolenaar  res = false
20576d69bf60SBram Moolenaar  if true ? false : true
20586d69bf60SBram Moolenaar    res = true
20596d69bf60SBram Moolenaar  endif
20606d69bf60SBram Moolenaar  assert_equal(false, res)
20616d69bf60SBram Moolenaar
20626d69bf60SBram Moolenaar  res = false
20636d69bf60SBram Moolenaar  if false ? false : true
20646d69bf60SBram Moolenaar    res = true
20656d69bf60SBram Moolenaar  endif
20666d69bf60SBram Moolenaar  assert_equal(true, res)
20676d69bf60SBram Moolenaar
20686d69bf60SBram Moolenaar  res = false
20696d69bf60SBram Moolenaar  if false ? true : false
20706d69bf60SBram Moolenaar    res = true
20716d69bf60SBram Moolenaar  endif
20726d69bf60SBram Moolenaar  assert_equal(false, res)
20736d69bf60SBram Moolenaar
20746d69bf60SBram Moolenaar  res = false
2075e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2076e8c4abbbSBram Moolenaar    res = true
2077e8c4abbbSBram Moolenaar  endif
2078e8c4abbbSBram Moolenaar  assert_equal(false, res)
2079e8c4abbbSBram Moolenaar
2080e8c4abbbSBram Moolenaar  res = false
20816d69bf60SBram Moolenaar  if true && true
20826d69bf60SBram Moolenaar    res = true
20836d69bf60SBram Moolenaar  endif
20846d69bf60SBram Moolenaar  assert_equal(true, res)
20856d69bf60SBram Moolenaar
20866d69bf60SBram Moolenaar  res = false
20876d69bf60SBram Moolenaar  if true && false
20886d69bf60SBram Moolenaar    res = true
20896d69bf60SBram Moolenaar  endif
20906d69bf60SBram Moolenaar  assert_equal(false, res)
20916d69bf60SBram Moolenaar
20926d69bf60SBram Moolenaar  res = false
20936d69bf60SBram Moolenaar  if g:bool_true && false
20946d69bf60SBram Moolenaar    res = true
20956d69bf60SBram Moolenaar  endif
20966d69bf60SBram Moolenaar  assert_equal(false, res)
20976d69bf60SBram Moolenaar
20986d69bf60SBram Moolenaar  res = false
20996d69bf60SBram Moolenaar  if true && g:bool_false
21006d69bf60SBram Moolenaar    res = true
21016d69bf60SBram Moolenaar  endif
21026d69bf60SBram Moolenaar  assert_equal(false, res)
21036d69bf60SBram Moolenaar
21046d69bf60SBram Moolenaar  res = false
21056d69bf60SBram Moolenaar  if false && false
21066d69bf60SBram Moolenaar    res = true
21076d69bf60SBram Moolenaar  endif
21086d69bf60SBram Moolenaar  assert_equal(false, res)
21096d69bf60SBram Moolenaar
21106d69bf60SBram Moolenaar  res = false
21116d69bf60SBram Moolenaar  if true || false
21126d69bf60SBram Moolenaar    res = true
21136d69bf60SBram Moolenaar  endif
21146d69bf60SBram Moolenaar  assert_equal(true, res)
21156d69bf60SBram Moolenaar
21166d69bf60SBram Moolenaar  res = false
21176d69bf60SBram Moolenaar  if g:bool_true || false
21186d69bf60SBram Moolenaar    res = true
21196d69bf60SBram Moolenaar  endif
21206d69bf60SBram Moolenaar  assert_equal(true, res)
21216d69bf60SBram Moolenaar
21226d69bf60SBram Moolenaar  res = false
21236d69bf60SBram Moolenaar  if true || g:bool_false
21246d69bf60SBram Moolenaar    res = true
21256d69bf60SBram Moolenaar  endif
21266d69bf60SBram Moolenaar  assert_equal(true, res)
21276d69bf60SBram Moolenaar
21286d69bf60SBram Moolenaar  res = false
21296d69bf60SBram Moolenaar  if false || false
21306d69bf60SBram Moolenaar    res = true
21316d69bf60SBram Moolenaar  endif
21326d69bf60SBram Moolenaar  assert_equal(false, res)
21333988f64fSBram Moolenaar
21343988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
21353988f64fSBram Moolenaar  if false | eval 0 | endif
21363988f64fSBram Moolenaar  if false | eval burp + 234 | endif
21373988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
21383988f64fSBram Moolenaar  if false
21393988f64fSBram Moolenaar    burp
21403988f64fSBram Moolenaar  endif
214180c34ca3SBram Moolenaarenddef
21426d69bf60SBram Moolenaar
214380c34ca3SBram Moolenaardef Test_if_const_expr_fails()
214480c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
214580c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2146e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
2147e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
21486d69bf60SBram Moolenaarenddef
21496d69bf60SBram Moolenaar
215072abcf42SBram Moolenaardef RunNested(i: number): number
215172abcf42SBram Moolenaar  let x: number = 0
215272abcf42SBram Moolenaar  if i % 2
215372abcf42SBram Moolenaar    if 1
2154f5be8cdbSBram Moolenaar      # comment
215572abcf42SBram Moolenaar    else
2156f5be8cdbSBram Moolenaar      # comment
215772abcf42SBram Moolenaar    endif
215872abcf42SBram Moolenaar    x += 1
215972abcf42SBram Moolenaar  else
216072abcf42SBram Moolenaar    x += 1000
216172abcf42SBram Moolenaar  endif
216272abcf42SBram Moolenaar  return x
216372abcf42SBram Moolenaarenddef
216472abcf42SBram Moolenaar
216572abcf42SBram Moolenaardef Test_nested_if()
216672abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
216772abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
216872abcf42SBram Moolenaarenddef
216972abcf42SBram Moolenaar
2170ad39c094SBram Moolenaardef Test_execute_cmd()
2171ad39c094SBram Moolenaar  new
2172ad39c094SBram Moolenaar  setline(1, 'default')
2173ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
2174ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2175a72cfb80SBram Moolenaar
2176a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
2177a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2178a72cfb80SBram Moolenaar
2179ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
2180ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
2181a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2182ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2183a72cfb80SBram Moolenaar
2184ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
2185ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2186a72cfb80SBram Moolenaar
2187ad39c094SBram Moolenaar  let cmd_first = 'call '
2188ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
2189ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2190ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2191ad39c094SBram Moolenaar  bwipe!
2192585fea7bSBram Moolenaar
21932d6b20d6SBram Moolenaar  let n = true
21942d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
21952d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
21962d6b20d6SBram Moolenaar
2197e5abf7afSBram Moolenaar  echomsg [1, 2, 3] #{a: 1, b: 2}
2198e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2199e5abf7afSBram Moolenaar
2200430deb19SBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:', 1)
2201430deb19SBram Moolenaar  call CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2202430deb19SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2203ad39c094SBram Moolenaarenddef
2204ad39c094SBram Moolenaar
220547e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2206f5be8cdbSBram Moolenaar  # only checks line continuation
220747e880d6SBram Moolenaar  let lines =<< trim END
220847e880d6SBram Moolenaar      vim9script
220947e880d6SBram Moolenaar      execute 'g:someVar'
221047e880d6SBram Moolenaar                .. ' = ' ..
221147e880d6SBram Moolenaar                   '28'
221247e880d6SBram Moolenaar      assert_equal(28, g:someVar)
221347e880d6SBram Moolenaar      unlet g:someVar
221447e880d6SBram Moolenaar  END
221547e880d6SBram Moolenaar  CheckScriptSuccess(lines)
221647e880d6SBram Moolenaarenddef
221747e880d6SBram Moolenaar
2218ad39c094SBram Moolenaardef Test_echo_cmd()
2219a72cfb80SBram Moolenaar  echo 'some' # comment
2220585fea7bSBram Moolenaar  echon 'thing'
2221ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2222ad39c094SBram Moolenaar
2223a72cfb80SBram Moolenaar  echo "some" # comment
2224a72cfb80SBram Moolenaar  echon "thing"
2225a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2226a72cfb80SBram Moolenaar
2227ad39c094SBram Moolenaar  let str1 = 'some'
2228ad39c094SBram Moolenaar  let str2 = 'more'
2229ad39c094SBram Moolenaar  echo str1 str2
2230ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2231a72cfb80SBram Moolenaar
2232a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2233ad39c094SBram Moolenaarenddef
2234ad39c094SBram Moolenaar
2235f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2236f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2237f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2238f93c7feaSBram Moolenaar  echo 'clear'
2239df069eecSBram Moolenaar  :1messages
2240f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2241f93c7feaSBram Moolenaar
2242f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2243f93c7feaSBram Moolenaarenddef
2244f93c7feaSBram Moolenaar
224547e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2246f5be8cdbSBram Moolenaar  # only checks line continuation
224747e880d6SBram Moolenaar  let lines =<< trim END
224847e880d6SBram Moolenaar      vim9script
224947e880d6SBram Moolenaar      echomsg 'here'
225047e880d6SBram Moolenaar                .. ' is ' ..
225147e880d6SBram Moolenaar                   'a message'
225247e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
225347e880d6SBram Moolenaar  END
225447e880d6SBram Moolenaar  CheckScriptSuccess(lines)
225547e880d6SBram Moolenaarenddef
225647e880d6SBram Moolenaar
2257f93c7feaSBram Moolenaardef Test_echoerr_cmd()
225840ee466cSBram Moolenaar  try
225940ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
226040ee466cSBram Moolenaar  catch
226140ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
226240ee466cSBram Moolenaar  endtry
2263f93c7feaSBram Moolenaarenddef
2264f93c7feaSBram Moolenaar
226547e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2266f5be8cdbSBram Moolenaar  # only checks line continuation
226747e880d6SBram Moolenaar  let lines =<< trim END
226847e880d6SBram Moolenaar      vim9script
226947e880d6SBram Moolenaar      try
227047e880d6SBram Moolenaar        echoerr 'this'
227147e880d6SBram Moolenaar                .. ' is ' ..
227247e880d6SBram Moolenaar                   'wrong'
227347e880d6SBram Moolenaar      catch
227447e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
227547e880d6SBram Moolenaar      endtry
227647e880d6SBram Moolenaar  END
227747e880d6SBram Moolenaar  CheckScriptSuccess(lines)
227847e880d6SBram Moolenaarenddef
227947e880d6SBram Moolenaar
228041fe0617SBram Moolenaardef Test_for_outside_of_function()
228141fe0617SBram Moolenaar  let lines =<< trim END
228241fe0617SBram Moolenaar    vim9script
228341fe0617SBram Moolenaar    new
228441fe0617SBram Moolenaar    for var in range(0, 3)
228541fe0617SBram Moolenaar      append(line('$'), var)
228641fe0617SBram Moolenaar    endfor
228741fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
228841fe0617SBram Moolenaar    bwipe!
228941fe0617SBram Moolenaar  END
229041fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
229141fe0617SBram Moolenaar  source Xvim9for.vim
229241fe0617SBram Moolenaar  delete('Xvim9for.vim')
229341fe0617SBram Moolenaarenddef
22948a7d6542SBram Moolenaar
2295e8c4abbbSBram Moolenaardef Test_for_loop()
2296e8c4abbbSBram Moolenaar  let result = ''
2297e8c4abbbSBram Moolenaar  for cnt in range(7)
2298e8c4abbbSBram Moolenaar    if cnt == 4
2299e8c4abbbSBram Moolenaar      break
2300e8c4abbbSBram Moolenaar    endif
2301e8c4abbbSBram Moolenaar    if cnt == 2
2302e8c4abbbSBram Moolenaar      continue
2303e8c4abbbSBram Moolenaar    endif
2304e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2305e8c4abbbSBram Moolenaar  endfor
2306e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
23070ad3e894SBram Moolenaar
23080ad3e894SBram Moolenaar  let concat = ''
23090ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
23100ad3e894SBram Moolenaar    concat ..= str
23110ad3e894SBram Moolenaar  endfor
23120ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
2313e8c4abbbSBram Moolenaarenddef
2314e8c4abbbSBram Moolenaar
2315e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2316675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2317675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2318451c2e35SBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1017:')
2319822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
2320451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
2321675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2322675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2323675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2324e8c4abbbSBram Moolenaarenddef
2325e8c4abbbSBram Moolenaar
2326d0df1aacSBram Moolenaardef Test_while_loop()
2327d0df1aacSBram Moolenaar  let result = ''
2328d0df1aacSBram Moolenaar  let cnt = 0
2329d0df1aacSBram Moolenaar  while cnt < 555
2330d0df1aacSBram Moolenaar    if cnt == 3
2331d0df1aacSBram Moolenaar      break
2332d0df1aacSBram Moolenaar    endif
2333d0df1aacSBram Moolenaar    cnt += 1
2334d0df1aacSBram Moolenaar    if cnt == 2
2335d0df1aacSBram Moolenaar      continue
2336d0df1aacSBram Moolenaar    endif
2337d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2338d0df1aacSBram Moolenaar  endwhile
2339d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2340d0df1aacSBram Moolenaarenddef
2341d0df1aacSBram Moolenaar
2342e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2343675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2344675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2345675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2346675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2347675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2348675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2349675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
2350bd5da371SBram Moolenaarenddef
2351bd5da371SBram Moolenaar
23529645e2d9SBram Moolenaardef Test_interrupt_loop()
235397acfc78SBram Moolenaar  let caught = false
23549645e2d9SBram Moolenaar  let x = 0
235597acfc78SBram Moolenaar  try
23569645e2d9SBram Moolenaar    while 1
23579645e2d9SBram Moolenaar      x += 1
23589645e2d9SBram Moolenaar      if x == 100
23599645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
23609645e2d9SBram Moolenaar      endif
23619645e2d9SBram Moolenaar    endwhile
236297acfc78SBram Moolenaar  catch
236397acfc78SBram Moolenaar    caught = true
236497acfc78SBram Moolenaar    assert_equal(100, x)
236597acfc78SBram Moolenaar  endtry
236697acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
236725859dd7SBram Moolenaar  # consume the CTRL-C
236825859dd7SBram Moolenaar  getchar(0)
23699645e2d9SBram Moolenaarenddef
237020431c9dSBram Moolenaar
23714fdae999SBram Moolenaardef Test_automatic_line_continuation()
23724fdae999SBram Moolenaar  let mylist = [
23734fdae999SBram Moolenaar      'one',
23744fdae999SBram Moolenaar      'two',
23754fdae999SBram Moolenaar      'three',
2376f5be8cdbSBram Moolenaar      ] # comment
23774fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
23784fdae999SBram Moolenaar
23794fdae999SBram Moolenaar  let mydict = {
23804fdae999SBram Moolenaar      'one': 1,
23814fdae999SBram Moolenaar      'two': 2,
23824fdae999SBram Moolenaar      'three':
23834fdae999SBram Moolenaar          3,
2384f5be8cdbSBram Moolenaar      } # comment
23854fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
23864fdae999SBram Moolenaar  mydict = #{
23872c330432SBram Moolenaar      one: 1,  # comment
23882c330432SBram Moolenaar      two:     # comment
23892c330432SBram Moolenaar           2,  # comment
23902c330432SBram Moolenaar      three: 3 # comment
23912c330432SBram Moolenaar      }
23922c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
23932c330432SBram Moolenaar  mydict = #{
23942c330432SBram Moolenaar      one: 1,
23954fdae999SBram Moolenaar      two:
23964fdae999SBram Moolenaar           2,
23972c330432SBram Moolenaar      three: 3
23984fdae999SBram Moolenaar      }
23994fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
2400e6085c53SBram Moolenaar
2401e6085c53SBram Moolenaar  assert_equal(
2402e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2403e6085c53SBram Moolenaar        split('one two three')
2404e6085c53SBram Moolenaar        )
24054fdae999SBram Moolenaarenddef
24064fdae999SBram Moolenaar
24077a092245SBram Moolenaardef Test_vim9_comment()
24087a092245SBram Moolenaar  CheckScriptSuccess([
24097a092245SBram Moolenaar      'vim9script',
24107a092245SBram Moolenaar      '# something',
24117a092245SBram Moolenaar      ])
24127a092245SBram Moolenaar  CheckScriptFailure([
24137a092245SBram Moolenaar      'vim9script',
24147a092245SBram Moolenaar      ':# something',
24157a092245SBram Moolenaar      ], 'E488:')
24167a092245SBram Moolenaar  CheckScriptFailure([
24177a092245SBram Moolenaar      '# something',
24187a092245SBram Moolenaar      ], 'E488:')
24197a092245SBram Moolenaar  CheckScriptFailure([
24207a092245SBram Moolenaar      ':# something',
24217a092245SBram Moolenaar      ], 'E488:')
24227a092245SBram Moolenaar
24234a8d9f2eSBram Moolenaar  { # block start
24244a8d9f2eSBram Moolenaar  } # block end
24254a8d9f2eSBram Moolenaar  CheckDefFailure([
24264a8d9f2eSBram Moolenaar      '{# comment',
24274a8d9f2eSBram Moolenaar      ], 'E488:')
24284a8d9f2eSBram Moolenaar  CheckDefFailure([
24294a8d9f2eSBram Moolenaar      '{',
24304a8d9f2eSBram Moolenaar      '}# comment',
24314a8d9f2eSBram Moolenaar      ], 'E488:')
24324a8d9f2eSBram Moolenaar
24334a8d9f2eSBram Moolenaar  echo "yes" # comment
24344a8d9f2eSBram Moolenaar  CheckDefFailure([
24354a8d9f2eSBram Moolenaar      'echo "yes"# comment',
24364a8d9f2eSBram Moolenaar      ], 'E488:')
24377a092245SBram Moolenaar  CheckScriptSuccess([
24387a092245SBram Moolenaar      'vim9script',
24397a092245SBram Moolenaar      'echo "yes" # something',
24407a092245SBram Moolenaar      ])
24417a092245SBram Moolenaar  CheckScriptFailure([
24427a092245SBram Moolenaar      'vim9script',
24437a092245SBram Moolenaar      'echo "yes"# something',
24447a092245SBram Moolenaar      ], 'E121:')
24457a092245SBram Moolenaar  CheckScriptFailure([
24467a092245SBram Moolenaar      'vim9script',
24477a092245SBram Moolenaar      'echo# something',
24487a092245SBram Moolenaar      ], 'E121:')
24497a092245SBram Moolenaar  CheckScriptFailure([
24507a092245SBram Moolenaar      'echo "yes" # something',
24517a092245SBram Moolenaar      ], 'E121:')
24527a092245SBram Moolenaar
24534a8d9f2eSBram Moolenaar  exe "echo" # comment
24544a8d9f2eSBram Moolenaar  CheckDefFailure([
24554a8d9f2eSBram Moolenaar      'exe "echo"# comment',
24564a8d9f2eSBram Moolenaar      ], 'E488:')
24574a8d9f2eSBram Moolenaar  CheckScriptSuccess([
24584a8d9f2eSBram Moolenaar      'vim9script',
24594a8d9f2eSBram Moolenaar      'exe "echo" # something',
24604a8d9f2eSBram Moolenaar      ])
24614a8d9f2eSBram Moolenaar  CheckScriptFailure([
24624a8d9f2eSBram Moolenaar      'vim9script',
24634a8d9f2eSBram Moolenaar      'exe "echo"# something',
24644a8d9f2eSBram Moolenaar      ], 'E121:')
24654a8d9f2eSBram Moolenaar  CheckDefFailure([
24664a8d9f2eSBram Moolenaar      'exe # comment',
24674a8d9f2eSBram Moolenaar      ], 'E1015:')
24684a8d9f2eSBram Moolenaar  CheckScriptFailure([
24694a8d9f2eSBram Moolenaar      'vim9script',
24704a8d9f2eSBram Moolenaar      'exe# something',
24714a8d9f2eSBram Moolenaar      ], 'E121:')
24724a8d9f2eSBram Moolenaar  CheckScriptFailure([
24734a8d9f2eSBram Moolenaar      'exe "echo" # something',
24744a8d9f2eSBram Moolenaar      ], 'E121:')
24754a8d9f2eSBram Moolenaar
24767a092245SBram Moolenaar  CheckDefFailure([
24777a092245SBram Moolenaar      'try# comment',
24787a092245SBram Moolenaar      '  echo "yes"',
24797a092245SBram Moolenaar      'catch',
24807a092245SBram Moolenaar      'endtry',
24817a092245SBram Moolenaar      ], 'E488:')
24822c5ed4e3SBram Moolenaar  CheckScriptFailure([
24832c5ed4e3SBram Moolenaar      'vim9script',
24842c5ed4e3SBram Moolenaar      'try# comment',
24852c5ed4e3SBram Moolenaar      'echo "yes"',
24862c5ed4e3SBram Moolenaar      ], 'E488:')
24877a092245SBram Moolenaar  CheckDefFailure([
24887a092245SBram Moolenaar      'try',
2489a72cfb80SBram Moolenaar      '  throw#comment',
2490a72cfb80SBram Moolenaar      'catch',
2491a72cfb80SBram Moolenaar      'endtry',
2492a72cfb80SBram Moolenaar      ], 'E1015:')
2493a72cfb80SBram Moolenaar  CheckDefFailure([
2494a72cfb80SBram Moolenaar      'try',
2495a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2496a72cfb80SBram Moolenaar      'catch',
2497a72cfb80SBram Moolenaar      'endtry',
2498a72cfb80SBram Moolenaar      ], 'E488:')
2499a72cfb80SBram Moolenaar  CheckDefFailure([
2500a72cfb80SBram Moolenaar      'try',
25017a092245SBram Moolenaar      '  echo "yes"',
25027a092245SBram Moolenaar      'catch# comment',
25037a092245SBram Moolenaar      'endtry',
25047a092245SBram Moolenaar      ], 'E488:')
25052c5ed4e3SBram Moolenaar  CheckScriptFailure([
25062c5ed4e3SBram Moolenaar      'vim9script',
25072c5ed4e3SBram Moolenaar      'try',
25082c5ed4e3SBram Moolenaar      '  echo "yes"',
25092c5ed4e3SBram Moolenaar      'catch# comment',
25102c5ed4e3SBram Moolenaar      'endtry',
25112c5ed4e3SBram Moolenaar      ], 'E654:')
25122c5ed4e3SBram Moolenaar  CheckDefFailure([
25132c5ed4e3SBram Moolenaar      'try',
25142c5ed4e3SBram Moolenaar      '  echo "yes"',
25152c5ed4e3SBram Moolenaar      'catch /pat/# comment',
25162c5ed4e3SBram Moolenaar      'endtry',
25172c5ed4e3SBram Moolenaar      ], 'E488:')
25187a092245SBram Moolenaar  CheckDefFailure([
25197a092245SBram Moolenaar      'try',
25207a092245SBram Moolenaar      'echo "yes"',
25217a092245SBram Moolenaar      'catch',
25227a092245SBram Moolenaar      'endtry# comment',
25237a092245SBram Moolenaar      ], 'E488:')
25242c5ed4e3SBram Moolenaar  CheckScriptFailure([
25252c5ed4e3SBram Moolenaar      'vim9script',
25262c5ed4e3SBram Moolenaar      'try',
25272c5ed4e3SBram Moolenaar      '  echo "yes"',
25282c5ed4e3SBram Moolenaar      'catch',
25292c5ed4e3SBram Moolenaar      'endtry# comment',
25309b7bf9e9SBram Moolenaar      ], 'E488:')
25312c5ed4e3SBram Moolenaar
25322c5ed4e3SBram Moolenaar  CheckScriptSuccess([
25332c5ed4e3SBram Moolenaar      'vim9script',
25342c5ed4e3SBram Moolenaar      'hi # comment',
25352c5ed4e3SBram Moolenaar      ])
25362c5ed4e3SBram Moolenaar  CheckScriptFailure([
25372c5ed4e3SBram Moolenaar      'vim9script',
25382c5ed4e3SBram Moolenaar      'hi# comment',
25392c5ed4e3SBram Moolenaar      ], 'E416:')
25401966c248SBram Moolenaar  CheckScriptSuccess([
25411966c248SBram Moolenaar      'vim9script',
25421966c248SBram Moolenaar      'hi Search # comment',
25431966c248SBram Moolenaar      ])
25441966c248SBram Moolenaar  CheckScriptFailure([
25451966c248SBram Moolenaar      'vim9script',
25461966c248SBram Moolenaar      'hi Search# comment',
25471966c248SBram Moolenaar      ], 'E416:')
25481966c248SBram Moolenaar  CheckScriptSuccess([
25491966c248SBram Moolenaar      'vim9script',
25501966c248SBram Moolenaar      'hi link This Search # comment',
25511966c248SBram Moolenaar      ])
25521966c248SBram Moolenaar  CheckScriptFailure([
25531966c248SBram Moolenaar      'vim9script',
25541966c248SBram Moolenaar      'hi link This That# comment',
25551966c248SBram Moolenaar      ], 'E413:')
25561966c248SBram Moolenaar  CheckScriptSuccess([
25571966c248SBram Moolenaar      'vim9script',
25581966c248SBram Moolenaar      'hi clear This # comment',
25591966c248SBram Moolenaar      'hi clear # comment',
25601966c248SBram Moolenaar      ])
2561f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2562f5be8cdbSBram Moolenaar  # hi clear This# comment',
25631966c248SBram Moolenaar  CheckScriptFailure([
25641966c248SBram Moolenaar      'vim9script',
25651966c248SBram Moolenaar      'hi clear# comment',
25661966c248SBram Moolenaar      ], 'E416:')
25671966c248SBram Moolenaar
25681966c248SBram Moolenaar  CheckScriptSuccess([
25691966c248SBram Moolenaar      'vim9script',
25701966c248SBram Moolenaar      'hi Group term=bold',
25711966c248SBram Moolenaar      'match Group /todo/ # comment',
25721966c248SBram Moolenaar      ])
25731966c248SBram Moolenaar  CheckScriptFailure([
25741966c248SBram Moolenaar      'vim9script',
25751966c248SBram Moolenaar      'hi Group term=bold',
25761966c248SBram Moolenaar      'match Group /todo/# comment',
25771966c248SBram Moolenaar      ], 'E488:')
25781966c248SBram Moolenaar  CheckScriptSuccess([
25791966c248SBram Moolenaar      'vim9script',
25801966c248SBram Moolenaar      'match # comment',
25811966c248SBram Moolenaar      ])
25821966c248SBram Moolenaar  CheckScriptFailure([
25831966c248SBram Moolenaar      'vim9script',
25841966c248SBram Moolenaar      'match# comment',
25851966c248SBram Moolenaar      ], 'E475:')
25861966c248SBram Moolenaar  CheckScriptSuccess([
25871966c248SBram Moolenaar      'vim9script',
25881966c248SBram Moolenaar      'match none # comment',
25891966c248SBram Moolenaar      ])
25901966c248SBram Moolenaar  CheckScriptFailure([
25911966c248SBram Moolenaar      'vim9script',
25921966c248SBram Moolenaar      'match none# comment',
25931966c248SBram Moolenaar      ], 'E475:')
25941966c248SBram Moolenaar
25951966c248SBram Moolenaar  CheckScriptSuccess([
25961966c248SBram Moolenaar      'vim9script',
25971966c248SBram Moolenaar      'menutrans clear # comment',
25981966c248SBram Moolenaar      ])
25991966c248SBram Moolenaar  CheckScriptFailure([
26001966c248SBram Moolenaar      'vim9script',
26011966c248SBram Moolenaar      'menutrans clear# comment text',
26021966c248SBram Moolenaar      ], 'E474:')
26031966c248SBram Moolenaar
26041966c248SBram Moolenaar  CheckScriptSuccess([
26051966c248SBram Moolenaar      'vim9script',
26061966c248SBram Moolenaar      'syntax clear # comment',
26071966c248SBram Moolenaar      ])
26081966c248SBram Moolenaar  CheckScriptFailure([
26091966c248SBram Moolenaar      'vim9script',
26101966c248SBram Moolenaar      'syntax clear# comment text',
26111966c248SBram Moolenaar      ], 'E28:')
26121966c248SBram Moolenaar  CheckScriptSuccess([
26131966c248SBram Moolenaar      'vim9script',
26141966c248SBram Moolenaar      'syntax keyword Word some',
26151966c248SBram Moolenaar      'syntax clear Word # comment',
26161966c248SBram Moolenaar      ])
26171966c248SBram Moolenaar  CheckScriptFailure([
26181966c248SBram Moolenaar      'vim9script',
26191966c248SBram Moolenaar      'syntax keyword Word some',
26201966c248SBram Moolenaar      'syntax clear Word# comment text',
26211966c248SBram Moolenaar      ], 'E28:')
26221966c248SBram Moolenaar
26231966c248SBram Moolenaar  CheckScriptSuccess([
26241966c248SBram Moolenaar      'vim9script',
26251966c248SBram Moolenaar      'syntax list # comment',
26261966c248SBram Moolenaar      ])
26271966c248SBram Moolenaar  CheckScriptFailure([
26281966c248SBram Moolenaar      'vim9script',
26291966c248SBram Moolenaar      'syntax list# comment text',
26301966c248SBram Moolenaar      ], 'E28:')
26311966c248SBram Moolenaar
26321966c248SBram Moolenaar  CheckScriptSuccess([
26331966c248SBram Moolenaar      'vim9script',
26341966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
26351966c248SBram Moolenaar      ])
26361966c248SBram Moolenaar  CheckScriptFailure([
26371966c248SBram Moolenaar      'vim9script',
26381966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
26391966c248SBram Moolenaar      ], 'E475:')
26401966c248SBram Moolenaar
26411966c248SBram Moolenaar  CheckScriptSuccess([
26421966c248SBram Moolenaar      'vim9script',
26431966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
26441966c248SBram Moolenaar      ])
26451966c248SBram Moolenaar  CheckScriptFailure([
26461966c248SBram Moolenaar      'vim9script',
26471966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
26481966c248SBram Moolenaar      ], 'E789:')
26491966c248SBram Moolenaar
26501966c248SBram Moolenaar  CheckScriptSuccess([
26511966c248SBram Moolenaar      'vim9script',
26521966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
26531966c248SBram Moolenaar      ])
26541966c248SBram Moolenaar  CheckScriptFailure([
26551966c248SBram Moolenaar      'vim9script',
26561966c248SBram Moolenaar      'syntax match Word /pat/# comment',
26571966c248SBram Moolenaar      ], 'E402:')
26581966c248SBram Moolenaar
26591966c248SBram Moolenaar  CheckScriptSuccess([
26601966c248SBram Moolenaar      'vim9script',
26611966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
26621966c248SBram Moolenaar      ])
26631966c248SBram Moolenaar  CheckScriptFailure([
26641966c248SBram Moolenaar      'vim9script',
26651966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
26661966c248SBram Moolenaar      ], 'E475:')
26671966c248SBram Moolenaar  CheckScriptFailure([
26681966c248SBram Moolenaar      'vim9script',
26691966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
26701966c248SBram Moolenaar      ], 'E406:')
26711966c248SBram Moolenaar  CheckScriptFailure([
26721966c248SBram Moolenaar      'vim9script',
26731966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
26741966c248SBram Moolenaar      ], 'E475:')
26751966c248SBram Moolenaar
26761966c248SBram Moolenaar  CheckScriptSuccess([
26771966c248SBram Moolenaar      'vim9script',
26781966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
26791966c248SBram Moolenaar      ])
26801966c248SBram Moolenaar  CheckScriptFailure([
26811966c248SBram Moolenaar      'vim9script',
26821966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2683d032f34aSBram Moolenaar      ], 'E402:')
26841966c248SBram Moolenaar
26851966c248SBram Moolenaar  CheckScriptSuccess([
26861966c248SBram Moolenaar      'vim9script',
26871966c248SBram Moolenaar      'syntax sync # comment',
26881966c248SBram Moolenaar      ])
26891966c248SBram Moolenaar  CheckScriptFailure([
26901966c248SBram Moolenaar      'vim9script',
26911966c248SBram Moolenaar      'syntax sync# comment',
26921966c248SBram Moolenaar      ], 'E404:')
26931966c248SBram Moolenaar  CheckScriptSuccess([
26941966c248SBram Moolenaar      'vim9script',
26951966c248SBram Moolenaar      'syntax sync ccomment # comment',
26961966c248SBram Moolenaar      ])
26971966c248SBram Moolenaar  CheckScriptFailure([
26981966c248SBram Moolenaar      'vim9script',
26991966c248SBram Moolenaar      'syntax sync ccomment# comment',
27001966c248SBram Moolenaar      ], 'E404:')
27011966c248SBram Moolenaar
27021966c248SBram Moolenaar  CheckScriptSuccess([
27031966c248SBram Moolenaar      'vim9script',
27041966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
27051966c248SBram Moolenaar      ])
27061966c248SBram Moolenaar  CheckScriptFailure([
27071966c248SBram Moolenaar      'vim9script',
27081966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
27091966c248SBram Moolenaar      ], 'E475:')
2710a72cfb80SBram Moolenaar
2711a72cfb80SBram Moolenaar  CheckScriptSuccess([
2712a72cfb80SBram Moolenaar      'vim9script',
2713a72cfb80SBram Moolenaar      'command Echo echo # comment',
2714a72cfb80SBram Moolenaar      'command Echo # comment',
2715a72cfb80SBram Moolenaar      ])
2716a72cfb80SBram Moolenaar  CheckScriptFailure([
2717a72cfb80SBram Moolenaar      'vim9script',
2718a72cfb80SBram Moolenaar      'command Echo echo# comment',
2719a72cfb80SBram Moolenaar      'Echo',
2720a72cfb80SBram Moolenaar      ], 'E121:')
2721a72cfb80SBram Moolenaar  CheckScriptFailure([
2722a72cfb80SBram Moolenaar      'vim9script',
2723a72cfb80SBram Moolenaar      'command Echo# comment',
2724a72cfb80SBram Moolenaar      ], 'E182:')
2725a72cfb80SBram Moolenaar  CheckScriptFailure([
2726a72cfb80SBram Moolenaar      'vim9script',
2727a72cfb80SBram Moolenaar      'command Echo echo',
2728a72cfb80SBram Moolenaar      'command Echo# comment',
2729a72cfb80SBram Moolenaar      ], 'E182:')
2730a72cfb80SBram Moolenaar
2731a72cfb80SBram Moolenaar  CheckScriptSuccess([
2732a72cfb80SBram Moolenaar      'vim9script',
2733a72cfb80SBram Moolenaar      'function # comment',
2734a72cfb80SBram Moolenaar      ])
2735a72cfb80SBram Moolenaar  CheckScriptFailure([
2736a72cfb80SBram Moolenaar      'vim9script',
27379898107fSBram Moolenaar      'function " comment',
27389898107fSBram Moolenaar      ], 'E129:')
27399898107fSBram Moolenaar  CheckScriptFailure([
27409898107fSBram Moolenaar      'vim9script',
2741a72cfb80SBram Moolenaar      'function# comment',
2742a72cfb80SBram Moolenaar      ], 'E129:')
2743a72cfb80SBram Moolenaar  CheckScriptSuccess([
2744a72cfb80SBram Moolenaar      'vim9script',
2745a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2746a72cfb80SBram Moolenaar      ])
2747a72cfb80SBram Moolenaar  CheckScriptFailure([
2748a72cfb80SBram Moolenaar      'vim9script',
2749a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2750a72cfb80SBram Moolenaar      ], 'E488:')
2751a72cfb80SBram Moolenaar
2752a72cfb80SBram Moolenaar  CheckScriptSuccess([
2753a72cfb80SBram Moolenaar      'vim9script',
27544c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2755a72cfb80SBram Moolenaar      'endfunc',
27564c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2757a72cfb80SBram Moolenaar      ])
2758a72cfb80SBram Moolenaar  CheckScriptFailure([
2759a72cfb80SBram Moolenaar      'vim9script',
27604c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2761a72cfb80SBram Moolenaar      'endfunc',
27624c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2763a72cfb80SBram Moolenaar      ], 'E488:')
2764a72cfb80SBram Moolenaar
2765a72cfb80SBram Moolenaar  CheckScriptSuccess([
2766a72cfb80SBram Moolenaar      'vim9script',
2767a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2768a72cfb80SBram Moolenaar      ])
2769a72cfb80SBram Moolenaar  CheckScriptFailure([
2770a72cfb80SBram Moolenaar      'vim9script',
2771a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2772a72cfb80SBram Moolenaar      ], 'E488:')
2773e7e4838fSBram Moolenaar
2774e7e4838fSBram Moolenaar  CheckScriptFailure([
2775e7e4838fSBram Moolenaar      'def Test() " comment',
2776e7e4838fSBram Moolenaar      'enddef',
2777e7e4838fSBram Moolenaar      ], 'E488:')
2778e7e4838fSBram Moolenaar  CheckScriptFailure([
2779e7e4838fSBram Moolenaar      'vim9script',
2780e7e4838fSBram Moolenaar      'def Test() " comment',
2781e7e4838fSBram Moolenaar      'enddef',
2782e7e4838fSBram Moolenaar      ], 'E488:')
2783e7e4838fSBram Moolenaar
2784e7e4838fSBram Moolenaar  CheckScriptSuccess([
2785e7e4838fSBram Moolenaar      'func Test() " comment',
2786e7e4838fSBram Moolenaar      'endfunc',
2787e7e4838fSBram Moolenaar      ])
27889898107fSBram Moolenaar  CheckScriptSuccess([
2789e7e4838fSBram Moolenaar      'vim9script',
2790e7e4838fSBram Moolenaar      'func Test() " comment',
2791e7e4838fSBram Moolenaar      'endfunc',
27929898107fSBram Moolenaar      ])
2793e7e4838fSBram Moolenaar
2794e7e4838fSBram Moolenaar  CheckScriptSuccess([
2795e7e4838fSBram Moolenaar      'def Test() # comment',
2796e7e4838fSBram Moolenaar      'enddef',
2797e7e4838fSBram Moolenaar      ])
2798e7e4838fSBram Moolenaar  CheckScriptFailure([
2799e7e4838fSBram Moolenaar      'func Test() # comment',
2800e7e4838fSBram Moolenaar      'endfunc',
2801e7e4838fSBram Moolenaar      ], 'E488:')
28022c5ed4e3SBram Moolenaarenddef
28032c5ed4e3SBram Moolenaar
28042c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
28052c5ed4e3SBram Moolenaar  CheckCanRunGui
28062c5ed4e3SBram Moolenaar
28072c5ed4e3SBram Moolenaar  CheckScriptFailure([
28082c5ed4e3SBram Moolenaar      'vim9script',
28092c5ed4e3SBram Moolenaar      'gui#comment'
28102c5ed4e3SBram Moolenaar      ], 'E499:')
28112c5ed4e3SBram Moolenaar  CheckScriptFailure([
28122c5ed4e3SBram Moolenaar      'vim9script',
28132c5ed4e3SBram Moolenaar      'gui -f#comment'
28142c5ed4e3SBram Moolenaar      ], 'E499:')
28157a092245SBram Moolenaarenddef
28167a092245SBram Moolenaar
2817a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
28186797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
28196797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2820a26b9700SBram Moolenaar
2821a26b9700SBram Moolenaar  edit test.vim
2822a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2823a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2824a26b9700SBram Moolenaar
2825a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2826a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2827a26b9700SBram Moolenaar
2828a26b9700SBram Moolenaar  g:entered = 0
2829a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2830a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2831a26b9700SBram Moolenaar
2832a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2833a26b9700SBram Moolenaar
2834a26b9700SBram Moolenaar  au! TabEnter
2835a26b9700SBram Moolenaar  unlet g:entered
2836d72c1bf0SBram Moolenaar
2837d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2838d72c1bf0SBram Moolenaar      'vim9script',
28396797966dSBram Moolenaar      'g:var = 123',
2840e55b1c09SBram Moolenaar      'b:var = 456',
2841e55b1c09SBram Moolenaar      'w:var = 777',
2842e55b1c09SBram Moolenaar      't:var = 888',
2843d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2844d72c1bf0SBram Moolenaar      ])
2845d72c1bf0SBram Moolenaar
2846d72c1bf0SBram Moolenaar  CheckScriptFailure([
2847d72c1bf0SBram Moolenaar      'vim9script',
2848d72c1bf0SBram Moolenaar      'let g:var = 123',
2849e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2850e55b1c09SBram Moolenaar
2851e55b1c09SBram Moolenaar  CheckScriptFailure([
2852e55b1c09SBram Moolenaar      'vim9script',
2853e55b1c09SBram Moolenaar      'let b:var = 123',
2854e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2855e55b1c09SBram Moolenaar
2856e55b1c09SBram Moolenaar  CheckScriptFailure([
2857e55b1c09SBram Moolenaar      'vim9script',
2858e55b1c09SBram Moolenaar      'let w:var = 123',
2859e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2860e55b1c09SBram Moolenaar
2861e55b1c09SBram Moolenaar  CheckScriptFailure([
2862e55b1c09SBram Moolenaar      'vim9script',
2863e55b1c09SBram Moolenaar      'let t:var = 123',
2864e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2865e55b1c09SBram Moolenaar
2866e55b1c09SBram Moolenaar  CheckScriptFailure([
2867e55b1c09SBram Moolenaar      'vim9script',
2868e55b1c09SBram Moolenaar      'let v:version = 123',
2869e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2870e55b1c09SBram Moolenaar
2871e55b1c09SBram Moolenaar  CheckScriptFailure([
2872e55b1c09SBram Moolenaar      'vim9script',
2873e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2874e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
28756797966dSBram Moolenaar
28766797966dSBram Moolenaar  CheckScriptFailure([
28776797966dSBram Moolenaar      'vim9script',
28786797966dSBram Moolenaar      'g:var = 123',
287932e35117SBram Moolenaar      'unlet g:var# comment1',
2880d72c1bf0SBram Moolenaar      ], 'E108:')
2881d72c1bf0SBram Moolenaar
2882d72c1bf0SBram Moolenaar  CheckScriptFailure([
2883d72c1bf0SBram Moolenaar      'let g:var = 123',
2884d72c1bf0SBram Moolenaar      'unlet g:var # something',
2885d72c1bf0SBram Moolenaar      ], 'E488:')
2886faac4104SBram Moolenaar
2887faac4104SBram Moolenaar  CheckScriptSuccess([
2888faac4104SBram Moolenaar      'vim9script',
288932e35117SBram Moolenaar      'if 1 # comment2',
2890faac4104SBram Moolenaar      '  echo "yes"',
2891faac4104SBram Moolenaar      'elseif 2 #comment',
2892faac4104SBram Moolenaar      '  echo "no"',
2893faac4104SBram Moolenaar      'endif',
2894faac4104SBram Moolenaar      ])
2895faac4104SBram Moolenaar
2896faac4104SBram Moolenaar  CheckScriptFailure([
2897faac4104SBram Moolenaar      'vim9script',
289832e35117SBram Moolenaar      'if 1# comment3',
2899faac4104SBram Moolenaar      '  echo "yes"',
2900faac4104SBram Moolenaar      'endif',
2901faac4104SBram Moolenaar      ], 'E15:')
2902faac4104SBram Moolenaar
2903faac4104SBram Moolenaar  CheckScriptFailure([
2904faac4104SBram Moolenaar      'vim9script',
290532e35117SBram Moolenaar      'if 0 # comment4',
2906faac4104SBram Moolenaar      '  echo "yes"',
2907faac4104SBram Moolenaar      'elseif 2#comment',
2908faac4104SBram Moolenaar      '  echo "no"',
2909faac4104SBram Moolenaar      'endif',
2910faac4104SBram Moolenaar      ], 'E15:')
2911faac4104SBram Moolenaar
2912faac4104SBram Moolenaar  CheckScriptSuccess([
2913faac4104SBram Moolenaar      'vim9script',
291432e35117SBram Moolenaar      'let v = 1 # comment5',
2915faac4104SBram Moolenaar      ])
2916faac4104SBram Moolenaar
2917faac4104SBram Moolenaar  CheckScriptFailure([
2918faac4104SBram Moolenaar      'vim9script',
291932e35117SBram Moolenaar      'let v = 1# comment6',
292032e35117SBram Moolenaar      ], 'E15:')
2921faac4104SBram Moolenaar
2922faac4104SBram Moolenaar  CheckScriptSuccess([
2923faac4104SBram Moolenaar      'vim9script',
2924faac4104SBram Moolenaar      'new'
2925faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2926df069eecSBram Moolenaar      ':$',
2927faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2928faac4104SBram Moolenaar      'bwipe!',
2929faac4104SBram Moolenaar      ])
2930faac4104SBram Moolenaar
2931f5be8cdbSBram Moolenaar  CheckScriptFailure([
2932f5be8cdbSBram Moolenaar      'vim9script',
2933f5be8cdbSBram Moolenaar      'new'
2934f5be8cdbSBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2935f5be8cdbSBram Moolenaar      ':$',
2936f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2937f5be8cdbSBram Moolenaar      'bwipe!',
2938f5be8cdbSBram Moolenaar      ], 'E488:')
2939f5be8cdbSBram Moolenaar
2940f5be8cdbSBram Moolenaar  CheckScriptFailure([
2941f5be8cdbSBram Moolenaar      'vim9script',
2942f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2943f5be8cdbSBram Moolenaar      ], 'E477:')
2944a26b9700SBram Moolenaarenddef
2945a26b9700SBram Moolenaar
29467e5bd91dSBram Moolenaardef Test_finish()
29477e5bd91dSBram Moolenaar  let lines =<< trim END
29487e5bd91dSBram Moolenaar    vim9script
29496797966dSBram Moolenaar    g:res = 'one'
29507e5bd91dSBram Moolenaar    if v:false | finish | endif
29516797966dSBram Moolenaar    g:res = 'two'
29527e5bd91dSBram Moolenaar    finish
29536797966dSBram Moolenaar    g:res = 'three'
29547e5bd91dSBram Moolenaar  END
29557e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
29567e5bd91dSBram Moolenaar  source Xfinished
29577e5bd91dSBram Moolenaar  assert_equal('two', g:res)
29587e5bd91dSBram Moolenaar
29597e5bd91dSBram Moolenaar  unlet g:res
29607e5bd91dSBram Moolenaar  delete('Xfinished')
29617e5bd91dSBram Moolenaarenddef
29627e5bd91dSBram Moolenaar
296332e35117SBram Moolenaardef Test_let_func_call()
296432e35117SBram Moolenaar  let lines =<< trim END
296532e35117SBram Moolenaar    vim9script
296632e35117SBram Moolenaar    func GetValue()
296732e35117SBram Moolenaar      if exists('g:count')
296832e35117SBram Moolenaar        let g:count += 1
296932e35117SBram Moolenaar      else
297032e35117SBram Moolenaar        let g:count = 1
297132e35117SBram Moolenaar      endif
297232e35117SBram Moolenaar      return 'this'
297332e35117SBram Moolenaar    endfunc
297432e35117SBram Moolenaar    let val: string = GetValue()
2975f5be8cdbSBram Moolenaar    # env var is always a string
2976df671b46SBram Moolenaar    let env = $TERM
297732e35117SBram Moolenaar  END
297832e35117SBram Moolenaar  writefile(lines, 'Xfinished')
297932e35117SBram Moolenaar  source Xfinished
2980f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
298132e35117SBram Moolenaar  assert_equal(1, g:count)
298232e35117SBram Moolenaar
298332e35117SBram Moolenaar  unlet g:count
298432e35117SBram Moolenaar  delete('Xfinished')
298532e35117SBram Moolenaarenddef
298632e35117SBram Moolenaar
298732e35117SBram Moolenaardef Test_let_missing_type()
298832e35117SBram Moolenaar  let lines =<< trim END
298932e35117SBram Moolenaar    vim9script
2990df671b46SBram Moolenaar    let var = g:unknown
2991227a69deSBram Moolenaar  END
2992822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2993227a69deSBram Moolenaar
2994227a69deSBram Moolenaar  lines =<< trim END
2995227a69deSBram Moolenaar    vim9script
2996227a69deSBram Moolenaar    let nr: number = 123
2997227a69deSBram Moolenaar    let var = nr
2998227a69deSBram Moolenaar  END
2999822ba247SBram Moolenaar  CheckScriptSuccess(lines)
300032e35117SBram Moolenaarenddef
300132e35117SBram Moolenaar
3002c82a5b5dSBram Moolenaardef Test_let_declaration()
3003c82a5b5dSBram Moolenaar  let lines =<< trim END
3004c82a5b5dSBram Moolenaar    vim9script
3005c82a5b5dSBram Moolenaar    let var: string
3006c82a5b5dSBram Moolenaar    g:var_uninit = var
3007c82a5b5dSBram Moolenaar    var = 'text'
3008c82a5b5dSBram Moolenaar    g:var_test = var
3009f5be8cdbSBram Moolenaar    # prefixing s: is optional
3010984dddbeSBram Moolenaar    s:var = 'prefixed'
3011984dddbeSBram Moolenaar    g:var_prefixed = s:var
3012984dddbeSBram Moolenaar
3013984dddbeSBram Moolenaar    let s:other: number
3014984dddbeSBram Moolenaar    other = 1234
3015984dddbeSBram Moolenaar    g:other_var = other
301653b29e48SBram Moolenaar
301753b29e48SBram Moolenaar    # type is inferred
301853b29e48SBram Moolenaar    s:dict = {'a': 222}
301953b29e48SBram Moolenaar    def GetDictVal(key: any)
302053b29e48SBram Moolenaar      g:dict_val = s:dict[key]
302153b29e48SBram Moolenaar    enddef
302253b29e48SBram Moolenaar    GetDictVal('a')
3023c82a5b5dSBram Moolenaar  END
3024c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
3025c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
3026c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
3027984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
3028984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
302953b29e48SBram Moolenaar  assert_equal(222, g:dict_val)
3030c82a5b5dSBram Moolenaar
3031c82a5b5dSBram Moolenaar  unlet g:var_uninit
3032c82a5b5dSBram Moolenaar  unlet g:var_test
3033984dddbeSBram Moolenaar  unlet g:var_prefixed
3034984dddbeSBram Moolenaar  unlet g:other_var
3035c82a5b5dSBram Moolenaarenddef
3036c82a5b5dSBram Moolenaar
3037c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
3038c5b1c20bSBram Moolenaar  let lines =<< trim END
3039c5b1c20bSBram Moolenaar    vim9script
3040c5b1c20bSBram Moolenaar    const var: string
3041c5b1c20bSBram Moolenaar  END
3042c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
3043c5b1c20bSBram Moolenaar
3044c5b1c20bSBram Moolenaar  lines =<< trim END
3045c5b1c20bSBram Moolenaar    vim9script
3046c5b1c20bSBram Moolenaar    let 9var: string
3047c5b1c20bSBram Moolenaar  END
3048c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
3049c5b1c20bSBram Moolenaarenddef
3050c5b1c20bSBram Moolenaar
305134db91f7SBram Moolenaardef Test_let_type_check()
305234db91f7SBram Moolenaar  let lines =<< trim END
305334db91f7SBram Moolenaar    vim9script
305434db91f7SBram Moolenaar    let var: string
305534db91f7SBram Moolenaar    var = 1234
305634db91f7SBram Moolenaar  END
3057451c2e35SBram Moolenaar  CheckScriptFailure(lines, 'E1012:')
3058984dddbeSBram Moolenaar
3059984dddbeSBram Moolenaar  lines =<< trim END
3060984dddbeSBram Moolenaar    vim9script
3061984dddbeSBram Moolenaar    let var:string
3062984dddbeSBram Moolenaar  END
3063984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
3064c5b1c20bSBram Moolenaar
3065c5b1c20bSBram Moolenaar  lines =<< trim END
3066c5b1c20bSBram Moolenaar    vim9script
3067c5b1c20bSBram Moolenaar    let var: asdf
3068c5b1c20bSBram Moolenaar  END
3069c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
3070a71e2633SBram Moolenaar
3071a71e2633SBram Moolenaar  lines =<< trim END
3072a71e2633SBram Moolenaar    vim9script
3073a71e2633SBram Moolenaar    let s:l: list<number>
3074a71e2633SBram Moolenaar    s:l = []
3075a71e2633SBram Moolenaar  END
3076a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
3077a71e2633SBram Moolenaar
3078a71e2633SBram Moolenaar  lines =<< trim END
3079a71e2633SBram Moolenaar    vim9script
3080a71e2633SBram Moolenaar    let s:d: dict<number>
3081a71e2633SBram Moolenaar    s:d = {}
3082a71e2633SBram Moolenaar  END
3083a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
308434db91f7SBram Moolenaarenddef
308534db91f7SBram Moolenaar
3086a5d0077eSBram Moolenaardef Test_forward_declaration()
3087a5d0077eSBram Moolenaar  let lines =<< trim END
3088a5d0077eSBram Moolenaar    vim9script
3089a5d0077eSBram Moolenaar    def GetValue(): string
3090a5d0077eSBram Moolenaar      return theVal
3091a5d0077eSBram Moolenaar    enddef
3092a5d0077eSBram Moolenaar    let theVal = 'something'
3093822ba247SBram Moolenaar    g:initVal = GetValue()
3094a5d0077eSBram Moolenaar    theVal = 'else'
3095a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3096a5d0077eSBram Moolenaar  END
3097a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3098a5d0077eSBram Moolenaar  source Xforward
3099a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3100a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3101a5d0077eSBram Moolenaar
3102a5d0077eSBram Moolenaar  unlet g:initVal
3103a5d0077eSBram Moolenaar  unlet g:laterVal
3104a5d0077eSBram Moolenaar  delete('Xforward')
3105a5d0077eSBram Moolenaarenddef
3106a5d0077eSBram Moolenaar
31079721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
31089721fb4eSBram Moolenaar  let legacy_lines =<< trim END
31099721fb4eSBram Moolenaar    source Xvim9_script.vim
31109721fb4eSBram Moolenaar
31119721fb4eSBram Moolenaar    call assert_false(exists('local'))
31129721fb4eSBram Moolenaar    call assert_false(exists('exported'))
31139721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
31149721fb4eSBram Moolenaar    call assert_equal('global', global)
31159721fb4eSBram Moolenaar    call assert_equal('global', g:global)
31169721fb4eSBram Moolenaar
31179721fb4eSBram Moolenaar    " imported variable becomes script-local
31189721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
31199721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
31209721fb4eSBram Moolenaar    call assert_false(exists('exported'))
31219721fb4eSBram Moolenaar
31229721fb4eSBram Moolenaar    " imported function becomes script-local
31239721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
31249721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
31259721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
31269721fb4eSBram Moolenaar  END
31279721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
31289721fb4eSBram Moolenaar
31299721fb4eSBram Moolenaar  let vim9_lines =<< trim END
31309721fb4eSBram Moolenaar    vim9script
31319721fb4eSBram Moolenaar    let local = 'local'
31329721fb4eSBram Moolenaar    g:global = 'global'
31339721fb4eSBram Moolenaar    export let exported = 'exported'
31349721fb4eSBram Moolenaar    export def GetText(): string
31359721fb4eSBram Moolenaar       return 'text'
31369721fb4eSBram Moolenaar    enddef
31379721fb4eSBram Moolenaar  END
31389721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
31399721fb4eSBram Moolenaar
31409721fb4eSBram Moolenaar  source Xlegacy_script.vim
31419721fb4eSBram Moolenaar
31429721fb4eSBram Moolenaar  assert_equal('global', g:global)
3143f5be8cdbSBram Moolenaar  unlet g:global
31449721fb4eSBram Moolenaar
31459721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
31469721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
31479721fb4eSBram Moolenaarenddef
3148a5d0077eSBram Moolenaar
31497d699701SBram Moolenaarfunc Test_vim9script_not_global()
31507d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
31517d699701SBram Moolenaar  let vim9lines =<< trim END
31527d699701SBram Moolenaar    vim9script
31537d699701SBram Moolenaar    let var = 'local'
31547d699701SBram Moolenaar    func TheFunc()
31557d699701SBram Moolenaar      echo 'local'
31567d699701SBram Moolenaar    endfunc
31577d699701SBram Moolenaar    def DefFunc()
31587d699701SBram Moolenaar      echo 'local'
31597d699701SBram Moolenaar    enddef
31607d699701SBram Moolenaar  END
31617d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
31627d699701SBram Moolenaar  source Xvim9script.vim
31637d699701SBram Moolenaar  try
31647d699701SBram Moolenaar    echo g:var
31657d699701SBram Moolenaar    assert_report('did not fail')
31667d699701SBram Moolenaar  catch /E121:/
31677d699701SBram Moolenaar    " caught
31687d699701SBram Moolenaar  endtry
31697d699701SBram Moolenaar  try
31707d699701SBram Moolenaar    call TheFunc()
31717d699701SBram Moolenaar    assert_report('did not fail')
31727d699701SBram Moolenaar  catch /E117:/
31737d699701SBram Moolenaar    " caught
31747d699701SBram Moolenaar  endtry
31757d699701SBram Moolenaar  try
31767d699701SBram Moolenaar    call DefFunc()
31777d699701SBram Moolenaar    assert_report('did not fail')
31787d699701SBram Moolenaar  catch /E117:/
31797d699701SBram Moolenaar    " caught
31807d699701SBram Moolenaar  endtry
31817d699701SBram Moolenaar
318225859dd7SBram Moolenaar  call delete('Xvim9script.vim')
31837d699701SBram Moolenaarendfunc
31847d699701SBram Moolenaar
3185eeb27bfeSBram Moolenaardef Test_vim9_copen()
3186eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3187eeb27bfeSBram Moolenaar  copen
3188eeb27bfeSBram Moolenaar  quit
3189eeb27bfeSBram Moolenaarenddef
3190eeb27bfeSBram Moolenaar
31912d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
31922d6b20d6SBram Moolenaardef Test_vim9_autoload()
31932d6b20d6SBram Moolenaar  let lines =<< trim END
31942d6b20d6SBram Moolenaar     vim9script
31952d6b20d6SBram Moolenaar     def foo#test()
31962d6b20d6SBram Moolenaar         echomsg getreg('"')
31972d6b20d6SBram Moolenaar     enddef
31982d6b20d6SBram Moolenaar  END
31992d6b20d6SBram Moolenaar
32002d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
32012d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
32022d6b20d6SBram Moolenaar  let save_rtp = &rtp
32032d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
32042d6b20d6SBram Moolenaar  augroup test
32052d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
32062d6b20d6SBram Moolenaar  augroup END
32072d6b20d6SBram Moolenaar
32082d6b20d6SBram Moolenaar  normal Y
32092d6b20d6SBram Moolenaar
32102d6b20d6SBram Moolenaar  augroup test
32112d6b20d6SBram Moolenaar    autocmd!
32122d6b20d6SBram Moolenaar  augroup END
32132d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
32142d6b20d6SBram Moolenaar  &rtp = save_rtp
32152d6b20d6SBram Moolenaarenddef
32162d6b20d6SBram Moolenaar
321781e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
321881e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
321981e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
322081e17fbeSBram Moolenaar  let lines =<< trim END
322181e17fbeSBram Moolenaar    let s:counter = 1
322281e17fbeSBram Moolenaar    def s:Func()
322381e17fbeSBram Moolenaar      au! CursorHold
322481e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
322581e17fbeSBram Moolenaar    enddef
322681e17fbeSBram Moolenaar    call s:Func()
322781e17fbeSBram Moolenaar    doau CursorHold
322881e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
322981e17fbeSBram Moolenaar    au! CursorHold
323081e17fbeSBram Moolenaar  END
323181e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
323281e17fbeSBram Moolenaarenddef
323381e17fbeSBram Moolenaar
32343896a105SBram Moolenaardef Test_cmdline_win()
32353896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
32363896a105SBram Moolenaar  # the command line window.
32373896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
32383896a105SBram Moolenaar  let export_lines =<< trim END
32393896a105SBram Moolenaar    vim9script
32403896a105SBram Moolenaar    export let That = 'yes'
32413896a105SBram Moolenaar  END
32423896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
32433896a105SBram Moolenaar  let import_lines =<< trim END
32443896a105SBram Moolenaar    vim9script
32453896a105SBram Moolenaar    import That from './Xexport.vim'
32463896a105SBram Moolenaar  END
32473896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
32483896a105SBram Moolenaar  let save_rtp = &rtp
32493896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
32503896a105SBram Moolenaar  syntax on
32513896a105SBram Moolenaar  augroup CmdWin
32523896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
32533896a105SBram Moolenaar  augroup END
32543896a105SBram Moolenaar  # this will open and also close the cmdline window
32553896a105SBram Moolenaar  feedkeys('q:', 'xt')
32563896a105SBram Moolenaar  assert_equal('yes', g:got_there)
32573896a105SBram Moolenaar
32583896a105SBram Moolenaar  augroup CmdWin
32593896a105SBram Moolenaar    au!
32603896a105SBram Moolenaar  augroup END
32613896a105SBram Moolenaar  &rtp = save_rtp
32623896a105SBram Moolenaar  delete('rtp', 'rf')
32633896a105SBram Moolenaarenddef
32643896a105SBram Moolenaar
3265e3d4685fSBram Moolenaardef Test_invalid_sid()
3266e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
326725859dd7SBram Moolenaar
3268e3d4685fSBram Moolenaar  if RunVim([], ['wq Xdidit'], '+"func <SNR>1_func"')
3269e3d4685fSBram Moolenaar    call assert_equal([], readfile('Xdidit'))
3270e3d4685fSBram Moolenaar  endif
3271e3d4685fSBram Moolenaar  delete('Xdidit')
3272e3d4685fSBram Moolenaarenddef
3273e3d4685fSBram Moolenaar
3274585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3275585fea7bSBram Moolenaardef Test_substitute_cmd()
3276585fea7bSBram Moolenaar  new
3277585fea7bSBram Moolenaar  setline(1, 'something')
3278585fea7bSBram Moolenaar  :substitute(some(other(
3279585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3280585fea7bSBram Moolenaar  bwipe!
3281585fea7bSBram Moolenaar
3282f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3283585fea7bSBram Moolenaar  let lines =<< trim END
3284585fea7bSBram Moolenaar    vim9script
3285585fea7bSBram Moolenaar    new
3286585fea7bSBram Moolenaar    setline(1, 'something')
3287585fea7bSBram Moolenaar    :substitute(some(other(
3288585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3289585fea7bSBram Moolenaar    bwipe!
3290585fea7bSBram Moolenaar  END
3291585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3292585fea7bSBram Moolenaar  source Xvim9lines
3293585fea7bSBram Moolenaar
3294585fea7bSBram Moolenaar  delete('Xvim9lines')
3295585fea7bSBram Moolenaarenddef
3296585fea7bSBram Moolenaar
32978a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3298