18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4101f4810SBram Moolenaarsource term_util.vim
5ad39c094SBram Moolenaarsource view_util.vim
6cfe435d7SBram Moolenaarsource vim9.vim
78a7d6542SBram Moolenaar
88a7d6542SBram Moolenaardef Test_syntax()
98a7d6542SBram Moolenaar  let var = 234
108a7d6542SBram Moolenaar  let other: list<string> = ['asdf']
118a7d6542SBram Moolenaarenddef
128a7d6542SBram Moolenaar
135d72ce69SBram Moolenaardef Test_range_only()
145d72ce69SBram Moolenaar  new
155d72ce69SBram Moolenaar  setline(1, ['blah', 'Blah'])
165d72ce69SBram Moolenaar  :/Blah/
175d72ce69SBram Moolenaar  assert_equal(2, getcurpos()[1])
18c2af0affSBram Moolenaar  bwipe!
19c2af0affSBram Moolenaar
20c2af0affSBram Moolenaar  # without range commands use current line
21c2af0affSBram Moolenaar  new
22c2af0affSBram Moolenaar  setline(1, ['one', 'two', 'three'])
23c2af0affSBram Moolenaar  :2
24c2af0affSBram Moolenaar  print
25c2af0affSBram Moolenaar  assert_equal('two', Screenline(&lines))
26c2af0affSBram Moolenaar  :3
27c2af0affSBram Moolenaar  list
28c2af0affSBram Moolenaar  assert_equal('three$', Screenline(&lines))
29c2af0affSBram Moolenaar  bwipe!
305d72ce69SBram Moolenaarenddef
315d72ce69SBram Moolenaar
326e587dcbSBram Moolenaarlet s:appendToMe = 'xxx'
336e587dcbSBram Moolenaarlet s:addToMe = 111
34401d9ffbSBram Moolenaarlet g:existing = 'yes'
35a8c17704SBram Moolenaarlet g:inc_counter = 1
36a8c17704SBram Moolenaarlet $SOME_ENV_VAR = 'some'
37a6e67e4fSBram Moolenaarlet g:alist = [7]
38a6e67e4fSBram Moolenaarlet g:astring = 'text'
39f0b9f43cSBram Moolenaarlet g:anumber = 123
406e587dcbSBram Moolenaar
418a7d6542SBram Moolenaardef Test_assignment()
428a7d6542SBram Moolenaar  let bool1: bool = true
438a7d6542SBram Moolenaar  assert_equal(v:true, bool1)
448a7d6542SBram Moolenaar  let bool2: bool = false
458a7d6542SBram Moolenaar  assert_equal(v:false, bool2)
468a7d6542SBram Moolenaar
47f93c7feaSBram Moolenaar  call CheckDefFailure(['let x:string'], 'E1069:')
48f93c7feaSBram Moolenaar  call CheckDefFailure(['let x:string = "x"'], 'E1069:')
491cc2a94fSBram Moolenaar  call CheckDefFailure(['let a:string = "x"'], 'E1069:')
5098b4f145SBram Moolenaar  call CheckDefFailure(['let lambda = {-> "lambda"}'], 'E704:')
51f93c7feaSBram Moolenaar
524cdb13ceSBram Moolenaar  let nr: number = 1234
53451c2e35SBram Moolenaar  call CheckDefFailure(['let nr: number = "asdf"'], 'E1012:')
544cdb13ceSBram Moolenaar
55b209750bSBram Moolenaar  let a: number = 6 #comment
569be61bbbSBram Moolenaar  assert_equal(6, a)
579be61bbbSBram Moolenaar
5842a480bfSBram Moolenaar  if has('channel')
5942a480bfSBram Moolenaar    let chan1: channel
60fbdd08edSBram Moolenaar    let job1: job
61f51cb4e0SBram Moolenaar    let job2: job = job_start('willfail')
6242a480bfSBram Moolenaar  endif
63fbdd08edSBram Moolenaar  if has('float')
64fbdd08edSBram Moolenaar    let float1: float = 3.4
65fbdd08edSBram Moolenaar  endif
665deeb3f1SBram Moolenaar  let Funky1: func
675deeb3f1SBram Moolenaar  let Funky2: func = function('len')
684c17ad94SBram Moolenaar  let Party2: func = funcref('g:Test_syntax')
6942a480bfSBram Moolenaar
70b209750bSBram Moolenaar  g:newvar = 'new'  #comment
71401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
72401d9ffbSBram Moolenaar
73401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
74401d9ffbSBram Moolenaar  g:existing = 'no'
75401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
76401d9ffbSBram Moolenaar
77b283a8a6SBram Moolenaar  v:char = 'abc'
786e587dcbSBram Moolenaar  assert_equal('abc', v:char)
79b283a8a6SBram Moolenaar
80b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
816e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
82b283a8a6SBram Moolenaar  $ENVVAR = ''
836e587dcbSBram Moolenaar
84b5ed2660SBram Moolenaar  let lines =<< trim END
85b5ed2660SBram Moolenaar    vim9script
86b5ed2660SBram Moolenaar    $ENVVAR = 'barfoo'
87b5ed2660SBram Moolenaar    assert_equal('barfoo', $ENVVAR)
88b5ed2660SBram Moolenaar    $ENVVAR = ''
89b5ed2660SBram Moolenaar  END
90b5ed2660SBram Moolenaar  call CheckScriptSuccess(lines)
91b5ed2660SBram Moolenaar
92fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
93fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
94fd1823e0SBram Moolenaar  s:addToMe += 222
95fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
960bbf722aSBram Moolenaar  s:newVar = 'new'
970bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
98a8c17704SBram Moolenaar
99a8c17704SBram Moolenaar  set ts=7
100a8c17704SBram Moolenaar  &ts += 1
101a8c17704SBram Moolenaar  assert_equal(8, &ts)
10280c34ca3SBram Moolenaar  &ts -= 3
10380c34ca3SBram Moolenaar  assert_equal(5, &ts)
10480c34ca3SBram Moolenaar  &ts *= 2
10580c34ca3SBram Moolenaar  assert_equal(10, &ts)
10680c34ca3SBram Moolenaar  &ts /= 3
10780c34ca3SBram Moolenaar  assert_equal(3, &ts)
10880c34ca3SBram Moolenaar  set ts=10
10980c34ca3SBram Moolenaar  &ts %= 4
11080c34ca3SBram Moolenaar  assert_equal(2, &ts)
111b5ed2660SBram Moolenaar
11293ad1471SBram Moolenaar  if has('float')
11393ad1471SBram Moolenaar    let f100: float = 100.0
11493ad1471SBram Moolenaar    f100 /= 5
11593ad1471SBram Moolenaar    assert_equal(20.0, f100)
11693ad1471SBram Moolenaar
11793ad1471SBram Moolenaar    let f200: float = 200.0
11893ad1471SBram Moolenaar    f200 /= 5.0
11993ad1471SBram Moolenaar    assert_equal(40.0, f200)
12093ad1471SBram Moolenaar
12193ad1471SBram Moolenaar    CheckDefFailure(['let nr: number = 200', 'nr /= 5.0'], 'E1012:')
12293ad1471SBram Moolenaar  endif
12393ad1471SBram Moolenaar
124b5ed2660SBram Moolenaar  lines =<< trim END
125b5ed2660SBram Moolenaar    &ts = 6
126b5ed2660SBram Moolenaar    &ts += 3
127b5ed2660SBram Moolenaar    assert_equal(9, &ts)
1282e800955SBram Moolenaar
1292e800955SBram Moolenaar    &l:ts = 6
1302e800955SBram Moolenaar    assert_equal(6, &ts)
1312e800955SBram Moolenaar    &l:ts += 2
1322e800955SBram Moolenaar    assert_equal(8, &ts)
1332e800955SBram Moolenaar
1342e800955SBram Moolenaar    &g:ts = 6
1352e800955SBram Moolenaar    assert_equal(6, &g:ts)
1362e800955SBram Moolenaar    &g:ts += 2
1372e800955SBram Moolenaar    assert_equal(8, &g:ts)
138b5ed2660SBram Moolenaar  END
1392e800955SBram Moolenaar  CheckDefAndScriptSuccess(lines)
140b5ed2660SBram Moolenaar
1410aae4809SBram Moolenaar  CheckDefFailure(['&notex += 3'], 'E113:')
1420aae4809SBram Moolenaar  CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
1430aae4809SBram Moolenaar  CheckDefFailure(['&ts = [7]'], 'E1012:')
1440aae4809SBram Moolenaar  CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list')
1450aae4809SBram Moolenaar  CheckDefFailure(['&ts = "xx"'], 'E1012:')
1460aae4809SBram Moolenaar  CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string')
1470aae4809SBram Moolenaar  CheckDefFailure(['&path += 3'], 'E1012:')
1480aae4809SBram Moolenaar  CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
149cb711abfSBram Moolenaar  # test freeing ISN_STOREOPT
1500aae4809SBram Moolenaar  CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
15180c34ca3SBram Moolenaar  &ts = 8
152a8c17704SBram Moolenaar
1530aae4809SBram Moolenaar  lines =<< trim END
1540aae4809SBram Moolenaar    let save_TI = &t_TI
1550aae4809SBram Moolenaar    &t_TI = ''
1560aae4809SBram Moolenaar    assert_equal('', &t_TI)
1570aae4809SBram Moolenaar    &t_TI = 'xxx'
1580aae4809SBram Moolenaar    assert_equal('xxx', &t_TI)
1590aae4809SBram Moolenaar    &t_TI = save_TI
1600aae4809SBram Moolenaar  END
1610aae4809SBram Moolenaar  CheckDefSuccess(lines)
1620aae4809SBram Moolenaar  CheckScriptSuccess(['vim9script'] + lines)
1630aae4809SBram Moolenaar
1640aae4809SBram Moolenaar  CheckDefFailure(['&t_TI = 123'], 'E1012:')
1650aae4809SBram Moolenaar  CheckScriptFailure(['vim9script', '&t_TI = 123'], 'E928:')
1660aae4809SBram Moolenaar
1670aae4809SBram Moolenaar  CheckDefFailure(['let s:var = 123'], 'E1101:')
1680aae4809SBram Moolenaar  CheckDefFailure(['let s:var: number'], 'E1101:')
16933afa244SBram Moolenaar
170f9b2b496SBram Moolenaar  lines =<< trim END
171f9b2b496SBram Moolenaar    vim9script
172f9b2b496SBram Moolenaar    def SomeFunc()
173f9b2b496SBram Moolenaar      s:var = 123
174f9b2b496SBram Moolenaar    enddef
175f9b2b496SBram Moolenaar    defcompile
176f9b2b496SBram Moolenaar  END
177f9b2b496SBram Moolenaar  call CheckScriptFailure(lines, 'E1089:')
178f9b2b496SBram Moolenaar
179a8c17704SBram Moolenaar  g:inc_counter += 1
180a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
181a8c17704SBram Moolenaar
182a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
183a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
184dd29f1b0SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1051:')
185451c2e35SBram Moolenaar  call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1012:')
186a8c17704SBram Moolenaar
187b5ed2660SBram Moolenaar  lines =<< trim END
188b5ed2660SBram Moolenaar    @c = 'areg'
189b5ed2660SBram Moolenaar    @c ..= 'add'
190b5ed2660SBram Moolenaar    assert_equal('aregadd', @c)
191b5ed2660SBram Moolenaar  END
1922e800955SBram Moolenaar  CheckDefAndScriptSuccess(lines)
1932e800955SBram Moolenaar
1942e800955SBram Moolenaar  call CheckDefFailure(['@a += "more"'], 'E1051:')
1952e800955SBram Moolenaar  call CheckDefFailure(['@a += 123'], 'E1012:')
196b5ed2660SBram Moolenaar
197e69f6d04SBram Moolenaar  v:errmsg = 'none'
198e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
199e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
200dd29f1b0SBram Moolenaar  call CheckDefFailure(['v:errmsg += "more"'], 'E1051:')
201451c2e35SBram Moolenaar  call CheckDefFailure(['v:errmsg += 123'], 'E1012:')
20233afa244SBram Moolenaar
20333afa244SBram Moolenaar  # single letter variables
20433afa244SBram Moolenaar  a = 123
20533afa244SBram Moolenaar  assert_equal(123, a)
20633afa244SBram Moolenaar  let b: number
20733afa244SBram Moolenaar  b = 123
20833afa244SBram Moolenaar  assert_equal(123, b)
20933afa244SBram Moolenaar  let g: number
21033afa244SBram Moolenaar  g = 123
21133afa244SBram Moolenaar  assert_equal(123, g)
21233afa244SBram Moolenaar  let s: number
21333afa244SBram Moolenaar  s = 123
21433afa244SBram Moolenaar  assert_equal(123, s)
21533afa244SBram Moolenaar  let t: number
21633afa244SBram Moolenaar  t = 123
21733afa244SBram Moolenaar  assert_equal(123, t)
21833afa244SBram Moolenaar  let v: number
21933afa244SBram Moolenaar  v = 123
22033afa244SBram Moolenaar  assert_equal(123, v)
22133afa244SBram Moolenaar  let w: number
22233afa244SBram Moolenaar  w = 123
22333afa244SBram Moolenaar  assert_equal(123, w)
2245deeb3f1SBram Moolenaarenddef
2255deeb3f1SBram Moolenaar
2263b74b6b4SBram Moolenaardef Test_vim9_single_char_vars()
2273b74b6b4SBram Moolenaar  let lines =<< trim END
2283b74b6b4SBram Moolenaar      vim9script
2293b74b6b4SBram Moolenaar
230f5be8cdbSBram Moolenaar      # single character variable declarations work
2313b74b6b4SBram Moolenaar      let a: string
2323b74b6b4SBram Moolenaar      let b: number
2333b74b6b4SBram Moolenaar      let l: list<any>
2343b74b6b4SBram Moolenaar      let s: string
2353b74b6b4SBram Moolenaar      let t: number
2363b74b6b4SBram Moolenaar      let v: number
2373b74b6b4SBram Moolenaar      let w: number
2383b74b6b4SBram Moolenaar
239f5be8cdbSBram Moolenaar      # script-local variables can be used without s: prefix
2403b74b6b4SBram Moolenaar      a = 'script-a'
2413b74b6b4SBram Moolenaar      b = 111
2423b74b6b4SBram Moolenaar      l = [1, 2, 3]
2433b74b6b4SBram Moolenaar      s = 'script-s'
2443b74b6b4SBram Moolenaar      t = 222
2453b74b6b4SBram Moolenaar      v = 333
2463b74b6b4SBram Moolenaar      w = 444
2473b74b6b4SBram Moolenaar
2483b74b6b4SBram Moolenaar      assert_equal('script-a', a)
2493b74b6b4SBram Moolenaar      assert_equal(111, b)
2503b74b6b4SBram Moolenaar      assert_equal([1, 2, 3], l)
2513b74b6b4SBram Moolenaar      assert_equal('script-s', s)
2523b74b6b4SBram Moolenaar      assert_equal(222, t)
2533b74b6b4SBram Moolenaar      assert_equal(333, v)
2543b74b6b4SBram Moolenaar      assert_equal(444, w)
2553b74b6b4SBram Moolenaar  END
2563b74b6b4SBram Moolenaar  writefile(lines, 'Xsinglechar')
2573b74b6b4SBram Moolenaar  source Xsinglechar
2583b74b6b4SBram Moolenaar  delete('Xsinglechar')
2593b74b6b4SBram Moolenaarenddef
2603b74b6b4SBram Moolenaar
26184370087SBram Moolenaardef Test_assignment_list()
26284370087SBram Moolenaar  let list1: list<bool> = [false, true, false]
26384370087SBram Moolenaar  let list2: list<number> = [1, 2, 3]
26484370087SBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
26584370087SBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
26684370087SBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
26784370087SBram Moolenaar
26884370087SBram Moolenaar  let listS: list<string> = []
26984370087SBram Moolenaar  let listN: list<number> = []
27084370087SBram Moolenaar
27184370087SBram Moolenaar  assert_equal([1, 2, 3], list2)
27284370087SBram Moolenaar  list2[-1] = 99
27384370087SBram Moolenaar  assert_equal([1, 2, 99], list2)
27484370087SBram Moolenaar  list2[-2] = 88
27584370087SBram Moolenaar  assert_equal([1, 88, 99], list2)
27684370087SBram Moolenaar  list2[-3] = 77
27784370087SBram Moolenaar  assert_equal([77, 88, 99], list2)
278dd29f1b0SBram Moolenaar  list2 += [100]
279dd29f1b0SBram Moolenaar  assert_equal([77, 88, 99, 100], list2)
280dd29f1b0SBram Moolenaar
281dd29f1b0SBram Moolenaar  list3 += ['end']
282dd29f1b0SBram Moolenaar  assert_equal(['sdf', 'asdf', 'end'], list3)
283dd29f1b0SBram Moolenaar
284dd29f1b0SBram Moolenaar
28584370087SBram Moolenaar  call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
286c5b1c20bSBram Moolenaar  call CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:')
28784370087SBram Moolenaar
28884370087SBram Moolenaar  # type becomes list<any>
28984370087SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
29084370087SBram Moolenaarenddef
29184370087SBram Moolenaar
292b31be3f9SBram Moolenaardef Test_assignment_list_vim9script()
293b31be3f9SBram Moolenaar  let lines =<< trim END
294b31be3f9SBram Moolenaar    vim9script
295b31be3f9SBram Moolenaar    let v1: number
296b31be3f9SBram Moolenaar    let v2: number
297b31be3f9SBram Moolenaar    let v3: number
298b31be3f9SBram Moolenaar    [v1, v2, v3] = [1, 2, 3]
299b31be3f9SBram Moolenaar    assert_equal([1, 2, 3], [v1, v2, v3])
300b31be3f9SBram Moolenaar  END
301b31be3f9SBram Moolenaar  call CheckScriptSuccess(lines)
302b31be3f9SBram Moolenaarenddef
303b31be3f9SBram Moolenaar
30484370087SBram Moolenaardef Test_assignment_dict()
30584370087SBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
30684370087SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
30784370087SBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
30884370087SBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
30974fae513SBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, two: 0z02}
31084370087SBram Moolenaar
311f5be8cdbSBram Moolenaar  # overwrite
312c785b9a7SBram Moolenaar  dict3['key'] = 'another'
313c785b9a7SBram Moolenaar
31458626872SBram Moolenaar  # empty key can be used
31558626872SBram Moolenaar  let dd = {}
31658626872SBram Moolenaar  dd[""] = 6
31758626872SBram Moolenaar  assert_equal({'': 6}, dd)
31884370087SBram Moolenaar
31984370087SBram Moolenaar  # type becomes dict<any>
32084370087SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
3218e4c8c85SBram Moolenaar
3228e4c8c85SBram Moolenaar  # assignment to script-local dict
3238e4c8c85SBram Moolenaar  let lines =<< trim END
3248e4c8c85SBram Moolenaar    vim9script
3258e4c8c85SBram Moolenaar    let test: dict<any> = {}
3268e4c8c85SBram Moolenaar    def FillDict(): dict<any>
3278e4c8c85SBram Moolenaar      test['a'] = 43
3288e4c8c85SBram Moolenaar      return test
3298e4c8c85SBram Moolenaar    enddef
3308e4c8c85SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3318e4c8c85SBram Moolenaar  END
3328e4c8c85SBram Moolenaar  call CheckScriptSuccess(lines)
3338e4c8c85SBram Moolenaar
3348e4c8c85SBram Moolenaar  lines =<< trim END
3358e4c8c85SBram Moolenaar    vim9script
3368e4c8c85SBram Moolenaar    let test: dict<any>
3378e4c8c85SBram Moolenaar    def FillDict(): dict<any>
3388e4c8c85SBram Moolenaar      test['a'] = 43
3398e4c8c85SBram Moolenaar      return test
3408e4c8c85SBram Moolenaar    enddef
3418e4c8c85SBram Moolenaar    FillDict()
3428e4c8c85SBram Moolenaar  END
3438e4c8c85SBram Moolenaar  call CheckScriptFailure(lines, 'E1103:')
3442caa1594SBram Moolenaar
3452caa1594SBram Moolenaar  # assignment to global dict
3462caa1594SBram Moolenaar  lines =<< trim END
3472caa1594SBram Moolenaar    vim9script
3482caa1594SBram Moolenaar    g:test = {}
3492caa1594SBram Moolenaar    def FillDict(): dict<any>
3502caa1594SBram Moolenaar      g:test['a'] = 43
3512caa1594SBram Moolenaar      return g:test
3522caa1594SBram Moolenaar    enddef
3532caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3542caa1594SBram Moolenaar  END
3552caa1594SBram Moolenaar  call CheckScriptSuccess(lines)
3562caa1594SBram Moolenaar
3572caa1594SBram Moolenaar  # assignment to buffer dict
3582caa1594SBram Moolenaar  lines =<< trim END
3592caa1594SBram Moolenaar    vim9script
3602caa1594SBram Moolenaar    b:test = {}
3612caa1594SBram Moolenaar    def FillDict(): dict<any>
3622caa1594SBram Moolenaar      b:test['a'] = 43
3632caa1594SBram Moolenaar      return b:test
3642caa1594SBram Moolenaar    enddef
3652caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3662caa1594SBram Moolenaar  END
3672caa1594SBram Moolenaar  call CheckScriptSuccess(lines)
36884370087SBram Moolenaarenddef
36984370087SBram Moolenaar
370d3aac291SBram Moolenaardef Test_assignment_local()
371f5be8cdbSBram Moolenaar  # Test in a separated file in order not to the current buffer/window/tab is
372f5be8cdbSBram Moolenaar  # changed.
373d3aac291SBram Moolenaar  let script_lines: list<string> =<< trim END
374d3aac291SBram Moolenaar    let b:existing = 'yes'
375d3aac291SBram Moolenaar    let w:existing = 'yes'
376d3aac291SBram Moolenaar    let t:existing = 'yes'
377d3aac291SBram Moolenaar
378d3aac291SBram Moolenaar    def Test_assignment_local_internal()
379d3aac291SBram Moolenaar      b:newvar = 'new'
380d3aac291SBram Moolenaar      assert_equal('new', b:newvar)
381d3aac291SBram Moolenaar      assert_equal('yes', b:existing)
382d3aac291SBram Moolenaar      b:existing = 'no'
383d3aac291SBram Moolenaar      assert_equal('no', b:existing)
384396f3138SBram Moolenaar      b:existing ..= 'NO'
385396f3138SBram Moolenaar      assert_equal('noNO', b:existing)
386d3aac291SBram Moolenaar
387d3aac291SBram Moolenaar      w:newvar = 'new'
388d3aac291SBram Moolenaar      assert_equal('new', w:newvar)
389d3aac291SBram Moolenaar      assert_equal('yes', w:existing)
390d3aac291SBram Moolenaar      w:existing = 'no'
391d3aac291SBram Moolenaar      assert_equal('no', w:existing)
392396f3138SBram Moolenaar      w:existing ..= 'NO'
393396f3138SBram Moolenaar      assert_equal('noNO', w:existing)
394d3aac291SBram Moolenaar
395d3aac291SBram Moolenaar      t:newvar = 'new'
396d3aac291SBram Moolenaar      assert_equal('new', t:newvar)
397d3aac291SBram Moolenaar      assert_equal('yes', t:existing)
398d3aac291SBram Moolenaar      t:existing = 'no'
399d3aac291SBram Moolenaar      assert_equal('no', t:existing)
400396f3138SBram Moolenaar      t:existing ..= 'NO'
401396f3138SBram Moolenaar      assert_equal('noNO', t:existing)
402d3aac291SBram Moolenaar    enddef
403d3aac291SBram Moolenaar    call Test_assignment_local_internal()
404d3aac291SBram Moolenaar  END
405d3aac291SBram Moolenaar  call CheckScriptSuccess(script_lines)
406d3aac291SBram Moolenaarenddef
407d3aac291SBram Moolenaar
4085deeb3f1SBram Moolenaardef Test_assignment_default()
409e69f6d04SBram Moolenaar
410cb711abfSBram Moolenaar  # Test default values.
411e69f6d04SBram Moolenaar  let thebool: bool
412e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
413e69f6d04SBram Moolenaar
414e69f6d04SBram Moolenaar  let thenumber: number
415e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
416e69f6d04SBram Moolenaar
417e69f6d04SBram Moolenaar  if has('float')
418e69f6d04SBram Moolenaar    let thefloat: float
419e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
420e69f6d04SBram Moolenaar  endif
421e69f6d04SBram Moolenaar
422e69f6d04SBram Moolenaar  let thestring: string
423e69f6d04SBram Moolenaar  assert_equal('', thestring)
424e69f6d04SBram Moolenaar
425e69f6d04SBram Moolenaar  let theblob: blob
426e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
427e69f6d04SBram Moolenaar
4285deeb3f1SBram Moolenaar  let Thefunc: func
4295deeb3f1SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
430e69f6d04SBram Moolenaar
431e69f6d04SBram Moolenaar  let thelist: list<any>
432e69f6d04SBram Moolenaar  assert_equal([], thelist)
433e69f6d04SBram Moolenaar
434e69f6d04SBram Moolenaar  let thedict: dict<any>
435e69f6d04SBram Moolenaar  assert_equal({}, thedict)
436e69f6d04SBram Moolenaar
4372c869deeSBram Moolenaar  if has('channel')
438e69f6d04SBram Moolenaar    let thejob: job
439e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
440e69f6d04SBram Moolenaar
441e69f6d04SBram Moolenaar    let thechannel: channel
442e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
443c785b9a7SBram Moolenaar
444c785b9a7SBram Moolenaar    if has('unix') && executable('cat')
445f5be8cdbSBram Moolenaar      # check with non-null job and channel, types must match
446c785b9a7SBram Moolenaar      thejob = job_start("cat ", #{})
447c785b9a7SBram Moolenaar      thechannel = job_getchannel(thejob)
448c785b9a7SBram Moolenaar      job_stop(thejob, 'kill')
449c785b9a7SBram Moolenaar    endif
4502c869deeSBram Moolenaar  endif
451585fea7bSBram Moolenaar
452585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
453585fea7bSBram Moolenaar  assert_equal(5678, nr)
4548a7d6542SBram Moolenaarenddef
4558a7d6542SBram Moolenaar
45647a519a9SBram Moolenaardef Test_assignment_var_list()
45747a519a9SBram Moolenaar  let v1: string
45847a519a9SBram Moolenaar  let v2: string
4599af78769SBram Moolenaar  let vrem: list<string>
4609af78769SBram Moolenaar  [v1] = ['aaa']
4619af78769SBram Moolenaar  assert_equal('aaa', v1)
4629af78769SBram Moolenaar
46347a519a9SBram Moolenaar  [v1, v2] = ['one', 'two']
46447a519a9SBram Moolenaar  assert_equal('one', v1)
46547a519a9SBram Moolenaar  assert_equal('two', v2)
4669af78769SBram Moolenaar
4679af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two']
4689af78769SBram Moolenaar  assert_equal('one', v1)
4699af78769SBram Moolenaar  assert_equal('two', v2)
4709af78769SBram Moolenaar  assert_equal([], vrem)
4719af78769SBram Moolenaar
4729af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two', 'three']
4739af78769SBram Moolenaar  assert_equal('one', v1)
4749af78769SBram Moolenaar  assert_equal('two', v2)
4759af78769SBram Moolenaar  assert_equal(['three'], vrem)
4761c199f9cSBram Moolenaar
4771c199f9cSBram Moolenaar  [&ts, &sw] = [3, 4]
4781c199f9cSBram Moolenaar  assert_equal(3, &ts)
4791c199f9cSBram Moolenaar  assert_equal(4, &sw)
4801c199f9cSBram Moolenaar  set ts=8 sw=4
48147a519a9SBram Moolenaarenddef
48247a519a9SBram Moolenaar
483c7e44a7eSBram Moolenaardef Test_assignment_vim9script()
484c7e44a7eSBram Moolenaar  let lines =<< trim END
485c7e44a7eSBram Moolenaar    vim9script
486c7e44a7eSBram Moolenaar    def Func(): list<number>
487c7e44a7eSBram Moolenaar      return [1, 2]
488c7e44a7eSBram Moolenaar    enddef
489c7e44a7eSBram Moolenaar    let var1: number
490c7e44a7eSBram Moolenaar    let var2: number
491c7e44a7eSBram Moolenaar    [var1, var2] =
492c7e44a7eSBram Moolenaar          Func()
493c7e44a7eSBram Moolenaar    assert_equal(1, var1)
494c7e44a7eSBram Moolenaar    assert_equal(2, var2)
495c7e44a7eSBram Moolenaar    let ll =
496c7e44a7eSBram Moolenaar          Func()
497c7e44a7eSBram Moolenaar    assert_equal([1, 2], ll)
49883144546SBram Moolenaar
49983144546SBram Moolenaar    @/ = 'text'
50083144546SBram Moolenaar    assert_equal('text', @/)
50183144546SBram Moolenaar    @0 = 'zero'
50283144546SBram Moolenaar    assert_equal('zero', @0)
50383144546SBram Moolenaar    @1 = 'one'
50483144546SBram Moolenaar    assert_equal('one', @1)
50583144546SBram Moolenaar    @9 = 'nine'
50683144546SBram Moolenaar    assert_equal('nine', @9)
50783144546SBram Moolenaar    @- = 'minus'
50883144546SBram Moolenaar    assert_equal('minus', @-)
50983144546SBram Moolenaar    if has('clipboard_working')
51083144546SBram Moolenaar      @* = 'star'
51183144546SBram Moolenaar      assert_equal('star', @*)
51283144546SBram Moolenaar      @+ = 'plus'
51383144546SBram Moolenaar      assert_equal('plus', @+)
51483144546SBram Moolenaar    endif
51595dd9f25SBram Moolenaar
51695dd9f25SBram Moolenaar    let a: number = 123
51795dd9f25SBram Moolenaar    assert_equal(123, a)
51895dd9f25SBram Moolenaar    let s: string = 'yes'
51995dd9f25SBram Moolenaar    assert_equal('yes', s)
52095dd9f25SBram Moolenaar    let b: number = 42
52195dd9f25SBram Moolenaar    assert_equal(42, b)
52295dd9f25SBram Moolenaar    let w: number = 43
52395dd9f25SBram Moolenaar    assert_equal(43, w)
52495dd9f25SBram Moolenaar    let t: number = 44
52595dd9f25SBram Moolenaar    assert_equal(44, t)
526c7e44a7eSBram Moolenaar  END
527c7e44a7eSBram Moolenaar  CheckScriptSuccess(lines)
528c7e44a7eSBram Moolenaarenddef
529c7e44a7eSBram Moolenaar
530cab27678SBram Moolenaardef Mess(): string
531cab27678SBram Moolenaar  v:foldstart = 123
532cab27678SBram Moolenaar  return 'xxx'
533cab27678SBram Moolenaarenddef
534cab27678SBram Moolenaar
535d72c1bf0SBram Moolenaardef Test_assignment_failure()
5368a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
5378a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
5388a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
5398a7d6542SBram Moolenaar
54063be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:')
54163be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='")
54263be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:')
54363be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:')
54463be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:')
54563be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='")
54663be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:')
54763be3d4bSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='")
54863be3d4bSBram Moolenaar
5498a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
5508a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
5518a7d6542SBram Moolenaar
5529b7bf9e9SBram Moolenaar  call CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
5539af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
5549af78769SBram Moolenaar                            '[a] = test_null_list()'], 'E1093:')
5559af78769SBram Moolenaar  call CheckDefExecFailure(['let a: number',
5569af78769SBram Moolenaar                            '[a] = []'], 'E1093:')
5579af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
5589af78769SBram Moolenaar                            'let y: number',
5599af78769SBram Moolenaar                            '[x, y] = [1]'], 'E1093:')
5609af78769SBram Moolenaar  call CheckDefExecFailure(['let x: number',
5619af78769SBram Moolenaar                            'let y: number',
5629af78769SBram Moolenaar                            'let z: list<number>',
5639af78769SBram Moolenaar                            '[x, y; z] = [1]'], 'E1093:')
5649be61bbbSBram Moolenaar
565e69f6d04SBram Moolenaar  call CheckDefFailure(['let somevar'], "E1022:")
566c2ee44ccSBram Moolenaar  call CheckDefFailure(['let &tabstop = 4'], 'E1052:')
5679be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
568c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:')
5699be61bbbSBram Moolenaar
570e55b1c09SBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
571c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:')
5729be61bbbSBram Moolenaar
573434d72cbSBram Moolenaar  if has('dnd')
57465821727SBram Moolenaar    call CheckDefFailure(['let @~ = 5'], 'E1066:')
575434d72cbSBram Moolenaar  else
576434d72cbSBram Moolenaar    call CheckDefFailure(['let @~ = 5'], 'E354:')
577434d72cbSBram Moolenaar    call CheckDefFailure(['@~ = 5'], 'E354:')
578434d72cbSBram Moolenaar  endif
5799be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
58065821727SBram Moolenaar  call CheckDefFailure(['let @/ = "x"'], 'E1066:')
581c2ee44ccSBram Moolenaar  call CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:')
5829be61bbbSBram Moolenaar
583e55b1c09SBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
584e55b1c09SBram Moolenaar  call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
585e55b1c09SBram Moolenaar  call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
586e55b1c09SBram Moolenaar  call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
5879be61bbbSBram Moolenaar
5889be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
589122616d9SBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:', 1)
590122616d9SBram Moolenaar  call CheckScriptFailure(['vim9script', 'let xnr += 4'], 'E1020:')
591122616d9SBram Moolenaar  call CheckDefFailure(["let xnr = xnr + 1"], 'E1001:', 1)
592122616d9SBram Moolenaar  call CheckScriptFailure(['vim9script', 'let xnr = xnr + 4'], 'E121:')
5939be61bbbSBram Moolenaar
594451c2e35SBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1108:')
59533fa29cfSBram Moolenaar
5968a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
5978a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
5988a7d6542SBram Moolenaar
5998a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
6008a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
6018a7d6542SBram Moolenaar
6028a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
6038a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
60442a480bfSBram Moolenaar
605d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
60642a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
607cab27678SBram Moolenaar
608cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
609cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
61043e969d3SBram Moolenaar
61143e969d3SBram Moolenaar  call CheckDefFailure(['w:foo: number = 10'],
61243e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 1')
61343e969d3SBram Moolenaar  call CheckDefFailure(['t:foo: bool = true'],
61443e969d3SBram Moolenaar                       'E488: Trailing characters: : bool = true')
61543e969d3SBram Moolenaar  call CheckDefFailure(['b:foo: string = "x"'],
61643e969d3SBram Moolenaar                       'E488: Trailing characters: : string = "x"')
61743e969d3SBram Moolenaar  call CheckDefFailure(['g:foo: number = 123'],
61843e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 123')
619d72c1bf0SBram Moolenaarenddef
620d72c1bf0SBram Moolenaar
621d72c1bf0SBram Moolenaardef Test_unlet()
622d72c1bf0SBram Moolenaar  g:somevar = 'yes'
623d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
624d72c1bf0SBram Moolenaar  unlet g:somevar
625d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
626d72c1bf0SBram Moolenaar  unlet! g:somevar
627d72c1bf0SBram Moolenaar
6288436773fSBram Moolenaar  # also works for script-local variable in legacy Vim script
6298436773fSBram Moolenaar  s:somevar = 'legacy'
6308436773fSBram Moolenaar  assert_true(exists('s:somevar'))
6318436773fSBram Moolenaar  unlet s:somevar
6328436773fSBram Moolenaar  assert_false(exists('s:somevar'))
6338436773fSBram Moolenaar  unlet! s:somevar
6348436773fSBram Moolenaar
635d72c1bf0SBram Moolenaar  call CheckScriptFailure([
636d72c1bf0SBram Moolenaar        'vim9script',
637d72c1bf0SBram Moolenaar        'let svar = 123',
638d72c1bf0SBram Moolenaar        'unlet svar',
639d72c1bf0SBram Moolenaar        ], 'E1081:')
640d72c1bf0SBram Moolenaar  call CheckScriptFailure([
641d72c1bf0SBram Moolenaar        'vim9script',
642d72c1bf0SBram Moolenaar        'let svar = 123',
643d72c1bf0SBram Moolenaar        'unlet s:svar',
644d72c1bf0SBram Moolenaar        ], 'E1081:')
645d72c1bf0SBram Moolenaar  call CheckScriptFailure([
646d72c1bf0SBram Moolenaar        'vim9script',
647d72c1bf0SBram Moolenaar        'let svar = 123',
648d72c1bf0SBram Moolenaar        'def Func()',
649d72c1bf0SBram Moolenaar        '  unlet svar',
650d72c1bf0SBram Moolenaar        'enddef',
651822ba247SBram Moolenaar        'defcompile',
652d72c1bf0SBram Moolenaar        ], 'E1081:')
653d72c1bf0SBram Moolenaar  call CheckScriptFailure([
654d72c1bf0SBram Moolenaar        'vim9script',
655d72c1bf0SBram Moolenaar        'let svar = 123',
656d72c1bf0SBram Moolenaar        'def Func()',
657d72c1bf0SBram Moolenaar        '  unlet s:svar',
658d72c1bf0SBram Moolenaar        'enddef',
659822ba247SBram Moolenaar        'defcompile',
660d72c1bf0SBram Moolenaar        ], 'E1081:')
6617bdaea6eSBram Moolenaar
6627bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
6637bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
6647bdaea6eSBram Moolenaar  unlet $ENVVAR
6657bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
666d72c1bf0SBram Moolenaarenddef
667599c89c8SBram Moolenaar
6684c17ad94SBram Moolenaardef Test_delfunction()
669f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
6704c17ad94SBram Moolenaar  CheckScriptSuccess([
6714c17ad94SBram Moolenaar      'vim9script',
6724c17ad94SBram Moolenaar      'func CheckMe()',
6734c17ad94SBram Moolenaar      '  return 123',
6744c17ad94SBram Moolenaar      'endfunc',
6754c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
6764c17ad94SBram Moolenaar      ])
6774c17ad94SBram Moolenaar
678f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
6794c17ad94SBram Moolenaar  CheckScriptFailure([
6804c17ad94SBram Moolenaar      'vim9script',
6814c17ad94SBram Moolenaar      'func DeleteMe1()',
6824c17ad94SBram Moolenaar      'endfunc',
6834c17ad94SBram Moolenaar      'delfunction DeleteMe1',
6844c17ad94SBram Moolenaar      ], 'E1084:')
6854c17ad94SBram Moolenaar  CheckScriptFailure([
6864c17ad94SBram Moolenaar      'vim9script',
6874c17ad94SBram Moolenaar      'func DeleteMe2()',
6884c17ad94SBram Moolenaar      'endfunc',
6894c17ad94SBram Moolenaar      'def DoThat()',
6904c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
6914c17ad94SBram Moolenaar      'enddef',
6924c17ad94SBram Moolenaar      'DoThat()',
6934c17ad94SBram Moolenaar      ], 'E1084:')
6944c17ad94SBram Moolenaar  CheckScriptFailure([
6954c17ad94SBram Moolenaar      'vim9script',
6964c17ad94SBram Moolenaar      'def DeleteMe3()',
6974c17ad94SBram Moolenaar      'enddef',
6984c17ad94SBram Moolenaar      'delfunction DeleteMe3',
6994c17ad94SBram Moolenaar      ], 'E1084:')
7004c17ad94SBram Moolenaar  CheckScriptFailure([
7014c17ad94SBram Moolenaar      'vim9script',
7024c17ad94SBram Moolenaar      'def DeleteMe4()',
7034c17ad94SBram Moolenaar      'enddef',
7044c17ad94SBram Moolenaar      'def DoThat()',
7054c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
7064c17ad94SBram Moolenaar      'enddef',
7074c17ad94SBram Moolenaar      'DoThat()',
7084c17ad94SBram Moolenaar      ], 'E1084:')
709925e9fd6SBram Moolenaar
710925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
711925e9fd6SBram Moolenaar  let lines =<< trim END
712925e9fd6SBram Moolenaar      vim9script
713925e9fd6SBram Moolenaar      def g:Global(): string
714925e9fd6SBram Moolenaar        return "yes"
715925e9fd6SBram Moolenaar      enddef
716925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
717925e9fd6SBram Moolenaar      def! g:Global(): string
718925e9fd6SBram Moolenaar        return "no"
719925e9fd6SBram Moolenaar      enddef
720925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
721925e9fd6SBram Moolenaar      delfunc g:Global
722925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
723925e9fd6SBram Moolenaar  END
724925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
725925e9fd6SBram Moolenaar
726925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
727925e9fd6SBram Moolenaar  lines =<< trim END
728925e9fd6SBram Moolenaar      vim9script
729925e9fd6SBram Moolenaar      func g:Global()
730925e9fd6SBram Moolenaar        return "yes"
731925e9fd6SBram Moolenaar      endfunc
732925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
733925e9fd6SBram Moolenaar      def! g:Global(): string
734925e9fd6SBram Moolenaar        return "no"
735925e9fd6SBram Moolenaar      enddef
736925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
737925e9fd6SBram Moolenaar      delfunc g:Global
738925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
739925e9fd6SBram Moolenaar  END
740925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
741925e9fd6SBram Moolenaar
742925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
743925e9fd6SBram Moolenaar  lines =<< trim END
744925e9fd6SBram Moolenaar      vim9script
745925e9fd6SBram Moolenaar      def g:Global(): string
746925e9fd6SBram Moolenaar        return "yes"
747925e9fd6SBram Moolenaar      enddef
748925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
749925e9fd6SBram Moolenaar      func! g:Global()
750925e9fd6SBram Moolenaar        return "no"
751925e9fd6SBram Moolenaar      endfunc
752925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
753925e9fd6SBram Moolenaar      delfunc g:Global
754925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
755925e9fd6SBram Moolenaar  END
756925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
7574c17ad94SBram Moolenaarenddef
7584c17ad94SBram Moolenaar
759599c89c8SBram Moolenaarfunc Test_wrong_type()
760599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
761599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
762599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
763599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
764599c89c8SBram Moolenaar
765599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
766599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
76742a480bfSBram Moolenaar
76842a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
76942a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
77042a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
77142a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
77242a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
77342a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
77442a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
77542a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
77642a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
77742a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
77842a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
779a0a9f43aSBram Moolenaar
780a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
781a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
7828a7d6542SBram Moolenaarendfunc
7838a7d6542SBram Moolenaar
7848a7d6542SBram Moolenaarfunc Test_const()
7858a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
7868a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
7878a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
7889be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
7898a7d6542SBram Moolenaarendfunc
7908a7d6542SBram Moolenaar
791df069eecSBram Moolenaardef Test_range_no_colon()
792df069eecSBram Moolenaar  call CheckDefFailure(['%s/a/b/'], 'E1050:')
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 Moolenaarenddef
797df069eecSBram Moolenaar
798df069eecSBram Moolenaar
7998a7d6542SBram Moolenaardef Test_block()
8008a7d6542SBram Moolenaar  let outer = 1
8018a7d6542SBram Moolenaar  {
8028a7d6542SBram Moolenaar    let inner = 2
8038a7d6542SBram Moolenaar    assert_equal(1, outer)
8048a7d6542SBram Moolenaar    assert_equal(2, inner)
8058a7d6542SBram Moolenaar  }
8068a7d6542SBram Moolenaar  assert_equal(1, outer)
8078a7d6542SBram Moolenaarenddef
8088a7d6542SBram Moolenaar
8098a7d6542SBram Moolenaarfunc Test_block_failure()
8108a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
811585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
812585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
8138a7d6542SBram Moolenaarendfunc
8148a7d6542SBram Moolenaar
815d032f34aSBram Moolenaarfunc g:NoSuchFunc()
816d032f34aSBram Moolenaar  echo 'none'
817d032f34aSBram Moolenaarendfunc
818d032f34aSBram Moolenaar
8198a7d6542SBram Moolenaardef Test_try_catch()
8208a7d6542SBram Moolenaar  let l = []
8217a092245SBram Moolenaar  try # comment
8228a7d6542SBram Moolenaar    add(l, '1')
8238a7d6542SBram Moolenaar    throw 'wrong'
8248a7d6542SBram Moolenaar    add(l, '2')
8257a092245SBram Moolenaar  catch # comment
8268a7d6542SBram Moolenaar    add(l, v:exception)
8277a092245SBram Moolenaar  finally # comment
8288a7d6542SBram Moolenaar    add(l, '3')
8297a092245SBram Moolenaar  endtry # comment
8308a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
83168d130c6SBram Moolenaar
832e859312eSBram Moolenaar  l = []
833e859312eSBram Moolenaar  try
834e859312eSBram Moolenaar    try
835e859312eSBram Moolenaar      add(l, '1')
836e859312eSBram Moolenaar      throw 'wrong'
837e859312eSBram Moolenaar      add(l, '2')
838e859312eSBram Moolenaar    catch /right/
839e859312eSBram Moolenaar      add(l, v:exception)
840e859312eSBram Moolenaar    endtry
841e859312eSBram Moolenaar  catch /wrong/
842e859312eSBram Moolenaar    add(l, 'caught')
843e859312eSBram Moolenaar  finally
844e859312eSBram Moolenaar    add(l, 'finally')
845e859312eSBram Moolenaar  endtry
846e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
847e859312eSBram Moolenaar
84868d130c6SBram Moolenaar  let n: number
84968d130c6SBram Moolenaar  try
85068d130c6SBram Moolenaar    n = l[3]
85168d130c6SBram Moolenaar  catch /E684:/
85268d130c6SBram Moolenaar    n = 99
85368d130c6SBram Moolenaar  endtry
85468d130c6SBram Moolenaar  assert_equal(99, n)
85568d130c6SBram Moolenaar
85668d130c6SBram Moolenaar  try
857cc673e74SBram Moolenaar    # string slice returns a string, not a number
85868d130c6SBram Moolenaar    n = g:astring[3]
85956acb094SBram Moolenaar  catch /E1029:/
86068d130c6SBram Moolenaar    n = 77
86168d130c6SBram Moolenaar  endtry
86268d130c6SBram Moolenaar  assert_equal(77, n)
86368d130c6SBram Moolenaar
86468d130c6SBram Moolenaar  try
86568d130c6SBram Moolenaar    n = l[g:astring]
86656acb094SBram Moolenaar  catch /E1029:/
86756acb094SBram Moolenaar    n = 88
86868d130c6SBram Moolenaar  endtry
86956acb094SBram Moolenaar  assert_equal(88, n)
87068d130c6SBram Moolenaar
87168d130c6SBram Moolenaar  try
87268d130c6SBram Moolenaar    n = s:does_not_exist
87368d130c6SBram Moolenaar  catch /E121:/
874f0b9f43cSBram Moolenaar    n = 111
875f0b9f43cSBram Moolenaar  endtry
876f0b9f43cSBram Moolenaar  assert_equal(111, n)
877f0b9f43cSBram Moolenaar
878f0b9f43cSBram Moolenaar  try
879f0b9f43cSBram Moolenaar    n = g:does_not_exist
880f0b9f43cSBram Moolenaar  catch /E121:/
88168d130c6SBram Moolenaar    n = 121
88268d130c6SBram Moolenaar  endtry
88368d130c6SBram Moolenaar  assert_equal(121, n)
88468d130c6SBram Moolenaar
88568d130c6SBram Moolenaar  let d = #{one: 1}
88668d130c6SBram Moolenaar  try
88768d130c6SBram Moolenaar    n = d[g:astring]
88868d130c6SBram Moolenaar  catch /E716:/
88968d130c6SBram Moolenaar    n = 222
89068d130c6SBram Moolenaar  endtry
89168d130c6SBram Moolenaar  assert_equal(222, n)
892f0b9f43cSBram Moolenaar
893f0b9f43cSBram Moolenaar  try
894f0b9f43cSBram Moolenaar    n = -g:astring
895f0b9f43cSBram Moolenaar  catch /E39:/
896f0b9f43cSBram Moolenaar    n = 233
897f0b9f43cSBram Moolenaar  endtry
898f0b9f43cSBram Moolenaar  assert_equal(233, n)
899f0b9f43cSBram Moolenaar
900f0b9f43cSBram Moolenaar  try
901f0b9f43cSBram Moolenaar    n = +g:astring
902f0b9f43cSBram Moolenaar  catch /E1030:/
903f0b9f43cSBram Moolenaar    n = 244
904f0b9f43cSBram Moolenaar  endtry
905f0b9f43cSBram Moolenaar  assert_equal(244, n)
906f0b9f43cSBram Moolenaar
907f0b9f43cSBram Moolenaar  try
908f0b9f43cSBram Moolenaar    n = +g:alist
909f0b9f43cSBram Moolenaar  catch /E745:/
910f0b9f43cSBram Moolenaar    n = 255
911f0b9f43cSBram Moolenaar  endtry
912f0b9f43cSBram Moolenaar  assert_equal(255, n)
913f0b9f43cSBram Moolenaar
914f0b9f43cSBram Moolenaar  let nd: dict<any>
915f0b9f43cSBram Moolenaar  try
916f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
917f0b9f43cSBram Moolenaar  catch /E1029:/
918f0b9f43cSBram Moolenaar    n = 266
919f0b9f43cSBram Moolenaar  endtry
920f0b9f43cSBram Moolenaar  assert_equal(266, n)
921f0b9f43cSBram Moolenaar
922f0b9f43cSBram Moolenaar  try
923f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
924f0b9f43cSBram Moolenaar  catch /E1093:/
925f0b9f43cSBram Moolenaar    n = 277
926f0b9f43cSBram Moolenaar  endtry
927f0b9f43cSBram Moolenaar  assert_equal(277, n)
928f0b9f43cSBram Moolenaar
929e859312eSBram Moolenaar  try
930e859312eSBram Moolenaar    &ts = g:astring
931e859312eSBram Moolenaar  catch /E1029:/
932e859312eSBram Moolenaar    n = 288
933e859312eSBram Moolenaar  endtry
934e859312eSBram Moolenaar  assert_equal(288, n)
935e859312eSBram Moolenaar
936e859312eSBram Moolenaar  try
937e859312eSBram Moolenaar    &backspace = 'asdf'
938e859312eSBram Moolenaar  catch /E474:/
939e859312eSBram Moolenaar    n = 299
940e859312eSBram Moolenaar  endtry
941e859312eSBram Moolenaar  assert_equal(299, n)
942e859312eSBram Moolenaar
943e859312eSBram Moolenaar  l = [1]
944e859312eSBram Moolenaar  try
945e859312eSBram Moolenaar    l[3] = 3
946e859312eSBram Moolenaar  catch /E684:/
947e859312eSBram Moolenaar    n = 300
948e859312eSBram Moolenaar  endtry
949e859312eSBram Moolenaar  assert_equal(300, n)
950e859312eSBram Moolenaar
951e859312eSBram Moolenaar  try
952e859312eSBram Moolenaar    unlet g:does_not_exist
953e859312eSBram Moolenaar  catch /E108:/
954e859312eSBram Moolenaar    n = 322
955e859312eSBram Moolenaar  endtry
956e859312eSBram Moolenaar  assert_equal(322, n)
957e859312eSBram Moolenaar
958e859312eSBram Moolenaar  try
959e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
960e859312eSBram Moolenaar  catch /E721:/
961e859312eSBram Moolenaar    n = 333
962e859312eSBram Moolenaar  endtry
963e859312eSBram Moolenaar  assert_equal(333, n)
964e859312eSBram Moolenaar
965e859312eSBram Moolenaar  try
966e859312eSBram Moolenaar    l = DeletedFunc()
967e859312eSBram Moolenaar  catch /E933:/
968e859312eSBram Moolenaar    n = 344
969e859312eSBram Moolenaar  endtry
970e859312eSBram Moolenaar  assert_equal(344, n)
971d032f34aSBram Moolenaar
972d032f34aSBram Moolenaar  try
973d032f34aSBram Moolenaar    echo len(v:true)
974d032f34aSBram Moolenaar  catch /E701:/
975d032f34aSBram Moolenaar    n = 355
976d032f34aSBram Moolenaar  endtry
977d032f34aSBram Moolenaar  assert_equal(355, n)
978d032f34aSBram Moolenaar
979d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
980d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
981d032f34aSBram Moolenaar  try
982d032f34aSBram Moolenaar    echo P()
983d032f34aSBram Moolenaar  catch /E117:/
984d032f34aSBram Moolenaar    n = 366
985d032f34aSBram Moolenaar  endtry
986d032f34aSBram Moolenaar  assert_equal(366, n)
987d032f34aSBram Moolenaar
988d032f34aSBram Moolenaar  try
989d032f34aSBram Moolenaar    echo g:NoSuchFunc()
990d032f34aSBram Moolenaar  catch /E117:/
991d032f34aSBram Moolenaar    n = 377
992d032f34aSBram Moolenaar  endtry
993d032f34aSBram Moolenaar  assert_equal(377, n)
994d032f34aSBram Moolenaar
995d032f34aSBram Moolenaar  try
996d032f34aSBram Moolenaar    echo g:alist + 4
997d032f34aSBram Moolenaar  catch /E745:/
998d032f34aSBram Moolenaar    n = 388
999d032f34aSBram Moolenaar  endtry
1000d032f34aSBram Moolenaar  assert_equal(388, n)
1001d032f34aSBram Moolenaar
1002d032f34aSBram Moolenaar  try
1003d032f34aSBram Moolenaar    echo 4 + g:alist
1004d032f34aSBram Moolenaar  catch /E745:/
1005d032f34aSBram Moolenaar    n = 399
1006d032f34aSBram Moolenaar  endtry
1007d032f34aSBram Moolenaar  assert_equal(399, n)
1008d032f34aSBram Moolenaar
1009d032f34aSBram Moolenaar  try
1010d032f34aSBram Moolenaar    echo g:alist.member
1011d032f34aSBram Moolenaar  catch /E715:/
1012d032f34aSBram Moolenaar    n = 400
1013d032f34aSBram Moolenaar  endtry
1014d032f34aSBram Moolenaar  assert_equal(400, n)
1015d032f34aSBram Moolenaar
1016d032f34aSBram Moolenaar  try
1017d032f34aSBram Moolenaar    echo d.member
1018d032f34aSBram Moolenaar  catch /E716:/
1019d032f34aSBram Moolenaar    n = 411
1020d032f34aSBram Moolenaar  endtry
1021d032f34aSBram Moolenaar  assert_equal(411, n)
10228a7d6542SBram Moolenaarenddef
10238a7d6542SBram Moolenaar
1024e859312eSBram Moolenaardef DeletedFunc(): list<any>
1025e859312eSBram Moolenaar  return ['delete me']
1026e859312eSBram Moolenaarenddef
1027e859312eSBram Moolenaardefcompile
1028e859312eSBram Moolenaardelfunc DeletedFunc
1029e859312eSBram Moolenaar
1030257cc5eeSBram Moolenaardef ThrowFromDef()
1031a72cfb80SBram Moolenaar  throw "getout" # comment
1032257cc5eeSBram Moolenaarenddef
1033257cc5eeSBram Moolenaar
1034257cc5eeSBram Moolenaarfunc CatchInFunc()
1035257cc5eeSBram Moolenaar  try
1036257cc5eeSBram Moolenaar    call ThrowFromDef()
1037257cc5eeSBram Moolenaar  catch
1038257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
1039257cc5eeSBram Moolenaar  endtry
1040257cc5eeSBram Moolenaarendfunc
1041257cc5eeSBram Moolenaar
1042257cc5eeSBram Moolenaardef CatchInDef()
1043257cc5eeSBram Moolenaar  try
1044257cc5eeSBram Moolenaar    ThrowFromDef()
1045257cc5eeSBram Moolenaar  catch
1046257cc5eeSBram Moolenaar    g:thrown_def = v:exception
1047257cc5eeSBram Moolenaar  endtry
1048257cc5eeSBram Moolenaarenddef
1049257cc5eeSBram Moolenaar
1050f575adffSBram Moolenaardef ReturnFinally(): string
1051f575adffSBram Moolenaar  try
1052f575adffSBram Moolenaar    return 'intry'
1053f575adffSBram Moolenaar  finally
1054f575adffSBram Moolenaar    g:in_finally = 'finally'
1055f575adffSBram Moolenaar  endtry
1056f575adffSBram Moolenaar  return 'end'
1057f575adffSBram Moolenaarenddef
1058f575adffSBram Moolenaar
1059257cc5eeSBram Moolenaardef Test_try_catch_nested()
1060257cc5eeSBram Moolenaar  CatchInFunc()
1061257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
1062257cc5eeSBram Moolenaar
1063257cc5eeSBram Moolenaar  CatchInDef()
1064257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
1065f575adffSBram Moolenaar
1066f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
1067f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
1068f575adffSBram Moolenaarenddef
1069f575adffSBram Moolenaar
1070f575adffSBram Moolenaardef Test_try_catch_match()
1071f575adffSBram Moolenaar  let seq = 'a'
1072f575adffSBram Moolenaar  try
1073f575adffSBram Moolenaar    throw 'something'
1074f575adffSBram Moolenaar  catch /nothing/
1075f575adffSBram Moolenaar    seq ..= 'x'
1076f575adffSBram Moolenaar  catch /some/
1077f575adffSBram Moolenaar    seq ..= 'b'
1078f575adffSBram Moolenaar  catch /asdf/
1079f575adffSBram Moolenaar    seq ..= 'x'
1080e8c4abbbSBram Moolenaar  catch ?a\?sdf?
1081e8c4abbbSBram Moolenaar    seq ..= 'y'
1082f575adffSBram Moolenaar  finally
1083f575adffSBram Moolenaar    seq ..= 'c'
1084f575adffSBram Moolenaar  endtry
1085f575adffSBram Moolenaar  assert_equal('abc', seq)
1086257cc5eeSBram Moolenaarenddef
1087257cc5eeSBram Moolenaar
1088e8c4abbbSBram Moolenaardef Test_try_catch_fails()
1089e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
1090e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1091e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1092585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
1093585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1094585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
1095585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
1096585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1097585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
1098585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
1099585fea7bSBram Moolenaar
1100a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
1101585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
1102e8c4abbbSBram Moolenaarenddef
1103e8c4abbbSBram Moolenaar
1104006ad48bSBram Moolenaardef Test_throw_vimscript()
1105f5be8cdbSBram Moolenaar  # only checks line continuation
1106006ad48bSBram Moolenaar  let lines =<< trim END
1107006ad48bSBram Moolenaar      vim9script
1108006ad48bSBram Moolenaar      try
1109006ad48bSBram Moolenaar        throw 'one'
1110006ad48bSBram Moolenaar              .. 'two'
1111006ad48bSBram Moolenaar      catch
1112006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
1113006ad48bSBram Moolenaar      endtry
1114006ad48bSBram Moolenaar  END
1115006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
1116006ad48bSBram Moolenaarenddef
1117006ad48bSBram Moolenaar
1118ed677f55SBram Moolenaardef Test_error_in_nested_function()
1119ed677f55SBram Moolenaar  # an error in a nested :function aborts executin in the calling :def function
1120ed677f55SBram Moolenaar  let lines =<< trim END
1121ed677f55SBram Moolenaar      vim9script
1122ed677f55SBram Moolenaar      def Func()
1123ed677f55SBram Moolenaar        Error()
1124ed677f55SBram Moolenaar        g:test_var = 1
1125ed677f55SBram Moolenaar      enddef
1126ed677f55SBram Moolenaar      func Error() abort
1127ed677f55SBram Moolenaar        eval [][0]
1128ed677f55SBram Moolenaar      endfunc
1129ed677f55SBram Moolenaar      Func()
1130ed677f55SBram Moolenaar  END
1131ed677f55SBram Moolenaar  g:test_var = 0
1132ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
1133ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
1134ed677f55SBram Moolenaarenddef
1135ed677f55SBram Moolenaar
113637c83711SBram Moolenaardef Test_cexpr_vimscript()
1137f5be8cdbSBram Moolenaar  # only checks line continuation
113837c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
113937c83711SBram Moolenaar  let lines =<< trim END
114037c83711SBram Moolenaar      vim9script
114137c83711SBram Moolenaar      cexpr 'File'
114237c83711SBram Moolenaar                .. ' someFile' ..
114337c83711SBram Moolenaar                   ' line 19'
114437c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
114537c83711SBram Moolenaar  END
114637c83711SBram Moolenaar  CheckScriptSuccess(lines)
114737c83711SBram Moolenaar  set errorformat&
114837c83711SBram Moolenaarenddef
114937c83711SBram Moolenaar
1150c9edd6b5SBram Moolenaardef Test_statusline_syntax()
1151c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
1152c9edd6b5SBram Moolenaar  let lines =<< trim END
1153c9edd6b5SBram Moolenaar      vim9script
1154c9edd6b5SBram Moolenaar      func g:Status()
1155c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
1156c9edd6b5SBram Moolenaar      endfunc
1157c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
1158c9edd6b5SBram Moolenaar      redrawstatus
1159c9edd6b5SBram Moolenaar      set laststatus statusline=
1160c9edd6b5SBram Moolenaar  END
1161c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
1162c9edd6b5SBram Moolenaarenddef
1163c9edd6b5SBram Moolenaar
1164b209750bSBram Moolenaardef Test_list_vimscript()
1165b209750bSBram Moolenaar  # checks line continuation and comments
1166b209750bSBram Moolenaar  let lines =<< trim END
1167b209750bSBram Moolenaar      vim9script
1168b209750bSBram Moolenaar      let mylist = [
1169b209750bSBram Moolenaar            'one',
1170b209750bSBram Moolenaar            # comment
1171b209750bSBram Moolenaar            'two', # empty line follows
1172b209750bSBram Moolenaar
1173b209750bSBram Moolenaar            'three',
1174b209750bSBram Moolenaar            ]
1175b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
1176b209750bSBram Moolenaar  END
1177b209750bSBram Moolenaar  CheckScriptSuccess(lines)
117866250c93SBram Moolenaar
117966250c93SBram Moolenaar  # check all lines from heredoc are kept
118066250c93SBram Moolenaar  lines =<< trim END
118166250c93SBram Moolenaar      # comment 1
118266250c93SBram Moolenaar      two
118366250c93SBram Moolenaar      # comment 3
118466250c93SBram Moolenaar
118566250c93SBram Moolenaar      five
118666250c93SBram Moolenaar      # comment 6
118766250c93SBram Moolenaar  END
118866250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
1189b209750bSBram Moolenaarenddef
1190b209750bSBram Moolenaar
11912a1381c3SBram Moolenaarif has('channel')
119240ee466cSBram Moolenaar  let someJob = test_null_job()
119340ee466cSBram Moolenaar
119440ee466cSBram Moolenaar  def FuncWithError()
119540ee466cSBram Moolenaar    echomsg g:someJob
119640ee466cSBram Moolenaar  enddef
119740ee466cSBram Moolenaar
119840ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
119940ee466cSBram Moolenaar    try
120040ee466cSBram Moolenaar      call FuncWithError()
120140ee466cSBram Moolenaar    catch
120240ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
120340ee466cSBram Moolenaar    endtry
120440ee466cSBram Moolenaar  endfunc
12052a1381c3SBram Moolenaarendif
120640ee466cSBram Moolenaar
12078a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
12088a7d6542SBram Moolenaar  vim9script
12098a7d6542SBram Moolenaar  let name: string = 'bob'
12108a7d6542SBram Moolenaar  def Concat(arg: string): string
12118a7d6542SBram Moolenaar    return name .. arg
12128a7d6542SBram Moolenaar  enddef
1213227a69deSBram Moolenaar  g:result = Concat('bie')
1214227a69deSBram Moolenaar  g:localname = name
12158a7d6542SBram Moolenaar
12168a7d6542SBram Moolenaar  export const CONST = 1234
12178a7d6542SBram Moolenaar  export let exported = 9876
12186e587dcbSBram Moolenaar  export let exp_name = 'John'
12198a7d6542SBram Moolenaar  export def Exported(): string
12208a7d6542SBram Moolenaar    return 'Exported'
12218a7d6542SBram Moolenaar  enddef
12228a7d6542SBram MoolenaarEND
12238a7d6542SBram Moolenaar
1224b3ca9824SBram Moolenaardef Undo_export_script_lines()
1225b3ca9824SBram Moolenaar  unlet g:result
1226b3ca9824SBram Moolenaar  unlet g:localname
1227b3ca9824SBram Moolenaarenddef
1228b3ca9824SBram Moolenaar
12295269bd2aSBram Moolenaardef Test_vim9_import_export()
12308a7d6542SBram Moolenaar  let import_script_lines =<< trim END
12318a7d6542SBram Moolenaar    vim9script
12328a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
12338a7d6542SBram Moolenaar    g:imported = exported
12346e587dcbSBram Moolenaar    exported += 3
12356e587dcbSBram Moolenaar    g:imported_added = exported
12368a7d6542SBram Moolenaar    g:imported_func = Exported()
12376e587dcbSBram Moolenaar
123840f4f7a4SBram Moolenaar    def GetExported(): string
123940f4f7a4SBram Moolenaar      let local_dict = #{ref: Exported}
124040f4f7a4SBram Moolenaar      return local_dict.ref()
124140f4f7a4SBram Moolenaar    enddef
124240f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
124340f4f7a4SBram Moolenaar
12446e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
12456e587dcbSBram Moolenaar    g:imported_name = exp_name
12466e587dcbSBram Moolenaar    exp_name ..= ' Doe'
12476e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
12485381c7a1SBram Moolenaar    g:imported_later = exported
12498a7d6542SBram Moolenaar  END
12508a7d6542SBram Moolenaar
12518a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
12528a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
12538a7d6542SBram Moolenaar
12548a7d6542SBram Moolenaar  source Ximport.vim
12558a7d6542SBram Moolenaar
12568a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
12578a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
12588a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
12596e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
12605381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
12618a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
126240f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
12636e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
12646e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
12658a7d6542SBram Moolenaar  assert_false(exists('g:name'))
12668a7d6542SBram Moolenaar
1267b3ca9824SBram Moolenaar  Undo_export_script_lines()
12688a7d6542SBram Moolenaar  unlet g:imported
12696e587dcbSBram Moolenaar  unlet g:imported_added
12705381c7a1SBram Moolenaar  unlet g:imported_later
12718a7d6542SBram Moolenaar  unlet g:imported_func
12726e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
12738a7d6542SBram Moolenaar  delete('Ximport.vim')
1274f2d5c240SBram Moolenaar
12751c991144SBram Moolenaar  # similar, with line breaks
12761c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
12771c991144SBram Moolenaar    vim9script
12781c991144SBram Moolenaar    import {
12791c991144SBram Moolenaar        exported,
12801c991144SBram Moolenaar        Exported,
12811c991144SBram Moolenaar        }
12821c991144SBram Moolenaar        from
12831c991144SBram Moolenaar        './Xexport.vim'
12841c991144SBram Moolenaar    g:imported = exported
12851c991144SBram Moolenaar    exported += 5
12861c991144SBram Moolenaar    g:imported_added = exported
12871c991144SBram Moolenaar    g:imported_func = Exported()
12881c991144SBram Moolenaar  END
12891c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
12901c991144SBram Moolenaar  source Ximport_lbr.vim
12911c991144SBram Moolenaar
12921c991144SBram Moolenaar  assert_equal(9876, g:imported)
12931c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
12941c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
12951c991144SBram Moolenaar
12961c991144SBram Moolenaar  # exported script not sourced again
12971c991144SBram Moolenaar  assert_false(exists('g:result'))
12981c991144SBram Moolenaar  unlet g:imported
12991c991144SBram Moolenaar  unlet g:imported_added
13001c991144SBram Moolenaar  unlet g:imported_func
13011c991144SBram Moolenaar  delete('Ximport_lbr.vim')
13021c991144SBram Moolenaar
13031c991144SBram Moolenaar  # import inside :def function
13045381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
13055381c7a1SBram Moolenaar    vim9script
13065381c7a1SBram Moolenaar    def ImportInDef()
13075381c7a1SBram Moolenaar      import exported from './Xexport.vim'
13085381c7a1SBram Moolenaar      g:imported = exported
13095381c7a1SBram Moolenaar      exported += 7
13105381c7a1SBram Moolenaar      g:imported_added = exported
13115381c7a1SBram Moolenaar    enddef
13125381c7a1SBram Moolenaar    ImportInDef()
13135381c7a1SBram Moolenaar  END
13145381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
13155381c7a1SBram Moolenaar  source Ximport2.vim
1316f5be8cdbSBram Moolenaar  # TODO: this should be 9879
13175381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
13185381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
13195381c7a1SBram Moolenaar  unlet g:imported
13205381c7a1SBram Moolenaar  unlet g:imported_added
13215381c7a1SBram Moolenaar  delete('Ximport2.vim')
13225381c7a1SBram Moolenaar
1323f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
1324f2d5c240SBram Moolenaar    vim9script
1325f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1326f2d5c240SBram Moolenaar    def UseExport()
1327f2d5c240SBram Moolenaar      g:imported = Export.exported
1328f2d5c240SBram Moolenaar    enddef
1329f2d5c240SBram Moolenaar    UseExport()
1330f2d5c240SBram Moolenaar  END
1331f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1332f2d5c240SBram Moolenaar  source Ximport.vim
13335381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1334f2d5c240SBram Moolenaar
1335599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
1336599c89c8SBram Moolenaar    vim9script
1337599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1338599c89c8SBram Moolenaar    def Func()
1339599c89c8SBram Moolenaar      let dummy = 1
1340599c89c8SBram Moolenaar      let imported = Export + dummy
1341599c89c8SBram Moolenaar    enddef
1342822ba247SBram Moolenaar    defcompile
1343599c89c8SBram Moolenaar  END
1344599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
1345599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
1346599c89c8SBram Moolenaar
1347599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
1348599c89c8SBram Moolenaar    vim9script
1349599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1350599c89c8SBram Moolenaar    def Func()
1351599c89c8SBram Moolenaar      let imported = Export . exported
1352599c89c8SBram Moolenaar    enddef
1353822ba247SBram Moolenaar    defcompile
1354599c89c8SBram Moolenaar  END
1355599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
1356599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1357599c89c8SBram Moolenaar
1358599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
1359599c89c8SBram Moolenaar    vim9script
1360599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1361599c89c8SBram Moolenaar    def Func()
1362599c89c8SBram Moolenaar      let imported = Export.
1363599c89c8SBram Moolenaar    enddef
1364822ba247SBram Moolenaar    defcompile
1365599c89c8SBram Moolenaar  END
1366599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
1367599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1368599c89c8SBram Moolenaar
13691c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
13701c991144SBram Moolenaar    vim9script
13711c991144SBram Moolenaar    import *
13721c991144SBram Moolenaar        as Export
13731c991144SBram Moolenaar        from
13741c991144SBram Moolenaar        './Xexport.vim'
13751c991144SBram Moolenaar    def UseExport()
13761c991144SBram Moolenaar      g:imported = Export.exported
13771c991144SBram Moolenaar    enddef
13781c991144SBram Moolenaar    UseExport()
13791c991144SBram Moolenaar  END
13801c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
13811c991144SBram Moolenaar  source Ximport.vim
13821c991144SBram Moolenaar  assert_equal(9883, g:imported)
13831c991144SBram Moolenaar
1384f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1385f2d5c240SBram Moolenaar    vim9script
1386f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1387f2d5c240SBram Moolenaar  END
1388f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
1389f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
1390f2d5c240SBram Moolenaar
1391f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1392fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1393fa29c8abSBram Moolenaar    vim9script
1394fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1395fa29c8abSBram Moolenaar  END
1396fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
1397fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
1398fa29c8abSBram Moolenaar
1399f5be8cdbSBram Moolenaar  # try to import something that is already defined
14005269bd2aSBram Moolenaar  let import_already_defined =<< trim END
14015269bd2aSBram Moolenaar    vim9script
14025269bd2aSBram Moolenaar    let exported = 'something'
14035269bd2aSBram Moolenaar    import exported from './Xexport.vim'
14045269bd2aSBram Moolenaar  END
14055269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
14065269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
14075269bd2aSBram Moolenaar
1408f5be8cdbSBram Moolenaar  # try to import something that is already defined
14095269bd2aSBram Moolenaar  import_already_defined =<< trim END
14105269bd2aSBram Moolenaar    vim9script
14115269bd2aSBram Moolenaar    let exported = 'something'
14125269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
14135269bd2aSBram Moolenaar  END
14145269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
14155269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
14165269bd2aSBram Moolenaar
1417f5be8cdbSBram Moolenaar  # try to import something that is already defined
14185269bd2aSBram Moolenaar  import_already_defined =<< trim END
14195269bd2aSBram Moolenaar    vim9script
14205269bd2aSBram Moolenaar    let exported = 'something'
14215269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
14225269bd2aSBram Moolenaar  END
14235269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
14245269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
14255269bd2aSBram Moolenaar
1426f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1427fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1428fa29c8abSBram Moolenaar    vim9script
1429fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1430fa29c8abSBram Moolenaar  END
1431fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
1432fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1433fa29c8abSBram Moolenaar
1434fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1435fa29c8abSBram Moolenaar    vim9script
1436fa29c8abSBram Moolenaar    import name './Xexport.vim'
1437fa29c8abSBram Moolenaar  END
1438fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
1439fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
1440fa29c8abSBram Moolenaar
1441fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1442fa29c8abSBram Moolenaar    vim9script
1443fa29c8abSBram Moolenaar    import name from Xexport.vim
1444fa29c8abSBram Moolenaar  END
1445fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
1446fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
1447fa29c8abSBram Moolenaar
1448fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1449fa29c8abSBram Moolenaar    vim9script
1450fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1451fa29c8abSBram Moolenaar  END
1452fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
1453fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
1454fa29c8abSBram Moolenaar
1455fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1456fa29c8abSBram Moolenaar    vim9script
1457fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1458fa29c8abSBram Moolenaar  END
14595269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
14605269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
1461fa29c8abSBram Moolenaar
1462f2d5c240SBram Moolenaar  delete('Ximport.vim')
14635269bd2aSBram Moolenaar  delete('Ximport3.vim')
14648a7d6542SBram Moolenaar  delete('Xexport.vim')
14658a7d6542SBram Moolenaar
1466f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1467750802b5SBram Moolenaar  set cpo&vi
1468750802b5SBram Moolenaar  let cpo_before = &cpo
1469750802b5SBram Moolenaar  let lines =<< trim END
1470750802b5SBram Moolenaar    vim9script
1471750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1472750802b5SBram Moolenaar  END
1473750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1474750802b5SBram Moolenaar  source Xvim9_script
1475750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1476750802b5SBram Moolenaar  set cpo&vim
1477750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1478750802b5SBram Moolenaar  delete('Xvim9_script')
1479750802b5SBram Moolenaarenddef
1480750802b5SBram Moolenaar
1481803af686SBram Moolenaarfunc g:Trigger()
1482803af686SBram Moolenaar  source Ximport.vim
1483803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1484803af686SBram Moolenaarendfunc
1485803af686SBram Moolenaar
1486803af686SBram Moolenaardef Test_import_export_expr_map()
1487803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1488803af686SBram Moolenaar  let export_lines =<< trim END
1489803af686SBram Moolenaar    vim9script
1490803af686SBram Moolenaar    export def That(): string
1491803af686SBram Moolenaar      return 'yes'
1492803af686SBram Moolenaar    enddef
1493803af686SBram Moolenaar  END
1494803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1495803af686SBram Moolenaar
1496803af686SBram Moolenaar  let import_lines =<< trim END
1497803af686SBram Moolenaar    vim9script
1498803af686SBram Moolenaar    import That from './Xexport_that.vim'
1499803af686SBram Moolenaar    assert_equal('yes', That())
1500803af686SBram Moolenaar  END
1501803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1502803af686SBram Moolenaar
1503803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1504803af686SBram Moolenaar  feedkeys('trigger', "xt")
1505803af686SBram Moolenaar
1506730b2483SBram Moolenaar  delete('Xexport_that.vim')
1507803af686SBram Moolenaar  delete('Ximport.vim')
1508803af686SBram Moolenaar  nunmap trigger
1509803af686SBram Moolenaarenddef
1510803af686SBram Moolenaar
15118e1986e3SBram Moolenaardef Test_import_in_filetype()
15128e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
15138e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
15148e1986e3SBram Moolenaar  let export_lines =<< trim END
15158e1986e3SBram Moolenaar    vim9script
15168e1986e3SBram Moolenaar    export let That = 'yes'
15178e1986e3SBram Moolenaar  END
1518730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
15198e1986e3SBram Moolenaar
15208e1986e3SBram Moolenaar  let import_lines =<< trim END
15218e1986e3SBram Moolenaar    vim9script
1522730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
15238e1986e3SBram Moolenaar    assert_equal('yes', That)
15248e1986e3SBram Moolenaar    g:did_load_mytpe = 1
15258e1986e3SBram Moolenaar  END
15268e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
15278e1986e3SBram Moolenaar
15288e1986e3SBram Moolenaar  let save_rtp = &rtp
15298e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
15308e1986e3SBram Moolenaar
15318e1986e3SBram Moolenaar  filetype plugin on
15328e1986e3SBram Moolenaar  copen
15338e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
15348e1986e3SBram Moolenaar
15358e1986e3SBram Moolenaar  quit!
1536730b2483SBram Moolenaar  delete('Xexport_ft.vim')
15378e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
15388e1986e3SBram Moolenaar  &rtp = save_rtp
15398e1986e3SBram Moolenaarenddef
15408e1986e3SBram Moolenaar
1541efa94447SBram Moolenaardef Test_use_import_in_mapping()
1542efa94447SBram Moolenaar  let lines =<< trim END
1543efa94447SBram Moolenaar      vim9script
1544efa94447SBram Moolenaar      export def Funcx()
1545efa94447SBram Moolenaar        g:result = 42
1546efa94447SBram Moolenaar      enddef
1547efa94447SBram Moolenaar  END
1548efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1549efa94447SBram Moolenaar  lines =<< trim END
1550efa94447SBram Moolenaar      vim9script
1551efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1552b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1553efa94447SBram Moolenaar  END
1554efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1555efa94447SBram Moolenaar
1556efa94447SBram Moolenaar  source Xmapscript.vim
1557b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1558efa94447SBram Moolenaar  assert_equal(42, g:result)
1559efa94447SBram Moolenaar
1560efa94447SBram Moolenaar  unlet g:result
1561efa94447SBram Moolenaar  delete('XsomeExport.vim')
1562efa94447SBram Moolenaar  delete('Xmapscript.vim')
1563b3ca9824SBram Moolenaar  nunmap <F3>
1564efa94447SBram Moolenaarenddef
1565efa94447SBram Moolenaar
1566750802b5SBram Moolenaardef Test_vim9script_fails()
15678a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
15688a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1569750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
15709721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
15719b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1572750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1573750802b5SBram Moolenaar
1574451c2e35SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1012:')
1575c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1576c785b9a7SBram Moolenaar
1577750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
1578a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
15798a7d6542SBram Moolenaarenddef
15808a7d6542SBram Moolenaar
1581f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1582101f4810SBram Moolenaar  CheckRunVimInTerminal
1583101f4810SBram Moolenaar
15849bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1585c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
15869bb3eb3eSBram Moolenaarendfunc
15879bb3eb3eSBram Moolenaar
1588c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1589101f4810SBram Moolenaar  let export =<< trim END
1590101f4810SBram Moolenaar    vim9script
1591101f4810SBram Moolenaar    export def Foo(): number
1592101f4810SBram Moolenaar        return 0
1593101f4810SBram Moolenaar    enddef
1594101f4810SBram Moolenaar  END
1595730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1596101f4810SBram Moolenaar
1597730b2483SBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{
15989bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
15999bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1600101f4810SBram Moolenaar
1601730b2483SBram Moolenaar  delete('XexportCmd.vim')
16029bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
16039bb3eb3eSBram Moolenaarenddef
1604101f4810SBram Moolenaar
16054c17ad94SBram Moolenaardef Test_vim9script_reload_import()
16068a7d6542SBram Moolenaar  let lines =<< trim END
16078a7d6542SBram Moolenaar    vim9script
16088a7d6542SBram Moolenaar    const var = ''
16098a7d6542SBram Moolenaar    let valone = 1234
16108a7d6542SBram Moolenaar    def MyFunc(arg: string)
16118a7d6542SBram Moolenaar       valone = 5678
16128a7d6542SBram Moolenaar    enddef
16138a7d6542SBram Moolenaar  END
16148a7d6542SBram Moolenaar  let morelines =<< trim END
16158a7d6542SBram Moolenaar    let valtwo = 222
16168a7d6542SBram Moolenaar    export def GetValtwo(): number
16178a7d6542SBram Moolenaar      return valtwo
16188a7d6542SBram Moolenaar    enddef
16198a7d6542SBram Moolenaar  END
162003afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
16218a7d6542SBram Moolenaar  source Xreload.vim
16228a7d6542SBram Moolenaar  source Xreload.vim
16238a7d6542SBram Moolenaar  source Xreload.vim
16248a7d6542SBram Moolenaar
16258a7d6542SBram Moolenaar  let testlines =<< trim END
16268a7d6542SBram Moolenaar    vim9script
16278a7d6542SBram Moolenaar    def TheFunc()
16288a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
16298a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
16308a7d6542SBram Moolenaar    enddef
16318a7d6542SBram Moolenaar    TheFunc()
16328a7d6542SBram Moolenaar  END
16338a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
16348a7d6542SBram Moolenaar  source Ximport.vim
16358a7d6542SBram Moolenaar
1636f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1637f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
16388a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
16398a7d6542SBram Moolenaar  source Ximport.vim
16408a7d6542SBram Moolenaar
1641f5be8cdbSBram Moolenaar  # cannot declare a var twice
16428a7d6542SBram Moolenaar  lines =<< trim END
16438a7d6542SBram Moolenaar    vim9script
16448a7d6542SBram Moolenaar    let valone = 1234
16458a7d6542SBram Moolenaar    let valone = 5678
16468a7d6542SBram Moolenaar  END
16478a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
16488a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
16498a7d6542SBram Moolenaar
16508a7d6542SBram Moolenaar  delete('Xreload.vim')
16518a7d6542SBram Moolenaar  delete('Ximport.vim')
16528a7d6542SBram Moolenaarenddef
16538a7d6542SBram Moolenaar
1654fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1655fe465a01SBram Moolenaar" script-local name.
1656fe465a01SBram Moolenaardef Test_vim9script_funcref()
1657fe465a01SBram Moolenaar  let sortlines =<< trim END
1658fe465a01SBram Moolenaar      vim9script
1659fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1660bed36b93SBram Moolenaar        return i2 - i1
1661fe465a01SBram Moolenaar      enddef
1662fe465a01SBram Moolenaar
1663fe465a01SBram Moolenaar      export def FastSort(): list<number>
1664fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1665fe465a01SBram Moolenaar      enddef
1666fe465a01SBram Moolenaar  END
1667fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1668fe465a01SBram Moolenaar
1669fe465a01SBram Moolenaar  let lines =<< trim END
1670fe465a01SBram Moolenaar    vim9script
1671fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1672fe465a01SBram Moolenaar    def Test()
1673fe465a01SBram Moolenaar      g:result = FastSort()
1674fe465a01SBram Moolenaar    enddef
1675fe465a01SBram Moolenaar    Test()
1676fe465a01SBram Moolenaar  END
1677fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1678fe465a01SBram Moolenaar
1679fe465a01SBram Moolenaar  source Xscript.vim
1680fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1681fe465a01SBram Moolenaar
1682fe465a01SBram Moolenaar  unlet g:result
1683fe465a01SBram Moolenaar  delete('Xsort.vim')
1684fe465a01SBram Moolenaar  delete('Xscript.vim')
1685fe465a01SBram Moolenaarenddef
1686fe465a01SBram Moolenaar
1687601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1688601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1689601e76acSBram Moolenaar" function reference.
1690c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1691c620c055SBram Moolenaar  let filterLines =<< trim END
1692c620c055SBram Moolenaar    vim9script
1693c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1694c620c055SBram Moolenaar      return idx % 2 == 1
1695c620c055SBram Moolenaar    enddef
1696c620c055SBram Moolenaar    export def FastFilter(): list<number>
1697c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1698c620c055SBram Moolenaar    enddef
1699601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1700601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1701601e76acSBram Moolenaar    enddef
1702c620c055SBram Moolenaar  END
1703c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1704c620c055SBram Moolenaar
1705c620c055SBram Moolenaar  let lines =<< trim END
1706c620c055SBram Moolenaar    vim9script
1707601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1708c620c055SBram Moolenaar    def Test()
1709c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1710c620c055SBram Moolenaar    enddef
1711c620c055SBram Moolenaar    Test()
1712601e76acSBram Moolenaar    def TestDirect()
1713601e76acSBram Moolenaar      let x: list<number> = FastFilterDirect()
1714601e76acSBram Moolenaar    enddef
1715601e76acSBram Moolenaar    TestDirect()
1716c620c055SBram Moolenaar  END
1717601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1718c620c055SBram Moolenaar  delete('Xfilter.vim')
1719c620c055SBram Moolenaarenddef
1720c620c055SBram Moolenaar
17214c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
17224c17ad94SBram Moolenaar  let first_lines =<< trim END
17234c17ad94SBram Moolenaar    vim9script
17244c17ad94SBram Moolenaar    def FuncYes(): string
17254c17ad94SBram Moolenaar      return 'yes'
17264c17ad94SBram Moolenaar    enddef
17274c17ad94SBram Moolenaar  END
172803afdcf1SBram Moolenaar  let withno_lines =<< trim END
17294c17ad94SBram Moolenaar    def FuncNo(): string
17304c17ad94SBram Moolenaar      return 'no'
17314c17ad94SBram Moolenaar    enddef
17324c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
17334c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
17344c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
173503afdcf1SBram Moolenaar    enddef
173603afdcf1SBram Moolenaar  END
173703afdcf1SBram Moolenaar  let nono_lines =<< trim END
173803afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
173903afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
17404c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
17414c17ad94SBram Moolenaar    enddef
17424c17ad94SBram Moolenaar  END
17434c17ad94SBram Moolenaar
17444c17ad94SBram Moolenaar  # FuncNo() is defined
174503afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
17464c17ad94SBram Moolenaar  source Xreloaded.vim
17474c17ad94SBram Moolenaar  g:DoCheck(true)
17484c17ad94SBram Moolenaar
17494c17ad94SBram Moolenaar  # FuncNo() is not redefined
175003afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
17514c17ad94SBram Moolenaar  source Xreloaded.vim
175203afdcf1SBram Moolenaar  g:DoCheck()
17534c17ad94SBram Moolenaar
17544c17ad94SBram Moolenaar  # FuncNo() is back
175503afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
17564c17ad94SBram Moolenaar  source Xreloaded.vim
175703afdcf1SBram Moolenaar  g:DoCheck()
17584c17ad94SBram Moolenaar
17594c17ad94SBram Moolenaar  delete('Xreloaded.vim')
17604c17ad94SBram Moolenaarenddef
17614c17ad94SBram Moolenaar
176289483d40SBram Moolenaardef Test_vim9script_reload_delvar()
176389483d40SBram Moolenaar  # write the script with a script-local variable
176489483d40SBram Moolenaar  let lines =<< trim END
176589483d40SBram Moolenaar    vim9script
176689483d40SBram Moolenaar    let var = 'string'
176789483d40SBram Moolenaar  END
176889483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
176989483d40SBram Moolenaar  source XreloadVar.vim
177089483d40SBram Moolenaar
177189483d40SBram Moolenaar  # now write the script using the same variable locally - works
177289483d40SBram Moolenaar  lines =<< trim END
177389483d40SBram Moolenaar    vim9script
177489483d40SBram Moolenaar    def Func()
177589483d40SBram Moolenaar      let var = 'string'
177689483d40SBram Moolenaar    enddef
177789483d40SBram Moolenaar  END
177889483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
177989483d40SBram Moolenaar  source XreloadVar.vim
178089483d40SBram Moolenaar
178189483d40SBram Moolenaar  delete('XreloadVar.vim')
178289483d40SBram Moolenaarenddef
178389483d40SBram Moolenaar
17848a7d6542SBram Moolenaardef Test_import_absolute()
17858a7d6542SBram Moolenaar  let import_lines = [
1786e6085c53SBram Moolenaar        'vim9script',
1787e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1788e6085c53SBram Moolenaar        'def UseExported()',
1789e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1790e6085c53SBram Moolenaar        '  exported = 8888',
1791e6085c53SBram Moolenaar        '  g:imported_after = exported',
1792e6085c53SBram Moolenaar        'enddef',
1793e6085c53SBram Moolenaar        'UseExported()',
1794e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1795e6085c53SBram Moolenaar        ]
17968a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
17978a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
17988a7d6542SBram Moolenaar
17998a7d6542SBram Moolenaar  source Ximport_abs.vim
18008a7d6542SBram Moolenaar
18018a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
18024e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1803675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1804675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1805675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1806675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1807675f716eSBram Moolenaar          'exported = 8888.*' ..
1808675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1809675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1810675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1811675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1812e6085c53SBram Moolenaar        g:import_disassembled)
1813b3ca9824SBram Moolenaar
1814b3ca9824SBram Moolenaar  Undo_export_script_lines()
18158a7d6542SBram Moolenaar  unlet g:imported_abs
18164e12a5dfSBram Moolenaar  unlet g:import_disassembled
18178a7d6542SBram Moolenaar
18188a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
18198a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
18208a7d6542SBram Moolenaarenddef
18218a7d6542SBram Moolenaar
18228a7d6542SBram Moolenaardef Test_import_rtp()
18238a7d6542SBram Moolenaar  let import_lines = [
1824e6085c53SBram Moolenaar        'vim9script',
1825e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1826e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1827e6085c53SBram Moolenaar        ]
18288a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
18298a7d6542SBram Moolenaar  mkdir('import')
18308a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
18318a7d6542SBram Moolenaar
18328a7d6542SBram Moolenaar  let save_rtp = &rtp
18338a7d6542SBram Moolenaar  &rtp = getcwd()
18348a7d6542SBram Moolenaar  source Ximport_rtp.vim
18358a7d6542SBram Moolenaar  &rtp = save_rtp
18368a7d6542SBram Moolenaar
18378a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
18388a7d6542SBram Moolenaar
1839b3ca9824SBram Moolenaar  Undo_export_script_lines()
1840b3ca9824SBram Moolenaar  unlet g:imported_rtp
18418a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
184289483d40SBram Moolenaar  delete('import', 'rf')
18438a7d6542SBram Moolenaarenddef
18448a7d6542SBram Moolenaar
184525e0f586SBram Moolenaardef Test_import_compile_error()
184625e0f586SBram Moolenaar  let export_lines = [
184725e0f586SBram Moolenaar        'vim9script',
184825e0f586SBram Moolenaar        'export def ExpFunc(): string',
184925e0f586SBram Moolenaar        '  return notDefined',
185025e0f586SBram Moolenaar        'enddef',
185125e0f586SBram Moolenaar        ]
185225e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
185325e0f586SBram Moolenaar
185425e0f586SBram Moolenaar  let import_lines = [
185525e0f586SBram Moolenaar        'vim9script',
185625e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
185725e0f586SBram Moolenaar        'def ImpFunc()',
185825e0f586SBram Moolenaar        '  echo ExpFunc()',
185925e0f586SBram Moolenaar        'enddef',
186025e0f586SBram Moolenaar        'defcompile',
186125e0f586SBram Moolenaar        ]
186225e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
186325e0f586SBram Moolenaar
186425e0f586SBram Moolenaar  try
186525e0f586SBram Moolenaar    source Ximport.vim
186625e0f586SBram Moolenaar  catch /E1001/
1867f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
186825e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
186925e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
187025e0f586SBram Moolenaar  endtry
187125e0f586SBram Moolenaar
187225e0f586SBram Moolenaar  delete('Xexported.vim')
187325e0f586SBram Moolenaar  delete('Ximport.vim')
187425e0f586SBram Moolenaarenddef
187525e0f586SBram Moolenaar
1876c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1877c4ce36d4SBram Moolenaar  let lines = [
1878c4ce36d4SBram Moolenaar        'vim9script',
1879c4ce36d4SBram Moolenaar        'def Func()',
1880c4ce36d4SBram Moolenaar        '  eval [][0]',
1881c4ce36d4SBram Moolenaar        'enddef',
1882c4ce36d4SBram Moolenaar        'Func()',
1883c4ce36d4SBram Moolenaar        ]
1884c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1885c4ce36d4SBram Moolenaar
1886c4ce36d4SBram Moolenaar  for count in range(3)
1887c4ce36d4SBram Moolenaar    try
1888c4ce36d4SBram Moolenaar      source Xtestscript.vim
1889c4ce36d4SBram Moolenaar    catch /E684/
1890c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1891c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1892c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1893c4ce36d4SBram Moolenaar    endtry
1894c4ce36d4SBram Moolenaar  endfor
1895c4ce36d4SBram Moolenaar
1896c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1897c4ce36d4SBram Moolenaarenddef
1898c4ce36d4SBram Moolenaar
1899eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1900eef2102eSBram Moolenaar  let export_lines =<< trim END
1901eef2102eSBram Moolenaar      vim9script
1902eef2102eSBram Moolenaar      export def Func()
1903eef2102eSBram Moolenaar        echo 'imported'
1904eef2102eSBram Moolenaar      enddef
1905eef2102eSBram Moolenaar  END
1906eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1907eef2102eSBram Moolenaar
1908eef2102eSBram Moolenaar  let lines =<< trim END
1909eef2102eSBram Moolenaar    vim9script
1910eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1911eef2102eSBram Moolenaar    def Func()
1912eef2102eSBram Moolenaar      echo 'local to function'
1913eef2102eSBram Moolenaar    enddef
1914eef2102eSBram Moolenaar  END
1915eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1916eef2102eSBram Moolenaar
1917eef2102eSBram Moolenaar  lines =<< trim END
1918eef2102eSBram Moolenaar    vim9script
1919eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1920eef2102eSBram Moolenaar    def Outer()
1921eef2102eSBram Moolenaar      def Func()
1922eef2102eSBram Moolenaar        echo 'local to function'
1923eef2102eSBram Moolenaar      enddef
1924eef2102eSBram Moolenaar    enddef
1925eef2102eSBram Moolenaar    defcompile
1926eef2102eSBram Moolenaar  END
1927eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1928eef2102eSBram Moolenaar
1929eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1930eef2102eSBram Moolenaarenddef
1931eef2102eSBram Moolenaar
1932b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1933b9a2cac3SBram Moolenaar  let lines =<< trim END
1934b9a2cac3SBram Moolenaar    vim9script
1935b9a2cac3SBram Moolenaar    def Func()
1936b9a2cac3SBram Moolenaar      echo 'one'
1937b9a2cac3SBram Moolenaar    enddef
1938b9a2cac3SBram Moolenaar    def Func()
1939b9a2cac3SBram Moolenaar      echo 'two'
1940b9a2cac3SBram Moolenaar    enddef
1941b9a2cac3SBram Moolenaar  END
1942b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1943fa211f3cSBram Moolenaar
1944fa211f3cSBram Moolenaar  lines =<< trim END
1945fa211f3cSBram Moolenaar    vim9script
1946fa211f3cSBram Moolenaar    def Foo(): string
1947fa211f3cSBram Moolenaar      return 'foo'
1948fa211f3cSBram Moolenaar      enddef
1949fa211f3cSBram Moolenaar    def Func()
1950fa211f3cSBram Moolenaar      let  Foo = {-> 'lambda'}
1951fa211f3cSBram Moolenaar    enddef
1952fa211f3cSBram Moolenaar    defcompile
1953fa211f3cSBram Moolenaar  END
1954fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1955b9a2cac3SBram Moolenaarenddef
1956b9a2cac3SBram Moolenaar
19578a7d6542SBram Moolenaardef Test_fixed_size_list()
1958f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
19598a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
19608a7d6542SBram Moolenaar  l->remove(0)
19618a7d6542SBram Moolenaar  l->add(5)
19628a7d6542SBram Moolenaar  l->insert(99, 1)
19630f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
19648a7d6542SBram Moolenaarenddef
19658a7d6542SBram Moolenaar
1966ae616494SBram Moolenaardef Test_no_insert_xit()
1967ae616494SBram Moolenaar  call CheckDefExecFailure(['a = 1'], 'E1100:')
1968ae616494SBram Moolenaar  call CheckDefExecFailure(['c = 1'], 'E1100:')
1969f5a48010SBram Moolenaar  call CheckDefExecFailure(['i = 1'], 'E1100:')
1970f5a48010SBram Moolenaar  call CheckDefExecFailure(['t = 1'], 'E1100:')
1971f5a48010SBram Moolenaar  call CheckDefExecFailure(['x = 1'], 'E1100:')
1972ae616494SBram Moolenaar
1973ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1974ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1975ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1976ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1977f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1978f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1979f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1980f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1981f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1982ae616494SBram Moolenaarenddef
1983ae616494SBram Moolenaar
1984158906cfSBram Moolenaardef IfElse(what: number): string
1985158906cfSBram Moolenaar  let res = ''
1986158906cfSBram Moolenaar  if what == 1
1987158906cfSBram Moolenaar    res = "one"
1988158906cfSBram Moolenaar  elseif what == 2
1989158906cfSBram Moolenaar    res = "two"
1990a259d8d3SBram Moolenaar  else
1991158906cfSBram Moolenaar    res = "three"
1992a259d8d3SBram Moolenaar  endif
1993158906cfSBram Moolenaar  return res
1994a259d8d3SBram Moolenaarenddef
1995a259d8d3SBram Moolenaar
1996158906cfSBram Moolenaardef Test_if_elseif_else()
1997158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1998158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1999158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
20000f18b6d1SBram Moolenaarenddef
20010f18b6d1SBram Moolenaar
2002e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
2003e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
2004e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
2005e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
2006e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
2007585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
2008e8c4abbbSBram Moolenaarenddef
2009e8c4abbbSBram Moolenaar
20106d69bf60SBram Moolenaarlet g:bool_true = v:true
20116d69bf60SBram Moolenaarlet g:bool_false = v:false
20126d69bf60SBram Moolenaar
20136d69bf60SBram Moolenaardef Test_if_const_expr()
20146d69bf60SBram Moolenaar  let res = false
20156d69bf60SBram Moolenaar  if true ? true : false
20166d69bf60SBram Moolenaar    res = true
20176d69bf60SBram Moolenaar  endif
20186d69bf60SBram Moolenaar  assert_equal(true, res)
20196d69bf60SBram Moolenaar
2020585fea7bSBram Moolenaar  g:glob = 2
2021585fea7bSBram Moolenaar  if false
20226797966dSBram Moolenaar    execute('g:glob = 3')
2023585fea7bSBram Moolenaar  endif
2024585fea7bSBram Moolenaar  assert_equal(2, g:glob)
2025585fea7bSBram Moolenaar  if true
20266797966dSBram Moolenaar    execute('g:glob = 3')
2027585fea7bSBram Moolenaar  endif
2028585fea7bSBram Moolenaar  assert_equal(3, g:glob)
2029585fea7bSBram Moolenaar
20306d69bf60SBram Moolenaar  res = false
20316d69bf60SBram Moolenaar  if g:bool_true ? true : false
20326d69bf60SBram Moolenaar    res = true
20336d69bf60SBram Moolenaar  endif
20346d69bf60SBram Moolenaar  assert_equal(true, res)
20356d69bf60SBram Moolenaar
20366d69bf60SBram Moolenaar  res = false
20376d69bf60SBram Moolenaar  if true ? g:bool_true : false
20386d69bf60SBram Moolenaar    res = true
20396d69bf60SBram Moolenaar  endif
20406d69bf60SBram Moolenaar  assert_equal(true, res)
20416d69bf60SBram Moolenaar
20426d69bf60SBram Moolenaar  res = false
20436d69bf60SBram Moolenaar  if true ? true : g:bool_false
20446d69bf60SBram Moolenaar    res = true
20456d69bf60SBram Moolenaar  endif
20466d69bf60SBram Moolenaar  assert_equal(true, res)
20476d69bf60SBram Moolenaar
20486d69bf60SBram Moolenaar  res = false
20496d69bf60SBram Moolenaar  if true ? false : true
20506d69bf60SBram Moolenaar    res = true
20516d69bf60SBram Moolenaar  endif
20526d69bf60SBram Moolenaar  assert_equal(false, res)
20536d69bf60SBram Moolenaar
20546d69bf60SBram Moolenaar  res = false
20556d69bf60SBram Moolenaar  if false ? false : true
20566d69bf60SBram Moolenaar    res = true
20576d69bf60SBram Moolenaar  endif
20586d69bf60SBram Moolenaar  assert_equal(true, res)
20596d69bf60SBram Moolenaar
20606d69bf60SBram Moolenaar  res = false
20616d69bf60SBram Moolenaar  if false ? true : false
20626d69bf60SBram Moolenaar    res = true
20636d69bf60SBram Moolenaar  endif
20646d69bf60SBram Moolenaar  assert_equal(false, res)
20656d69bf60SBram Moolenaar
20666d69bf60SBram Moolenaar  res = false
2067e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2068e8c4abbbSBram Moolenaar    res = true
2069e8c4abbbSBram Moolenaar  endif
2070e8c4abbbSBram Moolenaar  assert_equal(false, res)
2071e8c4abbbSBram Moolenaar
2072e8c4abbbSBram Moolenaar  res = false
20736d69bf60SBram Moolenaar  if true && true
20746d69bf60SBram Moolenaar    res = true
20756d69bf60SBram Moolenaar  endif
20766d69bf60SBram Moolenaar  assert_equal(true, res)
20776d69bf60SBram Moolenaar
20786d69bf60SBram Moolenaar  res = false
20796d69bf60SBram Moolenaar  if true && false
20806d69bf60SBram Moolenaar    res = true
20816d69bf60SBram Moolenaar  endif
20826d69bf60SBram Moolenaar  assert_equal(false, res)
20836d69bf60SBram Moolenaar
20846d69bf60SBram Moolenaar  res = false
20856d69bf60SBram Moolenaar  if g:bool_true && false
20866d69bf60SBram Moolenaar    res = true
20876d69bf60SBram Moolenaar  endif
20886d69bf60SBram Moolenaar  assert_equal(false, res)
20896d69bf60SBram Moolenaar
20906d69bf60SBram Moolenaar  res = false
20916d69bf60SBram Moolenaar  if true && g:bool_false
20926d69bf60SBram Moolenaar    res = true
20936d69bf60SBram Moolenaar  endif
20946d69bf60SBram Moolenaar  assert_equal(false, res)
20956d69bf60SBram Moolenaar
20966d69bf60SBram Moolenaar  res = false
20976d69bf60SBram Moolenaar  if false && false
20986d69bf60SBram Moolenaar    res = true
20996d69bf60SBram Moolenaar  endif
21006d69bf60SBram Moolenaar  assert_equal(false, res)
21016d69bf60SBram Moolenaar
21026d69bf60SBram Moolenaar  res = false
21036d69bf60SBram Moolenaar  if true || false
21046d69bf60SBram Moolenaar    res = true
21056d69bf60SBram Moolenaar  endif
21066d69bf60SBram Moolenaar  assert_equal(true, res)
21076d69bf60SBram Moolenaar
21086d69bf60SBram Moolenaar  res = false
21096d69bf60SBram Moolenaar  if g:bool_true || false
21106d69bf60SBram Moolenaar    res = true
21116d69bf60SBram Moolenaar  endif
21126d69bf60SBram Moolenaar  assert_equal(true, res)
21136d69bf60SBram Moolenaar
21146d69bf60SBram Moolenaar  res = false
21156d69bf60SBram Moolenaar  if true || g:bool_false
21166d69bf60SBram Moolenaar    res = true
21176d69bf60SBram Moolenaar  endif
21186d69bf60SBram Moolenaar  assert_equal(true, res)
21196d69bf60SBram Moolenaar
21206d69bf60SBram Moolenaar  res = false
21216d69bf60SBram Moolenaar  if false || false
21226d69bf60SBram Moolenaar    res = true
21236d69bf60SBram Moolenaar  endif
21246d69bf60SBram Moolenaar  assert_equal(false, res)
2125*3988f64fSBram Moolenaar
2126*3988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
2127*3988f64fSBram Moolenaar  if false | eval 0 | endif
2128*3988f64fSBram Moolenaar  if false | eval burp + 234 | endif
2129*3988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
2130*3988f64fSBram Moolenaar  if false
2131*3988f64fSBram Moolenaar    burp
2132*3988f64fSBram Moolenaar  endif
213380c34ca3SBram Moolenaarenddef
21346d69bf60SBram Moolenaar
213580c34ca3SBram Moolenaardef Test_if_const_expr_fails()
213680c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
213780c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2138e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
2139e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
21406d69bf60SBram Moolenaarenddef
21416d69bf60SBram Moolenaar
214272abcf42SBram Moolenaardef RunNested(i: number): number
214372abcf42SBram Moolenaar  let x: number = 0
214472abcf42SBram Moolenaar  if i % 2
214572abcf42SBram Moolenaar    if 1
2146f5be8cdbSBram Moolenaar      # comment
214772abcf42SBram Moolenaar    else
2148f5be8cdbSBram Moolenaar      # comment
214972abcf42SBram Moolenaar    endif
215072abcf42SBram Moolenaar    x += 1
215172abcf42SBram Moolenaar  else
215272abcf42SBram Moolenaar    x += 1000
215372abcf42SBram Moolenaar  endif
215472abcf42SBram Moolenaar  return x
215572abcf42SBram Moolenaarenddef
215672abcf42SBram Moolenaar
215772abcf42SBram Moolenaardef Test_nested_if()
215872abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
215972abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
216072abcf42SBram Moolenaarenddef
216172abcf42SBram Moolenaar
2162ad39c094SBram Moolenaardef Test_execute_cmd()
2163ad39c094SBram Moolenaar  new
2164ad39c094SBram Moolenaar  setline(1, 'default')
2165ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
2166ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2167a72cfb80SBram Moolenaar
2168a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
2169a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2170a72cfb80SBram Moolenaar
2171ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
2172ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
2173a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2174ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2175a72cfb80SBram Moolenaar
2176ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
2177ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2178a72cfb80SBram Moolenaar
2179ad39c094SBram Moolenaar  let cmd_first = 'call '
2180ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
2181ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2182ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2183ad39c094SBram Moolenaar  bwipe!
2184585fea7bSBram Moolenaar
21852d6b20d6SBram Moolenaar  let n = true
21862d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
21872d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
21882d6b20d6SBram Moolenaar
2189e5abf7afSBram Moolenaar  echomsg [1, 2, 3] #{a: 1, b: 2}
2190e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2191e5abf7afSBram Moolenaar
2192430deb19SBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:', 1)
2193430deb19SBram Moolenaar  call CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2194430deb19SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2195ad39c094SBram Moolenaarenddef
2196ad39c094SBram Moolenaar
219747e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2198f5be8cdbSBram Moolenaar  # only checks line continuation
219947e880d6SBram Moolenaar  let lines =<< trim END
220047e880d6SBram Moolenaar      vim9script
220147e880d6SBram Moolenaar      execute 'g:someVar'
220247e880d6SBram Moolenaar                .. ' = ' ..
220347e880d6SBram Moolenaar                   '28'
220447e880d6SBram Moolenaar      assert_equal(28, g:someVar)
220547e880d6SBram Moolenaar      unlet g:someVar
220647e880d6SBram Moolenaar  END
220747e880d6SBram Moolenaar  CheckScriptSuccess(lines)
220847e880d6SBram Moolenaarenddef
220947e880d6SBram Moolenaar
2210ad39c094SBram Moolenaardef Test_echo_cmd()
2211a72cfb80SBram Moolenaar  echo 'some' # comment
2212585fea7bSBram Moolenaar  echon 'thing'
2213ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2214ad39c094SBram Moolenaar
2215a72cfb80SBram Moolenaar  echo "some" # comment
2216a72cfb80SBram Moolenaar  echon "thing"
2217a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2218a72cfb80SBram Moolenaar
2219ad39c094SBram Moolenaar  let str1 = 'some'
2220ad39c094SBram Moolenaar  let str2 = 'more'
2221ad39c094SBram Moolenaar  echo str1 str2
2222ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2223a72cfb80SBram Moolenaar
2224a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2225ad39c094SBram Moolenaarenddef
2226ad39c094SBram Moolenaar
2227f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2228f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2229f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2230f93c7feaSBram Moolenaar  echo 'clear'
2231df069eecSBram Moolenaar  :1messages
2232f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2233f93c7feaSBram Moolenaar
2234f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2235f93c7feaSBram Moolenaarenddef
2236f93c7feaSBram Moolenaar
223747e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2238f5be8cdbSBram Moolenaar  # only checks line continuation
223947e880d6SBram Moolenaar  let lines =<< trim END
224047e880d6SBram Moolenaar      vim9script
224147e880d6SBram Moolenaar      echomsg 'here'
224247e880d6SBram Moolenaar                .. ' is ' ..
224347e880d6SBram Moolenaar                   'a message'
224447e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
224547e880d6SBram Moolenaar  END
224647e880d6SBram Moolenaar  CheckScriptSuccess(lines)
224747e880d6SBram Moolenaarenddef
224847e880d6SBram Moolenaar
2249f93c7feaSBram Moolenaardef Test_echoerr_cmd()
225040ee466cSBram Moolenaar  try
225140ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
225240ee466cSBram Moolenaar  catch
225340ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
225440ee466cSBram Moolenaar  endtry
2255f93c7feaSBram Moolenaarenddef
2256f93c7feaSBram Moolenaar
225747e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2258f5be8cdbSBram Moolenaar  # only checks line continuation
225947e880d6SBram Moolenaar  let lines =<< trim END
226047e880d6SBram Moolenaar      vim9script
226147e880d6SBram Moolenaar      try
226247e880d6SBram Moolenaar        echoerr 'this'
226347e880d6SBram Moolenaar                .. ' is ' ..
226447e880d6SBram Moolenaar                   'wrong'
226547e880d6SBram Moolenaar      catch
226647e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
226747e880d6SBram Moolenaar      endtry
226847e880d6SBram Moolenaar  END
226947e880d6SBram Moolenaar  CheckScriptSuccess(lines)
227047e880d6SBram Moolenaarenddef
227147e880d6SBram Moolenaar
227241fe0617SBram Moolenaardef Test_for_outside_of_function()
227341fe0617SBram Moolenaar  let lines =<< trim END
227441fe0617SBram Moolenaar    vim9script
227541fe0617SBram Moolenaar    new
227641fe0617SBram Moolenaar    for var in range(0, 3)
227741fe0617SBram Moolenaar      append(line('$'), var)
227841fe0617SBram Moolenaar    endfor
227941fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
228041fe0617SBram Moolenaar    bwipe!
228141fe0617SBram Moolenaar  END
228241fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
228341fe0617SBram Moolenaar  source Xvim9for.vim
228441fe0617SBram Moolenaar  delete('Xvim9for.vim')
228541fe0617SBram Moolenaarenddef
22868a7d6542SBram Moolenaar
2287e8c4abbbSBram Moolenaardef Test_for_loop()
2288e8c4abbbSBram Moolenaar  let result = ''
2289e8c4abbbSBram Moolenaar  for cnt in range(7)
2290e8c4abbbSBram Moolenaar    if cnt == 4
2291e8c4abbbSBram Moolenaar      break
2292e8c4abbbSBram Moolenaar    endif
2293e8c4abbbSBram Moolenaar    if cnt == 2
2294e8c4abbbSBram Moolenaar      continue
2295e8c4abbbSBram Moolenaar    endif
2296e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2297e8c4abbbSBram Moolenaar  endfor
2298e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
22990ad3e894SBram Moolenaar
23000ad3e894SBram Moolenaar  let concat = ''
23010ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
23020ad3e894SBram Moolenaar    concat ..= str
23030ad3e894SBram Moolenaar  endfor
23040ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
2305e8c4abbbSBram Moolenaarenddef
2306e8c4abbbSBram Moolenaar
2307e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2308675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2309675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2310451c2e35SBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1017:')
2311822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
2312451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
2313675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2314675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2315675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2316e8c4abbbSBram Moolenaarenddef
2317e8c4abbbSBram Moolenaar
2318d0df1aacSBram Moolenaardef Test_while_loop()
2319d0df1aacSBram Moolenaar  let result = ''
2320d0df1aacSBram Moolenaar  let cnt = 0
2321d0df1aacSBram Moolenaar  while cnt < 555
2322d0df1aacSBram Moolenaar    if cnt == 3
2323d0df1aacSBram Moolenaar      break
2324d0df1aacSBram Moolenaar    endif
2325d0df1aacSBram Moolenaar    cnt += 1
2326d0df1aacSBram Moolenaar    if cnt == 2
2327d0df1aacSBram Moolenaar      continue
2328d0df1aacSBram Moolenaar    endif
2329d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2330d0df1aacSBram Moolenaar  endwhile
2331d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2332d0df1aacSBram Moolenaarenddef
2333d0df1aacSBram Moolenaar
2334e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2335675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2336675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2337675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2338675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2339675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2340675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2341675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
2342bd5da371SBram Moolenaarenddef
2343bd5da371SBram Moolenaar
23449645e2d9SBram Moolenaardef Test_interrupt_loop()
234597acfc78SBram Moolenaar  let caught = false
23469645e2d9SBram Moolenaar  let x = 0
234797acfc78SBram Moolenaar  try
23489645e2d9SBram Moolenaar    while 1
23499645e2d9SBram Moolenaar      x += 1
23509645e2d9SBram Moolenaar      if x == 100
23519645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
23529645e2d9SBram Moolenaar      endif
23539645e2d9SBram Moolenaar    endwhile
235497acfc78SBram Moolenaar  catch
235597acfc78SBram Moolenaar    caught = true
235697acfc78SBram Moolenaar    assert_equal(100, x)
235797acfc78SBram Moolenaar  endtry
235897acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
23599645e2d9SBram Moolenaarenddef
236020431c9dSBram Moolenaar
23614fdae999SBram Moolenaardef Test_automatic_line_continuation()
23624fdae999SBram Moolenaar  let mylist = [
23634fdae999SBram Moolenaar      'one',
23644fdae999SBram Moolenaar      'two',
23654fdae999SBram Moolenaar      'three',
2366f5be8cdbSBram Moolenaar      ] # comment
23674fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
23684fdae999SBram Moolenaar
23694fdae999SBram Moolenaar  let mydict = {
23704fdae999SBram Moolenaar      'one': 1,
23714fdae999SBram Moolenaar      'two': 2,
23724fdae999SBram Moolenaar      'three':
23734fdae999SBram Moolenaar          3,
2374f5be8cdbSBram Moolenaar      } # comment
23754fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
23764fdae999SBram Moolenaar  mydict = #{
23772c330432SBram Moolenaar      one: 1,  # comment
23782c330432SBram Moolenaar      two:     # comment
23792c330432SBram Moolenaar           2,  # comment
23802c330432SBram Moolenaar      three: 3 # comment
23812c330432SBram Moolenaar      }
23822c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
23832c330432SBram Moolenaar  mydict = #{
23842c330432SBram Moolenaar      one: 1,
23854fdae999SBram Moolenaar      two:
23864fdae999SBram Moolenaar           2,
23872c330432SBram Moolenaar      three: 3
23884fdae999SBram Moolenaar      }
23894fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
2390e6085c53SBram Moolenaar
2391e6085c53SBram Moolenaar  assert_equal(
2392e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2393e6085c53SBram Moolenaar        split('one two three')
2394e6085c53SBram Moolenaar        )
23954fdae999SBram Moolenaarenddef
23964fdae999SBram Moolenaar
23977a092245SBram Moolenaardef Test_vim9_comment()
23987a092245SBram Moolenaar  CheckScriptSuccess([
23997a092245SBram Moolenaar      'vim9script',
24007a092245SBram Moolenaar      '# something',
24017a092245SBram Moolenaar      ])
24027a092245SBram Moolenaar  CheckScriptFailure([
24037a092245SBram Moolenaar      'vim9script',
24047a092245SBram Moolenaar      ':# something',
24057a092245SBram Moolenaar      ], 'E488:')
24067a092245SBram Moolenaar  CheckScriptFailure([
24077a092245SBram Moolenaar      '# something',
24087a092245SBram Moolenaar      ], 'E488:')
24097a092245SBram Moolenaar  CheckScriptFailure([
24107a092245SBram Moolenaar      ':# something',
24117a092245SBram Moolenaar      ], 'E488:')
24127a092245SBram Moolenaar
24134a8d9f2eSBram Moolenaar  { # block start
24144a8d9f2eSBram Moolenaar  } # block end
24154a8d9f2eSBram Moolenaar  CheckDefFailure([
24164a8d9f2eSBram Moolenaar      '{# comment',
24174a8d9f2eSBram Moolenaar      ], 'E488:')
24184a8d9f2eSBram Moolenaar  CheckDefFailure([
24194a8d9f2eSBram Moolenaar      '{',
24204a8d9f2eSBram Moolenaar      '}# comment',
24214a8d9f2eSBram Moolenaar      ], 'E488:')
24224a8d9f2eSBram Moolenaar
24234a8d9f2eSBram Moolenaar  echo "yes" # comment
24244a8d9f2eSBram Moolenaar  CheckDefFailure([
24254a8d9f2eSBram Moolenaar      'echo "yes"# comment',
24264a8d9f2eSBram Moolenaar      ], 'E488:')
24277a092245SBram Moolenaar  CheckScriptSuccess([
24287a092245SBram Moolenaar      'vim9script',
24297a092245SBram Moolenaar      'echo "yes" # something',
24307a092245SBram Moolenaar      ])
24317a092245SBram Moolenaar  CheckScriptFailure([
24327a092245SBram Moolenaar      'vim9script',
24337a092245SBram Moolenaar      'echo "yes"# something',
24347a092245SBram Moolenaar      ], 'E121:')
24357a092245SBram Moolenaar  CheckScriptFailure([
24367a092245SBram Moolenaar      'vim9script',
24377a092245SBram Moolenaar      'echo# something',
24387a092245SBram Moolenaar      ], 'E121:')
24397a092245SBram Moolenaar  CheckScriptFailure([
24407a092245SBram Moolenaar      'echo "yes" # something',
24417a092245SBram Moolenaar      ], 'E121:')
24427a092245SBram Moolenaar
24434a8d9f2eSBram Moolenaar  exe "echo" # comment
24444a8d9f2eSBram Moolenaar  CheckDefFailure([
24454a8d9f2eSBram Moolenaar      'exe "echo"# comment',
24464a8d9f2eSBram Moolenaar      ], 'E488:')
24474a8d9f2eSBram Moolenaar  CheckScriptSuccess([
24484a8d9f2eSBram Moolenaar      'vim9script',
24494a8d9f2eSBram Moolenaar      'exe "echo" # something',
24504a8d9f2eSBram Moolenaar      ])
24514a8d9f2eSBram Moolenaar  CheckScriptFailure([
24524a8d9f2eSBram Moolenaar      'vim9script',
24534a8d9f2eSBram Moolenaar      'exe "echo"# something',
24544a8d9f2eSBram Moolenaar      ], 'E121:')
24554a8d9f2eSBram Moolenaar  CheckDefFailure([
24564a8d9f2eSBram Moolenaar      'exe # comment',
24574a8d9f2eSBram Moolenaar      ], 'E1015:')
24584a8d9f2eSBram Moolenaar  CheckScriptFailure([
24594a8d9f2eSBram Moolenaar      'vim9script',
24604a8d9f2eSBram Moolenaar      'exe# something',
24614a8d9f2eSBram Moolenaar      ], 'E121:')
24624a8d9f2eSBram Moolenaar  CheckScriptFailure([
24634a8d9f2eSBram Moolenaar      'exe "echo" # something',
24644a8d9f2eSBram Moolenaar      ], 'E121:')
24654a8d9f2eSBram Moolenaar
24667a092245SBram Moolenaar  CheckDefFailure([
24677a092245SBram Moolenaar      'try# comment',
24687a092245SBram Moolenaar      '  echo "yes"',
24697a092245SBram Moolenaar      'catch',
24707a092245SBram Moolenaar      'endtry',
24717a092245SBram Moolenaar      ], 'E488:')
24722c5ed4e3SBram Moolenaar  CheckScriptFailure([
24732c5ed4e3SBram Moolenaar      'vim9script',
24742c5ed4e3SBram Moolenaar      'try# comment',
24752c5ed4e3SBram Moolenaar      'echo "yes"',
24762c5ed4e3SBram Moolenaar      ], 'E488:')
24777a092245SBram Moolenaar  CheckDefFailure([
24787a092245SBram Moolenaar      'try',
2479a72cfb80SBram Moolenaar      '  throw#comment',
2480a72cfb80SBram Moolenaar      'catch',
2481a72cfb80SBram Moolenaar      'endtry',
2482a72cfb80SBram Moolenaar      ], 'E1015:')
2483a72cfb80SBram Moolenaar  CheckDefFailure([
2484a72cfb80SBram Moolenaar      'try',
2485a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2486a72cfb80SBram Moolenaar      'catch',
2487a72cfb80SBram Moolenaar      'endtry',
2488a72cfb80SBram Moolenaar      ], 'E488:')
2489a72cfb80SBram Moolenaar  CheckDefFailure([
2490a72cfb80SBram Moolenaar      'try',
24917a092245SBram Moolenaar      '  echo "yes"',
24927a092245SBram Moolenaar      'catch# comment',
24937a092245SBram Moolenaar      'endtry',
24947a092245SBram Moolenaar      ], 'E488:')
24952c5ed4e3SBram Moolenaar  CheckScriptFailure([
24962c5ed4e3SBram Moolenaar      'vim9script',
24972c5ed4e3SBram Moolenaar      'try',
24982c5ed4e3SBram Moolenaar      '  echo "yes"',
24992c5ed4e3SBram Moolenaar      'catch# comment',
25002c5ed4e3SBram Moolenaar      'endtry',
25012c5ed4e3SBram Moolenaar      ], 'E654:')
25022c5ed4e3SBram Moolenaar  CheckDefFailure([
25032c5ed4e3SBram Moolenaar      'try',
25042c5ed4e3SBram Moolenaar      '  echo "yes"',
25052c5ed4e3SBram Moolenaar      'catch /pat/# comment',
25062c5ed4e3SBram Moolenaar      'endtry',
25072c5ed4e3SBram Moolenaar      ], 'E488:')
25087a092245SBram Moolenaar  CheckDefFailure([
25097a092245SBram Moolenaar      'try',
25107a092245SBram Moolenaar      'echo "yes"',
25117a092245SBram Moolenaar      'catch',
25127a092245SBram Moolenaar      'endtry# comment',
25137a092245SBram Moolenaar      ], 'E488:')
25142c5ed4e3SBram Moolenaar  CheckScriptFailure([
25152c5ed4e3SBram Moolenaar      'vim9script',
25162c5ed4e3SBram Moolenaar      'try',
25172c5ed4e3SBram Moolenaar      '  echo "yes"',
25182c5ed4e3SBram Moolenaar      'catch',
25192c5ed4e3SBram Moolenaar      'endtry# comment',
25209b7bf9e9SBram Moolenaar      ], 'E488:')
25212c5ed4e3SBram Moolenaar
25222c5ed4e3SBram Moolenaar  CheckScriptSuccess([
25232c5ed4e3SBram Moolenaar      'vim9script',
25242c5ed4e3SBram Moolenaar      'hi # comment',
25252c5ed4e3SBram Moolenaar      ])
25262c5ed4e3SBram Moolenaar  CheckScriptFailure([
25272c5ed4e3SBram Moolenaar      'vim9script',
25282c5ed4e3SBram Moolenaar      'hi# comment',
25292c5ed4e3SBram Moolenaar      ], 'E416:')
25301966c248SBram Moolenaar  CheckScriptSuccess([
25311966c248SBram Moolenaar      'vim9script',
25321966c248SBram Moolenaar      'hi Search # comment',
25331966c248SBram Moolenaar      ])
25341966c248SBram Moolenaar  CheckScriptFailure([
25351966c248SBram Moolenaar      'vim9script',
25361966c248SBram Moolenaar      'hi Search# comment',
25371966c248SBram Moolenaar      ], 'E416:')
25381966c248SBram Moolenaar  CheckScriptSuccess([
25391966c248SBram Moolenaar      'vim9script',
25401966c248SBram Moolenaar      'hi link This Search # comment',
25411966c248SBram Moolenaar      ])
25421966c248SBram Moolenaar  CheckScriptFailure([
25431966c248SBram Moolenaar      'vim9script',
25441966c248SBram Moolenaar      'hi link This That# comment',
25451966c248SBram Moolenaar      ], 'E413:')
25461966c248SBram Moolenaar  CheckScriptSuccess([
25471966c248SBram Moolenaar      'vim9script',
25481966c248SBram Moolenaar      'hi clear This # comment',
25491966c248SBram Moolenaar      'hi clear # comment',
25501966c248SBram Moolenaar      ])
2551f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2552f5be8cdbSBram Moolenaar  # hi clear This# comment',
25531966c248SBram Moolenaar  CheckScriptFailure([
25541966c248SBram Moolenaar      'vim9script',
25551966c248SBram Moolenaar      'hi clear# comment',
25561966c248SBram Moolenaar      ], 'E416:')
25571966c248SBram Moolenaar
25581966c248SBram Moolenaar  CheckScriptSuccess([
25591966c248SBram Moolenaar      'vim9script',
25601966c248SBram Moolenaar      'hi Group term=bold',
25611966c248SBram Moolenaar      'match Group /todo/ # comment',
25621966c248SBram Moolenaar      ])
25631966c248SBram Moolenaar  CheckScriptFailure([
25641966c248SBram Moolenaar      'vim9script',
25651966c248SBram Moolenaar      'hi Group term=bold',
25661966c248SBram Moolenaar      'match Group /todo/# comment',
25671966c248SBram Moolenaar      ], 'E488:')
25681966c248SBram Moolenaar  CheckScriptSuccess([
25691966c248SBram Moolenaar      'vim9script',
25701966c248SBram Moolenaar      'match # comment',
25711966c248SBram Moolenaar      ])
25721966c248SBram Moolenaar  CheckScriptFailure([
25731966c248SBram Moolenaar      'vim9script',
25741966c248SBram Moolenaar      'match# comment',
25751966c248SBram Moolenaar      ], 'E475:')
25761966c248SBram Moolenaar  CheckScriptSuccess([
25771966c248SBram Moolenaar      'vim9script',
25781966c248SBram Moolenaar      'match none # comment',
25791966c248SBram Moolenaar      ])
25801966c248SBram Moolenaar  CheckScriptFailure([
25811966c248SBram Moolenaar      'vim9script',
25821966c248SBram Moolenaar      'match none# comment',
25831966c248SBram Moolenaar      ], 'E475:')
25841966c248SBram Moolenaar
25851966c248SBram Moolenaar  CheckScriptSuccess([
25861966c248SBram Moolenaar      'vim9script',
25871966c248SBram Moolenaar      'menutrans clear # comment',
25881966c248SBram Moolenaar      ])
25891966c248SBram Moolenaar  CheckScriptFailure([
25901966c248SBram Moolenaar      'vim9script',
25911966c248SBram Moolenaar      'menutrans clear# comment text',
25921966c248SBram Moolenaar      ], 'E474:')
25931966c248SBram Moolenaar
25941966c248SBram Moolenaar  CheckScriptSuccess([
25951966c248SBram Moolenaar      'vim9script',
25961966c248SBram Moolenaar      'syntax clear # comment',
25971966c248SBram Moolenaar      ])
25981966c248SBram Moolenaar  CheckScriptFailure([
25991966c248SBram Moolenaar      'vim9script',
26001966c248SBram Moolenaar      'syntax clear# comment text',
26011966c248SBram Moolenaar      ], 'E28:')
26021966c248SBram Moolenaar  CheckScriptSuccess([
26031966c248SBram Moolenaar      'vim9script',
26041966c248SBram Moolenaar      'syntax keyword Word some',
26051966c248SBram Moolenaar      'syntax clear Word # comment',
26061966c248SBram Moolenaar      ])
26071966c248SBram Moolenaar  CheckScriptFailure([
26081966c248SBram Moolenaar      'vim9script',
26091966c248SBram Moolenaar      'syntax keyword Word some',
26101966c248SBram Moolenaar      'syntax clear Word# comment text',
26111966c248SBram Moolenaar      ], 'E28:')
26121966c248SBram Moolenaar
26131966c248SBram Moolenaar  CheckScriptSuccess([
26141966c248SBram Moolenaar      'vim9script',
26151966c248SBram Moolenaar      'syntax list # comment',
26161966c248SBram Moolenaar      ])
26171966c248SBram Moolenaar  CheckScriptFailure([
26181966c248SBram Moolenaar      'vim9script',
26191966c248SBram Moolenaar      'syntax list# comment text',
26201966c248SBram Moolenaar      ], 'E28:')
26211966c248SBram Moolenaar
26221966c248SBram Moolenaar  CheckScriptSuccess([
26231966c248SBram Moolenaar      'vim9script',
26241966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
26251966c248SBram Moolenaar      ])
26261966c248SBram Moolenaar  CheckScriptFailure([
26271966c248SBram Moolenaar      'vim9script',
26281966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
26291966c248SBram Moolenaar      ], 'E475:')
26301966c248SBram Moolenaar
26311966c248SBram Moolenaar  CheckScriptSuccess([
26321966c248SBram Moolenaar      'vim9script',
26331966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
26341966c248SBram Moolenaar      ])
26351966c248SBram Moolenaar  CheckScriptFailure([
26361966c248SBram Moolenaar      'vim9script',
26371966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
26381966c248SBram Moolenaar      ], 'E789:')
26391966c248SBram Moolenaar
26401966c248SBram Moolenaar  CheckScriptSuccess([
26411966c248SBram Moolenaar      'vim9script',
26421966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
26431966c248SBram Moolenaar      ])
26441966c248SBram Moolenaar  CheckScriptFailure([
26451966c248SBram Moolenaar      'vim9script',
26461966c248SBram Moolenaar      'syntax match Word /pat/# comment',
26471966c248SBram Moolenaar      ], 'E402:')
26481966c248SBram Moolenaar
26491966c248SBram Moolenaar  CheckScriptSuccess([
26501966c248SBram Moolenaar      'vim9script',
26511966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
26521966c248SBram Moolenaar      ])
26531966c248SBram Moolenaar  CheckScriptFailure([
26541966c248SBram Moolenaar      'vim9script',
26551966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
26561966c248SBram Moolenaar      ], 'E475:')
26571966c248SBram Moolenaar  CheckScriptFailure([
26581966c248SBram Moolenaar      'vim9script',
26591966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
26601966c248SBram Moolenaar      ], 'E406:')
26611966c248SBram Moolenaar  CheckScriptFailure([
26621966c248SBram Moolenaar      'vim9script',
26631966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
26641966c248SBram Moolenaar      ], 'E475:')
26651966c248SBram Moolenaar
26661966c248SBram Moolenaar  CheckScriptSuccess([
26671966c248SBram Moolenaar      'vim9script',
26681966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
26691966c248SBram Moolenaar      ])
26701966c248SBram Moolenaar  CheckScriptFailure([
26711966c248SBram Moolenaar      'vim9script',
26721966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2673d032f34aSBram Moolenaar      ], 'E402:')
26741966c248SBram Moolenaar
26751966c248SBram Moolenaar  CheckScriptSuccess([
26761966c248SBram Moolenaar      'vim9script',
26771966c248SBram Moolenaar      'syntax sync # comment',
26781966c248SBram Moolenaar      ])
26791966c248SBram Moolenaar  CheckScriptFailure([
26801966c248SBram Moolenaar      'vim9script',
26811966c248SBram Moolenaar      'syntax sync# comment',
26821966c248SBram Moolenaar      ], 'E404:')
26831966c248SBram Moolenaar  CheckScriptSuccess([
26841966c248SBram Moolenaar      'vim9script',
26851966c248SBram Moolenaar      'syntax sync ccomment # comment',
26861966c248SBram Moolenaar      ])
26871966c248SBram Moolenaar  CheckScriptFailure([
26881966c248SBram Moolenaar      'vim9script',
26891966c248SBram Moolenaar      'syntax sync ccomment# comment',
26901966c248SBram Moolenaar      ], 'E404:')
26911966c248SBram Moolenaar
26921966c248SBram Moolenaar  CheckScriptSuccess([
26931966c248SBram Moolenaar      'vim9script',
26941966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
26951966c248SBram Moolenaar      ])
26961966c248SBram Moolenaar  CheckScriptFailure([
26971966c248SBram Moolenaar      'vim9script',
26981966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
26991966c248SBram Moolenaar      ], 'E475:')
2700a72cfb80SBram Moolenaar
2701a72cfb80SBram Moolenaar  CheckScriptSuccess([
2702a72cfb80SBram Moolenaar      'vim9script',
2703a72cfb80SBram Moolenaar      'command Echo echo # comment',
2704a72cfb80SBram Moolenaar      'command Echo # comment',
2705a72cfb80SBram Moolenaar      ])
2706a72cfb80SBram Moolenaar  CheckScriptFailure([
2707a72cfb80SBram Moolenaar      'vim9script',
2708a72cfb80SBram Moolenaar      'command Echo echo# comment',
2709a72cfb80SBram Moolenaar      'Echo',
2710a72cfb80SBram Moolenaar      ], 'E121:')
2711a72cfb80SBram Moolenaar  CheckScriptFailure([
2712a72cfb80SBram Moolenaar      'vim9script',
2713a72cfb80SBram Moolenaar      'command Echo# comment',
2714a72cfb80SBram Moolenaar      ], 'E182:')
2715a72cfb80SBram Moolenaar  CheckScriptFailure([
2716a72cfb80SBram Moolenaar      'vim9script',
2717a72cfb80SBram Moolenaar      'command Echo echo',
2718a72cfb80SBram Moolenaar      'command Echo# comment',
2719a72cfb80SBram Moolenaar      ], 'E182:')
2720a72cfb80SBram Moolenaar
2721a72cfb80SBram Moolenaar  CheckScriptSuccess([
2722a72cfb80SBram Moolenaar      'vim9script',
2723a72cfb80SBram Moolenaar      'function # comment',
2724a72cfb80SBram Moolenaar      ])
2725a72cfb80SBram Moolenaar  CheckScriptFailure([
2726a72cfb80SBram Moolenaar      'vim9script',
27279898107fSBram Moolenaar      'function " comment',
27289898107fSBram Moolenaar      ], 'E129:')
27299898107fSBram Moolenaar  CheckScriptFailure([
27309898107fSBram Moolenaar      'vim9script',
2731a72cfb80SBram Moolenaar      'function# comment',
2732a72cfb80SBram Moolenaar      ], 'E129:')
2733a72cfb80SBram Moolenaar  CheckScriptSuccess([
2734a72cfb80SBram Moolenaar      'vim9script',
2735a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2736a72cfb80SBram Moolenaar      ])
2737a72cfb80SBram Moolenaar  CheckScriptFailure([
2738a72cfb80SBram Moolenaar      'vim9script',
2739a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2740a72cfb80SBram Moolenaar      ], 'E488:')
2741a72cfb80SBram Moolenaar
2742a72cfb80SBram Moolenaar  CheckScriptSuccess([
2743a72cfb80SBram Moolenaar      'vim9script',
27444c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2745a72cfb80SBram Moolenaar      'endfunc',
27464c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2747a72cfb80SBram Moolenaar      ])
2748a72cfb80SBram Moolenaar  CheckScriptFailure([
2749a72cfb80SBram Moolenaar      'vim9script',
27504c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2751a72cfb80SBram Moolenaar      'endfunc',
27524c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2753a72cfb80SBram Moolenaar      ], 'E488:')
2754a72cfb80SBram Moolenaar
2755a72cfb80SBram Moolenaar  CheckScriptSuccess([
2756a72cfb80SBram Moolenaar      'vim9script',
2757a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2758a72cfb80SBram Moolenaar      ])
2759a72cfb80SBram Moolenaar  CheckScriptFailure([
2760a72cfb80SBram Moolenaar      'vim9script',
2761a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2762a72cfb80SBram Moolenaar      ], 'E488:')
2763e7e4838fSBram Moolenaar
2764e7e4838fSBram Moolenaar  CheckScriptFailure([
2765e7e4838fSBram Moolenaar      'def Test() " comment',
2766e7e4838fSBram Moolenaar      'enddef',
2767e7e4838fSBram Moolenaar      ], 'E488:')
2768e7e4838fSBram Moolenaar  CheckScriptFailure([
2769e7e4838fSBram Moolenaar      'vim9script',
2770e7e4838fSBram Moolenaar      'def Test() " comment',
2771e7e4838fSBram Moolenaar      'enddef',
2772e7e4838fSBram Moolenaar      ], 'E488:')
2773e7e4838fSBram Moolenaar
2774e7e4838fSBram Moolenaar  CheckScriptSuccess([
2775e7e4838fSBram Moolenaar      'func Test() " comment',
2776e7e4838fSBram Moolenaar      'endfunc',
2777e7e4838fSBram Moolenaar      ])
27789898107fSBram Moolenaar  CheckScriptSuccess([
2779e7e4838fSBram Moolenaar      'vim9script',
2780e7e4838fSBram Moolenaar      'func Test() " comment',
2781e7e4838fSBram Moolenaar      'endfunc',
27829898107fSBram Moolenaar      ])
2783e7e4838fSBram Moolenaar
2784e7e4838fSBram Moolenaar  CheckScriptSuccess([
2785e7e4838fSBram Moolenaar      'def Test() # comment',
2786e7e4838fSBram Moolenaar      'enddef',
2787e7e4838fSBram Moolenaar      ])
2788e7e4838fSBram Moolenaar  CheckScriptFailure([
2789e7e4838fSBram Moolenaar      'func Test() # comment',
2790e7e4838fSBram Moolenaar      'endfunc',
2791e7e4838fSBram Moolenaar      ], 'E488:')
27922c5ed4e3SBram Moolenaarenddef
27932c5ed4e3SBram Moolenaar
27942c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
27952c5ed4e3SBram Moolenaar  CheckCanRunGui
27962c5ed4e3SBram Moolenaar
27972c5ed4e3SBram Moolenaar  CheckScriptFailure([
27982c5ed4e3SBram Moolenaar      'vim9script',
27992c5ed4e3SBram Moolenaar      'gui#comment'
28002c5ed4e3SBram Moolenaar      ], 'E499:')
28012c5ed4e3SBram Moolenaar  CheckScriptFailure([
28022c5ed4e3SBram Moolenaar      'vim9script',
28032c5ed4e3SBram Moolenaar      'gui -f#comment'
28042c5ed4e3SBram Moolenaar      ], 'E499:')
28057a092245SBram Moolenaarenddef
28067a092245SBram Moolenaar
2807a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
28086797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
28096797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2810a26b9700SBram Moolenaar
2811a26b9700SBram Moolenaar  edit test.vim
2812a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2813a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2814a26b9700SBram Moolenaar
2815a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2816a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2817a26b9700SBram Moolenaar
2818a26b9700SBram Moolenaar  g:entered = 0
2819a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2820a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2821a26b9700SBram Moolenaar
2822a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2823a26b9700SBram Moolenaar
2824a26b9700SBram Moolenaar  au! TabEnter
2825a26b9700SBram Moolenaar  unlet g:entered
2826d72c1bf0SBram Moolenaar
2827d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2828d72c1bf0SBram Moolenaar      'vim9script',
28296797966dSBram Moolenaar      'g:var = 123',
2830e55b1c09SBram Moolenaar      'b:var = 456',
2831e55b1c09SBram Moolenaar      'w:var = 777',
2832e55b1c09SBram Moolenaar      't:var = 888',
2833d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2834d72c1bf0SBram Moolenaar      ])
2835d72c1bf0SBram Moolenaar
2836d72c1bf0SBram Moolenaar  CheckScriptFailure([
2837d72c1bf0SBram Moolenaar      'vim9script',
2838d72c1bf0SBram Moolenaar      'let g:var = 123',
2839e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2840e55b1c09SBram Moolenaar
2841e55b1c09SBram Moolenaar  CheckScriptFailure([
2842e55b1c09SBram Moolenaar      'vim9script',
2843e55b1c09SBram Moolenaar      'let b:var = 123',
2844e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2845e55b1c09SBram Moolenaar
2846e55b1c09SBram Moolenaar  CheckScriptFailure([
2847e55b1c09SBram Moolenaar      'vim9script',
2848e55b1c09SBram Moolenaar      'let w:var = 123',
2849e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2850e55b1c09SBram Moolenaar
2851e55b1c09SBram Moolenaar  CheckScriptFailure([
2852e55b1c09SBram Moolenaar      'vim9script',
2853e55b1c09SBram Moolenaar      'let t:var = 123',
2854e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2855e55b1c09SBram Moolenaar
2856e55b1c09SBram Moolenaar  CheckScriptFailure([
2857e55b1c09SBram Moolenaar      'vim9script',
2858e55b1c09SBram Moolenaar      'let v:version = 123',
2859e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2860e55b1c09SBram Moolenaar
2861e55b1c09SBram Moolenaar  CheckScriptFailure([
2862e55b1c09SBram Moolenaar      'vim9script',
2863e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2864e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
28656797966dSBram Moolenaar
28666797966dSBram Moolenaar  CheckScriptFailure([
28676797966dSBram Moolenaar      'vim9script',
28686797966dSBram Moolenaar      'g:var = 123',
286932e35117SBram Moolenaar      'unlet g:var# comment1',
2870d72c1bf0SBram Moolenaar      ], 'E108:')
2871d72c1bf0SBram Moolenaar
2872d72c1bf0SBram Moolenaar  CheckScriptFailure([
2873d72c1bf0SBram Moolenaar      'let g:var = 123',
2874d72c1bf0SBram Moolenaar      'unlet g:var # something',
2875d72c1bf0SBram Moolenaar      ], 'E488:')
2876faac4104SBram Moolenaar
2877faac4104SBram Moolenaar  CheckScriptSuccess([
2878faac4104SBram Moolenaar      'vim9script',
287932e35117SBram Moolenaar      'if 1 # comment2',
2880faac4104SBram Moolenaar      '  echo "yes"',
2881faac4104SBram Moolenaar      'elseif 2 #comment',
2882faac4104SBram Moolenaar      '  echo "no"',
2883faac4104SBram Moolenaar      'endif',
2884faac4104SBram Moolenaar      ])
2885faac4104SBram Moolenaar
2886faac4104SBram Moolenaar  CheckScriptFailure([
2887faac4104SBram Moolenaar      'vim9script',
288832e35117SBram Moolenaar      'if 1# comment3',
2889faac4104SBram Moolenaar      '  echo "yes"',
2890faac4104SBram Moolenaar      'endif',
2891faac4104SBram Moolenaar      ], 'E15:')
2892faac4104SBram Moolenaar
2893faac4104SBram Moolenaar  CheckScriptFailure([
2894faac4104SBram Moolenaar      'vim9script',
289532e35117SBram Moolenaar      'if 0 # comment4',
2896faac4104SBram Moolenaar      '  echo "yes"',
2897faac4104SBram Moolenaar      'elseif 2#comment',
2898faac4104SBram Moolenaar      '  echo "no"',
2899faac4104SBram Moolenaar      'endif',
2900faac4104SBram Moolenaar      ], 'E15:')
2901faac4104SBram Moolenaar
2902faac4104SBram Moolenaar  CheckScriptSuccess([
2903faac4104SBram Moolenaar      'vim9script',
290432e35117SBram Moolenaar      'let v = 1 # comment5',
2905faac4104SBram Moolenaar      ])
2906faac4104SBram Moolenaar
2907faac4104SBram Moolenaar  CheckScriptFailure([
2908faac4104SBram Moolenaar      'vim9script',
290932e35117SBram Moolenaar      'let v = 1# comment6',
291032e35117SBram Moolenaar      ], 'E15:')
2911faac4104SBram Moolenaar
2912faac4104SBram Moolenaar  CheckScriptSuccess([
2913faac4104SBram Moolenaar      'vim9script',
2914faac4104SBram Moolenaar      'new'
2915faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2916df069eecSBram Moolenaar      ':$',
2917faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2918faac4104SBram Moolenaar      'bwipe!',
2919faac4104SBram Moolenaar      ])
2920faac4104SBram Moolenaar
2921f5be8cdbSBram Moolenaar  CheckScriptFailure([
2922f5be8cdbSBram Moolenaar      'vim9script',
2923f5be8cdbSBram Moolenaar      'new'
2924f5be8cdbSBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2925f5be8cdbSBram Moolenaar      ':$',
2926f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2927f5be8cdbSBram Moolenaar      'bwipe!',
2928f5be8cdbSBram Moolenaar      ], 'E488:')
2929f5be8cdbSBram Moolenaar
2930f5be8cdbSBram Moolenaar  CheckScriptFailure([
2931f5be8cdbSBram Moolenaar      'vim9script',
2932f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2933f5be8cdbSBram Moolenaar      ], 'E477:')
2934a26b9700SBram Moolenaarenddef
2935a26b9700SBram Moolenaar
29367e5bd91dSBram Moolenaardef Test_finish()
29377e5bd91dSBram Moolenaar  let lines =<< trim END
29387e5bd91dSBram Moolenaar    vim9script
29396797966dSBram Moolenaar    g:res = 'one'
29407e5bd91dSBram Moolenaar    if v:false | finish | endif
29416797966dSBram Moolenaar    g:res = 'two'
29427e5bd91dSBram Moolenaar    finish
29436797966dSBram Moolenaar    g:res = 'three'
29447e5bd91dSBram Moolenaar  END
29457e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
29467e5bd91dSBram Moolenaar  source Xfinished
29477e5bd91dSBram Moolenaar  assert_equal('two', g:res)
29487e5bd91dSBram Moolenaar
29497e5bd91dSBram Moolenaar  unlet g:res
29507e5bd91dSBram Moolenaar  delete('Xfinished')
29517e5bd91dSBram Moolenaarenddef
29527e5bd91dSBram Moolenaar
295332e35117SBram Moolenaardef Test_let_func_call()
295432e35117SBram Moolenaar  let lines =<< trim END
295532e35117SBram Moolenaar    vim9script
295632e35117SBram Moolenaar    func GetValue()
295732e35117SBram Moolenaar      if exists('g:count')
295832e35117SBram Moolenaar        let g:count += 1
295932e35117SBram Moolenaar      else
296032e35117SBram Moolenaar        let g:count = 1
296132e35117SBram Moolenaar      endif
296232e35117SBram Moolenaar      return 'this'
296332e35117SBram Moolenaar    endfunc
296432e35117SBram Moolenaar    let val: string = GetValue()
2965f5be8cdbSBram Moolenaar    # env var is always a string
2966df671b46SBram Moolenaar    let env = $TERM
296732e35117SBram Moolenaar  END
296832e35117SBram Moolenaar  writefile(lines, 'Xfinished')
296932e35117SBram Moolenaar  source Xfinished
2970f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
297132e35117SBram Moolenaar  assert_equal(1, g:count)
297232e35117SBram Moolenaar
297332e35117SBram Moolenaar  unlet g:count
297432e35117SBram Moolenaar  delete('Xfinished')
297532e35117SBram Moolenaarenddef
297632e35117SBram Moolenaar
297732e35117SBram Moolenaardef Test_let_missing_type()
297832e35117SBram Moolenaar  let lines =<< trim END
297932e35117SBram Moolenaar    vim9script
2980df671b46SBram Moolenaar    let var = g:unknown
2981227a69deSBram Moolenaar  END
2982822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2983227a69deSBram Moolenaar
2984227a69deSBram Moolenaar  lines =<< trim END
2985227a69deSBram Moolenaar    vim9script
2986227a69deSBram Moolenaar    let nr: number = 123
2987227a69deSBram Moolenaar    let var = nr
2988227a69deSBram Moolenaar  END
2989822ba247SBram Moolenaar  CheckScriptSuccess(lines)
299032e35117SBram Moolenaarenddef
299132e35117SBram Moolenaar
2992c82a5b5dSBram Moolenaardef Test_let_declaration()
2993c82a5b5dSBram Moolenaar  let lines =<< trim END
2994c82a5b5dSBram Moolenaar    vim9script
2995c82a5b5dSBram Moolenaar    let var: string
2996c82a5b5dSBram Moolenaar    g:var_uninit = var
2997c82a5b5dSBram Moolenaar    var = 'text'
2998c82a5b5dSBram Moolenaar    g:var_test = var
2999f5be8cdbSBram Moolenaar    # prefixing s: is optional
3000984dddbeSBram Moolenaar    s:var = 'prefixed'
3001984dddbeSBram Moolenaar    g:var_prefixed = s:var
3002984dddbeSBram Moolenaar
3003984dddbeSBram Moolenaar    let s:other: number
3004984dddbeSBram Moolenaar    other = 1234
3005984dddbeSBram Moolenaar    g:other_var = other
300653b29e48SBram Moolenaar
300753b29e48SBram Moolenaar    # type is inferred
300853b29e48SBram Moolenaar    s:dict = {'a': 222}
300953b29e48SBram Moolenaar    def GetDictVal(key: any)
301053b29e48SBram Moolenaar      g:dict_val = s:dict[key]
301153b29e48SBram Moolenaar    enddef
301253b29e48SBram Moolenaar    GetDictVal('a')
3013c82a5b5dSBram Moolenaar  END
3014c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
3015c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
3016c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
3017984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
3018984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
301953b29e48SBram Moolenaar  assert_equal(222, g:dict_val)
3020c82a5b5dSBram Moolenaar
3021c82a5b5dSBram Moolenaar  unlet g:var_uninit
3022c82a5b5dSBram Moolenaar  unlet g:var_test
3023984dddbeSBram Moolenaar  unlet g:var_prefixed
3024984dddbeSBram Moolenaar  unlet g:other_var
3025c82a5b5dSBram Moolenaarenddef
3026c82a5b5dSBram Moolenaar
3027c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
3028c5b1c20bSBram Moolenaar  let lines =<< trim END
3029c5b1c20bSBram Moolenaar    vim9script
3030c5b1c20bSBram Moolenaar    const var: string
3031c5b1c20bSBram Moolenaar  END
3032c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
3033c5b1c20bSBram Moolenaar
3034c5b1c20bSBram Moolenaar  lines =<< trim END
3035c5b1c20bSBram Moolenaar    vim9script
3036c5b1c20bSBram Moolenaar    let 9var: string
3037c5b1c20bSBram Moolenaar  END
3038c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
3039c5b1c20bSBram Moolenaarenddef
3040c5b1c20bSBram Moolenaar
304134db91f7SBram Moolenaardef Test_let_type_check()
304234db91f7SBram Moolenaar  let lines =<< trim END
304334db91f7SBram Moolenaar    vim9script
304434db91f7SBram Moolenaar    let var: string
304534db91f7SBram Moolenaar    var = 1234
304634db91f7SBram Moolenaar  END
3047451c2e35SBram Moolenaar  CheckScriptFailure(lines, 'E1012:')
3048984dddbeSBram Moolenaar
3049984dddbeSBram Moolenaar  lines =<< trim END
3050984dddbeSBram Moolenaar    vim9script
3051984dddbeSBram Moolenaar    let var:string
3052984dddbeSBram Moolenaar  END
3053984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
3054c5b1c20bSBram Moolenaar
3055c5b1c20bSBram Moolenaar  lines =<< trim END
3056c5b1c20bSBram Moolenaar    vim9script
3057c5b1c20bSBram Moolenaar    let var: asdf
3058c5b1c20bSBram Moolenaar  END
3059c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
3060a71e2633SBram Moolenaar
3061a71e2633SBram Moolenaar  lines =<< trim END
3062a71e2633SBram Moolenaar    vim9script
3063a71e2633SBram Moolenaar    let s:l: list<number>
3064a71e2633SBram Moolenaar    s:l = []
3065a71e2633SBram Moolenaar  END
3066a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
3067a71e2633SBram Moolenaar
3068a71e2633SBram Moolenaar  lines =<< trim END
3069a71e2633SBram Moolenaar    vim9script
3070a71e2633SBram Moolenaar    let s:d: dict<number>
3071a71e2633SBram Moolenaar    s:d = {}
3072a71e2633SBram Moolenaar  END
3073a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
307434db91f7SBram Moolenaarenddef
307534db91f7SBram Moolenaar
3076a5d0077eSBram Moolenaardef Test_forward_declaration()
3077a5d0077eSBram Moolenaar  let lines =<< trim END
3078a5d0077eSBram Moolenaar    vim9script
3079a5d0077eSBram Moolenaar    def GetValue(): string
3080a5d0077eSBram Moolenaar      return theVal
3081a5d0077eSBram Moolenaar    enddef
3082a5d0077eSBram Moolenaar    let theVal = 'something'
3083822ba247SBram Moolenaar    g:initVal = GetValue()
3084a5d0077eSBram Moolenaar    theVal = 'else'
3085a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3086a5d0077eSBram Moolenaar  END
3087a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3088a5d0077eSBram Moolenaar  source Xforward
3089a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3090a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3091a5d0077eSBram Moolenaar
3092a5d0077eSBram Moolenaar  unlet g:initVal
3093a5d0077eSBram Moolenaar  unlet g:laterVal
3094a5d0077eSBram Moolenaar  delete('Xforward')
3095a5d0077eSBram Moolenaarenddef
3096a5d0077eSBram Moolenaar
30979721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
30989721fb4eSBram Moolenaar  let legacy_lines =<< trim END
30999721fb4eSBram Moolenaar    source Xvim9_script.vim
31009721fb4eSBram Moolenaar
31019721fb4eSBram Moolenaar    call assert_false(exists('local'))
31029721fb4eSBram Moolenaar    call assert_false(exists('exported'))
31039721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
31049721fb4eSBram Moolenaar    call assert_equal('global', global)
31059721fb4eSBram Moolenaar    call assert_equal('global', g:global)
31069721fb4eSBram Moolenaar
31079721fb4eSBram Moolenaar    " imported variable becomes script-local
31089721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
31099721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
31109721fb4eSBram Moolenaar    call assert_false(exists('exported'))
31119721fb4eSBram Moolenaar
31129721fb4eSBram Moolenaar    " imported function becomes script-local
31139721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
31149721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
31159721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
31169721fb4eSBram Moolenaar  END
31179721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
31189721fb4eSBram Moolenaar
31199721fb4eSBram Moolenaar  let vim9_lines =<< trim END
31209721fb4eSBram Moolenaar    vim9script
31219721fb4eSBram Moolenaar    let local = 'local'
31229721fb4eSBram Moolenaar    g:global = 'global'
31239721fb4eSBram Moolenaar    export let exported = 'exported'
31249721fb4eSBram Moolenaar    export def GetText(): string
31259721fb4eSBram Moolenaar       return 'text'
31269721fb4eSBram Moolenaar    enddef
31279721fb4eSBram Moolenaar  END
31289721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
31299721fb4eSBram Moolenaar
31309721fb4eSBram Moolenaar  source Xlegacy_script.vim
31319721fb4eSBram Moolenaar
31329721fb4eSBram Moolenaar  assert_equal('global', g:global)
3133f5be8cdbSBram Moolenaar  unlet g:global
31349721fb4eSBram Moolenaar
31359721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
31369721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
31379721fb4eSBram Moolenaarenddef
3138a5d0077eSBram Moolenaar
31397d699701SBram Moolenaarfunc Test_vim9script_not_global()
31407d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
31417d699701SBram Moolenaar  let vim9lines =<< trim END
31427d699701SBram Moolenaar    vim9script
31437d699701SBram Moolenaar    let var = 'local'
31447d699701SBram Moolenaar    func TheFunc()
31457d699701SBram Moolenaar      echo 'local'
31467d699701SBram Moolenaar    endfunc
31477d699701SBram Moolenaar    def DefFunc()
31487d699701SBram Moolenaar      echo 'local'
31497d699701SBram Moolenaar    enddef
31507d699701SBram Moolenaar  END
31517d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
31527d699701SBram Moolenaar  source Xvim9script.vim
31537d699701SBram Moolenaar  try
31547d699701SBram Moolenaar    echo g:var
31557d699701SBram Moolenaar    assert_report('did not fail')
31567d699701SBram Moolenaar  catch /E121:/
31577d699701SBram Moolenaar    " caught
31587d699701SBram Moolenaar  endtry
31597d699701SBram Moolenaar  try
31607d699701SBram Moolenaar    call TheFunc()
31617d699701SBram Moolenaar    assert_report('did not fail')
31627d699701SBram Moolenaar  catch /E117:/
31637d699701SBram Moolenaar    " caught
31647d699701SBram Moolenaar  endtry
31657d699701SBram Moolenaar  try
31667d699701SBram Moolenaar    call DefFunc()
31677d699701SBram Moolenaar    assert_report('did not fail')
31687d699701SBram Moolenaar  catch /E117:/
31697d699701SBram Moolenaar    " caught
31707d699701SBram Moolenaar  endtry
31717d699701SBram Moolenaar
31727d699701SBram Moolenaar  call delete('Xvim9script.vium')
31737d699701SBram Moolenaarendfunc
31747d699701SBram Moolenaar
3175eeb27bfeSBram Moolenaardef Test_vim9_copen()
3176eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3177eeb27bfeSBram Moolenaar  copen
3178eeb27bfeSBram Moolenaar  quit
3179eeb27bfeSBram Moolenaarenddef
3180eeb27bfeSBram Moolenaar
31812d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
31822d6b20d6SBram Moolenaardef Test_vim9_autoload()
31832d6b20d6SBram Moolenaar  let lines =<< trim END
31842d6b20d6SBram Moolenaar     vim9script
31852d6b20d6SBram Moolenaar     def foo#test()
31862d6b20d6SBram Moolenaar         echomsg getreg('"')
31872d6b20d6SBram Moolenaar     enddef
31882d6b20d6SBram Moolenaar  END
31892d6b20d6SBram Moolenaar
31902d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
31912d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
31922d6b20d6SBram Moolenaar  let save_rtp = &rtp
31932d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
31942d6b20d6SBram Moolenaar  augroup test
31952d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
31962d6b20d6SBram Moolenaar  augroup END
31972d6b20d6SBram Moolenaar
31982d6b20d6SBram Moolenaar  normal Y
31992d6b20d6SBram Moolenaar
32002d6b20d6SBram Moolenaar  augroup test
32012d6b20d6SBram Moolenaar    autocmd!
32022d6b20d6SBram Moolenaar  augroup END
32032d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
32042d6b20d6SBram Moolenaar  &rtp = save_rtp
32052d6b20d6SBram Moolenaarenddef
32062d6b20d6SBram Moolenaar
320781e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
320881e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
320981e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
321081e17fbeSBram Moolenaar  let lines =<< trim END
321181e17fbeSBram Moolenaar    let s:counter = 1
321281e17fbeSBram Moolenaar    def s:Func()
321381e17fbeSBram Moolenaar      au! CursorHold
321481e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
321581e17fbeSBram Moolenaar    enddef
321681e17fbeSBram Moolenaar    call s:Func()
321781e17fbeSBram Moolenaar    doau CursorHold
321881e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
321981e17fbeSBram Moolenaar    au! CursorHold
322081e17fbeSBram Moolenaar  END
322181e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
322281e17fbeSBram Moolenaarenddef
322381e17fbeSBram Moolenaar
32243896a105SBram Moolenaardef Test_cmdline_win()
32253896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
32263896a105SBram Moolenaar  # the command line window.
32273896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
32283896a105SBram Moolenaar  let export_lines =<< trim END
32293896a105SBram Moolenaar    vim9script
32303896a105SBram Moolenaar    export let That = 'yes'
32313896a105SBram Moolenaar  END
32323896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
32333896a105SBram Moolenaar  let import_lines =<< trim END
32343896a105SBram Moolenaar    vim9script
32353896a105SBram Moolenaar    import That from './Xexport.vim'
32363896a105SBram Moolenaar  END
32373896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
32383896a105SBram Moolenaar  let save_rtp = &rtp
32393896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
32403896a105SBram Moolenaar  syntax on
32413896a105SBram Moolenaar  augroup CmdWin
32423896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
32433896a105SBram Moolenaar  augroup END
32443896a105SBram Moolenaar  # this will open and also close the cmdline window
32453896a105SBram Moolenaar  feedkeys('q:', 'xt')
32463896a105SBram Moolenaar  assert_equal('yes', g:got_there)
32473896a105SBram Moolenaar
32483896a105SBram Moolenaar  augroup CmdWin
32493896a105SBram Moolenaar    au!
32503896a105SBram Moolenaar  augroup END
32513896a105SBram Moolenaar  &rtp = save_rtp
32523896a105SBram Moolenaar  delete('rtp', 'rf')
32533896a105SBram Moolenaarenddef
32543896a105SBram Moolenaar
3255585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3256585fea7bSBram Moolenaardef Test_substitute_cmd()
3257585fea7bSBram Moolenaar  new
3258585fea7bSBram Moolenaar  setline(1, 'something')
3259585fea7bSBram Moolenaar  :substitute(some(other(
3260585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3261585fea7bSBram Moolenaar  bwipe!
3262585fea7bSBram Moolenaar
3263f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3264585fea7bSBram Moolenaar  let lines =<< trim END
3265585fea7bSBram Moolenaar    vim9script
3266585fea7bSBram Moolenaar    new
3267585fea7bSBram Moolenaar    setline(1, 'something')
3268585fea7bSBram Moolenaar    :substitute(some(other(
3269585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3270585fea7bSBram Moolenaar    bwipe!
3271585fea7bSBram Moolenaar  END
3272585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3273585fea7bSBram Moolenaar  source Xvim9lines
3274585fea7bSBram Moolenaar
3275585fea7bSBram Moolenaar  delete('Xvim9lines')
3276585fea7bSBram Moolenaarenddef
3277585fea7bSBram Moolenaar
32788a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3279