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])
18*c2af0affSBram Moolenaar  bwipe!
19*c2af0affSBram Moolenaar
20*c2af0affSBram Moolenaar  # without range commands use current line
21*c2af0affSBram Moolenaar  new
22*c2af0affSBram Moolenaar  setline(1, ['one', 'two', 'three'])
23*c2af0affSBram Moolenaar  :2
24*c2af0affSBram Moolenaar  print
25*c2af0affSBram Moolenaar  assert_equal('two', Screenline(&lines))
26*c2af0affSBram Moolenaar  :3
27*c2af0affSBram Moolenaar  list
28*c2af0affSBram Moolenaar  assert_equal('three$', Screenline(&lines))
29*c2af0affSBram 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
1687c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the
1688c620c055SBram Moolenaar" script where FastFilter() is called from.
1689c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1690c620c055SBram Moolenaar  let filterLines =<< trim END
1691c620c055SBram Moolenaar    vim9script
1692c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1693c620c055SBram Moolenaar      return idx % 2 == 1
1694c620c055SBram Moolenaar    enddef
1695c620c055SBram Moolenaar    export def FastFilter(): list<number>
1696c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1697c620c055SBram Moolenaar    enddef
1698c620c055SBram Moolenaar  END
1699c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1700c620c055SBram Moolenaar
1701c620c055SBram Moolenaar  let lines =<< trim END
1702c620c055SBram Moolenaar    vim9script
1703c620c055SBram Moolenaar    import {FilterFunc, FastFilter} from './Xfilter.vim'
1704c620c055SBram Moolenaar    def Test()
1705c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1706c620c055SBram Moolenaar    enddef
1707c620c055SBram Moolenaar    Test()
1708c620c055SBram Moolenaar  END
1709c620c055SBram Moolenaar  writefile(lines, 'Ximport.vim')
1710c620c055SBram Moolenaar  assert_fails('source Ximport.vim', 'E121:')
1711c620c055SBram Moolenaar
1712c620c055SBram Moolenaar  delete('Xfilter.vim')
1713c620c055SBram Moolenaar  delete('Ximport.vim')
1714c620c055SBram Moolenaarenddef
1715c620c055SBram Moolenaar
17164c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
17174c17ad94SBram Moolenaar  let first_lines =<< trim END
17184c17ad94SBram Moolenaar    vim9script
17194c17ad94SBram Moolenaar    def FuncYes(): string
17204c17ad94SBram Moolenaar      return 'yes'
17214c17ad94SBram Moolenaar    enddef
17224c17ad94SBram Moolenaar  END
172303afdcf1SBram Moolenaar  let withno_lines =<< trim END
17244c17ad94SBram Moolenaar    def FuncNo(): string
17254c17ad94SBram Moolenaar      return 'no'
17264c17ad94SBram Moolenaar    enddef
17274c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
17284c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
17294c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
173003afdcf1SBram Moolenaar    enddef
173103afdcf1SBram Moolenaar  END
173203afdcf1SBram Moolenaar  let nono_lines =<< trim END
173303afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
173403afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
17354c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
17364c17ad94SBram Moolenaar    enddef
17374c17ad94SBram Moolenaar  END
17384c17ad94SBram Moolenaar
17394c17ad94SBram Moolenaar  # FuncNo() is defined
174003afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
17414c17ad94SBram Moolenaar  source Xreloaded.vim
17424c17ad94SBram Moolenaar  g:DoCheck(true)
17434c17ad94SBram Moolenaar
17444c17ad94SBram Moolenaar  # FuncNo() is not redefined
174503afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
17464c17ad94SBram Moolenaar  source Xreloaded.vim
174703afdcf1SBram Moolenaar  g:DoCheck()
17484c17ad94SBram Moolenaar
17494c17ad94SBram Moolenaar  # FuncNo() is back
175003afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
17514c17ad94SBram Moolenaar  source Xreloaded.vim
175203afdcf1SBram Moolenaar  g:DoCheck()
17534c17ad94SBram Moolenaar
17544c17ad94SBram Moolenaar  delete('Xreloaded.vim')
17554c17ad94SBram Moolenaarenddef
17564c17ad94SBram Moolenaar
175789483d40SBram Moolenaardef Test_vim9script_reload_delvar()
175889483d40SBram Moolenaar  # write the script with a script-local variable
175989483d40SBram Moolenaar  let lines =<< trim END
176089483d40SBram Moolenaar    vim9script
176189483d40SBram Moolenaar    let var = 'string'
176289483d40SBram Moolenaar  END
176389483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
176489483d40SBram Moolenaar  source XreloadVar.vim
176589483d40SBram Moolenaar
176689483d40SBram Moolenaar  # now write the script using the same variable locally - works
176789483d40SBram Moolenaar  lines =<< trim END
176889483d40SBram Moolenaar    vim9script
176989483d40SBram Moolenaar    def Func()
177089483d40SBram Moolenaar      let var = 'string'
177189483d40SBram Moolenaar    enddef
177289483d40SBram Moolenaar  END
177389483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
177489483d40SBram Moolenaar  source XreloadVar.vim
177589483d40SBram Moolenaar
177689483d40SBram Moolenaar  delete('XreloadVar.vim')
177789483d40SBram Moolenaarenddef
177889483d40SBram Moolenaar
17798a7d6542SBram Moolenaardef Test_import_absolute()
17808a7d6542SBram Moolenaar  let import_lines = [
1781e6085c53SBram Moolenaar        'vim9script',
1782e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1783e6085c53SBram Moolenaar        'def UseExported()',
1784e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1785e6085c53SBram Moolenaar        '  exported = 8888',
1786e6085c53SBram Moolenaar        '  g:imported_after = exported',
1787e6085c53SBram Moolenaar        'enddef',
1788e6085c53SBram Moolenaar        'UseExported()',
1789e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1790e6085c53SBram Moolenaar        ]
17918a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
17928a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
17938a7d6542SBram Moolenaar
17948a7d6542SBram Moolenaar  source Ximport_abs.vim
17958a7d6542SBram Moolenaar
17968a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
17974e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1798675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1799675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1800675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1801675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1802675f716eSBram Moolenaar          'exported = 8888.*' ..
1803675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1804675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1805675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1806675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1807e6085c53SBram Moolenaar        g:import_disassembled)
1808b3ca9824SBram Moolenaar
1809b3ca9824SBram Moolenaar  Undo_export_script_lines()
18108a7d6542SBram Moolenaar  unlet g:imported_abs
18114e12a5dfSBram Moolenaar  unlet g:import_disassembled
18128a7d6542SBram Moolenaar
18138a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
18148a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
18158a7d6542SBram Moolenaarenddef
18168a7d6542SBram Moolenaar
18178a7d6542SBram Moolenaardef Test_import_rtp()
18188a7d6542SBram Moolenaar  let import_lines = [
1819e6085c53SBram Moolenaar        'vim9script',
1820e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1821e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1822e6085c53SBram Moolenaar        ]
18238a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
18248a7d6542SBram Moolenaar  mkdir('import')
18258a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
18268a7d6542SBram Moolenaar
18278a7d6542SBram Moolenaar  let save_rtp = &rtp
18288a7d6542SBram Moolenaar  &rtp = getcwd()
18298a7d6542SBram Moolenaar  source Ximport_rtp.vim
18308a7d6542SBram Moolenaar  &rtp = save_rtp
18318a7d6542SBram Moolenaar
18328a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
18338a7d6542SBram Moolenaar
1834b3ca9824SBram Moolenaar  Undo_export_script_lines()
1835b3ca9824SBram Moolenaar  unlet g:imported_rtp
18368a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
183789483d40SBram Moolenaar  delete('import', 'rf')
18388a7d6542SBram Moolenaarenddef
18398a7d6542SBram Moolenaar
184025e0f586SBram Moolenaardef Test_import_compile_error()
184125e0f586SBram Moolenaar  let export_lines = [
184225e0f586SBram Moolenaar        'vim9script',
184325e0f586SBram Moolenaar        'export def ExpFunc(): string',
184425e0f586SBram Moolenaar        '  return notDefined',
184525e0f586SBram Moolenaar        'enddef',
184625e0f586SBram Moolenaar        ]
184725e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
184825e0f586SBram Moolenaar
184925e0f586SBram Moolenaar  let import_lines = [
185025e0f586SBram Moolenaar        'vim9script',
185125e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
185225e0f586SBram Moolenaar        'def ImpFunc()',
185325e0f586SBram Moolenaar        '  echo ExpFunc()',
185425e0f586SBram Moolenaar        'enddef',
185525e0f586SBram Moolenaar        'defcompile',
185625e0f586SBram Moolenaar        ]
185725e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
185825e0f586SBram Moolenaar
185925e0f586SBram Moolenaar  try
186025e0f586SBram Moolenaar    source Ximport.vim
186125e0f586SBram Moolenaar  catch /E1001/
1862f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
186325e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
186425e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
186525e0f586SBram Moolenaar  endtry
186625e0f586SBram Moolenaar
186725e0f586SBram Moolenaar  delete('Xexported.vim')
186825e0f586SBram Moolenaar  delete('Ximport.vim')
186925e0f586SBram Moolenaarenddef
187025e0f586SBram Moolenaar
1871c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1872c4ce36d4SBram Moolenaar  let lines = [
1873c4ce36d4SBram Moolenaar        'vim9script',
1874c4ce36d4SBram Moolenaar        'def Func()',
1875c4ce36d4SBram Moolenaar        '  eval [][0]',
1876c4ce36d4SBram Moolenaar        'enddef',
1877c4ce36d4SBram Moolenaar        'Func()',
1878c4ce36d4SBram Moolenaar        ]
1879c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1880c4ce36d4SBram Moolenaar
1881c4ce36d4SBram Moolenaar  for count in range(3)
1882c4ce36d4SBram Moolenaar    try
1883c4ce36d4SBram Moolenaar      source Xtestscript.vim
1884c4ce36d4SBram Moolenaar    catch /E684/
1885c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1886c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1887c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1888c4ce36d4SBram Moolenaar    endtry
1889c4ce36d4SBram Moolenaar  endfor
1890c4ce36d4SBram Moolenaar
1891c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1892c4ce36d4SBram Moolenaarenddef
1893c4ce36d4SBram Moolenaar
1894eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1895eef2102eSBram Moolenaar  let export_lines =<< trim END
1896eef2102eSBram Moolenaar      vim9script
1897eef2102eSBram Moolenaar      export def Func()
1898eef2102eSBram Moolenaar        echo 'imported'
1899eef2102eSBram Moolenaar      enddef
1900eef2102eSBram Moolenaar  END
1901eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1902eef2102eSBram Moolenaar
1903eef2102eSBram Moolenaar  let lines =<< trim END
1904eef2102eSBram Moolenaar    vim9script
1905eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1906eef2102eSBram Moolenaar    def Func()
1907eef2102eSBram Moolenaar      echo 'local to function'
1908eef2102eSBram Moolenaar    enddef
1909eef2102eSBram Moolenaar  END
1910eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1911eef2102eSBram Moolenaar
1912eef2102eSBram Moolenaar  lines =<< trim END
1913eef2102eSBram Moolenaar    vim9script
1914eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1915eef2102eSBram Moolenaar    def Outer()
1916eef2102eSBram Moolenaar      def Func()
1917eef2102eSBram Moolenaar        echo 'local to function'
1918eef2102eSBram Moolenaar      enddef
1919eef2102eSBram Moolenaar    enddef
1920eef2102eSBram Moolenaar    defcompile
1921eef2102eSBram Moolenaar  END
1922eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1923eef2102eSBram Moolenaar
1924eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1925eef2102eSBram Moolenaarenddef
1926eef2102eSBram Moolenaar
1927b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1928b9a2cac3SBram Moolenaar  let lines =<< trim END
1929b9a2cac3SBram Moolenaar    vim9script
1930b9a2cac3SBram Moolenaar    def Func()
1931b9a2cac3SBram Moolenaar      echo 'one'
1932b9a2cac3SBram Moolenaar    enddef
1933b9a2cac3SBram Moolenaar    def Func()
1934b9a2cac3SBram Moolenaar      echo 'two'
1935b9a2cac3SBram Moolenaar    enddef
1936b9a2cac3SBram Moolenaar  END
1937b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1938fa211f3cSBram Moolenaar
1939fa211f3cSBram Moolenaar  lines =<< trim END
1940fa211f3cSBram Moolenaar    vim9script
1941fa211f3cSBram Moolenaar    def Foo(): string
1942fa211f3cSBram Moolenaar      return 'foo'
1943fa211f3cSBram Moolenaar      enddef
1944fa211f3cSBram Moolenaar    def Func()
1945fa211f3cSBram Moolenaar      let  Foo = {-> 'lambda'}
1946fa211f3cSBram Moolenaar    enddef
1947fa211f3cSBram Moolenaar    defcompile
1948fa211f3cSBram Moolenaar  END
1949fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1950b9a2cac3SBram Moolenaarenddef
1951b9a2cac3SBram Moolenaar
19528a7d6542SBram Moolenaardef Test_fixed_size_list()
1953f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
19548a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
19558a7d6542SBram Moolenaar  l->remove(0)
19568a7d6542SBram Moolenaar  l->add(5)
19578a7d6542SBram Moolenaar  l->insert(99, 1)
19580f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
19598a7d6542SBram Moolenaarenddef
19608a7d6542SBram Moolenaar
1961ae616494SBram Moolenaardef Test_no_insert_xit()
1962ae616494SBram Moolenaar  call CheckDefExecFailure(['a = 1'], 'E1100:')
1963ae616494SBram Moolenaar  call CheckDefExecFailure(['c = 1'], 'E1100:')
1964f5a48010SBram Moolenaar  call CheckDefExecFailure(['i = 1'], 'E1100:')
1965f5a48010SBram Moolenaar  call CheckDefExecFailure(['t = 1'], 'E1100:')
1966f5a48010SBram Moolenaar  call CheckDefExecFailure(['x = 1'], 'E1100:')
1967ae616494SBram Moolenaar
1968ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1969ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1970ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1971ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1972f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1973f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1974f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1975f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1976f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1977ae616494SBram Moolenaarenddef
1978ae616494SBram Moolenaar
1979158906cfSBram Moolenaardef IfElse(what: number): string
1980158906cfSBram Moolenaar  let res = ''
1981158906cfSBram Moolenaar  if what == 1
1982158906cfSBram Moolenaar    res = "one"
1983158906cfSBram Moolenaar  elseif what == 2
1984158906cfSBram Moolenaar    res = "two"
1985a259d8d3SBram Moolenaar  else
1986158906cfSBram Moolenaar    res = "three"
1987a259d8d3SBram Moolenaar  endif
1988158906cfSBram Moolenaar  return res
1989a259d8d3SBram Moolenaarenddef
1990a259d8d3SBram Moolenaar
1991158906cfSBram Moolenaardef Test_if_elseif_else()
1992158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1993158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1994158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
19950f18b6d1SBram Moolenaarenddef
19960f18b6d1SBram Moolenaar
1997e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1998e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1999e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
2000e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
2001e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
2002585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
2003e8c4abbbSBram Moolenaarenddef
2004e8c4abbbSBram Moolenaar
20056d69bf60SBram Moolenaarlet g:bool_true = v:true
20066d69bf60SBram Moolenaarlet g:bool_false = v:false
20076d69bf60SBram Moolenaar
20086d69bf60SBram Moolenaardef Test_if_const_expr()
20096d69bf60SBram Moolenaar  let res = false
20106d69bf60SBram Moolenaar  if true ? true : false
20116d69bf60SBram Moolenaar    res = true
20126d69bf60SBram Moolenaar  endif
20136d69bf60SBram Moolenaar  assert_equal(true, res)
20146d69bf60SBram Moolenaar
2015585fea7bSBram Moolenaar  g:glob = 2
2016585fea7bSBram Moolenaar  if false
20176797966dSBram Moolenaar    execute('g:glob = 3')
2018585fea7bSBram Moolenaar  endif
2019585fea7bSBram Moolenaar  assert_equal(2, g:glob)
2020585fea7bSBram Moolenaar  if true
20216797966dSBram Moolenaar    execute('g:glob = 3')
2022585fea7bSBram Moolenaar  endif
2023585fea7bSBram Moolenaar  assert_equal(3, g:glob)
2024585fea7bSBram Moolenaar
20256d69bf60SBram Moolenaar  res = false
20266d69bf60SBram Moolenaar  if g:bool_true ? true : false
20276d69bf60SBram Moolenaar    res = true
20286d69bf60SBram Moolenaar  endif
20296d69bf60SBram Moolenaar  assert_equal(true, res)
20306d69bf60SBram Moolenaar
20316d69bf60SBram Moolenaar  res = false
20326d69bf60SBram Moolenaar  if true ? g:bool_true : false
20336d69bf60SBram Moolenaar    res = true
20346d69bf60SBram Moolenaar  endif
20356d69bf60SBram Moolenaar  assert_equal(true, res)
20366d69bf60SBram Moolenaar
20376d69bf60SBram Moolenaar  res = false
20386d69bf60SBram Moolenaar  if true ? true : g:bool_false
20396d69bf60SBram Moolenaar    res = true
20406d69bf60SBram Moolenaar  endif
20416d69bf60SBram Moolenaar  assert_equal(true, res)
20426d69bf60SBram Moolenaar
20436d69bf60SBram Moolenaar  res = false
20446d69bf60SBram Moolenaar  if true ? false : true
20456d69bf60SBram Moolenaar    res = true
20466d69bf60SBram Moolenaar  endif
20476d69bf60SBram Moolenaar  assert_equal(false, res)
20486d69bf60SBram Moolenaar
20496d69bf60SBram Moolenaar  res = false
20506d69bf60SBram Moolenaar  if false ? false : true
20516d69bf60SBram Moolenaar    res = true
20526d69bf60SBram Moolenaar  endif
20536d69bf60SBram Moolenaar  assert_equal(true, res)
20546d69bf60SBram Moolenaar
20556d69bf60SBram Moolenaar  res = false
20566d69bf60SBram Moolenaar  if false ? true : false
20576d69bf60SBram Moolenaar    res = true
20586d69bf60SBram Moolenaar  endif
20596d69bf60SBram Moolenaar  assert_equal(false, res)
20606d69bf60SBram Moolenaar
20616d69bf60SBram Moolenaar  res = false
2062e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2063e8c4abbbSBram Moolenaar    res = true
2064e8c4abbbSBram Moolenaar  endif
2065e8c4abbbSBram Moolenaar  assert_equal(false, res)
2066e8c4abbbSBram Moolenaar
2067e8c4abbbSBram Moolenaar  res = false
20686d69bf60SBram Moolenaar  if true && true
20696d69bf60SBram Moolenaar    res = true
20706d69bf60SBram Moolenaar  endif
20716d69bf60SBram Moolenaar  assert_equal(true, res)
20726d69bf60SBram Moolenaar
20736d69bf60SBram Moolenaar  res = false
20746d69bf60SBram Moolenaar  if true && false
20756d69bf60SBram Moolenaar    res = true
20766d69bf60SBram Moolenaar  endif
20776d69bf60SBram Moolenaar  assert_equal(false, res)
20786d69bf60SBram Moolenaar
20796d69bf60SBram Moolenaar  res = false
20806d69bf60SBram Moolenaar  if g:bool_true && false
20816d69bf60SBram Moolenaar    res = true
20826d69bf60SBram Moolenaar  endif
20836d69bf60SBram Moolenaar  assert_equal(false, res)
20846d69bf60SBram Moolenaar
20856d69bf60SBram Moolenaar  res = false
20866d69bf60SBram Moolenaar  if true && g:bool_false
20876d69bf60SBram Moolenaar    res = true
20886d69bf60SBram Moolenaar  endif
20896d69bf60SBram Moolenaar  assert_equal(false, res)
20906d69bf60SBram Moolenaar
20916d69bf60SBram Moolenaar  res = false
20926d69bf60SBram Moolenaar  if false && false
20936d69bf60SBram Moolenaar    res = true
20946d69bf60SBram Moolenaar  endif
20956d69bf60SBram Moolenaar  assert_equal(false, res)
20966d69bf60SBram Moolenaar
20976d69bf60SBram Moolenaar  res = false
20986d69bf60SBram Moolenaar  if true || false
20996d69bf60SBram Moolenaar    res = true
21006d69bf60SBram Moolenaar  endif
21016d69bf60SBram Moolenaar  assert_equal(true, res)
21026d69bf60SBram Moolenaar
21036d69bf60SBram Moolenaar  res = false
21046d69bf60SBram Moolenaar  if g:bool_true || false
21056d69bf60SBram Moolenaar    res = true
21066d69bf60SBram Moolenaar  endif
21076d69bf60SBram Moolenaar  assert_equal(true, res)
21086d69bf60SBram Moolenaar
21096d69bf60SBram Moolenaar  res = false
21106d69bf60SBram Moolenaar  if true || g:bool_false
21116d69bf60SBram Moolenaar    res = true
21126d69bf60SBram Moolenaar  endif
21136d69bf60SBram Moolenaar  assert_equal(true, res)
21146d69bf60SBram Moolenaar
21156d69bf60SBram Moolenaar  res = false
21166d69bf60SBram Moolenaar  if false || false
21176d69bf60SBram Moolenaar    res = true
21186d69bf60SBram Moolenaar  endif
21196d69bf60SBram Moolenaar  assert_equal(false, res)
212080c34ca3SBram Moolenaarenddef
21216d69bf60SBram Moolenaar
212280c34ca3SBram Moolenaardef Test_if_const_expr_fails()
212380c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
212480c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2125e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
2126e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
21276d69bf60SBram Moolenaarenddef
21286d69bf60SBram Moolenaar
212972abcf42SBram Moolenaardef RunNested(i: number): number
213072abcf42SBram Moolenaar  let x: number = 0
213172abcf42SBram Moolenaar  if i % 2
213272abcf42SBram Moolenaar    if 1
2133f5be8cdbSBram Moolenaar      # comment
213472abcf42SBram Moolenaar    else
2135f5be8cdbSBram Moolenaar      # comment
213672abcf42SBram Moolenaar    endif
213772abcf42SBram Moolenaar    x += 1
213872abcf42SBram Moolenaar  else
213972abcf42SBram Moolenaar    x += 1000
214072abcf42SBram Moolenaar  endif
214172abcf42SBram Moolenaar  return x
214272abcf42SBram Moolenaarenddef
214372abcf42SBram Moolenaar
214472abcf42SBram Moolenaardef Test_nested_if()
214572abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
214672abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
214772abcf42SBram Moolenaarenddef
214872abcf42SBram Moolenaar
2149ad39c094SBram Moolenaardef Test_execute_cmd()
2150ad39c094SBram Moolenaar  new
2151ad39c094SBram Moolenaar  setline(1, 'default')
2152ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
2153ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2154a72cfb80SBram Moolenaar
2155a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
2156a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2157a72cfb80SBram Moolenaar
2158ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
2159ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
2160a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2161ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2162a72cfb80SBram Moolenaar
2163ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
2164ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2165a72cfb80SBram Moolenaar
2166ad39c094SBram Moolenaar  let cmd_first = 'call '
2167ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
2168ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2169ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2170ad39c094SBram Moolenaar  bwipe!
2171585fea7bSBram Moolenaar
21722d6b20d6SBram Moolenaar  let n = true
21732d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
21742d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
21752d6b20d6SBram Moolenaar
2176e5abf7afSBram Moolenaar  echomsg [1, 2, 3] #{a: 1, b: 2}
2177e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2178e5abf7afSBram Moolenaar
2179430deb19SBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:', 1)
2180430deb19SBram Moolenaar  call CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2181430deb19SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2182ad39c094SBram Moolenaarenddef
2183ad39c094SBram Moolenaar
218447e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2185f5be8cdbSBram Moolenaar  # only checks line continuation
218647e880d6SBram Moolenaar  let lines =<< trim END
218747e880d6SBram Moolenaar      vim9script
218847e880d6SBram Moolenaar      execute 'g:someVar'
218947e880d6SBram Moolenaar                .. ' = ' ..
219047e880d6SBram Moolenaar                   '28'
219147e880d6SBram Moolenaar      assert_equal(28, g:someVar)
219247e880d6SBram Moolenaar      unlet g:someVar
219347e880d6SBram Moolenaar  END
219447e880d6SBram Moolenaar  CheckScriptSuccess(lines)
219547e880d6SBram Moolenaarenddef
219647e880d6SBram Moolenaar
2197ad39c094SBram Moolenaardef Test_echo_cmd()
2198a72cfb80SBram Moolenaar  echo 'some' # comment
2199585fea7bSBram Moolenaar  echon 'thing'
2200ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2201ad39c094SBram Moolenaar
2202a72cfb80SBram Moolenaar  echo "some" # comment
2203a72cfb80SBram Moolenaar  echon "thing"
2204a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2205a72cfb80SBram Moolenaar
2206ad39c094SBram Moolenaar  let str1 = 'some'
2207ad39c094SBram Moolenaar  let str2 = 'more'
2208ad39c094SBram Moolenaar  echo str1 str2
2209ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2210a72cfb80SBram Moolenaar
2211a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2212ad39c094SBram Moolenaarenddef
2213ad39c094SBram Moolenaar
2214f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2215f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2216f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2217f93c7feaSBram Moolenaar  echo 'clear'
2218df069eecSBram Moolenaar  :1messages
2219f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2220f93c7feaSBram Moolenaar
2221f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2222f93c7feaSBram Moolenaarenddef
2223f93c7feaSBram Moolenaar
222447e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2225f5be8cdbSBram Moolenaar  # only checks line continuation
222647e880d6SBram Moolenaar  let lines =<< trim END
222747e880d6SBram Moolenaar      vim9script
222847e880d6SBram Moolenaar      echomsg 'here'
222947e880d6SBram Moolenaar                .. ' is ' ..
223047e880d6SBram Moolenaar                   'a message'
223147e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
223247e880d6SBram Moolenaar  END
223347e880d6SBram Moolenaar  CheckScriptSuccess(lines)
223447e880d6SBram Moolenaarenddef
223547e880d6SBram Moolenaar
2236f93c7feaSBram Moolenaardef Test_echoerr_cmd()
223740ee466cSBram Moolenaar  try
223840ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
223940ee466cSBram Moolenaar  catch
224040ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
224140ee466cSBram Moolenaar  endtry
2242f93c7feaSBram Moolenaarenddef
2243f93c7feaSBram Moolenaar
224447e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2245f5be8cdbSBram Moolenaar  # only checks line continuation
224647e880d6SBram Moolenaar  let lines =<< trim END
224747e880d6SBram Moolenaar      vim9script
224847e880d6SBram Moolenaar      try
224947e880d6SBram Moolenaar        echoerr 'this'
225047e880d6SBram Moolenaar                .. ' is ' ..
225147e880d6SBram Moolenaar                   'wrong'
225247e880d6SBram Moolenaar      catch
225347e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
225447e880d6SBram Moolenaar      endtry
225547e880d6SBram Moolenaar  END
225647e880d6SBram Moolenaar  CheckScriptSuccess(lines)
225747e880d6SBram Moolenaarenddef
225847e880d6SBram Moolenaar
225941fe0617SBram Moolenaardef Test_for_outside_of_function()
226041fe0617SBram Moolenaar  let lines =<< trim END
226141fe0617SBram Moolenaar    vim9script
226241fe0617SBram Moolenaar    new
226341fe0617SBram Moolenaar    for var in range(0, 3)
226441fe0617SBram Moolenaar      append(line('$'), var)
226541fe0617SBram Moolenaar    endfor
226641fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
226741fe0617SBram Moolenaar    bwipe!
226841fe0617SBram Moolenaar  END
226941fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
227041fe0617SBram Moolenaar  source Xvim9for.vim
227141fe0617SBram Moolenaar  delete('Xvim9for.vim')
227241fe0617SBram Moolenaarenddef
22738a7d6542SBram Moolenaar
2274e8c4abbbSBram Moolenaardef Test_for_loop()
2275e8c4abbbSBram Moolenaar  let result = ''
2276e8c4abbbSBram Moolenaar  for cnt in range(7)
2277e8c4abbbSBram Moolenaar    if cnt == 4
2278e8c4abbbSBram Moolenaar      break
2279e8c4abbbSBram Moolenaar    endif
2280e8c4abbbSBram Moolenaar    if cnt == 2
2281e8c4abbbSBram Moolenaar      continue
2282e8c4abbbSBram Moolenaar    endif
2283e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2284e8c4abbbSBram Moolenaar  endfor
2285e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
22860ad3e894SBram Moolenaar
22870ad3e894SBram Moolenaar  let concat = ''
22880ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
22890ad3e894SBram Moolenaar    concat ..= str
22900ad3e894SBram Moolenaar  endfor
22910ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
2292e8c4abbbSBram Moolenaarenddef
2293e8c4abbbSBram Moolenaar
2294e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2295675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2296675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2297451c2e35SBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1017:')
2298822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
2299451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
2300675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2301675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2302675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2303e8c4abbbSBram Moolenaarenddef
2304e8c4abbbSBram Moolenaar
2305d0df1aacSBram Moolenaardef Test_while_loop()
2306d0df1aacSBram Moolenaar  let result = ''
2307d0df1aacSBram Moolenaar  let cnt = 0
2308d0df1aacSBram Moolenaar  while cnt < 555
2309d0df1aacSBram Moolenaar    if cnt == 3
2310d0df1aacSBram Moolenaar      break
2311d0df1aacSBram Moolenaar    endif
2312d0df1aacSBram Moolenaar    cnt += 1
2313d0df1aacSBram Moolenaar    if cnt == 2
2314d0df1aacSBram Moolenaar      continue
2315d0df1aacSBram Moolenaar    endif
2316d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2317d0df1aacSBram Moolenaar  endwhile
2318d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2319d0df1aacSBram Moolenaarenddef
2320d0df1aacSBram Moolenaar
2321e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2322675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2323675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2324675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2325675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2326675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2327675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2328675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
2329bd5da371SBram Moolenaarenddef
2330bd5da371SBram Moolenaar
23319645e2d9SBram Moolenaardef Test_interrupt_loop()
233297acfc78SBram Moolenaar  let caught = false
23339645e2d9SBram Moolenaar  let x = 0
233497acfc78SBram Moolenaar  try
23359645e2d9SBram Moolenaar    while 1
23369645e2d9SBram Moolenaar      x += 1
23379645e2d9SBram Moolenaar      if x == 100
23389645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
23399645e2d9SBram Moolenaar      endif
23409645e2d9SBram Moolenaar    endwhile
234197acfc78SBram Moolenaar  catch
234297acfc78SBram Moolenaar    caught = true
234397acfc78SBram Moolenaar    assert_equal(100, x)
234497acfc78SBram Moolenaar  endtry
234597acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
23469645e2d9SBram Moolenaarenddef
234720431c9dSBram Moolenaar
23484fdae999SBram Moolenaardef Test_automatic_line_continuation()
23494fdae999SBram Moolenaar  let mylist = [
23504fdae999SBram Moolenaar      'one',
23514fdae999SBram Moolenaar      'two',
23524fdae999SBram Moolenaar      'three',
2353f5be8cdbSBram Moolenaar      ] # comment
23544fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
23554fdae999SBram Moolenaar
23564fdae999SBram Moolenaar  let mydict = {
23574fdae999SBram Moolenaar      'one': 1,
23584fdae999SBram Moolenaar      'two': 2,
23594fdae999SBram Moolenaar      'three':
23604fdae999SBram Moolenaar          3,
2361f5be8cdbSBram Moolenaar      } # comment
23624fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
23634fdae999SBram Moolenaar  mydict = #{
23642c330432SBram Moolenaar      one: 1,  # comment
23652c330432SBram Moolenaar      two:     # comment
23662c330432SBram Moolenaar           2,  # comment
23672c330432SBram Moolenaar      three: 3 # comment
23682c330432SBram Moolenaar      }
23692c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
23702c330432SBram Moolenaar  mydict = #{
23712c330432SBram Moolenaar      one: 1,
23724fdae999SBram Moolenaar      two:
23734fdae999SBram Moolenaar           2,
23742c330432SBram Moolenaar      three: 3
23754fdae999SBram Moolenaar      }
23764fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
2377e6085c53SBram Moolenaar
2378e6085c53SBram Moolenaar  assert_equal(
2379e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2380e6085c53SBram Moolenaar        split('one two three')
2381e6085c53SBram Moolenaar        )
23824fdae999SBram Moolenaarenddef
23834fdae999SBram Moolenaar
23847a092245SBram Moolenaardef Test_vim9_comment()
23857a092245SBram Moolenaar  CheckScriptSuccess([
23867a092245SBram Moolenaar      'vim9script',
23877a092245SBram Moolenaar      '# something',
23887a092245SBram Moolenaar      ])
23897a092245SBram Moolenaar  CheckScriptFailure([
23907a092245SBram Moolenaar      'vim9script',
23917a092245SBram Moolenaar      ':# something',
23927a092245SBram Moolenaar      ], 'E488:')
23937a092245SBram Moolenaar  CheckScriptFailure([
23947a092245SBram Moolenaar      '# something',
23957a092245SBram Moolenaar      ], 'E488:')
23967a092245SBram Moolenaar  CheckScriptFailure([
23977a092245SBram Moolenaar      ':# something',
23987a092245SBram Moolenaar      ], 'E488:')
23997a092245SBram Moolenaar
24004a8d9f2eSBram Moolenaar  { # block start
24014a8d9f2eSBram Moolenaar  } # block end
24024a8d9f2eSBram Moolenaar  CheckDefFailure([
24034a8d9f2eSBram Moolenaar      '{# comment',
24044a8d9f2eSBram Moolenaar      ], 'E488:')
24054a8d9f2eSBram Moolenaar  CheckDefFailure([
24064a8d9f2eSBram Moolenaar      '{',
24074a8d9f2eSBram Moolenaar      '}# comment',
24084a8d9f2eSBram Moolenaar      ], 'E488:')
24094a8d9f2eSBram Moolenaar
24104a8d9f2eSBram Moolenaar  echo "yes" # comment
24114a8d9f2eSBram Moolenaar  CheckDefFailure([
24124a8d9f2eSBram Moolenaar      'echo "yes"# comment',
24134a8d9f2eSBram Moolenaar      ], 'E488:')
24147a092245SBram Moolenaar  CheckScriptSuccess([
24157a092245SBram Moolenaar      'vim9script',
24167a092245SBram Moolenaar      'echo "yes" # something',
24177a092245SBram Moolenaar      ])
24187a092245SBram Moolenaar  CheckScriptFailure([
24197a092245SBram Moolenaar      'vim9script',
24207a092245SBram Moolenaar      'echo "yes"# something',
24217a092245SBram Moolenaar      ], 'E121:')
24227a092245SBram Moolenaar  CheckScriptFailure([
24237a092245SBram Moolenaar      'vim9script',
24247a092245SBram Moolenaar      'echo# something',
24257a092245SBram Moolenaar      ], 'E121:')
24267a092245SBram Moolenaar  CheckScriptFailure([
24277a092245SBram Moolenaar      'echo "yes" # something',
24287a092245SBram Moolenaar      ], 'E121:')
24297a092245SBram Moolenaar
24304a8d9f2eSBram Moolenaar  exe "echo" # comment
24314a8d9f2eSBram Moolenaar  CheckDefFailure([
24324a8d9f2eSBram Moolenaar      'exe "echo"# comment',
24334a8d9f2eSBram Moolenaar      ], 'E488:')
24344a8d9f2eSBram Moolenaar  CheckScriptSuccess([
24354a8d9f2eSBram Moolenaar      'vim9script',
24364a8d9f2eSBram Moolenaar      'exe "echo" # something',
24374a8d9f2eSBram Moolenaar      ])
24384a8d9f2eSBram Moolenaar  CheckScriptFailure([
24394a8d9f2eSBram Moolenaar      'vim9script',
24404a8d9f2eSBram Moolenaar      'exe "echo"# something',
24414a8d9f2eSBram Moolenaar      ], 'E121:')
24424a8d9f2eSBram Moolenaar  CheckDefFailure([
24434a8d9f2eSBram Moolenaar      'exe # comment',
24444a8d9f2eSBram Moolenaar      ], 'E1015:')
24454a8d9f2eSBram Moolenaar  CheckScriptFailure([
24464a8d9f2eSBram Moolenaar      'vim9script',
24474a8d9f2eSBram Moolenaar      'exe# something',
24484a8d9f2eSBram Moolenaar      ], 'E121:')
24494a8d9f2eSBram Moolenaar  CheckScriptFailure([
24504a8d9f2eSBram Moolenaar      'exe "echo" # something',
24514a8d9f2eSBram Moolenaar      ], 'E121:')
24524a8d9f2eSBram Moolenaar
24537a092245SBram Moolenaar  CheckDefFailure([
24547a092245SBram Moolenaar      'try# comment',
24557a092245SBram Moolenaar      '  echo "yes"',
24567a092245SBram Moolenaar      'catch',
24577a092245SBram Moolenaar      'endtry',
24587a092245SBram Moolenaar      ], 'E488:')
24592c5ed4e3SBram Moolenaar  CheckScriptFailure([
24602c5ed4e3SBram Moolenaar      'vim9script',
24612c5ed4e3SBram Moolenaar      'try# comment',
24622c5ed4e3SBram Moolenaar      'echo "yes"',
24632c5ed4e3SBram Moolenaar      ], 'E488:')
24647a092245SBram Moolenaar  CheckDefFailure([
24657a092245SBram Moolenaar      'try',
2466a72cfb80SBram Moolenaar      '  throw#comment',
2467a72cfb80SBram Moolenaar      'catch',
2468a72cfb80SBram Moolenaar      'endtry',
2469a72cfb80SBram Moolenaar      ], 'E1015:')
2470a72cfb80SBram Moolenaar  CheckDefFailure([
2471a72cfb80SBram Moolenaar      'try',
2472a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2473a72cfb80SBram Moolenaar      'catch',
2474a72cfb80SBram Moolenaar      'endtry',
2475a72cfb80SBram Moolenaar      ], 'E488:')
2476a72cfb80SBram Moolenaar  CheckDefFailure([
2477a72cfb80SBram Moolenaar      'try',
24787a092245SBram Moolenaar      '  echo "yes"',
24797a092245SBram Moolenaar      'catch# comment',
24807a092245SBram Moolenaar      'endtry',
24817a092245SBram Moolenaar      ], 'E488:')
24822c5ed4e3SBram Moolenaar  CheckScriptFailure([
24832c5ed4e3SBram Moolenaar      'vim9script',
24842c5ed4e3SBram Moolenaar      'try',
24852c5ed4e3SBram Moolenaar      '  echo "yes"',
24862c5ed4e3SBram Moolenaar      'catch# comment',
24872c5ed4e3SBram Moolenaar      'endtry',
24882c5ed4e3SBram Moolenaar      ], 'E654:')
24892c5ed4e3SBram Moolenaar  CheckDefFailure([
24902c5ed4e3SBram Moolenaar      'try',
24912c5ed4e3SBram Moolenaar      '  echo "yes"',
24922c5ed4e3SBram Moolenaar      'catch /pat/# comment',
24932c5ed4e3SBram Moolenaar      'endtry',
24942c5ed4e3SBram Moolenaar      ], 'E488:')
24957a092245SBram Moolenaar  CheckDefFailure([
24967a092245SBram Moolenaar      'try',
24977a092245SBram Moolenaar      'echo "yes"',
24987a092245SBram Moolenaar      'catch',
24997a092245SBram Moolenaar      'endtry# comment',
25007a092245SBram Moolenaar      ], 'E488:')
25012c5ed4e3SBram Moolenaar  CheckScriptFailure([
25022c5ed4e3SBram Moolenaar      'vim9script',
25032c5ed4e3SBram Moolenaar      'try',
25042c5ed4e3SBram Moolenaar      '  echo "yes"',
25052c5ed4e3SBram Moolenaar      'catch',
25062c5ed4e3SBram Moolenaar      'endtry# comment',
25079b7bf9e9SBram Moolenaar      ], 'E488:')
25082c5ed4e3SBram Moolenaar
25092c5ed4e3SBram Moolenaar  CheckScriptSuccess([
25102c5ed4e3SBram Moolenaar      'vim9script',
25112c5ed4e3SBram Moolenaar      'hi # comment',
25122c5ed4e3SBram Moolenaar      ])
25132c5ed4e3SBram Moolenaar  CheckScriptFailure([
25142c5ed4e3SBram Moolenaar      'vim9script',
25152c5ed4e3SBram Moolenaar      'hi# comment',
25162c5ed4e3SBram Moolenaar      ], 'E416:')
25171966c248SBram Moolenaar  CheckScriptSuccess([
25181966c248SBram Moolenaar      'vim9script',
25191966c248SBram Moolenaar      'hi Search # comment',
25201966c248SBram Moolenaar      ])
25211966c248SBram Moolenaar  CheckScriptFailure([
25221966c248SBram Moolenaar      'vim9script',
25231966c248SBram Moolenaar      'hi Search# comment',
25241966c248SBram Moolenaar      ], 'E416:')
25251966c248SBram Moolenaar  CheckScriptSuccess([
25261966c248SBram Moolenaar      'vim9script',
25271966c248SBram Moolenaar      'hi link This Search # comment',
25281966c248SBram Moolenaar      ])
25291966c248SBram Moolenaar  CheckScriptFailure([
25301966c248SBram Moolenaar      'vim9script',
25311966c248SBram Moolenaar      'hi link This That# comment',
25321966c248SBram Moolenaar      ], 'E413:')
25331966c248SBram Moolenaar  CheckScriptSuccess([
25341966c248SBram Moolenaar      'vim9script',
25351966c248SBram Moolenaar      'hi clear This # comment',
25361966c248SBram Moolenaar      'hi clear # comment',
25371966c248SBram Moolenaar      ])
2538f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2539f5be8cdbSBram Moolenaar  # hi clear This# comment',
25401966c248SBram Moolenaar  CheckScriptFailure([
25411966c248SBram Moolenaar      'vim9script',
25421966c248SBram Moolenaar      'hi clear# comment',
25431966c248SBram Moolenaar      ], 'E416:')
25441966c248SBram Moolenaar
25451966c248SBram Moolenaar  CheckScriptSuccess([
25461966c248SBram Moolenaar      'vim9script',
25471966c248SBram Moolenaar      'hi Group term=bold',
25481966c248SBram Moolenaar      'match Group /todo/ # comment',
25491966c248SBram Moolenaar      ])
25501966c248SBram Moolenaar  CheckScriptFailure([
25511966c248SBram Moolenaar      'vim9script',
25521966c248SBram Moolenaar      'hi Group term=bold',
25531966c248SBram Moolenaar      'match Group /todo/# comment',
25541966c248SBram Moolenaar      ], 'E488:')
25551966c248SBram Moolenaar  CheckScriptSuccess([
25561966c248SBram Moolenaar      'vim9script',
25571966c248SBram Moolenaar      'match # comment',
25581966c248SBram Moolenaar      ])
25591966c248SBram Moolenaar  CheckScriptFailure([
25601966c248SBram Moolenaar      'vim9script',
25611966c248SBram Moolenaar      'match# comment',
25621966c248SBram Moolenaar      ], 'E475:')
25631966c248SBram Moolenaar  CheckScriptSuccess([
25641966c248SBram Moolenaar      'vim9script',
25651966c248SBram Moolenaar      'match none # comment',
25661966c248SBram Moolenaar      ])
25671966c248SBram Moolenaar  CheckScriptFailure([
25681966c248SBram Moolenaar      'vim9script',
25691966c248SBram Moolenaar      'match none# comment',
25701966c248SBram Moolenaar      ], 'E475:')
25711966c248SBram Moolenaar
25721966c248SBram Moolenaar  CheckScriptSuccess([
25731966c248SBram Moolenaar      'vim9script',
25741966c248SBram Moolenaar      'menutrans clear # comment',
25751966c248SBram Moolenaar      ])
25761966c248SBram Moolenaar  CheckScriptFailure([
25771966c248SBram Moolenaar      'vim9script',
25781966c248SBram Moolenaar      'menutrans clear# comment text',
25791966c248SBram Moolenaar      ], 'E474:')
25801966c248SBram Moolenaar
25811966c248SBram Moolenaar  CheckScriptSuccess([
25821966c248SBram Moolenaar      'vim9script',
25831966c248SBram Moolenaar      'syntax clear # comment',
25841966c248SBram Moolenaar      ])
25851966c248SBram Moolenaar  CheckScriptFailure([
25861966c248SBram Moolenaar      'vim9script',
25871966c248SBram Moolenaar      'syntax clear# comment text',
25881966c248SBram Moolenaar      ], 'E28:')
25891966c248SBram Moolenaar  CheckScriptSuccess([
25901966c248SBram Moolenaar      'vim9script',
25911966c248SBram Moolenaar      'syntax keyword Word some',
25921966c248SBram Moolenaar      'syntax clear Word # comment',
25931966c248SBram Moolenaar      ])
25941966c248SBram Moolenaar  CheckScriptFailure([
25951966c248SBram Moolenaar      'vim9script',
25961966c248SBram Moolenaar      'syntax keyword Word some',
25971966c248SBram Moolenaar      'syntax clear Word# comment text',
25981966c248SBram Moolenaar      ], 'E28:')
25991966c248SBram Moolenaar
26001966c248SBram Moolenaar  CheckScriptSuccess([
26011966c248SBram Moolenaar      'vim9script',
26021966c248SBram Moolenaar      'syntax list # comment',
26031966c248SBram Moolenaar      ])
26041966c248SBram Moolenaar  CheckScriptFailure([
26051966c248SBram Moolenaar      'vim9script',
26061966c248SBram Moolenaar      'syntax list# comment text',
26071966c248SBram Moolenaar      ], 'E28:')
26081966c248SBram Moolenaar
26091966c248SBram Moolenaar  CheckScriptSuccess([
26101966c248SBram Moolenaar      'vim9script',
26111966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
26121966c248SBram Moolenaar      ])
26131966c248SBram Moolenaar  CheckScriptFailure([
26141966c248SBram Moolenaar      'vim9script',
26151966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
26161966c248SBram Moolenaar      ], 'E475:')
26171966c248SBram Moolenaar
26181966c248SBram Moolenaar  CheckScriptSuccess([
26191966c248SBram Moolenaar      'vim9script',
26201966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
26211966c248SBram Moolenaar      ])
26221966c248SBram Moolenaar  CheckScriptFailure([
26231966c248SBram Moolenaar      'vim9script',
26241966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
26251966c248SBram Moolenaar      ], 'E789:')
26261966c248SBram Moolenaar
26271966c248SBram Moolenaar  CheckScriptSuccess([
26281966c248SBram Moolenaar      'vim9script',
26291966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
26301966c248SBram Moolenaar      ])
26311966c248SBram Moolenaar  CheckScriptFailure([
26321966c248SBram Moolenaar      'vim9script',
26331966c248SBram Moolenaar      'syntax match Word /pat/# comment',
26341966c248SBram Moolenaar      ], 'E402:')
26351966c248SBram Moolenaar
26361966c248SBram Moolenaar  CheckScriptSuccess([
26371966c248SBram Moolenaar      'vim9script',
26381966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
26391966c248SBram Moolenaar      ])
26401966c248SBram Moolenaar  CheckScriptFailure([
26411966c248SBram Moolenaar      'vim9script',
26421966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
26431966c248SBram Moolenaar      ], 'E475:')
26441966c248SBram Moolenaar  CheckScriptFailure([
26451966c248SBram Moolenaar      'vim9script',
26461966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
26471966c248SBram Moolenaar      ], 'E406:')
26481966c248SBram Moolenaar  CheckScriptFailure([
26491966c248SBram Moolenaar      'vim9script',
26501966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
26511966c248SBram Moolenaar      ], 'E475:')
26521966c248SBram Moolenaar
26531966c248SBram Moolenaar  CheckScriptSuccess([
26541966c248SBram Moolenaar      'vim9script',
26551966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
26561966c248SBram Moolenaar      ])
26571966c248SBram Moolenaar  CheckScriptFailure([
26581966c248SBram Moolenaar      'vim9script',
26591966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2660d032f34aSBram Moolenaar      ], 'E402:')
26611966c248SBram Moolenaar
26621966c248SBram Moolenaar  CheckScriptSuccess([
26631966c248SBram Moolenaar      'vim9script',
26641966c248SBram Moolenaar      'syntax sync # comment',
26651966c248SBram Moolenaar      ])
26661966c248SBram Moolenaar  CheckScriptFailure([
26671966c248SBram Moolenaar      'vim9script',
26681966c248SBram Moolenaar      'syntax sync# comment',
26691966c248SBram Moolenaar      ], 'E404:')
26701966c248SBram Moolenaar  CheckScriptSuccess([
26711966c248SBram Moolenaar      'vim9script',
26721966c248SBram Moolenaar      'syntax sync ccomment # comment',
26731966c248SBram Moolenaar      ])
26741966c248SBram Moolenaar  CheckScriptFailure([
26751966c248SBram Moolenaar      'vim9script',
26761966c248SBram Moolenaar      'syntax sync ccomment# comment',
26771966c248SBram Moolenaar      ], 'E404:')
26781966c248SBram Moolenaar
26791966c248SBram Moolenaar  CheckScriptSuccess([
26801966c248SBram Moolenaar      'vim9script',
26811966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
26821966c248SBram Moolenaar      ])
26831966c248SBram Moolenaar  CheckScriptFailure([
26841966c248SBram Moolenaar      'vim9script',
26851966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
26861966c248SBram Moolenaar      ], 'E475:')
2687a72cfb80SBram Moolenaar
2688a72cfb80SBram Moolenaar  CheckScriptSuccess([
2689a72cfb80SBram Moolenaar      'vim9script',
2690a72cfb80SBram Moolenaar      'command Echo echo # comment',
2691a72cfb80SBram Moolenaar      'command Echo # comment',
2692a72cfb80SBram Moolenaar      ])
2693a72cfb80SBram Moolenaar  CheckScriptFailure([
2694a72cfb80SBram Moolenaar      'vim9script',
2695a72cfb80SBram Moolenaar      'command Echo echo# comment',
2696a72cfb80SBram Moolenaar      'Echo',
2697a72cfb80SBram Moolenaar      ], 'E121:')
2698a72cfb80SBram Moolenaar  CheckScriptFailure([
2699a72cfb80SBram Moolenaar      'vim9script',
2700a72cfb80SBram Moolenaar      'command Echo# comment',
2701a72cfb80SBram Moolenaar      ], 'E182:')
2702a72cfb80SBram Moolenaar  CheckScriptFailure([
2703a72cfb80SBram Moolenaar      'vim9script',
2704a72cfb80SBram Moolenaar      'command Echo echo',
2705a72cfb80SBram Moolenaar      'command Echo# comment',
2706a72cfb80SBram Moolenaar      ], 'E182:')
2707a72cfb80SBram Moolenaar
2708a72cfb80SBram Moolenaar  CheckScriptSuccess([
2709a72cfb80SBram Moolenaar      'vim9script',
2710a72cfb80SBram Moolenaar      'function # comment',
2711a72cfb80SBram Moolenaar      ])
2712a72cfb80SBram Moolenaar  CheckScriptFailure([
2713a72cfb80SBram Moolenaar      'vim9script',
27149898107fSBram Moolenaar      'function " comment',
27159898107fSBram Moolenaar      ], 'E129:')
27169898107fSBram Moolenaar  CheckScriptFailure([
27179898107fSBram Moolenaar      'vim9script',
2718a72cfb80SBram Moolenaar      'function# comment',
2719a72cfb80SBram Moolenaar      ], 'E129:')
2720a72cfb80SBram Moolenaar  CheckScriptSuccess([
2721a72cfb80SBram Moolenaar      'vim9script',
2722a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2723a72cfb80SBram Moolenaar      ])
2724a72cfb80SBram Moolenaar  CheckScriptFailure([
2725a72cfb80SBram Moolenaar      'vim9script',
2726a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2727a72cfb80SBram Moolenaar      ], 'E488:')
2728a72cfb80SBram Moolenaar
2729a72cfb80SBram Moolenaar  CheckScriptSuccess([
2730a72cfb80SBram Moolenaar      'vim9script',
27314c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2732a72cfb80SBram Moolenaar      'endfunc',
27334c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2734a72cfb80SBram Moolenaar      ])
2735a72cfb80SBram Moolenaar  CheckScriptFailure([
2736a72cfb80SBram Moolenaar      'vim9script',
27374c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2738a72cfb80SBram Moolenaar      'endfunc',
27394c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2740a72cfb80SBram Moolenaar      ], 'E488:')
2741a72cfb80SBram Moolenaar
2742a72cfb80SBram Moolenaar  CheckScriptSuccess([
2743a72cfb80SBram Moolenaar      'vim9script',
2744a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2745a72cfb80SBram Moolenaar      ])
2746a72cfb80SBram Moolenaar  CheckScriptFailure([
2747a72cfb80SBram Moolenaar      'vim9script',
2748a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2749a72cfb80SBram Moolenaar      ], 'E488:')
2750e7e4838fSBram Moolenaar
2751e7e4838fSBram Moolenaar  CheckScriptFailure([
2752e7e4838fSBram Moolenaar      'def Test() " comment',
2753e7e4838fSBram Moolenaar      'enddef',
2754e7e4838fSBram Moolenaar      ], 'E488:')
2755e7e4838fSBram Moolenaar  CheckScriptFailure([
2756e7e4838fSBram Moolenaar      'vim9script',
2757e7e4838fSBram Moolenaar      'def Test() " comment',
2758e7e4838fSBram Moolenaar      'enddef',
2759e7e4838fSBram Moolenaar      ], 'E488:')
2760e7e4838fSBram Moolenaar
2761e7e4838fSBram Moolenaar  CheckScriptSuccess([
2762e7e4838fSBram Moolenaar      'func Test() " comment',
2763e7e4838fSBram Moolenaar      'endfunc',
2764e7e4838fSBram Moolenaar      ])
27659898107fSBram Moolenaar  CheckScriptSuccess([
2766e7e4838fSBram Moolenaar      'vim9script',
2767e7e4838fSBram Moolenaar      'func Test() " comment',
2768e7e4838fSBram Moolenaar      'endfunc',
27699898107fSBram Moolenaar      ])
2770e7e4838fSBram Moolenaar
2771e7e4838fSBram Moolenaar  CheckScriptSuccess([
2772e7e4838fSBram Moolenaar      'def Test() # comment',
2773e7e4838fSBram Moolenaar      'enddef',
2774e7e4838fSBram Moolenaar      ])
2775e7e4838fSBram Moolenaar  CheckScriptFailure([
2776e7e4838fSBram Moolenaar      'func Test() # comment',
2777e7e4838fSBram Moolenaar      'endfunc',
2778e7e4838fSBram Moolenaar      ], 'E488:')
27792c5ed4e3SBram Moolenaarenddef
27802c5ed4e3SBram Moolenaar
27812c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
27822c5ed4e3SBram Moolenaar  CheckCanRunGui
27832c5ed4e3SBram Moolenaar
27842c5ed4e3SBram Moolenaar  CheckScriptFailure([
27852c5ed4e3SBram Moolenaar      'vim9script',
27862c5ed4e3SBram Moolenaar      'gui#comment'
27872c5ed4e3SBram Moolenaar      ], 'E499:')
27882c5ed4e3SBram Moolenaar  CheckScriptFailure([
27892c5ed4e3SBram Moolenaar      'vim9script',
27902c5ed4e3SBram Moolenaar      'gui -f#comment'
27912c5ed4e3SBram Moolenaar      ], 'E499:')
27927a092245SBram Moolenaarenddef
27937a092245SBram Moolenaar
2794a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
27956797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
27966797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2797a26b9700SBram Moolenaar
2798a26b9700SBram Moolenaar  edit test.vim
2799a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2800a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2801a26b9700SBram Moolenaar
2802a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2803a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2804a26b9700SBram Moolenaar
2805a26b9700SBram Moolenaar  g:entered = 0
2806a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2807a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2808a26b9700SBram Moolenaar
2809a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2810a26b9700SBram Moolenaar
2811a26b9700SBram Moolenaar  au! TabEnter
2812a26b9700SBram Moolenaar  unlet g:entered
2813d72c1bf0SBram Moolenaar
2814d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2815d72c1bf0SBram Moolenaar      'vim9script',
28166797966dSBram Moolenaar      'g:var = 123',
2817e55b1c09SBram Moolenaar      'b:var = 456',
2818e55b1c09SBram Moolenaar      'w:var = 777',
2819e55b1c09SBram Moolenaar      't:var = 888',
2820d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2821d72c1bf0SBram Moolenaar      ])
2822d72c1bf0SBram Moolenaar
2823d72c1bf0SBram Moolenaar  CheckScriptFailure([
2824d72c1bf0SBram Moolenaar      'vim9script',
2825d72c1bf0SBram Moolenaar      'let g:var = 123',
2826e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2827e55b1c09SBram Moolenaar
2828e55b1c09SBram Moolenaar  CheckScriptFailure([
2829e55b1c09SBram Moolenaar      'vim9script',
2830e55b1c09SBram Moolenaar      'let b:var = 123',
2831e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2832e55b1c09SBram Moolenaar
2833e55b1c09SBram Moolenaar  CheckScriptFailure([
2834e55b1c09SBram Moolenaar      'vim9script',
2835e55b1c09SBram Moolenaar      'let w:var = 123',
2836e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2837e55b1c09SBram Moolenaar
2838e55b1c09SBram Moolenaar  CheckScriptFailure([
2839e55b1c09SBram Moolenaar      'vim9script',
2840e55b1c09SBram Moolenaar      'let t:var = 123',
2841e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2842e55b1c09SBram Moolenaar
2843e55b1c09SBram Moolenaar  CheckScriptFailure([
2844e55b1c09SBram Moolenaar      'vim9script',
2845e55b1c09SBram Moolenaar      'let v:version = 123',
2846e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2847e55b1c09SBram Moolenaar
2848e55b1c09SBram Moolenaar  CheckScriptFailure([
2849e55b1c09SBram Moolenaar      'vim9script',
2850e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2851e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
28526797966dSBram Moolenaar
28536797966dSBram Moolenaar  CheckScriptFailure([
28546797966dSBram Moolenaar      'vim9script',
28556797966dSBram Moolenaar      'g:var = 123',
285632e35117SBram Moolenaar      'unlet g:var# comment1',
2857d72c1bf0SBram Moolenaar      ], 'E108:')
2858d72c1bf0SBram Moolenaar
2859d72c1bf0SBram Moolenaar  CheckScriptFailure([
2860d72c1bf0SBram Moolenaar      'let g:var = 123',
2861d72c1bf0SBram Moolenaar      'unlet g:var # something',
2862d72c1bf0SBram Moolenaar      ], 'E488:')
2863faac4104SBram Moolenaar
2864faac4104SBram Moolenaar  CheckScriptSuccess([
2865faac4104SBram Moolenaar      'vim9script',
286632e35117SBram Moolenaar      'if 1 # comment2',
2867faac4104SBram Moolenaar      '  echo "yes"',
2868faac4104SBram Moolenaar      'elseif 2 #comment',
2869faac4104SBram Moolenaar      '  echo "no"',
2870faac4104SBram Moolenaar      'endif',
2871faac4104SBram Moolenaar      ])
2872faac4104SBram Moolenaar
2873faac4104SBram Moolenaar  CheckScriptFailure([
2874faac4104SBram Moolenaar      'vim9script',
287532e35117SBram Moolenaar      'if 1# comment3',
2876faac4104SBram Moolenaar      '  echo "yes"',
2877faac4104SBram Moolenaar      'endif',
2878faac4104SBram Moolenaar      ], 'E15:')
2879faac4104SBram Moolenaar
2880faac4104SBram Moolenaar  CheckScriptFailure([
2881faac4104SBram Moolenaar      'vim9script',
288232e35117SBram Moolenaar      'if 0 # comment4',
2883faac4104SBram Moolenaar      '  echo "yes"',
2884faac4104SBram Moolenaar      'elseif 2#comment',
2885faac4104SBram Moolenaar      '  echo "no"',
2886faac4104SBram Moolenaar      'endif',
2887faac4104SBram Moolenaar      ], 'E15:')
2888faac4104SBram Moolenaar
2889faac4104SBram Moolenaar  CheckScriptSuccess([
2890faac4104SBram Moolenaar      'vim9script',
289132e35117SBram Moolenaar      'let v = 1 # comment5',
2892faac4104SBram Moolenaar      ])
2893faac4104SBram Moolenaar
2894faac4104SBram Moolenaar  CheckScriptFailure([
2895faac4104SBram Moolenaar      'vim9script',
289632e35117SBram Moolenaar      'let v = 1# comment6',
289732e35117SBram Moolenaar      ], 'E15:')
2898faac4104SBram Moolenaar
2899faac4104SBram Moolenaar  CheckScriptSuccess([
2900faac4104SBram Moolenaar      'vim9script',
2901faac4104SBram Moolenaar      'new'
2902faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2903df069eecSBram Moolenaar      ':$',
2904faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2905faac4104SBram Moolenaar      'bwipe!',
2906faac4104SBram Moolenaar      ])
2907faac4104SBram Moolenaar
2908f5be8cdbSBram Moolenaar  CheckScriptFailure([
2909f5be8cdbSBram Moolenaar      'vim9script',
2910f5be8cdbSBram Moolenaar      'new'
2911f5be8cdbSBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2912f5be8cdbSBram Moolenaar      ':$',
2913f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2914f5be8cdbSBram Moolenaar      'bwipe!',
2915f5be8cdbSBram Moolenaar      ], 'E488:')
2916f5be8cdbSBram Moolenaar
2917f5be8cdbSBram Moolenaar  CheckScriptFailure([
2918f5be8cdbSBram Moolenaar      'vim9script',
2919f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2920f5be8cdbSBram Moolenaar      ], 'E477:')
2921a26b9700SBram Moolenaarenddef
2922a26b9700SBram Moolenaar
29237e5bd91dSBram Moolenaardef Test_finish()
29247e5bd91dSBram Moolenaar  let lines =<< trim END
29257e5bd91dSBram Moolenaar    vim9script
29266797966dSBram Moolenaar    g:res = 'one'
29277e5bd91dSBram Moolenaar    if v:false | finish | endif
29286797966dSBram Moolenaar    g:res = 'two'
29297e5bd91dSBram Moolenaar    finish
29306797966dSBram Moolenaar    g:res = 'three'
29317e5bd91dSBram Moolenaar  END
29327e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
29337e5bd91dSBram Moolenaar  source Xfinished
29347e5bd91dSBram Moolenaar  assert_equal('two', g:res)
29357e5bd91dSBram Moolenaar
29367e5bd91dSBram Moolenaar  unlet g:res
29377e5bd91dSBram Moolenaar  delete('Xfinished')
29387e5bd91dSBram Moolenaarenddef
29397e5bd91dSBram Moolenaar
294032e35117SBram Moolenaardef Test_let_func_call()
294132e35117SBram Moolenaar  let lines =<< trim END
294232e35117SBram Moolenaar    vim9script
294332e35117SBram Moolenaar    func GetValue()
294432e35117SBram Moolenaar      if exists('g:count')
294532e35117SBram Moolenaar        let g:count += 1
294632e35117SBram Moolenaar      else
294732e35117SBram Moolenaar        let g:count = 1
294832e35117SBram Moolenaar      endif
294932e35117SBram Moolenaar      return 'this'
295032e35117SBram Moolenaar    endfunc
295132e35117SBram Moolenaar    let val: string = GetValue()
2952f5be8cdbSBram Moolenaar    # env var is always a string
2953df671b46SBram Moolenaar    let env = $TERM
295432e35117SBram Moolenaar  END
295532e35117SBram Moolenaar  writefile(lines, 'Xfinished')
295632e35117SBram Moolenaar  source Xfinished
2957f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
295832e35117SBram Moolenaar  assert_equal(1, g:count)
295932e35117SBram Moolenaar
296032e35117SBram Moolenaar  unlet g:count
296132e35117SBram Moolenaar  delete('Xfinished')
296232e35117SBram Moolenaarenddef
296332e35117SBram Moolenaar
296432e35117SBram Moolenaardef Test_let_missing_type()
296532e35117SBram Moolenaar  let lines =<< trim END
296632e35117SBram Moolenaar    vim9script
2967df671b46SBram Moolenaar    let var = g:unknown
2968227a69deSBram Moolenaar  END
2969822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2970227a69deSBram Moolenaar
2971227a69deSBram Moolenaar  lines =<< trim END
2972227a69deSBram Moolenaar    vim9script
2973227a69deSBram Moolenaar    let nr: number = 123
2974227a69deSBram Moolenaar    let var = nr
2975227a69deSBram Moolenaar  END
2976822ba247SBram Moolenaar  CheckScriptSuccess(lines)
297732e35117SBram Moolenaarenddef
297832e35117SBram Moolenaar
2979c82a5b5dSBram Moolenaardef Test_let_declaration()
2980c82a5b5dSBram Moolenaar  let lines =<< trim END
2981c82a5b5dSBram Moolenaar    vim9script
2982c82a5b5dSBram Moolenaar    let var: string
2983c82a5b5dSBram Moolenaar    g:var_uninit = var
2984c82a5b5dSBram Moolenaar    var = 'text'
2985c82a5b5dSBram Moolenaar    g:var_test = var
2986f5be8cdbSBram Moolenaar    # prefixing s: is optional
2987984dddbeSBram Moolenaar    s:var = 'prefixed'
2988984dddbeSBram Moolenaar    g:var_prefixed = s:var
2989984dddbeSBram Moolenaar
2990984dddbeSBram Moolenaar    let s:other: number
2991984dddbeSBram Moolenaar    other = 1234
2992984dddbeSBram Moolenaar    g:other_var = other
299353b29e48SBram Moolenaar
299453b29e48SBram Moolenaar    # type is inferred
299553b29e48SBram Moolenaar    s:dict = {'a': 222}
299653b29e48SBram Moolenaar    def GetDictVal(key: any)
299753b29e48SBram Moolenaar      g:dict_val = s:dict[key]
299853b29e48SBram Moolenaar    enddef
299953b29e48SBram Moolenaar    GetDictVal('a')
3000c82a5b5dSBram Moolenaar  END
3001c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
3002c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
3003c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
3004984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
3005984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
300653b29e48SBram Moolenaar  assert_equal(222, g:dict_val)
3007c82a5b5dSBram Moolenaar
3008c82a5b5dSBram Moolenaar  unlet g:var_uninit
3009c82a5b5dSBram Moolenaar  unlet g:var_test
3010984dddbeSBram Moolenaar  unlet g:var_prefixed
3011984dddbeSBram Moolenaar  unlet g:other_var
3012c82a5b5dSBram Moolenaarenddef
3013c82a5b5dSBram Moolenaar
3014c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
3015c5b1c20bSBram Moolenaar  let lines =<< trim END
3016c5b1c20bSBram Moolenaar    vim9script
3017c5b1c20bSBram Moolenaar    const var: string
3018c5b1c20bSBram Moolenaar  END
3019c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
3020c5b1c20bSBram Moolenaar
3021c5b1c20bSBram Moolenaar  lines =<< trim END
3022c5b1c20bSBram Moolenaar    vim9script
3023c5b1c20bSBram Moolenaar    let 9var: string
3024c5b1c20bSBram Moolenaar  END
3025c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
3026c5b1c20bSBram Moolenaarenddef
3027c5b1c20bSBram Moolenaar
302834db91f7SBram Moolenaardef Test_let_type_check()
302934db91f7SBram Moolenaar  let lines =<< trim END
303034db91f7SBram Moolenaar    vim9script
303134db91f7SBram Moolenaar    let var: string
303234db91f7SBram Moolenaar    var = 1234
303334db91f7SBram Moolenaar  END
3034451c2e35SBram Moolenaar  CheckScriptFailure(lines, 'E1012:')
3035984dddbeSBram Moolenaar
3036984dddbeSBram Moolenaar  lines =<< trim END
3037984dddbeSBram Moolenaar    vim9script
3038984dddbeSBram Moolenaar    let var:string
3039984dddbeSBram Moolenaar  END
3040984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
3041c5b1c20bSBram Moolenaar
3042c5b1c20bSBram Moolenaar  lines =<< trim END
3043c5b1c20bSBram Moolenaar    vim9script
3044c5b1c20bSBram Moolenaar    let var: asdf
3045c5b1c20bSBram Moolenaar  END
3046c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
3047a71e2633SBram Moolenaar
3048a71e2633SBram Moolenaar  lines =<< trim END
3049a71e2633SBram Moolenaar    vim9script
3050a71e2633SBram Moolenaar    let s:l: list<number>
3051a71e2633SBram Moolenaar    s:l = []
3052a71e2633SBram Moolenaar  END
3053a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
3054a71e2633SBram Moolenaar
3055a71e2633SBram Moolenaar  lines =<< trim END
3056a71e2633SBram Moolenaar    vim9script
3057a71e2633SBram Moolenaar    let s:d: dict<number>
3058a71e2633SBram Moolenaar    s:d = {}
3059a71e2633SBram Moolenaar  END
3060a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
306134db91f7SBram Moolenaarenddef
306234db91f7SBram Moolenaar
3063a5d0077eSBram Moolenaardef Test_forward_declaration()
3064a5d0077eSBram Moolenaar  let lines =<< trim END
3065a5d0077eSBram Moolenaar    vim9script
3066a5d0077eSBram Moolenaar    def GetValue(): string
3067a5d0077eSBram Moolenaar      return theVal
3068a5d0077eSBram Moolenaar    enddef
3069a5d0077eSBram Moolenaar    let theVal = 'something'
3070822ba247SBram Moolenaar    g:initVal = GetValue()
3071a5d0077eSBram Moolenaar    theVal = 'else'
3072a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3073a5d0077eSBram Moolenaar  END
3074a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3075a5d0077eSBram Moolenaar  source Xforward
3076a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3077a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3078a5d0077eSBram Moolenaar
3079a5d0077eSBram Moolenaar  unlet g:initVal
3080a5d0077eSBram Moolenaar  unlet g:laterVal
3081a5d0077eSBram Moolenaar  delete('Xforward')
3082a5d0077eSBram Moolenaarenddef
3083a5d0077eSBram Moolenaar
30849721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
30859721fb4eSBram Moolenaar  let legacy_lines =<< trim END
30869721fb4eSBram Moolenaar    source Xvim9_script.vim
30879721fb4eSBram Moolenaar
30889721fb4eSBram Moolenaar    call assert_false(exists('local'))
30899721fb4eSBram Moolenaar    call assert_false(exists('exported'))
30909721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
30919721fb4eSBram Moolenaar    call assert_equal('global', global)
30929721fb4eSBram Moolenaar    call assert_equal('global', g:global)
30939721fb4eSBram Moolenaar
30949721fb4eSBram Moolenaar    " imported variable becomes script-local
30959721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
30969721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
30979721fb4eSBram Moolenaar    call assert_false(exists('exported'))
30989721fb4eSBram Moolenaar
30999721fb4eSBram Moolenaar    " imported function becomes script-local
31009721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
31019721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
31029721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
31039721fb4eSBram Moolenaar  END
31049721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
31059721fb4eSBram Moolenaar
31069721fb4eSBram Moolenaar  let vim9_lines =<< trim END
31079721fb4eSBram Moolenaar    vim9script
31089721fb4eSBram Moolenaar    let local = 'local'
31099721fb4eSBram Moolenaar    g:global = 'global'
31109721fb4eSBram Moolenaar    export let exported = 'exported'
31119721fb4eSBram Moolenaar    export def GetText(): string
31129721fb4eSBram Moolenaar       return 'text'
31139721fb4eSBram Moolenaar    enddef
31149721fb4eSBram Moolenaar  END
31159721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
31169721fb4eSBram Moolenaar
31179721fb4eSBram Moolenaar  source Xlegacy_script.vim
31189721fb4eSBram Moolenaar
31199721fb4eSBram Moolenaar  assert_equal('global', g:global)
3120f5be8cdbSBram Moolenaar  unlet g:global
31219721fb4eSBram Moolenaar
31229721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
31239721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
31249721fb4eSBram Moolenaarenddef
3125a5d0077eSBram Moolenaar
31267d699701SBram Moolenaarfunc Test_vim9script_not_global()
31277d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
31287d699701SBram Moolenaar  let vim9lines =<< trim END
31297d699701SBram Moolenaar    vim9script
31307d699701SBram Moolenaar    let var = 'local'
31317d699701SBram Moolenaar    func TheFunc()
31327d699701SBram Moolenaar      echo 'local'
31337d699701SBram Moolenaar    endfunc
31347d699701SBram Moolenaar    def DefFunc()
31357d699701SBram Moolenaar      echo 'local'
31367d699701SBram Moolenaar    enddef
31377d699701SBram Moolenaar  END
31387d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
31397d699701SBram Moolenaar  source Xvim9script.vim
31407d699701SBram Moolenaar  try
31417d699701SBram Moolenaar    echo g:var
31427d699701SBram Moolenaar    assert_report('did not fail')
31437d699701SBram Moolenaar  catch /E121:/
31447d699701SBram Moolenaar    " caught
31457d699701SBram Moolenaar  endtry
31467d699701SBram Moolenaar  try
31477d699701SBram Moolenaar    call TheFunc()
31487d699701SBram Moolenaar    assert_report('did not fail')
31497d699701SBram Moolenaar  catch /E117:/
31507d699701SBram Moolenaar    " caught
31517d699701SBram Moolenaar  endtry
31527d699701SBram Moolenaar  try
31537d699701SBram Moolenaar    call DefFunc()
31547d699701SBram Moolenaar    assert_report('did not fail')
31557d699701SBram Moolenaar  catch /E117:/
31567d699701SBram Moolenaar    " caught
31577d699701SBram Moolenaar  endtry
31587d699701SBram Moolenaar
31597d699701SBram Moolenaar  call delete('Xvim9script.vium')
31607d699701SBram Moolenaarendfunc
31617d699701SBram Moolenaar
3162eeb27bfeSBram Moolenaardef Test_vim9_copen()
3163eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3164eeb27bfeSBram Moolenaar  copen
3165eeb27bfeSBram Moolenaar  quit
3166eeb27bfeSBram Moolenaarenddef
3167eeb27bfeSBram Moolenaar
31682d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
31692d6b20d6SBram Moolenaardef Test_vim9_autoload()
31702d6b20d6SBram Moolenaar  let lines =<< trim END
31712d6b20d6SBram Moolenaar     vim9script
31722d6b20d6SBram Moolenaar     def foo#test()
31732d6b20d6SBram Moolenaar         echomsg getreg('"')
31742d6b20d6SBram Moolenaar     enddef
31752d6b20d6SBram Moolenaar  END
31762d6b20d6SBram Moolenaar
31772d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
31782d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
31792d6b20d6SBram Moolenaar  let save_rtp = &rtp
31802d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
31812d6b20d6SBram Moolenaar  augroup test
31822d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
31832d6b20d6SBram Moolenaar  augroup END
31842d6b20d6SBram Moolenaar
31852d6b20d6SBram Moolenaar  normal Y
31862d6b20d6SBram Moolenaar
31872d6b20d6SBram Moolenaar  augroup test
31882d6b20d6SBram Moolenaar    autocmd!
31892d6b20d6SBram Moolenaar  augroup END
31902d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
31912d6b20d6SBram Moolenaar  &rtp = save_rtp
31922d6b20d6SBram Moolenaarenddef
31932d6b20d6SBram Moolenaar
319481e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
319581e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
319681e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
319781e17fbeSBram Moolenaar  let lines =<< trim END
319881e17fbeSBram Moolenaar    let s:counter = 1
319981e17fbeSBram Moolenaar    def s:Func()
320081e17fbeSBram Moolenaar      au! CursorHold
320181e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
320281e17fbeSBram Moolenaar    enddef
320381e17fbeSBram Moolenaar    call s:Func()
320481e17fbeSBram Moolenaar    doau CursorHold
320581e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
320681e17fbeSBram Moolenaar    au! CursorHold
320781e17fbeSBram Moolenaar  END
320881e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
320981e17fbeSBram Moolenaarenddef
321081e17fbeSBram Moolenaar
32113896a105SBram Moolenaardef Test_cmdline_win()
32123896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
32133896a105SBram Moolenaar  # the command line window.
32143896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
32153896a105SBram Moolenaar  let export_lines =<< trim END
32163896a105SBram Moolenaar    vim9script
32173896a105SBram Moolenaar    export let That = 'yes'
32183896a105SBram Moolenaar  END
32193896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
32203896a105SBram Moolenaar  let import_lines =<< trim END
32213896a105SBram Moolenaar    vim9script
32223896a105SBram Moolenaar    import That from './Xexport.vim'
32233896a105SBram Moolenaar  END
32243896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
32253896a105SBram Moolenaar  let save_rtp = &rtp
32263896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
32273896a105SBram Moolenaar  syntax on
32283896a105SBram Moolenaar  augroup CmdWin
32293896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
32303896a105SBram Moolenaar  augroup END
32313896a105SBram Moolenaar  # this will open and also close the cmdline window
32323896a105SBram Moolenaar  feedkeys('q:', 'xt')
32333896a105SBram Moolenaar  assert_equal('yes', g:got_there)
32343896a105SBram Moolenaar
32353896a105SBram Moolenaar  augroup CmdWin
32363896a105SBram Moolenaar    au!
32373896a105SBram Moolenaar  augroup END
32383896a105SBram Moolenaar  &rtp = save_rtp
32393896a105SBram Moolenaar  delete('rtp', 'rf')
32403896a105SBram Moolenaarenddef
32413896a105SBram Moolenaar
3242585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3243585fea7bSBram Moolenaardef Test_substitute_cmd()
3244585fea7bSBram Moolenaar  new
3245585fea7bSBram Moolenaar  setline(1, 'something')
3246585fea7bSBram Moolenaar  :substitute(some(other(
3247585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3248585fea7bSBram Moolenaar  bwipe!
3249585fea7bSBram Moolenaar
3250f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3251585fea7bSBram Moolenaar  let lines =<< trim END
3252585fea7bSBram Moolenaar    vim9script
3253585fea7bSBram Moolenaar    new
3254585fea7bSBram Moolenaar    setline(1, 'something')
3255585fea7bSBram Moolenaar    :substitute(some(other(
3256585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3257585fea7bSBram Moolenaar    bwipe!
3258585fea7bSBram Moolenaar  END
3259585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3260585fea7bSBram Moolenaar  source Xvim9lines
3261585fea7bSBram Moolenaar
3262585fea7bSBram Moolenaar  delete('Xvim9lines')
3263585fea7bSBram Moolenaarenddef
3264585fea7bSBram Moolenaar
32658a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3266