18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4101f4810SBram Moolenaarsource term_util.vim
5ad39c094SBram Moolenaarsource view_util.vim
6cfe435d7SBram Moolenaarsource vim9.vim
7e3d4685fSBram Moolenaarsource shared.vim
88a7d6542SBram Moolenaar
98a7d6542SBram Moolenaardef Test_syntax()
108a7d6542SBram Moolenaar  let var = 234
118a7d6542SBram Moolenaar  let other: list<string> = ['asdf']
128a7d6542SBram Moolenaarenddef
138a7d6542SBram Moolenaar
145d72ce69SBram Moolenaardef Test_range_only()
155d72ce69SBram Moolenaar  new
165d72ce69SBram Moolenaar  setline(1, ['blah', 'Blah'])
175d72ce69SBram Moolenaar  :/Blah/
185d72ce69SBram Moolenaar  assert_equal(2, getcurpos()[1])
19c2af0affSBram Moolenaar  bwipe!
20c2af0affSBram Moolenaar
21c2af0affSBram Moolenaar  # without range commands use current line
22c2af0affSBram Moolenaar  new
23c2af0affSBram Moolenaar  setline(1, ['one', 'two', 'three'])
24c2af0affSBram Moolenaar  :2
25c2af0affSBram Moolenaar  print
26c2af0affSBram Moolenaar  assert_equal('two', Screenline(&lines))
27c2af0affSBram Moolenaar  :3
28c2af0affSBram Moolenaar  list
29c2af0affSBram Moolenaar  assert_equal('three$', Screenline(&lines))
30c2af0affSBram Moolenaar  bwipe!
315d72ce69SBram Moolenaarenddef
325d72ce69SBram Moolenaar
336e587dcbSBram Moolenaarlet s:appendToMe = 'xxx'
346e587dcbSBram Moolenaarlet s:addToMe = 111
35401d9ffbSBram Moolenaarlet g:existing = 'yes'
36a8c17704SBram Moolenaarlet g:inc_counter = 1
37a8c17704SBram Moolenaarlet $SOME_ENV_VAR = 'some'
38a6e67e4fSBram Moolenaarlet g:alist = [7]
39a6e67e4fSBram Moolenaarlet g:astring = 'text'
40f0b9f43cSBram Moolenaarlet g:anumber = 123
416e587dcbSBram Moolenaar
42ba7c0d7bSBram Moolenaardef Test_assignment_bool()
438a7d6542SBram Moolenaar  let bool1: bool = true
448a7d6542SBram Moolenaar  assert_equal(v:true, bool1)
458a7d6542SBram Moolenaar  let bool2: bool = false
468a7d6542SBram Moolenaar  assert_equal(v:false, bool2)
478a7d6542SBram Moolenaar
4829a86ffeSBram Moolenaar  let bool3: bool = 0
494ed124ccSBram Moolenaar  assert_equal(false, bool3)
5029a86ffeSBram Moolenaar  let bool4: bool = 1
514ed124ccSBram Moolenaar  assert_equal(true, bool4)
524ed124ccSBram Moolenaar
534ed124ccSBram Moolenaar  let bool5: bool = 'yes' && 'no'
544ed124ccSBram Moolenaar  assert_equal(true, bool5)
554ed124ccSBram Moolenaar  let bool6: bool = [] && 99
564ed124ccSBram Moolenaar  assert_equal(false, bool6)
574ed124ccSBram Moolenaar  let bool7: bool = [] || #{a: 1} && 99
584ed124ccSBram Moolenaar  assert_equal(true, bool7)
5929a86ffeSBram Moolenaar
60ba7c0d7bSBram Moolenaar  let lines =<< trim END
61ba7c0d7bSBram Moolenaar    vim9script
62ba7c0d7bSBram Moolenaar    def GetFlag(): bool
63ba7c0d7bSBram Moolenaar      let flag: bool = 1
64ba7c0d7bSBram Moolenaar      return flag
65ba7c0d7bSBram Moolenaar    enddef
66ba7c0d7bSBram Moolenaar    let flag: bool = GetFlag()
674ed124ccSBram Moolenaar    assert_equal(true, flag)
68ba7c0d7bSBram Moolenaar    flag = 0
69c1ec0422SBram Moolenaar    assert_equal(false, flag)
70ba7c0d7bSBram Moolenaar    flag = 1
71c1ec0422SBram Moolenaar    assert_equal(true, flag)
72c1ec0422SBram Moolenaar    flag = 99 || 123
73c1ec0422SBram Moolenaar    assert_equal(true, flag)
74c1ec0422SBram Moolenaar    flag = 'yes' && []
75c1ec0422SBram Moolenaar    assert_equal(false, flag)
76ba7c0d7bSBram Moolenaar  END
77ba7c0d7bSBram Moolenaar  CheckScriptSuccess(lines)
78ba7c0d7bSBram Moolenaar  CheckDefAndScriptFailure(['let x: bool = 2'], 'E1012:')
79ba7c0d7bSBram Moolenaar  CheckDefAndScriptFailure(['let x: bool = -1'], 'E1012:')
80ba7c0d7bSBram Moolenaar  CheckDefAndScriptFailure(['let x: bool = [1]'], 'E1012:')
81ba7c0d7bSBram Moolenaar  CheckDefAndScriptFailure(['let x: bool = {}'], 'E1012:')
82ba7c0d7bSBram Moolenaar  CheckDefAndScriptFailure(['let x: bool = "x"'], 'E1012:')
83ba7c0d7bSBram Moolenaarenddef
84ba7c0d7bSBram Moolenaar
85ba7c0d7bSBram Moolenaardef Test_assignment()
86d2c61705SBram Moolenaar  CheckDefFailure(['let x:string'], 'E1069:')
87d2c61705SBram Moolenaar  CheckDefFailure(['let x:string = "x"'], 'E1069:')
88d2c61705SBram Moolenaar  CheckDefFailure(['let a:string = "x"'], 'E1069:')
89d2c61705SBram Moolenaar  CheckDefFailure(['let lambda = {-> "lambda"}'], 'E704:')
90f93c7feaSBram Moolenaar
914cdb13ceSBram Moolenaar  let nr: number = 1234
92d2c61705SBram Moolenaar  CheckDefFailure(['let nr: number = "asdf"'], 'E1012:')
934cdb13ceSBram Moolenaar
94b209750bSBram Moolenaar  let a: number = 6 #comment
959be61bbbSBram Moolenaar  assert_equal(6, a)
969be61bbbSBram Moolenaar
9742a480bfSBram Moolenaar  if has('channel')
9842a480bfSBram Moolenaar    let chan1: channel
99fbdd08edSBram Moolenaar    let job1: job
100f51cb4e0SBram Moolenaar    let job2: job = job_start('willfail')
10142a480bfSBram Moolenaar  endif
102fbdd08edSBram Moolenaar  if has('float')
103fbdd08edSBram Moolenaar    let float1: float = 3.4
104fbdd08edSBram Moolenaar  endif
1055deeb3f1SBram Moolenaar  let Funky1: func
1065deeb3f1SBram Moolenaar  let Funky2: func = function('len')
1074c17ad94SBram Moolenaar  let Party2: func = funcref('g:Test_syntax')
10842a480bfSBram Moolenaar
109b209750bSBram Moolenaar  g:newvar = 'new'  #comment
110401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
111401d9ffbSBram Moolenaar
112401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
113401d9ffbSBram Moolenaar  g:existing = 'no'
114401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
115401d9ffbSBram Moolenaar
116b283a8a6SBram Moolenaar  v:char = 'abc'
1176e587dcbSBram Moolenaar  assert_equal('abc', v:char)
118b283a8a6SBram Moolenaar
119b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
1206e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
121b283a8a6SBram Moolenaar  $ENVVAR = ''
1226e587dcbSBram Moolenaar
123b5ed2660SBram Moolenaar  let lines =<< trim END
124b5ed2660SBram Moolenaar    vim9script
125b5ed2660SBram Moolenaar    $ENVVAR = 'barfoo'
126b5ed2660SBram Moolenaar    assert_equal('barfoo', $ENVVAR)
127b5ed2660SBram Moolenaar    $ENVVAR = ''
128b5ed2660SBram Moolenaar  END
129d2c61705SBram Moolenaar  CheckScriptSuccess(lines)
130b5ed2660SBram Moolenaar
131fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
132fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
133fd1823e0SBram Moolenaar  s:addToMe += 222
134fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
1350bbf722aSBram Moolenaar  s:newVar = 'new'
1360bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
137a8c17704SBram Moolenaar
138a8c17704SBram Moolenaar  set ts=7
139a8c17704SBram Moolenaar  &ts += 1
140a8c17704SBram Moolenaar  assert_equal(8, &ts)
14180c34ca3SBram Moolenaar  &ts -= 3
14280c34ca3SBram Moolenaar  assert_equal(5, &ts)
14380c34ca3SBram Moolenaar  &ts *= 2
14480c34ca3SBram Moolenaar  assert_equal(10, &ts)
14580c34ca3SBram Moolenaar  &ts /= 3
14680c34ca3SBram Moolenaar  assert_equal(3, &ts)
14780c34ca3SBram Moolenaar  set ts=10
14880c34ca3SBram Moolenaar  &ts %= 4
14980c34ca3SBram Moolenaar  assert_equal(2, &ts)
150b5ed2660SBram Moolenaar
15193ad1471SBram Moolenaar  if has('float')
15293ad1471SBram Moolenaar    let f100: float = 100.0
15393ad1471SBram Moolenaar    f100 /= 5
15493ad1471SBram Moolenaar    assert_equal(20.0, f100)
15593ad1471SBram Moolenaar
15693ad1471SBram Moolenaar    let f200: float = 200.0
15793ad1471SBram Moolenaar    f200 /= 5.0
15893ad1471SBram Moolenaar    assert_equal(40.0, f200)
15993ad1471SBram Moolenaar
16093ad1471SBram Moolenaar    CheckDefFailure(['let nr: number = 200', 'nr /= 5.0'], 'E1012:')
16193ad1471SBram Moolenaar  endif
16293ad1471SBram Moolenaar
163b5ed2660SBram Moolenaar  lines =<< trim END
164b5ed2660SBram Moolenaar    &ts = 6
165b5ed2660SBram Moolenaar    &ts += 3
166b5ed2660SBram Moolenaar    assert_equal(9, &ts)
1672e800955SBram Moolenaar
1682e800955SBram Moolenaar    &l:ts = 6
1692e800955SBram Moolenaar    assert_equal(6, &ts)
1702e800955SBram Moolenaar    &l:ts += 2
1712e800955SBram Moolenaar    assert_equal(8, &ts)
1722e800955SBram Moolenaar
1732e800955SBram Moolenaar    &g:ts = 6
1742e800955SBram Moolenaar    assert_equal(6, &g:ts)
1752e800955SBram Moolenaar    &g:ts += 2
1762e800955SBram Moolenaar    assert_equal(8, &g:ts)
177b5ed2660SBram Moolenaar  END
1782e800955SBram Moolenaar  CheckDefAndScriptSuccess(lines)
179b5ed2660SBram Moolenaar
1800aae4809SBram Moolenaar  CheckDefFailure(['&notex += 3'], 'E113:')
1810aae4809SBram Moolenaar  CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
1820aae4809SBram Moolenaar  CheckDefFailure(['&ts = [7]'], 'E1012:')
1830aae4809SBram Moolenaar  CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list')
1840aae4809SBram Moolenaar  CheckDefFailure(['&ts = "xx"'], 'E1012:')
1850aae4809SBram Moolenaar  CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string')
1860aae4809SBram Moolenaar  CheckDefFailure(['&path += 3'], 'E1012:')
1870aae4809SBram Moolenaar  CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
188cb711abfSBram Moolenaar  # test freeing ISN_STOREOPT
1890aae4809SBram Moolenaar  CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
19080c34ca3SBram Moolenaar  &ts = 8
191a8c17704SBram Moolenaar
1920aae4809SBram Moolenaar  lines =<< trim END
1930aae4809SBram Moolenaar    let save_TI = &t_TI
1940aae4809SBram Moolenaar    &t_TI = ''
1950aae4809SBram Moolenaar    assert_equal('', &t_TI)
1960aae4809SBram Moolenaar    &t_TI = 'xxx'
1970aae4809SBram Moolenaar    assert_equal('xxx', &t_TI)
1980aae4809SBram Moolenaar    &t_TI = save_TI
1990aae4809SBram Moolenaar  END
200ba7c0d7bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
2010aae4809SBram Moolenaar
2020aae4809SBram Moolenaar  CheckDefFailure(['&t_TI = 123'], 'E1012:')
2030aae4809SBram Moolenaar  CheckScriptFailure(['vim9script', '&t_TI = 123'], 'E928:')
2040aae4809SBram Moolenaar
2050aae4809SBram Moolenaar  CheckDefFailure(['let s:var = 123'], 'E1101:')
2060aae4809SBram Moolenaar  CheckDefFailure(['let s:var: number'], 'E1101:')
20733afa244SBram Moolenaar
208f9b2b496SBram Moolenaar  lines =<< trim END
209f9b2b496SBram Moolenaar    vim9script
210f9b2b496SBram Moolenaar    def SomeFunc()
211f9b2b496SBram Moolenaar      s:var = 123
212f9b2b496SBram Moolenaar    enddef
213f9b2b496SBram Moolenaar    defcompile
214f9b2b496SBram Moolenaar  END
215d2c61705SBram Moolenaar  CheckScriptFailure(lines, 'E1089:')
216f9b2b496SBram Moolenaar
217a8c17704SBram Moolenaar  g:inc_counter += 1
218a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
219a8c17704SBram Moolenaar
220a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
221a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
222d2c61705SBram Moolenaar  CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1051:')
223d2c61705SBram Moolenaar  CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1012:')
224a8c17704SBram Moolenaar
225b5ed2660SBram Moolenaar  lines =<< trim END
226b5ed2660SBram Moolenaar    @c = 'areg'
227b5ed2660SBram Moolenaar    @c ..= 'add'
228b5ed2660SBram Moolenaar    assert_equal('aregadd', @c)
229b5ed2660SBram Moolenaar  END
2302e800955SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2312e800955SBram Moolenaar
232d2c61705SBram Moolenaar  CheckDefFailure(['@a += "more"'], 'E1051:')
233d2c61705SBram Moolenaar  CheckDefFailure(['@a += 123'], 'E1012:')
234b5ed2660SBram Moolenaar
235e69f6d04SBram Moolenaar  v:errmsg = 'none'
236e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
237e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
238d2c61705SBram Moolenaar  CheckDefFailure(['v:errmsg += "more"'], 'E1051:')
239d2c61705SBram Moolenaar  CheckDefFailure(['v:errmsg += 123'], 'E1012:')
24033afa244SBram Moolenaar
24133afa244SBram Moolenaar  # single letter variables
24233afa244SBram Moolenaar  a = 123
24333afa244SBram Moolenaar  assert_equal(123, a)
24433afa244SBram Moolenaar  let b: number
24533afa244SBram Moolenaar  b = 123
24633afa244SBram Moolenaar  assert_equal(123, b)
24733afa244SBram Moolenaar  let g: number
24833afa244SBram Moolenaar  g = 123
24933afa244SBram Moolenaar  assert_equal(123, g)
25033afa244SBram Moolenaar  let s: number
25133afa244SBram Moolenaar  s = 123
25233afa244SBram Moolenaar  assert_equal(123, s)
25333afa244SBram Moolenaar  let t: number
25433afa244SBram Moolenaar  t = 123
25533afa244SBram Moolenaar  assert_equal(123, t)
25633afa244SBram Moolenaar  let v: number
25733afa244SBram Moolenaar  v = 123
25833afa244SBram Moolenaar  assert_equal(123, v)
25933afa244SBram Moolenaar  let w: number
26033afa244SBram Moolenaar  w = 123
26133afa244SBram Moolenaar  assert_equal(123, w)
2625deeb3f1SBram Moolenaarenddef
2635deeb3f1SBram Moolenaar
2643b74b6b4SBram Moolenaardef Test_vim9_single_char_vars()
2653b74b6b4SBram Moolenaar  let lines =<< trim END
2663b74b6b4SBram Moolenaar      vim9script
2673b74b6b4SBram Moolenaar
268f5be8cdbSBram Moolenaar      # single character variable declarations work
2693b74b6b4SBram Moolenaar      let a: string
2703b74b6b4SBram Moolenaar      let b: number
2713b74b6b4SBram Moolenaar      let l: list<any>
2723b74b6b4SBram Moolenaar      let s: string
2733b74b6b4SBram Moolenaar      let t: number
2743b74b6b4SBram Moolenaar      let v: number
2753b74b6b4SBram Moolenaar      let w: number
2763b74b6b4SBram Moolenaar
277f5be8cdbSBram Moolenaar      # script-local variables can be used without s: prefix
2783b74b6b4SBram Moolenaar      a = 'script-a'
2793b74b6b4SBram Moolenaar      b = 111
2803b74b6b4SBram Moolenaar      l = [1, 2, 3]
2813b74b6b4SBram Moolenaar      s = 'script-s'
2823b74b6b4SBram Moolenaar      t = 222
2833b74b6b4SBram Moolenaar      v = 333
2843b74b6b4SBram Moolenaar      w = 444
2853b74b6b4SBram Moolenaar
2863b74b6b4SBram Moolenaar      assert_equal('script-a', a)
2873b74b6b4SBram Moolenaar      assert_equal(111, b)
2883b74b6b4SBram Moolenaar      assert_equal([1, 2, 3], l)
2893b74b6b4SBram Moolenaar      assert_equal('script-s', s)
2903b74b6b4SBram Moolenaar      assert_equal(222, t)
2913b74b6b4SBram Moolenaar      assert_equal(333, v)
2923b74b6b4SBram Moolenaar      assert_equal(444, w)
2933b74b6b4SBram Moolenaar  END
2943b74b6b4SBram Moolenaar  writefile(lines, 'Xsinglechar')
2953b74b6b4SBram Moolenaar  source Xsinglechar
2963b74b6b4SBram Moolenaar  delete('Xsinglechar')
2973b74b6b4SBram Moolenaarenddef
2983b74b6b4SBram Moolenaar
29984370087SBram Moolenaardef Test_assignment_list()
30084370087SBram Moolenaar  let list1: list<bool> = [false, true, false]
30184370087SBram Moolenaar  let list2: list<number> = [1, 2, 3]
30284370087SBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
30384370087SBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
30484370087SBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
30584370087SBram Moolenaar
30684370087SBram Moolenaar  let listS: list<string> = []
30784370087SBram Moolenaar  let listN: list<number> = []
30884370087SBram Moolenaar
30984370087SBram Moolenaar  assert_equal([1, 2, 3], list2)
31084370087SBram Moolenaar  list2[-1] = 99
31184370087SBram Moolenaar  assert_equal([1, 2, 99], list2)
31284370087SBram Moolenaar  list2[-2] = 88
31384370087SBram Moolenaar  assert_equal([1, 88, 99], list2)
31484370087SBram Moolenaar  list2[-3] = 77
31584370087SBram Moolenaar  assert_equal([77, 88, 99], list2)
316dd29f1b0SBram Moolenaar  list2 += [100]
317dd29f1b0SBram Moolenaar  assert_equal([77, 88, 99, 100], list2)
318dd29f1b0SBram Moolenaar
319dd29f1b0SBram Moolenaar  list3 += ['end']
320dd29f1b0SBram Moolenaar  assert_equal(['sdf', 'asdf', 'end'], list3)
321dd29f1b0SBram Moolenaar
322d2c61705SBram Moolenaar  CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
323d2c61705SBram Moolenaar  CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:')
32484370087SBram Moolenaar
32584370087SBram Moolenaar  # type becomes list<any>
32684370087SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
32784370087SBram Moolenaarenddef
32884370087SBram Moolenaar
329b31be3f9SBram Moolenaardef Test_assignment_list_vim9script()
330b31be3f9SBram Moolenaar  let lines =<< trim END
331b31be3f9SBram Moolenaar    vim9script
332b31be3f9SBram Moolenaar    let v1: number
333b31be3f9SBram Moolenaar    let v2: number
334b31be3f9SBram Moolenaar    let v3: number
335b31be3f9SBram Moolenaar    [v1, v2, v3] = [1, 2, 3]
336b31be3f9SBram Moolenaar    assert_equal([1, 2, 3], [v1, v2, v3])
337b31be3f9SBram Moolenaar  END
338d2c61705SBram Moolenaar  CheckScriptSuccess(lines)
339b31be3f9SBram Moolenaarenddef
340b31be3f9SBram Moolenaar
34184370087SBram Moolenaardef Test_assignment_dict()
34284370087SBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
34384370087SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
34484370087SBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
34584370087SBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
34674fae513SBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, two: 0z02}
34784370087SBram Moolenaar
348f5be8cdbSBram Moolenaar  # overwrite
349c785b9a7SBram Moolenaar  dict3['key'] = 'another'
350c785b9a7SBram Moolenaar
35158626872SBram Moolenaar  # empty key can be used
35258626872SBram Moolenaar  let dd = {}
35358626872SBram Moolenaar  dd[""] = 6
35458626872SBram Moolenaar  assert_equal({'': 6}, dd)
35584370087SBram Moolenaar
35684370087SBram Moolenaar  # type becomes dict<any>
35784370087SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
3588e4c8c85SBram Moolenaar
3598e4c8c85SBram Moolenaar  # assignment to script-local dict
3608e4c8c85SBram Moolenaar  let lines =<< trim END
3618e4c8c85SBram Moolenaar    vim9script
3628e4c8c85SBram Moolenaar    let test: dict<any> = {}
3638e4c8c85SBram Moolenaar    def FillDict(): dict<any>
3648e4c8c85SBram Moolenaar      test['a'] = 43
3658e4c8c85SBram Moolenaar      return test
3668e4c8c85SBram Moolenaar    enddef
3678e4c8c85SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3688e4c8c85SBram Moolenaar  END
36908052228SBram Moolenaar  CheckScriptSuccess(lines)
3708e4c8c85SBram Moolenaar
3718e4c8c85SBram Moolenaar  lines =<< trim END
3728e4c8c85SBram Moolenaar    vim9script
3738e4c8c85SBram Moolenaar    let test: dict<any>
3748e4c8c85SBram Moolenaar    def FillDict(): dict<any>
3758e4c8c85SBram Moolenaar      test['a'] = 43
3768e4c8c85SBram Moolenaar      return test
3778e4c8c85SBram Moolenaar    enddef
3788e4c8c85SBram Moolenaar    FillDict()
3798e4c8c85SBram Moolenaar  END
38008052228SBram Moolenaar  CheckScriptFailure(lines, 'E1103:')
3812caa1594SBram Moolenaar
3822caa1594SBram Moolenaar  # assignment to global dict
3832caa1594SBram Moolenaar  lines =<< trim END
3842caa1594SBram Moolenaar    vim9script
3852caa1594SBram Moolenaar    g:test = {}
3862caa1594SBram Moolenaar    def FillDict(): dict<any>
3872caa1594SBram Moolenaar      g:test['a'] = 43
3882caa1594SBram Moolenaar      return g:test
3892caa1594SBram Moolenaar    enddef
3902caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3912caa1594SBram Moolenaar  END
39208052228SBram Moolenaar  CheckScriptSuccess(lines)
3932caa1594SBram Moolenaar
3942caa1594SBram Moolenaar  # assignment to buffer dict
3952caa1594SBram Moolenaar  lines =<< trim END
3962caa1594SBram Moolenaar    vim9script
3972caa1594SBram Moolenaar    b:test = {}
3982caa1594SBram Moolenaar    def FillDict(): dict<any>
3992caa1594SBram Moolenaar      b:test['a'] = 43
4002caa1594SBram Moolenaar      return b:test
4012caa1594SBram Moolenaar    enddef
4022caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
4032caa1594SBram Moolenaar  END
40408052228SBram Moolenaar  CheckScriptSuccess(lines)
40584370087SBram Moolenaarenddef
40684370087SBram Moolenaar
407d3aac291SBram Moolenaardef Test_assignment_local()
408f5be8cdbSBram Moolenaar  # Test in a separated file in order not to the current buffer/window/tab is
409f5be8cdbSBram Moolenaar  # changed.
410d3aac291SBram Moolenaar  let script_lines: list<string> =<< trim END
411d3aac291SBram Moolenaar    let b:existing = 'yes'
412d3aac291SBram Moolenaar    let w:existing = 'yes'
413d3aac291SBram Moolenaar    let t:existing = 'yes'
414d3aac291SBram Moolenaar
415d3aac291SBram Moolenaar    def Test_assignment_local_internal()
416d3aac291SBram Moolenaar      b:newvar = 'new'
417d3aac291SBram Moolenaar      assert_equal('new', b:newvar)
418d3aac291SBram Moolenaar      assert_equal('yes', b:existing)
419d3aac291SBram Moolenaar      b:existing = 'no'
420d3aac291SBram Moolenaar      assert_equal('no', b:existing)
421396f3138SBram Moolenaar      b:existing ..= 'NO'
422396f3138SBram Moolenaar      assert_equal('noNO', b:existing)
423d3aac291SBram Moolenaar
424d3aac291SBram Moolenaar      w:newvar = 'new'
425d3aac291SBram Moolenaar      assert_equal('new', w:newvar)
426d3aac291SBram Moolenaar      assert_equal('yes', w:existing)
427d3aac291SBram Moolenaar      w:existing = 'no'
428d3aac291SBram Moolenaar      assert_equal('no', w:existing)
429396f3138SBram Moolenaar      w:existing ..= 'NO'
430396f3138SBram Moolenaar      assert_equal('noNO', w:existing)
431d3aac291SBram Moolenaar
432d3aac291SBram Moolenaar      t:newvar = 'new'
433d3aac291SBram Moolenaar      assert_equal('new', t:newvar)
434d3aac291SBram Moolenaar      assert_equal('yes', t:existing)
435d3aac291SBram Moolenaar      t:existing = 'no'
436d3aac291SBram Moolenaar      assert_equal('no', t:existing)
437396f3138SBram Moolenaar      t:existing ..= 'NO'
438396f3138SBram Moolenaar      assert_equal('noNO', t:existing)
439d3aac291SBram Moolenaar    enddef
440d3aac291SBram Moolenaar    call Test_assignment_local_internal()
441d3aac291SBram Moolenaar  END
44208052228SBram Moolenaar  CheckScriptSuccess(script_lines)
443d3aac291SBram Moolenaarenddef
444d3aac291SBram Moolenaar
4455deeb3f1SBram Moolenaardef Test_assignment_default()
446e69f6d04SBram Moolenaar
447cb711abfSBram Moolenaar  # Test default values.
448e69f6d04SBram Moolenaar  let thebool: bool
449e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
450e69f6d04SBram Moolenaar
451e69f6d04SBram Moolenaar  let thenumber: number
452e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
453e69f6d04SBram Moolenaar
454e69f6d04SBram Moolenaar  if has('float')
455e69f6d04SBram Moolenaar    let thefloat: float
456e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
457e69f6d04SBram Moolenaar  endif
458e69f6d04SBram Moolenaar
459e69f6d04SBram Moolenaar  let thestring: string
460e69f6d04SBram Moolenaar  assert_equal('', thestring)
461e69f6d04SBram Moolenaar
462e69f6d04SBram Moolenaar  let theblob: blob
463e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
464e69f6d04SBram Moolenaar
4655deeb3f1SBram Moolenaar  let Thefunc: func
4665deeb3f1SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
467e69f6d04SBram Moolenaar
468e69f6d04SBram Moolenaar  let thelist: list<any>
469e69f6d04SBram Moolenaar  assert_equal([], thelist)
470e69f6d04SBram Moolenaar
471e69f6d04SBram Moolenaar  let thedict: dict<any>
472e69f6d04SBram Moolenaar  assert_equal({}, thedict)
473e69f6d04SBram Moolenaar
4742c869deeSBram Moolenaar  if has('channel')
475e69f6d04SBram Moolenaar    let thejob: job
476e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
477e69f6d04SBram Moolenaar
478e69f6d04SBram Moolenaar    let thechannel: channel
479e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
480c785b9a7SBram Moolenaar
481c785b9a7SBram Moolenaar    if has('unix') && executable('cat')
482f5be8cdbSBram Moolenaar      # check with non-null job and channel, types must match
483c785b9a7SBram Moolenaar      thejob = job_start("cat ", #{})
484c785b9a7SBram Moolenaar      thechannel = job_getchannel(thejob)
485c785b9a7SBram Moolenaar      job_stop(thejob, 'kill')
486c785b9a7SBram Moolenaar    endif
4872c869deeSBram Moolenaar  endif
488585fea7bSBram Moolenaar
489585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
490585fea7bSBram Moolenaar  assert_equal(5678, nr)
4918a7d6542SBram Moolenaarenddef
4928a7d6542SBram Moolenaar
49347a519a9SBram Moolenaardef Test_assignment_var_list()
49447a519a9SBram Moolenaar  let v1: string
49547a519a9SBram Moolenaar  let v2: string
4969af78769SBram Moolenaar  let vrem: list<string>
4979af78769SBram Moolenaar  [v1] = ['aaa']
4989af78769SBram Moolenaar  assert_equal('aaa', v1)
4999af78769SBram Moolenaar
50047a519a9SBram Moolenaar  [v1, v2] = ['one', 'two']
50147a519a9SBram Moolenaar  assert_equal('one', v1)
50247a519a9SBram Moolenaar  assert_equal('two', v2)
5039af78769SBram Moolenaar
5049af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two']
5059af78769SBram Moolenaar  assert_equal('one', v1)
5069af78769SBram Moolenaar  assert_equal('two', v2)
5079af78769SBram Moolenaar  assert_equal([], vrem)
5089af78769SBram Moolenaar
5099af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two', 'three']
5109af78769SBram Moolenaar  assert_equal('one', v1)
5119af78769SBram Moolenaar  assert_equal('two', v2)
5129af78769SBram Moolenaar  assert_equal(['three'], vrem)
5131c199f9cSBram Moolenaar
5141c199f9cSBram Moolenaar  [&ts, &sw] = [3, 4]
5151c199f9cSBram Moolenaar  assert_equal(3, &ts)
5161c199f9cSBram Moolenaar  assert_equal(4, &sw)
5171c199f9cSBram Moolenaar  set ts=8 sw=4
51847a519a9SBram Moolenaarenddef
51947a519a9SBram Moolenaar
520c7e44a7eSBram Moolenaardef Test_assignment_vim9script()
521c7e44a7eSBram Moolenaar  let lines =<< trim END
522c7e44a7eSBram Moolenaar    vim9script
523c7e44a7eSBram Moolenaar    def Func(): list<number>
524c7e44a7eSBram Moolenaar      return [1, 2]
525c7e44a7eSBram Moolenaar    enddef
526c7e44a7eSBram Moolenaar    let var1: number
527c7e44a7eSBram Moolenaar    let var2: number
528c7e44a7eSBram Moolenaar    [var1, var2] =
529c7e44a7eSBram Moolenaar          Func()
530c7e44a7eSBram Moolenaar    assert_equal(1, var1)
531c7e44a7eSBram Moolenaar    assert_equal(2, var2)
532c7e44a7eSBram Moolenaar    let ll =
533c7e44a7eSBram Moolenaar          Func()
534c7e44a7eSBram Moolenaar    assert_equal([1, 2], ll)
53583144546SBram Moolenaar
53683144546SBram Moolenaar    @/ = 'text'
53783144546SBram Moolenaar    assert_equal('text', @/)
53883144546SBram Moolenaar    @0 = 'zero'
53983144546SBram Moolenaar    assert_equal('zero', @0)
54083144546SBram Moolenaar    @1 = 'one'
54183144546SBram Moolenaar    assert_equal('one', @1)
54283144546SBram Moolenaar    @9 = 'nine'
54383144546SBram Moolenaar    assert_equal('nine', @9)
54483144546SBram Moolenaar    @- = 'minus'
54583144546SBram Moolenaar    assert_equal('minus', @-)
54683144546SBram Moolenaar    if has('clipboard_working')
54783144546SBram Moolenaar      @* = 'star'
54883144546SBram Moolenaar      assert_equal('star', @*)
54983144546SBram Moolenaar      @+ = 'plus'
55083144546SBram Moolenaar      assert_equal('plus', @+)
55183144546SBram Moolenaar    endif
55295dd9f25SBram Moolenaar
55395dd9f25SBram Moolenaar    let a: number = 123
55495dd9f25SBram Moolenaar    assert_equal(123, a)
55595dd9f25SBram Moolenaar    let s: string = 'yes'
55695dd9f25SBram Moolenaar    assert_equal('yes', s)
55795dd9f25SBram Moolenaar    let b: number = 42
55895dd9f25SBram Moolenaar    assert_equal(42, b)
55995dd9f25SBram Moolenaar    let w: number = 43
56095dd9f25SBram Moolenaar    assert_equal(43, w)
56195dd9f25SBram Moolenaar    let t: number = 44
56295dd9f25SBram Moolenaar    assert_equal(44, t)
563c7e44a7eSBram Moolenaar  END
564c7e44a7eSBram Moolenaar  CheckScriptSuccess(lines)
565c7e44a7eSBram Moolenaarenddef
566c7e44a7eSBram Moolenaar
567cab27678SBram Moolenaardef Mess(): string
568cab27678SBram Moolenaar  v:foldstart = 123
569cab27678SBram Moolenaar  return 'xxx'
570cab27678SBram Moolenaarenddef
571cab27678SBram Moolenaar
572d72c1bf0SBram Moolenaardef Test_assignment_failure()
573d2c61705SBram Moolenaar  CheckDefFailure(['let var=234'], 'E1004:')
574d2c61705SBram Moolenaar  CheckDefFailure(['let var =234'], 'E1004:')
575d2c61705SBram Moolenaar  CheckDefFailure(['let var= 234'], 'E1004:')
5768a7d6542SBram Moolenaar
577d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:')
578d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='")
579d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:')
580d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:')
581d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:')
582d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='")
583d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:')
584d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='")
58563be3d4bSBram Moolenaar
586d2c61705SBram Moolenaar  CheckDefFailure(['let true = 1'], 'E1034:')
587d2c61705SBram Moolenaar  CheckDefFailure(['let false = 1'], 'E1034:')
5888a7d6542SBram Moolenaar
589d2c61705SBram Moolenaar  CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
590d2c61705SBram Moolenaar  CheckDefExecFailure(['let a: number',
5919af78769SBram Moolenaar                       '[a] = test_null_list()'], 'E1093:')
592d2c61705SBram Moolenaar  CheckDefExecFailure(['let a: number',
5939af78769SBram Moolenaar                       '[a] = []'], 'E1093:')
594d2c61705SBram Moolenaar  CheckDefExecFailure(['let x: number',
5959af78769SBram Moolenaar                       'let y: number',
5969af78769SBram Moolenaar                       '[x, y] = [1]'], 'E1093:')
597d2c61705SBram Moolenaar  CheckDefExecFailure(['let x: number',
5989af78769SBram Moolenaar                       'let y: number',
5999af78769SBram Moolenaar                       'let z: list<number>',
6009af78769SBram Moolenaar                       '[x, y; z] = [1]'], 'E1093:')
6019be61bbbSBram Moolenaar
602d2c61705SBram Moolenaar  CheckDefFailure(['let somevar'], "E1022:")
603d2c61705SBram Moolenaar  CheckDefFailure(['let &tabstop = 4'], 'E1052:')
604d2c61705SBram Moolenaar  CheckDefFailure(['&g:option = 5'], 'E113:')
605d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:')
6069be61bbbSBram Moolenaar
607d2c61705SBram Moolenaar  CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
608d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:')
6099be61bbbSBram Moolenaar
610434d72cbSBram Moolenaar  if has('dnd')
611d2c61705SBram Moolenaar    CheckDefFailure(['let @~ = 5'], 'E1066:')
612434d72cbSBram Moolenaar  else
613d2c61705SBram Moolenaar    CheckDefFailure(['let @~ = 5'], 'E354:')
614d2c61705SBram Moolenaar    CheckDefFailure(['@~ = 5'], 'E354:')
615434d72cbSBram Moolenaar  endif
616d2c61705SBram Moolenaar  CheckDefFailure(['let @a = 5'], 'E1066:')
617d2c61705SBram Moolenaar  CheckDefFailure(['let @/ = "x"'], 'E1066:')
618d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:')
6199be61bbbSBram Moolenaar
620d2c61705SBram Moolenaar  CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
621d2c61705SBram Moolenaar  CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
622d2c61705SBram Moolenaar  CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
623d2c61705SBram Moolenaar  CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
6249be61bbbSBram Moolenaar
625d2c61705SBram Moolenaar  CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
626d2c61705SBram Moolenaar  CheckDefFailure(['let xnr += 4'], 'E1020:', 1)
627d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let xnr += 4'], 'E1020:')
628d2c61705SBram Moolenaar  CheckDefFailure(["let xnr = xnr + 1"], 'E1001:', 1)
629d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let xnr = xnr + 4'], 'E121:')
6309be61bbbSBram Moolenaar
631d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1108:')
63233fa29cfSBram Moolenaar
633d2c61705SBram Moolenaar  CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
634d2c61705SBram Moolenaar  CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
6358a7d6542SBram Moolenaar
636d2c61705SBram Moolenaar  CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
637d2c61705SBram Moolenaar  CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
6388a7d6542SBram Moolenaar
639d2c61705SBram Moolenaar  CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
640d2c61705SBram Moolenaar  CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
64142a480bfSBram Moolenaar
642d2c61705SBram Moolenaar  CheckDefFailure(['let var: dict <number>'], 'E1068:')
643d2c61705SBram Moolenaar  CheckDefFailure(['let var: dict<number'], 'E1009:')
644cab27678SBram Moolenaar
645d2c61705SBram Moolenaar  assert_fails('s/^/\=Mess()/n', 'E794:')
646d2c61705SBram Moolenaar  CheckDefFailure(['let var: dict<number'], 'E1009:')
64743e969d3SBram Moolenaar
648d2c61705SBram Moolenaar  CheckDefFailure(['w:foo: number = 10'],
64943e969d3SBram Moolenaar                  'E488: Trailing characters: : number = 1')
650d2c61705SBram Moolenaar  CheckDefFailure(['t:foo: bool = true'],
65143e969d3SBram Moolenaar                  'E488: Trailing characters: : bool = true')
652d2c61705SBram Moolenaar  CheckDefFailure(['b:foo: string = "x"'],
65343e969d3SBram Moolenaar                  'E488: Trailing characters: : string = "x"')
654d2c61705SBram Moolenaar  CheckDefFailure(['g:foo: number = 123'],
65543e969d3SBram Moolenaar                  'E488: Trailing characters: : number = 123')
656d72c1bf0SBram Moolenaarenddef
657d72c1bf0SBram Moolenaar
658d72c1bf0SBram Moolenaardef Test_unlet()
659d72c1bf0SBram Moolenaar  g:somevar = 'yes'
660d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
661d72c1bf0SBram Moolenaar  unlet g:somevar
662d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
663d72c1bf0SBram Moolenaar  unlet! g:somevar
664d72c1bf0SBram Moolenaar
6658436773fSBram Moolenaar  # also works for script-local variable in legacy Vim script
6668436773fSBram Moolenaar  s:somevar = 'legacy'
6678436773fSBram Moolenaar  assert_true(exists('s:somevar'))
6688436773fSBram Moolenaar  unlet s:somevar
6698436773fSBram Moolenaar  assert_false(exists('s:somevar'))
6708436773fSBram Moolenaar  unlet! s:somevar
6718436773fSBram Moolenaar
672d2c61705SBram Moolenaar  CheckScriptFailure([
673d72c1bf0SBram Moolenaar   'vim9script',
674d72c1bf0SBram Moolenaar   'let svar = 123',
675d72c1bf0SBram Moolenaar   'unlet svar',
676d72c1bf0SBram Moolenaar   ], 'E1081:')
677d2c61705SBram Moolenaar  CheckScriptFailure([
678d72c1bf0SBram Moolenaar   'vim9script',
679d72c1bf0SBram Moolenaar   'let svar = 123',
680d72c1bf0SBram Moolenaar   'unlet s:svar',
681d72c1bf0SBram Moolenaar   ], 'E1081:')
682d2c61705SBram Moolenaar  CheckScriptFailure([
683d72c1bf0SBram Moolenaar   'vim9script',
684d72c1bf0SBram Moolenaar   'let svar = 123',
685d72c1bf0SBram Moolenaar   'def Func()',
686d72c1bf0SBram Moolenaar   '  unlet svar',
687d72c1bf0SBram Moolenaar   'enddef',
688822ba247SBram Moolenaar   'defcompile',
689d72c1bf0SBram Moolenaar   ], 'E1081:')
690d2c61705SBram Moolenaar  CheckScriptFailure([
691d72c1bf0SBram Moolenaar   'vim9script',
692d72c1bf0SBram Moolenaar   'let svar = 123',
693d72c1bf0SBram Moolenaar   'def Func()',
694d72c1bf0SBram Moolenaar   '  unlet s:svar',
695d72c1bf0SBram Moolenaar   'enddef',
696822ba247SBram Moolenaar   'defcompile',
697d72c1bf0SBram Moolenaar   ], 'E1081:')
6987bdaea6eSBram Moolenaar
6997bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
7007bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
7017bdaea6eSBram Moolenaar  unlet $ENVVAR
7027bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
703d72c1bf0SBram Moolenaarenddef
704599c89c8SBram Moolenaar
7054c17ad94SBram Moolenaardef Test_delfunction()
706f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
7074c17ad94SBram Moolenaar  CheckScriptSuccess([
7084c17ad94SBram Moolenaar      'vim9script',
7094c17ad94SBram Moolenaar      'func CheckMe()',
7104c17ad94SBram Moolenaar      '  return 123',
7114c17ad94SBram Moolenaar      'endfunc',
7124c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
7134c17ad94SBram Moolenaar      ])
7144c17ad94SBram Moolenaar
715f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
7164c17ad94SBram Moolenaar  CheckScriptFailure([
7174c17ad94SBram Moolenaar      'vim9script',
7184c17ad94SBram Moolenaar      'func DeleteMe1()',
7194c17ad94SBram Moolenaar      'endfunc',
7204c17ad94SBram Moolenaar      'delfunction DeleteMe1',
7214c17ad94SBram Moolenaar      ], 'E1084:')
7224c17ad94SBram Moolenaar  CheckScriptFailure([
7234c17ad94SBram Moolenaar      'vim9script',
7244c17ad94SBram Moolenaar      'func DeleteMe2()',
7254c17ad94SBram Moolenaar      'endfunc',
7264c17ad94SBram Moolenaar      'def DoThat()',
7274c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
7284c17ad94SBram Moolenaar      'enddef',
7294c17ad94SBram Moolenaar      'DoThat()',
7304c17ad94SBram Moolenaar      ], 'E1084:')
7314c17ad94SBram Moolenaar  CheckScriptFailure([
7324c17ad94SBram Moolenaar      'vim9script',
7334c17ad94SBram Moolenaar      'def DeleteMe3()',
7344c17ad94SBram Moolenaar      'enddef',
7354c17ad94SBram Moolenaar      'delfunction DeleteMe3',
7364c17ad94SBram Moolenaar      ], 'E1084:')
7374c17ad94SBram Moolenaar  CheckScriptFailure([
7384c17ad94SBram Moolenaar      'vim9script',
7394c17ad94SBram Moolenaar      'def DeleteMe4()',
7404c17ad94SBram Moolenaar      'enddef',
7414c17ad94SBram Moolenaar      'def DoThat()',
7424c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
7434c17ad94SBram Moolenaar      'enddef',
7444c17ad94SBram Moolenaar      'DoThat()',
7454c17ad94SBram Moolenaar      ], 'E1084:')
746925e9fd6SBram Moolenaar
747925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
748925e9fd6SBram Moolenaar  let lines =<< trim END
749925e9fd6SBram Moolenaar      vim9script
750925e9fd6SBram Moolenaar      def g:Global(): string
751925e9fd6SBram Moolenaar        return "yes"
752925e9fd6SBram Moolenaar      enddef
753925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
754925e9fd6SBram Moolenaar      def! g:Global(): string
755925e9fd6SBram Moolenaar        return "no"
756925e9fd6SBram Moolenaar      enddef
757925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
758925e9fd6SBram Moolenaar      delfunc g:Global
759925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
760925e9fd6SBram Moolenaar  END
761925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
762925e9fd6SBram Moolenaar
763925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
764925e9fd6SBram Moolenaar  lines =<< trim END
765925e9fd6SBram Moolenaar      vim9script
766925e9fd6SBram Moolenaar      func g:Global()
767925e9fd6SBram Moolenaar        return "yes"
768925e9fd6SBram Moolenaar      endfunc
769925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
770925e9fd6SBram Moolenaar      def! g:Global(): string
771925e9fd6SBram Moolenaar        return "no"
772925e9fd6SBram Moolenaar      enddef
773925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
774925e9fd6SBram Moolenaar      delfunc g:Global
775925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
776925e9fd6SBram Moolenaar  END
777925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
778925e9fd6SBram Moolenaar
779925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
780925e9fd6SBram Moolenaar  lines =<< trim END
781925e9fd6SBram Moolenaar      vim9script
782925e9fd6SBram Moolenaar      def g:Global(): string
783925e9fd6SBram Moolenaar        return "yes"
784925e9fd6SBram Moolenaar      enddef
785925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
786925e9fd6SBram Moolenaar      func! g:Global()
787925e9fd6SBram Moolenaar        return "no"
788925e9fd6SBram Moolenaar      endfunc
789925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
790925e9fd6SBram Moolenaar      delfunc g:Global
791925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
792925e9fd6SBram Moolenaar  END
793925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
7944c17ad94SBram Moolenaarenddef
7954c17ad94SBram Moolenaar
79608052228SBram Moolenaardef Test_wrong_type()
79708052228SBram Moolenaar  CheckDefFailure(['let var: list<nothing>'], 'E1010:')
79808052228SBram Moolenaar  CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
79908052228SBram Moolenaar  CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
80008052228SBram Moolenaar  CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
801599c89c8SBram Moolenaar
80208052228SBram Moolenaar  CheckDefFailure(['let var: dict<number'], 'E1009:')
80308052228SBram Moolenaar  CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
80442a480bfSBram Moolenaar
80508052228SBram Moolenaar  CheckDefFailure(['let var: ally'], 'E1010:')
80608052228SBram Moolenaar  CheckDefFailure(['let var: bram'], 'E1010:')
80708052228SBram Moolenaar  CheckDefFailure(['let var: cathy'], 'E1010:')
80808052228SBram Moolenaar  CheckDefFailure(['let var: dom'], 'E1010:')
80908052228SBram Moolenaar  CheckDefFailure(['let var: freddy'], 'E1010:')
81008052228SBram Moolenaar  CheckDefFailure(['let var: john'], 'E1010:')
81108052228SBram Moolenaar  CheckDefFailure(['let var: larry'], 'E1010:')
81208052228SBram Moolenaar  CheckDefFailure(['let var: ned'], 'E1010:')
81308052228SBram Moolenaar  CheckDefFailure(['let var: pam'], 'E1010:')
81408052228SBram Moolenaar  CheckDefFailure(['let var: sam'], 'E1010:')
81508052228SBram Moolenaar  CheckDefFailure(['let var: vim'], 'E1010:')
816a0a9f43aSBram Moolenaar
81708052228SBram Moolenaar  CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
81808052228SBram Moolenaar  CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
81908052228SBram Moolenaarenddef
8208a7d6542SBram Moolenaar
82108052228SBram Moolenaardef Test_const()
82208052228SBram Moolenaar  CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
82308052228SBram Moolenaar  CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
824*dbeecb2bSBram Moolenaar  CheckDefFailure(['const list = [1, 2]', 'let list = [3, 4]'], 'E1017:')
82508052228SBram Moolenaar  CheckDefFailure(['const two'], 'E1021:')
82608052228SBram Moolenaar  CheckDefFailure(['const &option'], 'E996:')
827*dbeecb2bSBram Moolenaar
828*dbeecb2bSBram Moolenaar  let lines =<< trim END
829*dbeecb2bSBram Moolenaar    const list = [1, 2, 3]
830*dbeecb2bSBram Moolenaar    list[0] = 4
831*dbeecb2bSBram Moolenaar  END
832*dbeecb2bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
83308052228SBram Moolenaarenddef
8348a7d6542SBram Moolenaar
835df069eecSBram Moolenaardef Test_range_no_colon()
836d2c61705SBram Moolenaar  CheckDefFailure(['%s/a/b/'], 'E1050:')
837d2c61705SBram Moolenaar  CheckDefFailure(['+ s/a/b/'], 'E1050:')
838d2c61705SBram Moolenaar  CheckDefFailure(['- s/a/b/'], 'E1050:')
839d2c61705SBram Moolenaar  CheckDefFailure(['. s/a/b/'], 'E1050:')
840df069eecSBram Moolenaarenddef
841df069eecSBram Moolenaar
842df069eecSBram Moolenaar
8438a7d6542SBram Moolenaardef Test_block()
8448a7d6542SBram Moolenaar  let outer = 1
8458a7d6542SBram Moolenaar  {
8468a7d6542SBram Moolenaar    let inner = 2
8478a7d6542SBram Moolenaar    assert_equal(1, outer)
8488a7d6542SBram Moolenaar    assert_equal(2, inner)
8498a7d6542SBram Moolenaar  }
8508a7d6542SBram Moolenaar  assert_equal(1, outer)
8518a7d6542SBram Moolenaarenddef
8528a7d6542SBram Moolenaar
85308052228SBram Moolenaardef Test_block_failure()
85408052228SBram Moolenaar  CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
85508052228SBram Moolenaar  CheckDefFailure(['}'], 'E1025:')
85608052228SBram Moolenaar  CheckDefFailure(['{', 'echo 1'], 'E1026:')
85708052228SBram Moolenaarenddef
8588a7d6542SBram Moolenaar
859d032f34aSBram Moolenaarfunc g:NoSuchFunc()
860d032f34aSBram Moolenaar  echo 'none'
861d032f34aSBram Moolenaarendfunc
862d032f34aSBram Moolenaar
8638a7d6542SBram Moolenaardef Test_try_catch()
8648a7d6542SBram Moolenaar  let l = []
8657a092245SBram Moolenaar  try # comment
8668a7d6542SBram Moolenaar    add(l, '1')
8678a7d6542SBram Moolenaar    throw 'wrong'
8688a7d6542SBram Moolenaar    add(l, '2')
8697a092245SBram Moolenaar  catch # comment
8708a7d6542SBram Moolenaar    add(l, v:exception)
8717a092245SBram Moolenaar  finally # comment
8728a7d6542SBram Moolenaar    add(l, '3')
8737a092245SBram Moolenaar  endtry # comment
8748a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
87568d130c6SBram Moolenaar
876e859312eSBram Moolenaar  l = []
877e859312eSBram Moolenaar  try
878e859312eSBram Moolenaar    try
879e859312eSBram Moolenaar      add(l, '1')
880e859312eSBram Moolenaar      throw 'wrong'
881e859312eSBram Moolenaar      add(l, '2')
882e859312eSBram Moolenaar    catch /right/
883e859312eSBram Moolenaar      add(l, v:exception)
884e859312eSBram Moolenaar    endtry
885e859312eSBram Moolenaar  catch /wrong/
886e859312eSBram Moolenaar    add(l, 'caught')
887e859312eSBram Moolenaar  finally
888e859312eSBram Moolenaar    add(l, 'finally')
889e859312eSBram Moolenaar  endtry
890e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
891e859312eSBram Moolenaar
89268d130c6SBram Moolenaar  let n: number
89368d130c6SBram Moolenaar  try
89468d130c6SBram Moolenaar    n = l[3]
89568d130c6SBram Moolenaar  catch /E684:/
89668d130c6SBram Moolenaar    n = 99
89768d130c6SBram Moolenaar  endtry
89868d130c6SBram Moolenaar  assert_equal(99, n)
89968d130c6SBram Moolenaar
90068d130c6SBram Moolenaar  try
901cc673e74SBram Moolenaar    # string slice returns a string, not a number
90268d130c6SBram Moolenaar    n = g:astring[3]
90356acb094SBram Moolenaar  catch /E1029:/
90468d130c6SBram Moolenaar    n = 77
90568d130c6SBram Moolenaar  endtry
90668d130c6SBram Moolenaar  assert_equal(77, n)
90768d130c6SBram Moolenaar
90868d130c6SBram Moolenaar  try
90968d130c6SBram Moolenaar    n = l[g:astring]
91056acb094SBram Moolenaar  catch /E1029:/
91156acb094SBram Moolenaar    n = 88
91268d130c6SBram Moolenaar  endtry
91356acb094SBram Moolenaar  assert_equal(88, n)
91468d130c6SBram Moolenaar
91568d130c6SBram Moolenaar  try
91668d130c6SBram Moolenaar    n = s:does_not_exist
91768d130c6SBram Moolenaar  catch /E121:/
918f0b9f43cSBram Moolenaar    n = 111
919f0b9f43cSBram Moolenaar  endtry
920f0b9f43cSBram Moolenaar  assert_equal(111, n)
921f0b9f43cSBram Moolenaar
922f0b9f43cSBram Moolenaar  try
923f0b9f43cSBram Moolenaar    n = g:does_not_exist
924f0b9f43cSBram Moolenaar  catch /E121:/
92568d130c6SBram Moolenaar    n = 121
92668d130c6SBram Moolenaar  endtry
92768d130c6SBram Moolenaar  assert_equal(121, n)
92868d130c6SBram Moolenaar
92968d130c6SBram Moolenaar  let d = #{one: 1}
93068d130c6SBram Moolenaar  try
93168d130c6SBram Moolenaar    n = d[g:astring]
93268d130c6SBram Moolenaar  catch /E716:/
93368d130c6SBram Moolenaar    n = 222
93468d130c6SBram Moolenaar  endtry
93568d130c6SBram Moolenaar  assert_equal(222, n)
936f0b9f43cSBram Moolenaar
937f0b9f43cSBram Moolenaar  try
938f0b9f43cSBram Moolenaar    n = -g:astring
939f0b9f43cSBram Moolenaar  catch /E39:/
940f0b9f43cSBram Moolenaar    n = 233
941f0b9f43cSBram Moolenaar  endtry
942f0b9f43cSBram Moolenaar  assert_equal(233, n)
943f0b9f43cSBram Moolenaar
944f0b9f43cSBram Moolenaar  try
945f0b9f43cSBram Moolenaar    n = +g:astring
946f0b9f43cSBram Moolenaar  catch /E1030:/
947f0b9f43cSBram Moolenaar    n = 244
948f0b9f43cSBram Moolenaar  endtry
949f0b9f43cSBram Moolenaar  assert_equal(244, n)
950f0b9f43cSBram Moolenaar
951f0b9f43cSBram Moolenaar  try
952f0b9f43cSBram Moolenaar    n = +g:alist
953f0b9f43cSBram Moolenaar  catch /E745:/
954f0b9f43cSBram Moolenaar    n = 255
955f0b9f43cSBram Moolenaar  endtry
956f0b9f43cSBram Moolenaar  assert_equal(255, n)
957f0b9f43cSBram Moolenaar
958f0b9f43cSBram Moolenaar  let nd: dict<any>
959f0b9f43cSBram Moolenaar  try
960f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
961f0b9f43cSBram Moolenaar  catch /E1029:/
962f0b9f43cSBram Moolenaar    n = 266
963f0b9f43cSBram Moolenaar  endtry
964f0b9f43cSBram Moolenaar  assert_equal(266, n)
965f0b9f43cSBram Moolenaar
966f0b9f43cSBram Moolenaar  try
967f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
968f0b9f43cSBram Moolenaar  catch /E1093:/
969f0b9f43cSBram Moolenaar    n = 277
970f0b9f43cSBram Moolenaar  endtry
971f0b9f43cSBram Moolenaar  assert_equal(277, n)
972f0b9f43cSBram Moolenaar
973e859312eSBram Moolenaar  try
974e859312eSBram Moolenaar    &ts = g:astring
975e859312eSBram Moolenaar  catch /E1029:/
976e859312eSBram Moolenaar    n = 288
977e859312eSBram Moolenaar  endtry
978e859312eSBram Moolenaar  assert_equal(288, n)
979e859312eSBram Moolenaar
980e859312eSBram Moolenaar  try
981e859312eSBram Moolenaar    &backspace = 'asdf'
982e859312eSBram Moolenaar  catch /E474:/
983e859312eSBram Moolenaar    n = 299
984e859312eSBram Moolenaar  endtry
985e859312eSBram Moolenaar  assert_equal(299, n)
986e859312eSBram Moolenaar
987e859312eSBram Moolenaar  l = [1]
988e859312eSBram Moolenaar  try
989e859312eSBram Moolenaar    l[3] = 3
990e859312eSBram Moolenaar  catch /E684:/
991e859312eSBram Moolenaar    n = 300
992e859312eSBram Moolenaar  endtry
993e859312eSBram Moolenaar  assert_equal(300, n)
994e859312eSBram Moolenaar
995e859312eSBram Moolenaar  try
996e859312eSBram Moolenaar    unlet g:does_not_exist
997e859312eSBram Moolenaar  catch /E108:/
998e859312eSBram Moolenaar    n = 322
999e859312eSBram Moolenaar  endtry
1000e859312eSBram Moolenaar  assert_equal(322, n)
1001e859312eSBram Moolenaar
1002e859312eSBram Moolenaar  try
1003e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
1004e859312eSBram Moolenaar  catch /E721:/
1005e859312eSBram Moolenaar    n = 333
1006e859312eSBram Moolenaar  endtry
1007e859312eSBram Moolenaar  assert_equal(333, n)
1008e859312eSBram Moolenaar
1009e859312eSBram Moolenaar  try
1010e859312eSBram Moolenaar    l = DeletedFunc()
1011e859312eSBram Moolenaar  catch /E933:/
1012e859312eSBram Moolenaar    n = 344
1013e859312eSBram Moolenaar  endtry
1014e859312eSBram Moolenaar  assert_equal(344, n)
1015d032f34aSBram Moolenaar
1016d032f34aSBram Moolenaar  try
1017d032f34aSBram Moolenaar    echo len(v:true)
1018d032f34aSBram Moolenaar  catch /E701:/
1019d032f34aSBram Moolenaar    n = 355
1020d032f34aSBram Moolenaar  endtry
1021d032f34aSBram Moolenaar  assert_equal(355, n)
1022d032f34aSBram Moolenaar
1023d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
1024d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
1025d032f34aSBram Moolenaar  try
1026d032f34aSBram Moolenaar    echo P()
1027d032f34aSBram Moolenaar  catch /E117:/
1028d032f34aSBram Moolenaar    n = 366
1029d032f34aSBram Moolenaar  endtry
1030d032f34aSBram Moolenaar  assert_equal(366, n)
1031d032f34aSBram Moolenaar
1032d032f34aSBram Moolenaar  try
1033d032f34aSBram Moolenaar    echo g:NoSuchFunc()
1034d032f34aSBram Moolenaar  catch /E117:/
1035d032f34aSBram Moolenaar    n = 377
1036d032f34aSBram Moolenaar  endtry
1037d032f34aSBram Moolenaar  assert_equal(377, n)
1038d032f34aSBram Moolenaar
1039d032f34aSBram Moolenaar  try
1040d032f34aSBram Moolenaar    echo g:alist + 4
1041d032f34aSBram Moolenaar  catch /E745:/
1042d032f34aSBram Moolenaar    n = 388
1043d032f34aSBram Moolenaar  endtry
1044d032f34aSBram Moolenaar  assert_equal(388, n)
1045d032f34aSBram Moolenaar
1046d032f34aSBram Moolenaar  try
1047d032f34aSBram Moolenaar    echo 4 + g:alist
1048d032f34aSBram Moolenaar  catch /E745:/
1049d032f34aSBram Moolenaar    n = 399
1050d032f34aSBram Moolenaar  endtry
1051d032f34aSBram Moolenaar  assert_equal(399, n)
1052d032f34aSBram Moolenaar
1053d032f34aSBram Moolenaar  try
1054d032f34aSBram Moolenaar    echo g:alist.member
1055d032f34aSBram Moolenaar  catch /E715:/
1056d032f34aSBram Moolenaar    n = 400
1057d032f34aSBram Moolenaar  endtry
1058d032f34aSBram Moolenaar  assert_equal(400, n)
1059d032f34aSBram Moolenaar
1060d032f34aSBram Moolenaar  try
1061d032f34aSBram Moolenaar    echo d.member
1062d032f34aSBram Moolenaar  catch /E716:/
1063d032f34aSBram Moolenaar    n = 411
1064d032f34aSBram Moolenaar  endtry
1065d032f34aSBram Moolenaar  assert_equal(411, n)
10668a7d6542SBram Moolenaarenddef
10678a7d6542SBram Moolenaar
1068e859312eSBram Moolenaardef DeletedFunc(): list<any>
1069e859312eSBram Moolenaar  return ['delete me']
1070e859312eSBram Moolenaarenddef
1071e859312eSBram Moolenaardefcompile
1072e859312eSBram Moolenaardelfunc DeletedFunc
1073e859312eSBram Moolenaar
1074257cc5eeSBram Moolenaardef ThrowFromDef()
1075a72cfb80SBram Moolenaar  throw "getout" # comment
1076257cc5eeSBram Moolenaarenddef
1077257cc5eeSBram Moolenaar
1078257cc5eeSBram Moolenaarfunc CatchInFunc()
1079257cc5eeSBram Moolenaar  try
1080257cc5eeSBram Moolenaar    call ThrowFromDef()
1081257cc5eeSBram Moolenaar  catch
1082257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
1083257cc5eeSBram Moolenaar  endtry
1084257cc5eeSBram Moolenaarendfunc
1085257cc5eeSBram Moolenaar
1086257cc5eeSBram Moolenaardef CatchInDef()
1087257cc5eeSBram Moolenaar  try
1088257cc5eeSBram Moolenaar    ThrowFromDef()
1089257cc5eeSBram Moolenaar  catch
1090257cc5eeSBram Moolenaar    g:thrown_def = v:exception
1091257cc5eeSBram Moolenaar  endtry
1092257cc5eeSBram Moolenaarenddef
1093257cc5eeSBram Moolenaar
1094f575adffSBram Moolenaardef ReturnFinally(): string
1095f575adffSBram Moolenaar  try
1096f575adffSBram Moolenaar    return 'intry'
1097f575adffSBram Moolenaar  finally
1098f575adffSBram Moolenaar    g:in_finally = 'finally'
1099f575adffSBram Moolenaar  endtry
1100f575adffSBram Moolenaar  return 'end'
1101f575adffSBram Moolenaarenddef
1102f575adffSBram Moolenaar
1103257cc5eeSBram Moolenaardef Test_try_catch_nested()
1104257cc5eeSBram Moolenaar  CatchInFunc()
1105257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
1106257cc5eeSBram Moolenaar
1107257cc5eeSBram Moolenaar  CatchInDef()
1108257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
1109f575adffSBram Moolenaar
1110f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
1111f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
1112f575adffSBram Moolenaarenddef
1113f575adffSBram Moolenaar
1114f575adffSBram Moolenaardef Test_try_catch_match()
1115f575adffSBram Moolenaar  let seq = 'a'
1116f575adffSBram Moolenaar  try
1117f575adffSBram Moolenaar    throw 'something'
1118f575adffSBram Moolenaar  catch /nothing/
1119f575adffSBram Moolenaar    seq ..= 'x'
1120f575adffSBram Moolenaar  catch /some/
1121f575adffSBram Moolenaar    seq ..= 'b'
1122f575adffSBram Moolenaar  catch /asdf/
1123f575adffSBram Moolenaar    seq ..= 'x'
1124e8c4abbbSBram Moolenaar  catch ?a\?sdf?
1125e8c4abbbSBram Moolenaar    seq ..= 'y'
1126f575adffSBram Moolenaar  finally
1127f575adffSBram Moolenaar    seq ..= 'c'
1128f575adffSBram Moolenaar  endtry
1129f575adffSBram Moolenaar  assert_equal('abc', seq)
1130257cc5eeSBram Moolenaarenddef
1131257cc5eeSBram Moolenaar
1132e8c4abbbSBram Moolenaardef Test_try_catch_fails()
1133d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
1134d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1135d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1136d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
1137d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1138d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
1139d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
1140d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1141d2c61705SBram Moolenaar  CheckDefFailure(['if 2', 'endtry'], 'E171:')
1142d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
1143585fea7bSBram Moolenaar
1144d2c61705SBram Moolenaar  CheckDefFailure(['throw'], 'E1015:')
1145d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
1146e8c4abbbSBram Moolenaarenddef
1147e8c4abbbSBram Moolenaar
1148006ad48bSBram Moolenaardef Test_throw_vimscript()
1149f5be8cdbSBram Moolenaar  # only checks line continuation
1150006ad48bSBram Moolenaar  let lines =<< trim END
1151006ad48bSBram Moolenaar      vim9script
1152006ad48bSBram Moolenaar      try
1153006ad48bSBram Moolenaar        throw 'one'
1154006ad48bSBram Moolenaar              .. 'two'
1155006ad48bSBram Moolenaar      catch
1156006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
1157006ad48bSBram Moolenaar      endtry
1158006ad48bSBram Moolenaar  END
1159006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
1160006ad48bSBram Moolenaarenddef
1161006ad48bSBram Moolenaar
1162ed677f55SBram Moolenaardef Test_error_in_nested_function()
1163ed677f55SBram Moolenaar  # an error in a nested :function aborts executin in the calling :def function
1164ed677f55SBram Moolenaar  let lines =<< trim END
1165ed677f55SBram Moolenaar      vim9script
1166ed677f55SBram Moolenaar      def Func()
1167ed677f55SBram Moolenaar        Error()
1168ed677f55SBram Moolenaar        g:test_var = 1
1169ed677f55SBram Moolenaar      enddef
1170ed677f55SBram Moolenaar      func Error() abort
1171ed677f55SBram Moolenaar        eval [][0]
1172ed677f55SBram Moolenaar      endfunc
1173ed677f55SBram Moolenaar      Func()
1174ed677f55SBram Moolenaar  END
1175ed677f55SBram Moolenaar  g:test_var = 0
1176ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
1177ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
1178ed677f55SBram Moolenaarenddef
1179ed677f55SBram Moolenaar
118037c83711SBram Moolenaardef Test_cexpr_vimscript()
1181f5be8cdbSBram Moolenaar  # only checks line continuation
118237c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
118337c83711SBram Moolenaar  let lines =<< trim END
118437c83711SBram Moolenaar      vim9script
118537c83711SBram Moolenaar      cexpr 'File'
118637c83711SBram Moolenaar                .. ' someFile' ..
118737c83711SBram Moolenaar                   ' line 19'
118837c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
118937c83711SBram Moolenaar  END
119037c83711SBram Moolenaar  CheckScriptSuccess(lines)
119137c83711SBram Moolenaar  set errorformat&
119237c83711SBram Moolenaarenddef
119337c83711SBram Moolenaar
1194c9edd6b5SBram Moolenaardef Test_statusline_syntax()
1195c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
1196c9edd6b5SBram Moolenaar  let lines =<< trim END
1197c9edd6b5SBram Moolenaar      vim9script
1198c9edd6b5SBram Moolenaar      func g:Status()
1199c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
1200c9edd6b5SBram Moolenaar      endfunc
1201c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
1202c9edd6b5SBram Moolenaar      redrawstatus
1203c9edd6b5SBram Moolenaar      set laststatus statusline=
1204c9edd6b5SBram Moolenaar  END
1205c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
1206c9edd6b5SBram Moolenaarenddef
1207c9edd6b5SBram Moolenaar
1208b209750bSBram Moolenaardef Test_list_vimscript()
1209b209750bSBram Moolenaar  # checks line continuation and comments
1210b209750bSBram Moolenaar  let lines =<< trim END
1211b209750bSBram Moolenaar      vim9script
1212b209750bSBram Moolenaar      let mylist = [
1213b209750bSBram Moolenaar            'one',
1214b209750bSBram Moolenaar            # comment
1215b209750bSBram Moolenaar            'two', # empty line follows
1216b209750bSBram Moolenaar
1217b209750bSBram Moolenaar            'three',
1218b209750bSBram Moolenaar            ]
1219b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
1220b209750bSBram Moolenaar  END
1221b209750bSBram Moolenaar  CheckScriptSuccess(lines)
122266250c93SBram Moolenaar
122366250c93SBram Moolenaar  # check all lines from heredoc are kept
122466250c93SBram Moolenaar  lines =<< trim END
122566250c93SBram Moolenaar      # comment 1
122666250c93SBram Moolenaar      two
122766250c93SBram Moolenaar      # comment 3
122866250c93SBram Moolenaar
122966250c93SBram Moolenaar      five
123066250c93SBram Moolenaar      # comment 6
123166250c93SBram Moolenaar  END
123266250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
1233b209750bSBram Moolenaarenddef
1234b209750bSBram Moolenaar
12352a1381c3SBram Moolenaarif has('channel')
123640ee466cSBram Moolenaar  let someJob = test_null_job()
123740ee466cSBram Moolenaar
123840ee466cSBram Moolenaar  def FuncWithError()
123940ee466cSBram Moolenaar    echomsg g:someJob
124040ee466cSBram Moolenaar  enddef
124140ee466cSBram Moolenaar
124240ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
124340ee466cSBram Moolenaar    try
124440ee466cSBram Moolenaar      call FuncWithError()
124540ee466cSBram Moolenaar    catch
124640ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
124740ee466cSBram Moolenaar    endtry
124840ee466cSBram Moolenaar  endfunc
12492a1381c3SBram Moolenaarendif
125040ee466cSBram Moolenaar
12518a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
12528a7d6542SBram Moolenaar  vim9script
12538a7d6542SBram Moolenaar  let name: string = 'bob'
12548a7d6542SBram Moolenaar  def Concat(arg: string): string
12558a7d6542SBram Moolenaar    return name .. arg
12568a7d6542SBram Moolenaar  enddef
1257227a69deSBram Moolenaar  g:result = Concat('bie')
1258227a69deSBram Moolenaar  g:localname = name
12598a7d6542SBram Moolenaar
12608a7d6542SBram Moolenaar  export const CONST = 1234
12618a7d6542SBram Moolenaar  export let exported = 9876
12626e587dcbSBram Moolenaar  export let exp_name = 'John'
12638a7d6542SBram Moolenaar  export def Exported(): string
12648a7d6542SBram Moolenaar    return 'Exported'
12658a7d6542SBram Moolenaar  enddef
12668a7d6542SBram MoolenaarEND
12678a7d6542SBram Moolenaar
1268b3ca9824SBram Moolenaardef Undo_export_script_lines()
1269b3ca9824SBram Moolenaar  unlet g:result
1270b3ca9824SBram Moolenaar  unlet g:localname
1271b3ca9824SBram Moolenaarenddef
1272b3ca9824SBram Moolenaar
12735269bd2aSBram Moolenaardef Test_vim9_import_export()
12748a7d6542SBram Moolenaar  let import_script_lines =<< trim END
12758a7d6542SBram Moolenaar    vim9script
12768a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
12778a7d6542SBram Moolenaar    g:imported = exported
12786e587dcbSBram Moolenaar    exported += 3
12796e587dcbSBram Moolenaar    g:imported_added = exported
12808a7d6542SBram Moolenaar    g:imported_func = Exported()
12816e587dcbSBram Moolenaar
128240f4f7a4SBram Moolenaar    def GetExported(): string
128340f4f7a4SBram Moolenaar      let local_dict = #{ref: Exported}
128440f4f7a4SBram Moolenaar      return local_dict.ref()
128540f4f7a4SBram Moolenaar    enddef
128640f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
128740f4f7a4SBram Moolenaar
12886e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
12896e587dcbSBram Moolenaar    g:imported_name = exp_name
12906e587dcbSBram Moolenaar    exp_name ..= ' Doe'
12916e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
12925381c7a1SBram Moolenaar    g:imported_later = exported
12938a7d6542SBram Moolenaar  END
12948a7d6542SBram Moolenaar
12958a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
12968a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
12978a7d6542SBram Moolenaar
12988a7d6542SBram Moolenaar  source Ximport.vim
12998a7d6542SBram Moolenaar
13008a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
13018a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
13028a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
13036e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
13045381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
13058a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
130640f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
13076e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
13086e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
13098a7d6542SBram Moolenaar  assert_false(exists('g:name'))
13108a7d6542SBram Moolenaar
1311b3ca9824SBram Moolenaar  Undo_export_script_lines()
13128a7d6542SBram Moolenaar  unlet g:imported
13136e587dcbSBram Moolenaar  unlet g:imported_added
13145381c7a1SBram Moolenaar  unlet g:imported_later
13158a7d6542SBram Moolenaar  unlet g:imported_func
13166e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
13178a7d6542SBram Moolenaar  delete('Ximport.vim')
1318f2d5c240SBram Moolenaar
13191c991144SBram Moolenaar  # similar, with line breaks
13201c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
13211c991144SBram Moolenaar    vim9script
13221c991144SBram Moolenaar    import {
13231c991144SBram Moolenaar        exported,
13241c991144SBram Moolenaar        Exported,
13251c991144SBram Moolenaar        }
13261c991144SBram Moolenaar        from
13271c991144SBram Moolenaar        './Xexport.vim'
13281c991144SBram Moolenaar    g:imported = exported
13291c991144SBram Moolenaar    exported += 5
13301c991144SBram Moolenaar    g:imported_added = exported
13311c991144SBram Moolenaar    g:imported_func = Exported()
13321c991144SBram Moolenaar  END
13331c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
13341c991144SBram Moolenaar  source Ximport_lbr.vim
13351c991144SBram Moolenaar
13361c991144SBram Moolenaar  assert_equal(9876, g:imported)
13371c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
13381c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
13391c991144SBram Moolenaar
13401c991144SBram Moolenaar  # exported script not sourced again
13411c991144SBram Moolenaar  assert_false(exists('g:result'))
13421c991144SBram Moolenaar  unlet g:imported
13431c991144SBram Moolenaar  unlet g:imported_added
13441c991144SBram Moolenaar  unlet g:imported_func
13451c991144SBram Moolenaar  delete('Ximport_lbr.vim')
13461c991144SBram Moolenaar
13471c991144SBram Moolenaar  # import inside :def function
13485381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
13495381c7a1SBram Moolenaar    vim9script
13505381c7a1SBram Moolenaar    def ImportInDef()
13515381c7a1SBram Moolenaar      import exported from './Xexport.vim'
13525381c7a1SBram Moolenaar      g:imported = exported
13535381c7a1SBram Moolenaar      exported += 7
13545381c7a1SBram Moolenaar      g:imported_added = exported
13555381c7a1SBram Moolenaar    enddef
13565381c7a1SBram Moolenaar    ImportInDef()
13575381c7a1SBram Moolenaar  END
13585381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
13595381c7a1SBram Moolenaar  source Ximport2.vim
1360f5be8cdbSBram Moolenaar  # TODO: this should be 9879
13615381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
13625381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
13635381c7a1SBram Moolenaar  unlet g:imported
13645381c7a1SBram Moolenaar  unlet g:imported_added
13655381c7a1SBram Moolenaar  delete('Ximport2.vim')
13665381c7a1SBram Moolenaar
1367f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
1368f2d5c240SBram Moolenaar    vim9script
1369f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1370f2d5c240SBram Moolenaar    def UseExport()
1371f2d5c240SBram Moolenaar      g:imported = Export.exported
1372f2d5c240SBram Moolenaar    enddef
1373f2d5c240SBram Moolenaar    UseExport()
1374f2d5c240SBram Moolenaar  END
1375f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1376f2d5c240SBram Moolenaar  source Ximport.vim
13775381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1378f2d5c240SBram Moolenaar
1379599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
1380599c89c8SBram Moolenaar    vim9script
1381599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1382599c89c8SBram Moolenaar    def Func()
1383599c89c8SBram Moolenaar      let dummy = 1
1384599c89c8SBram Moolenaar      let imported = Export + dummy
1385599c89c8SBram Moolenaar    enddef
1386822ba247SBram Moolenaar    defcompile
1387599c89c8SBram Moolenaar  END
1388599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
138944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
1390599c89c8SBram Moolenaar
1391599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
1392599c89c8SBram Moolenaar    vim9script
1393599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1394599c89c8SBram Moolenaar    def Func()
1395599c89c8SBram Moolenaar      let imported = Export . exported
1396599c89c8SBram Moolenaar    enddef
1397822ba247SBram Moolenaar    defcompile
1398599c89c8SBram Moolenaar  END
1399599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
140044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
1401599c89c8SBram Moolenaar
1402599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
1403599c89c8SBram Moolenaar    vim9script
1404599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1405599c89c8SBram Moolenaar    def Func()
1406599c89c8SBram Moolenaar      let imported = Export.
1407599c89c8SBram Moolenaar    enddef
1408822ba247SBram Moolenaar    defcompile
1409599c89c8SBram Moolenaar  END
1410599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
141144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1412599c89c8SBram Moolenaar
14131c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
14141c991144SBram Moolenaar    vim9script
14151c991144SBram Moolenaar    import *
14161c991144SBram Moolenaar        as Export
14171c991144SBram Moolenaar        from
14181c991144SBram Moolenaar        './Xexport.vim'
14191c991144SBram Moolenaar    def UseExport()
14201c991144SBram Moolenaar      g:imported = Export.exported
14211c991144SBram Moolenaar    enddef
14221c991144SBram Moolenaar    UseExport()
14231c991144SBram Moolenaar  END
14241c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
14251c991144SBram Moolenaar  source Ximport.vim
14261c991144SBram Moolenaar  assert_equal(9883, g:imported)
14271c991144SBram Moolenaar
1428f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1429f2d5c240SBram Moolenaar    vim9script
1430f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1431f2d5c240SBram Moolenaar  END
1432f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
143344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1434f2d5c240SBram Moolenaar
1435f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1436fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1437fa29c8abSBram Moolenaar    vim9script
1438fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1439fa29c8abSBram Moolenaar  END
1440fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
144144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1442fa29c8abSBram Moolenaar
1443f5be8cdbSBram Moolenaar  # try to import something that is already defined
14445269bd2aSBram Moolenaar  let import_already_defined =<< trim END
14455269bd2aSBram Moolenaar    vim9script
14465269bd2aSBram Moolenaar    let exported = 'something'
14475269bd2aSBram Moolenaar    import exported from './Xexport.vim'
14485269bd2aSBram Moolenaar  END
14495269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
145044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
14515269bd2aSBram Moolenaar
1452f5be8cdbSBram Moolenaar  # try to import something that is already defined
14535269bd2aSBram Moolenaar  import_already_defined =<< trim END
14545269bd2aSBram Moolenaar    vim9script
14555269bd2aSBram Moolenaar    let exported = 'something'
14565269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
14575269bd2aSBram Moolenaar  END
14585269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
145944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
14605269bd2aSBram Moolenaar
1461f5be8cdbSBram Moolenaar  # try to import something that is already defined
14625269bd2aSBram Moolenaar  import_already_defined =<< trim END
14635269bd2aSBram Moolenaar    vim9script
14645269bd2aSBram Moolenaar    let exported = 'something'
14655269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
14665269bd2aSBram Moolenaar  END
14675269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
146844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
14695269bd2aSBram Moolenaar
1470f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1471fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1472fa29c8abSBram Moolenaar    vim9script
1473fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1474fa29c8abSBram Moolenaar  END
1475fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
147644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1477fa29c8abSBram Moolenaar
1478fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1479fa29c8abSBram Moolenaar    vim9script
1480fa29c8abSBram Moolenaar    import name './Xexport.vim'
1481fa29c8abSBram Moolenaar  END
1482fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
148344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1484fa29c8abSBram Moolenaar
1485fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1486fa29c8abSBram Moolenaar    vim9script
1487fa29c8abSBram Moolenaar    import name from Xexport.vim
1488fa29c8abSBram Moolenaar  END
1489fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
149044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
1491fa29c8abSBram Moolenaar
1492fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1493fa29c8abSBram Moolenaar    vim9script
1494fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1495fa29c8abSBram Moolenaar  END
1496fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
149744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1498fa29c8abSBram Moolenaar
1499fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1500fa29c8abSBram Moolenaar    vim9script
1501fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1502fa29c8abSBram Moolenaar  END
15035269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
150444d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1505fa29c8abSBram Moolenaar
1506f2d5c240SBram Moolenaar  delete('Ximport.vim')
15075269bd2aSBram Moolenaar  delete('Ximport3.vim')
15088a7d6542SBram Moolenaar  delete('Xexport.vim')
15098a7d6542SBram Moolenaar
1510f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1511750802b5SBram Moolenaar  set cpo&vi
1512750802b5SBram Moolenaar  let cpo_before = &cpo
1513750802b5SBram Moolenaar  let lines =<< trim END
1514750802b5SBram Moolenaar    vim9script
1515750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1516750802b5SBram Moolenaar  END
1517750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1518750802b5SBram Moolenaar  source Xvim9_script
1519750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1520750802b5SBram Moolenaar  set cpo&vim
1521750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1522750802b5SBram Moolenaar  delete('Xvim9_script')
1523750802b5SBram Moolenaarenddef
1524750802b5SBram Moolenaar
1525803af686SBram Moolenaarfunc g:Trigger()
1526803af686SBram Moolenaar  source Ximport.vim
1527803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1528803af686SBram Moolenaarendfunc
1529803af686SBram Moolenaar
1530803af686SBram Moolenaardef Test_import_export_expr_map()
1531803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1532803af686SBram Moolenaar  let export_lines =<< trim END
1533803af686SBram Moolenaar    vim9script
1534803af686SBram Moolenaar    export def That(): string
1535803af686SBram Moolenaar      return 'yes'
1536803af686SBram Moolenaar    enddef
1537803af686SBram Moolenaar  END
1538803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1539803af686SBram Moolenaar
1540803af686SBram Moolenaar  let import_lines =<< trim END
1541803af686SBram Moolenaar    vim9script
1542803af686SBram Moolenaar    import That from './Xexport_that.vim'
1543803af686SBram Moolenaar    assert_equal('yes', That())
1544803af686SBram Moolenaar  END
1545803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1546803af686SBram Moolenaar
1547803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1548803af686SBram Moolenaar  feedkeys('trigger', "xt")
1549803af686SBram Moolenaar
1550730b2483SBram Moolenaar  delete('Xexport_that.vim')
1551803af686SBram Moolenaar  delete('Ximport.vim')
1552803af686SBram Moolenaar  nunmap trigger
1553803af686SBram Moolenaarenddef
1554803af686SBram Moolenaar
15558e1986e3SBram Moolenaardef Test_import_in_filetype()
15568e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
15578e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
15588e1986e3SBram Moolenaar  let export_lines =<< trim END
15598e1986e3SBram Moolenaar    vim9script
15608e1986e3SBram Moolenaar    export let That = 'yes'
15618e1986e3SBram Moolenaar  END
1562730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
15638e1986e3SBram Moolenaar
15648e1986e3SBram Moolenaar  let import_lines =<< trim END
15658e1986e3SBram Moolenaar    vim9script
1566730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
15678e1986e3SBram Moolenaar    assert_equal('yes', That)
15688e1986e3SBram Moolenaar    g:did_load_mytpe = 1
15698e1986e3SBram Moolenaar  END
15708e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
15718e1986e3SBram Moolenaar
15728e1986e3SBram Moolenaar  let save_rtp = &rtp
15738e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
15748e1986e3SBram Moolenaar
15758e1986e3SBram Moolenaar  filetype plugin on
15768e1986e3SBram Moolenaar  copen
15778e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
15788e1986e3SBram Moolenaar
15798e1986e3SBram Moolenaar  quit!
1580730b2483SBram Moolenaar  delete('Xexport_ft.vim')
15818e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
15828e1986e3SBram Moolenaar  &rtp = save_rtp
15838e1986e3SBram Moolenaarenddef
15848e1986e3SBram Moolenaar
1585efa94447SBram Moolenaardef Test_use_import_in_mapping()
1586efa94447SBram Moolenaar  let lines =<< trim END
1587efa94447SBram Moolenaar      vim9script
1588efa94447SBram Moolenaar      export def Funcx()
1589efa94447SBram Moolenaar        g:result = 42
1590efa94447SBram Moolenaar      enddef
1591efa94447SBram Moolenaar  END
1592efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1593efa94447SBram Moolenaar  lines =<< trim END
1594efa94447SBram Moolenaar      vim9script
1595efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1596b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1597efa94447SBram Moolenaar  END
1598efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1599efa94447SBram Moolenaar
1600efa94447SBram Moolenaar  source Xmapscript.vim
1601b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1602efa94447SBram Moolenaar  assert_equal(42, g:result)
1603efa94447SBram Moolenaar
1604efa94447SBram Moolenaar  unlet g:result
1605efa94447SBram Moolenaar  delete('XsomeExport.vim')
1606efa94447SBram Moolenaar  delete('Xmapscript.vim')
1607b3ca9824SBram Moolenaar  nunmap <F3>
1608efa94447SBram Moolenaarenddef
1609efa94447SBram Moolenaar
1610750802b5SBram Moolenaardef Test_vim9script_fails()
16118a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
16128a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1613750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
16149721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
16159b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1616750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1617750802b5SBram Moolenaar
1618451c2e35SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1012:')
1619c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1620c785b9a7SBram Moolenaar
1621e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1622e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
16238a7d6542SBram Moolenaarenddef
16248a7d6542SBram Moolenaar
1625f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1626101f4810SBram Moolenaar  CheckRunVimInTerminal
1627101f4810SBram Moolenaar
16289bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1629c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
16309bb3eb3eSBram Moolenaarendfunc
16319bb3eb3eSBram Moolenaar
1632c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1633101f4810SBram Moolenaar  let export =<< trim END
1634101f4810SBram Moolenaar    vim9script
1635101f4810SBram Moolenaar    export def Foo(): number
1636101f4810SBram Moolenaar        return 0
1637101f4810SBram Moolenaar    enddef
1638101f4810SBram Moolenaar  END
1639730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1640101f4810SBram Moolenaar
1641730b2483SBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{
16429bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
16439bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1644101f4810SBram Moolenaar
1645730b2483SBram Moolenaar  delete('XexportCmd.vim')
16469bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
16479bb3eb3eSBram Moolenaarenddef
1648101f4810SBram Moolenaar
16494c17ad94SBram Moolenaardef Test_vim9script_reload_import()
16508a7d6542SBram Moolenaar  let lines =<< trim END
16518a7d6542SBram Moolenaar    vim9script
16528a7d6542SBram Moolenaar    const var = ''
16538a7d6542SBram Moolenaar    let valone = 1234
16548a7d6542SBram Moolenaar    def MyFunc(arg: string)
16558a7d6542SBram Moolenaar       valone = 5678
16568a7d6542SBram Moolenaar    enddef
16578a7d6542SBram Moolenaar  END
16588a7d6542SBram Moolenaar  let morelines =<< trim END
16598a7d6542SBram Moolenaar    let valtwo = 222
16608a7d6542SBram Moolenaar    export def GetValtwo(): number
16618a7d6542SBram Moolenaar      return valtwo
16628a7d6542SBram Moolenaar    enddef
16638a7d6542SBram Moolenaar  END
166403afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
16658a7d6542SBram Moolenaar  source Xreload.vim
16668a7d6542SBram Moolenaar  source Xreload.vim
16678a7d6542SBram Moolenaar  source Xreload.vim
16688a7d6542SBram Moolenaar
16698a7d6542SBram Moolenaar  let testlines =<< trim END
16708a7d6542SBram Moolenaar    vim9script
16718a7d6542SBram Moolenaar    def TheFunc()
16728a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
16738a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
16748a7d6542SBram Moolenaar    enddef
16758a7d6542SBram Moolenaar    TheFunc()
16768a7d6542SBram Moolenaar  END
16778a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
16788a7d6542SBram Moolenaar  source Ximport.vim
16798a7d6542SBram Moolenaar
1680f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1681f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
16828a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
16838a7d6542SBram Moolenaar  source Ximport.vim
16848a7d6542SBram Moolenaar
1685f5be8cdbSBram Moolenaar  # cannot declare a var twice
16868a7d6542SBram Moolenaar  lines =<< trim END
16878a7d6542SBram Moolenaar    vim9script
16888a7d6542SBram Moolenaar    let valone = 1234
16898a7d6542SBram Moolenaar    let valone = 5678
16908a7d6542SBram Moolenaar  END
16918a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
169244d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
16938a7d6542SBram Moolenaar
16948a7d6542SBram Moolenaar  delete('Xreload.vim')
16958a7d6542SBram Moolenaar  delete('Ximport.vim')
16968a7d6542SBram Moolenaarenddef
16978a7d6542SBram Moolenaar
169895006e3dSBram Moolenaardef s:RetSome(): string
169995006e3dSBram Moolenaar  return 'some'
170095006e3dSBram Moolenaarenddef
170195006e3dSBram Moolenaar
1702fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1703fe465a01SBram Moolenaar" script-local name.
1704fe465a01SBram Moolenaardef Test_vim9script_funcref()
1705fe465a01SBram Moolenaar  let sortlines =<< trim END
1706fe465a01SBram Moolenaar      vim9script
1707fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1708bed36b93SBram Moolenaar        return i2 - i1
1709fe465a01SBram Moolenaar      enddef
1710fe465a01SBram Moolenaar
1711fe465a01SBram Moolenaar      export def FastSort(): list<number>
1712fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1713fe465a01SBram Moolenaar      enddef
1714fe465a01SBram Moolenaar  END
1715fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1716fe465a01SBram Moolenaar
1717fe465a01SBram Moolenaar  let lines =<< trim END
1718fe465a01SBram Moolenaar    vim9script
1719fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1720fe465a01SBram Moolenaar    def Test()
1721fe465a01SBram Moolenaar      g:result = FastSort()
1722fe465a01SBram Moolenaar    enddef
1723fe465a01SBram Moolenaar    Test()
1724fe465a01SBram Moolenaar  END
1725fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1726fe465a01SBram Moolenaar
1727fe465a01SBram Moolenaar  source Xscript.vim
1728fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1729fe465a01SBram Moolenaar
1730fe465a01SBram Moolenaar  unlet g:result
1731fe465a01SBram Moolenaar  delete('Xsort.vim')
1732fe465a01SBram Moolenaar  delete('Xscript.vim')
173395006e3dSBram Moolenaar
173495006e3dSBram Moolenaar  let Funcref = function('s:RetSome')
173595006e3dSBram Moolenaar  assert_equal('some', Funcref())
1736fe465a01SBram Moolenaarenddef
1737fe465a01SBram Moolenaar
1738601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1739601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1740601e76acSBram Moolenaar" function reference.
1741c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1742c620c055SBram Moolenaar  let filterLines =<< trim END
1743c620c055SBram Moolenaar    vim9script
1744c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1745c620c055SBram Moolenaar      return idx % 2 == 1
1746c620c055SBram Moolenaar    enddef
1747c620c055SBram Moolenaar    export def FastFilter(): list<number>
1748c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1749c620c055SBram Moolenaar    enddef
1750601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1751601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1752601e76acSBram Moolenaar    enddef
1753c620c055SBram Moolenaar  END
1754c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1755c620c055SBram Moolenaar
1756c620c055SBram Moolenaar  let lines =<< trim END
1757c620c055SBram Moolenaar    vim9script
1758601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1759c620c055SBram Moolenaar    def Test()
1760c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1761c620c055SBram Moolenaar    enddef
1762c620c055SBram Moolenaar    Test()
1763601e76acSBram Moolenaar    def TestDirect()
1764601e76acSBram Moolenaar      let x: list<number> = FastFilterDirect()
1765601e76acSBram Moolenaar    enddef
1766601e76acSBram Moolenaar    TestDirect()
1767c620c055SBram Moolenaar  END
1768601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1769c620c055SBram Moolenaar  delete('Xfilter.vim')
1770c620c055SBram Moolenaarenddef
1771c620c055SBram Moolenaar
17724c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
17734c17ad94SBram Moolenaar  let first_lines =<< trim END
17744c17ad94SBram Moolenaar    vim9script
17754c17ad94SBram Moolenaar    def FuncYes(): string
17764c17ad94SBram Moolenaar      return 'yes'
17774c17ad94SBram Moolenaar    enddef
17784c17ad94SBram Moolenaar  END
177903afdcf1SBram Moolenaar  let withno_lines =<< trim END
17804c17ad94SBram Moolenaar    def FuncNo(): string
17814c17ad94SBram Moolenaar      return 'no'
17824c17ad94SBram Moolenaar    enddef
17834c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
17844c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
17854c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
178603afdcf1SBram Moolenaar    enddef
178703afdcf1SBram Moolenaar  END
178803afdcf1SBram Moolenaar  let nono_lines =<< trim END
178903afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
179003afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
179144d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
17924c17ad94SBram Moolenaar    enddef
17934c17ad94SBram Moolenaar  END
17944c17ad94SBram Moolenaar
17954c17ad94SBram Moolenaar  # FuncNo() is defined
179603afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
17974c17ad94SBram Moolenaar  source Xreloaded.vim
17984c17ad94SBram Moolenaar  g:DoCheck(true)
17994c17ad94SBram Moolenaar
18004c17ad94SBram Moolenaar  # FuncNo() is not redefined
180103afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
18024c17ad94SBram Moolenaar  source Xreloaded.vim
180303afdcf1SBram Moolenaar  g:DoCheck()
18044c17ad94SBram Moolenaar
18054c17ad94SBram Moolenaar  # FuncNo() is back
180603afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
18074c17ad94SBram Moolenaar  source Xreloaded.vim
180803afdcf1SBram Moolenaar  g:DoCheck()
18094c17ad94SBram Moolenaar
18104c17ad94SBram Moolenaar  delete('Xreloaded.vim')
18114c17ad94SBram Moolenaarenddef
18124c17ad94SBram Moolenaar
181389483d40SBram Moolenaardef Test_vim9script_reload_delvar()
181489483d40SBram Moolenaar  # write the script with a script-local variable
181589483d40SBram Moolenaar  let lines =<< trim END
181689483d40SBram Moolenaar    vim9script
181789483d40SBram Moolenaar    let var = 'string'
181889483d40SBram Moolenaar  END
181989483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
182089483d40SBram Moolenaar  source XreloadVar.vim
182189483d40SBram Moolenaar
182289483d40SBram Moolenaar  # now write the script using the same variable locally - works
182389483d40SBram Moolenaar  lines =<< trim END
182489483d40SBram Moolenaar    vim9script
182589483d40SBram Moolenaar    def Func()
182689483d40SBram Moolenaar      let var = 'string'
182789483d40SBram Moolenaar    enddef
182889483d40SBram Moolenaar  END
182989483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
183089483d40SBram Moolenaar  source XreloadVar.vim
183189483d40SBram Moolenaar
183289483d40SBram Moolenaar  delete('XreloadVar.vim')
183389483d40SBram Moolenaarenddef
183489483d40SBram Moolenaar
18358a7d6542SBram Moolenaardef Test_import_absolute()
18368a7d6542SBram Moolenaar  let import_lines = [
1837e6085c53SBram Moolenaar        'vim9script',
1838e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1839e6085c53SBram Moolenaar        'def UseExported()',
1840e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1841e6085c53SBram Moolenaar        '  exported = 8888',
1842e6085c53SBram Moolenaar        '  g:imported_after = exported',
1843e6085c53SBram Moolenaar        'enddef',
1844e6085c53SBram Moolenaar        'UseExported()',
1845e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1846e6085c53SBram Moolenaar        ]
18478a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
18488a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
18498a7d6542SBram Moolenaar
18508a7d6542SBram Moolenaar  source Ximport_abs.vim
18518a7d6542SBram Moolenaar
18528a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
18534e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1854675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1855675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1856675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1857675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1858675f716eSBram Moolenaar          'exported = 8888.*' ..
1859675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1860675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1861675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1862675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1863e6085c53SBram Moolenaar        g:import_disassembled)
1864b3ca9824SBram Moolenaar
1865b3ca9824SBram Moolenaar  Undo_export_script_lines()
18668a7d6542SBram Moolenaar  unlet g:imported_abs
18674e12a5dfSBram Moolenaar  unlet g:import_disassembled
18688a7d6542SBram Moolenaar
18698a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
18708a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
18718a7d6542SBram Moolenaarenddef
18728a7d6542SBram Moolenaar
18738a7d6542SBram Moolenaardef Test_import_rtp()
18748a7d6542SBram Moolenaar  let import_lines = [
1875e6085c53SBram Moolenaar        'vim9script',
1876e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1877e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1878e6085c53SBram Moolenaar        ]
18798a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
18808a7d6542SBram Moolenaar  mkdir('import')
18818a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
18828a7d6542SBram Moolenaar
18838a7d6542SBram Moolenaar  let save_rtp = &rtp
18848a7d6542SBram Moolenaar  &rtp = getcwd()
18858a7d6542SBram Moolenaar  source Ximport_rtp.vim
18868a7d6542SBram Moolenaar  &rtp = save_rtp
18878a7d6542SBram Moolenaar
18888a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
18898a7d6542SBram Moolenaar
1890b3ca9824SBram Moolenaar  Undo_export_script_lines()
1891b3ca9824SBram Moolenaar  unlet g:imported_rtp
18928a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
189389483d40SBram Moolenaar  delete('import', 'rf')
18948a7d6542SBram Moolenaarenddef
18958a7d6542SBram Moolenaar
189625e0f586SBram Moolenaardef Test_import_compile_error()
189725e0f586SBram Moolenaar  let export_lines = [
189825e0f586SBram Moolenaar        'vim9script',
189925e0f586SBram Moolenaar        'export def ExpFunc(): string',
190025e0f586SBram Moolenaar        '  return notDefined',
190125e0f586SBram Moolenaar        'enddef',
190225e0f586SBram Moolenaar        ]
190325e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
190425e0f586SBram Moolenaar
190525e0f586SBram Moolenaar  let import_lines = [
190625e0f586SBram Moolenaar        'vim9script',
190725e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
190825e0f586SBram Moolenaar        'def ImpFunc()',
190925e0f586SBram Moolenaar        '  echo ExpFunc()',
191025e0f586SBram Moolenaar        'enddef',
191125e0f586SBram Moolenaar        'defcompile',
191225e0f586SBram Moolenaar        ]
191325e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
191425e0f586SBram Moolenaar
191525e0f586SBram Moolenaar  try
191625e0f586SBram Moolenaar    source Ximport.vim
191725e0f586SBram Moolenaar  catch /E1001/
1918f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
191925e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
192025e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
192125e0f586SBram Moolenaar  endtry
192225e0f586SBram Moolenaar
192325e0f586SBram Moolenaar  delete('Xexported.vim')
192425e0f586SBram Moolenaar  delete('Ximport.vim')
192525e0f586SBram Moolenaarenddef
192625e0f586SBram Moolenaar
1927c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1928c4ce36d4SBram Moolenaar  let lines = [
1929c4ce36d4SBram Moolenaar        'vim9script',
1930c4ce36d4SBram Moolenaar        'def Func()',
1931c4ce36d4SBram Moolenaar        '  eval [][0]',
1932c4ce36d4SBram Moolenaar        'enddef',
1933c4ce36d4SBram Moolenaar        'Func()',
1934c4ce36d4SBram Moolenaar        ]
1935c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1936c4ce36d4SBram Moolenaar
1937c4ce36d4SBram Moolenaar  for count in range(3)
1938c4ce36d4SBram Moolenaar    try
1939c4ce36d4SBram Moolenaar      source Xtestscript.vim
1940c4ce36d4SBram Moolenaar    catch /E684/
1941c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1942c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1943c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1944c4ce36d4SBram Moolenaar    endtry
1945c4ce36d4SBram Moolenaar  endfor
1946c4ce36d4SBram Moolenaar
1947c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1948c4ce36d4SBram Moolenaarenddef
1949c4ce36d4SBram Moolenaar
1950eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1951eef2102eSBram Moolenaar  let export_lines =<< trim END
1952eef2102eSBram Moolenaar      vim9script
1953eef2102eSBram Moolenaar      export def Func()
1954eef2102eSBram Moolenaar        echo 'imported'
1955eef2102eSBram Moolenaar      enddef
1956eef2102eSBram Moolenaar  END
1957eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1958eef2102eSBram Moolenaar
1959eef2102eSBram Moolenaar  let lines =<< trim END
1960eef2102eSBram Moolenaar    vim9script
1961eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1962eef2102eSBram Moolenaar    def Func()
1963eef2102eSBram Moolenaar      echo 'local to function'
1964eef2102eSBram Moolenaar    enddef
1965eef2102eSBram Moolenaar  END
1966eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1967eef2102eSBram Moolenaar
1968eef2102eSBram Moolenaar  lines =<< trim END
1969eef2102eSBram Moolenaar    vim9script
1970eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1971eef2102eSBram Moolenaar    def Outer()
1972eef2102eSBram Moolenaar      def Func()
1973eef2102eSBram Moolenaar        echo 'local to function'
1974eef2102eSBram Moolenaar      enddef
1975eef2102eSBram Moolenaar    enddef
1976eef2102eSBram Moolenaar    defcompile
1977eef2102eSBram Moolenaar  END
1978eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1979eef2102eSBram Moolenaar
1980eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1981eef2102eSBram Moolenaarenddef
1982eef2102eSBram Moolenaar
1983b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1984b9a2cac3SBram Moolenaar  let lines =<< trim END
1985b9a2cac3SBram Moolenaar    vim9script
1986b9a2cac3SBram Moolenaar    def Func()
1987b9a2cac3SBram Moolenaar      echo 'one'
1988b9a2cac3SBram Moolenaar    enddef
1989b9a2cac3SBram Moolenaar    def Func()
1990b9a2cac3SBram Moolenaar      echo 'two'
1991b9a2cac3SBram Moolenaar    enddef
1992b9a2cac3SBram Moolenaar  END
1993b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1994fa211f3cSBram Moolenaar
1995fa211f3cSBram Moolenaar  lines =<< trim END
1996fa211f3cSBram Moolenaar    vim9script
1997fa211f3cSBram Moolenaar    def Foo(): string
1998fa211f3cSBram Moolenaar      return 'foo'
1999fa211f3cSBram Moolenaar      enddef
2000fa211f3cSBram Moolenaar    def Func()
2001fa211f3cSBram Moolenaar      let  Foo = {-> 'lambda'}
2002fa211f3cSBram Moolenaar    enddef
2003fa211f3cSBram Moolenaar    defcompile
2004fa211f3cSBram Moolenaar  END
2005fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2006b9a2cac3SBram Moolenaarenddef
2007b9a2cac3SBram Moolenaar
20088a7d6542SBram Moolenaardef Test_fixed_size_list()
2009f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
20108a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
20118a7d6542SBram Moolenaar  l->remove(0)
20128a7d6542SBram Moolenaar  l->add(5)
20138a7d6542SBram Moolenaar  l->insert(99, 1)
20140f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
20158a7d6542SBram Moolenaarenddef
20168a7d6542SBram Moolenaar
2017ae616494SBram Moolenaardef Test_no_insert_xit()
2018d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
2019d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
2020d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
2021d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
2022d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
2023ae616494SBram Moolenaar
2024ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
2025ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
2026ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
2027ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
2028f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
2029f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
2030f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
2031f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
2032f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
2033ae616494SBram Moolenaarenddef
2034ae616494SBram Moolenaar
2035158906cfSBram Moolenaardef IfElse(what: number): string
2036158906cfSBram Moolenaar  let res = ''
2037158906cfSBram Moolenaar  if what == 1
2038158906cfSBram Moolenaar    res = "one"
2039158906cfSBram Moolenaar  elseif what == 2
2040158906cfSBram Moolenaar    res = "two"
2041a259d8d3SBram Moolenaar  else
2042158906cfSBram Moolenaar    res = "three"
2043a259d8d3SBram Moolenaar  endif
2044158906cfSBram Moolenaar  return res
2045a259d8d3SBram Moolenaarenddef
2046a259d8d3SBram Moolenaar
2047158906cfSBram Moolenaardef Test_if_elseif_else()
2048158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
2049158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
2050158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
20510f18b6d1SBram Moolenaarenddef
20520f18b6d1SBram Moolenaar
2053e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
2054d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
2055d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
2056d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
2057d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
2058d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
2059e8c4abbbSBram Moolenaarenddef
2060e8c4abbbSBram Moolenaar
20616d69bf60SBram Moolenaarlet g:bool_true = v:true
20626d69bf60SBram Moolenaarlet g:bool_false = v:false
20636d69bf60SBram Moolenaar
20646d69bf60SBram Moolenaardef Test_if_const_expr()
20656d69bf60SBram Moolenaar  let res = false
20666d69bf60SBram Moolenaar  if true ? true : false
20676d69bf60SBram Moolenaar    res = true
20686d69bf60SBram Moolenaar  endif
20696d69bf60SBram Moolenaar  assert_equal(true, res)
20706d69bf60SBram Moolenaar
2071585fea7bSBram Moolenaar  g:glob = 2
2072585fea7bSBram Moolenaar  if false
20736797966dSBram Moolenaar    execute('g:glob = 3')
2074585fea7bSBram Moolenaar  endif
2075585fea7bSBram Moolenaar  assert_equal(2, g:glob)
2076585fea7bSBram Moolenaar  if true
20776797966dSBram Moolenaar    execute('g:glob = 3')
2078585fea7bSBram Moolenaar  endif
2079585fea7bSBram Moolenaar  assert_equal(3, g:glob)
2080585fea7bSBram Moolenaar
20816d69bf60SBram Moolenaar  res = false
20826d69bf60SBram Moolenaar  if g:bool_true ? true : false
20836d69bf60SBram Moolenaar    res = true
20846d69bf60SBram Moolenaar  endif
20856d69bf60SBram Moolenaar  assert_equal(true, res)
20866d69bf60SBram Moolenaar
20876d69bf60SBram Moolenaar  res = false
20886d69bf60SBram Moolenaar  if true ? g:bool_true : false
20896d69bf60SBram Moolenaar    res = true
20906d69bf60SBram Moolenaar  endif
20916d69bf60SBram Moolenaar  assert_equal(true, res)
20926d69bf60SBram Moolenaar
20936d69bf60SBram Moolenaar  res = false
20946d69bf60SBram Moolenaar  if true ? true : g:bool_false
20956d69bf60SBram Moolenaar    res = true
20966d69bf60SBram Moolenaar  endif
20976d69bf60SBram Moolenaar  assert_equal(true, res)
20986d69bf60SBram Moolenaar
20996d69bf60SBram Moolenaar  res = false
21006d69bf60SBram Moolenaar  if true ? false : true
21016d69bf60SBram Moolenaar    res = true
21026d69bf60SBram Moolenaar  endif
21036d69bf60SBram Moolenaar  assert_equal(false, res)
21046d69bf60SBram Moolenaar
21056d69bf60SBram Moolenaar  res = false
21066d69bf60SBram Moolenaar  if false ? false : true
21076d69bf60SBram Moolenaar    res = true
21086d69bf60SBram Moolenaar  endif
21096d69bf60SBram Moolenaar  assert_equal(true, res)
21106d69bf60SBram Moolenaar
21116d69bf60SBram Moolenaar  res = false
21126d69bf60SBram Moolenaar  if false ? true : false
21136d69bf60SBram Moolenaar    res = true
21146d69bf60SBram Moolenaar  endif
21156d69bf60SBram Moolenaar  assert_equal(false, res)
21166d69bf60SBram Moolenaar
21176d69bf60SBram Moolenaar  res = false
2118e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2119e8c4abbbSBram Moolenaar    res = true
2120e8c4abbbSBram Moolenaar  endif
2121e8c4abbbSBram Moolenaar  assert_equal(false, res)
2122e8c4abbbSBram Moolenaar
2123e8c4abbbSBram Moolenaar  res = false
21246d69bf60SBram Moolenaar  if true && true
21256d69bf60SBram Moolenaar    res = true
21266d69bf60SBram Moolenaar  endif
21276d69bf60SBram Moolenaar  assert_equal(true, res)
21286d69bf60SBram Moolenaar
21296d69bf60SBram Moolenaar  res = false
21306d69bf60SBram Moolenaar  if true && false
21316d69bf60SBram Moolenaar    res = true
21326d69bf60SBram Moolenaar  endif
21336d69bf60SBram Moolenaar  assert_equal(false, res)
21346d69bf60SBram Moolenaar
21356d69bf60SBram Moolenaar  res = false
21366d69bf60SBram Moolenaar  if g:bool_true && false
21376d69bf60SBram Moolenaar    res = true
21386d69bf60SBram Moolenaar  endif
21396d69bf60SBram Moolenaar  assert_equal(false, res)
21406d69bf60SBram Moolenaar
21416d69bf60SBram Moolenaar  res = false
21426d69bf60SBram Moolenaar  if true && g:bool_false
21436d69bf60SBram Moolenaar    res = true
21446d69bf60SBram Moolenaar  endif
21456d69bf60SBram Moolenaar  assert_equal(false, res)
21466d69bf60SBram Moolenaar
21476d69bf60SBram Moolenaar  res = false
21486d69bf60SBram Moolenaar  if false && false
21496d69bf60SBram Moolenaar    res = true
21506d69bf60SBram Moolenaar  endif
21516d69bf60SBram Moolenaar  assert_equal(false, res)
21526d69bf60SBram Moolenaar
21536d69bf60SBram Moolenaar  res = false
21546d69bf60SBram Moolenaar  if true || false
21556d69bf60SBram Moolenaar    res = true
21566d69bf60SBram Moolenaar  endif
21576d69bf60SBram Moolenaar  assert_equal(true, res)
21586d69bf60SBram Moolenaar
21596d69bf60SBram Moolenaar  res = false
21606d69bf60SBram Moolenaar  if g:bool_true || false
21616d69bf60SBram Moolenaar    res = true
21626d69bf60SBram Moolenaar  endif
21636d69bf60SBram Moolenaar  assert_equal(true, res)
21646d69bf60SBram Moolenaar
21656d69bf60SBram Moolenaar  res = false
21666d69bf60SBram Moolenaar  if true || g:bool_false
21676d69bf60SBram Moolenaar    res = true
21686d69bf60SBram Moolenaar  endif
21696d69bf60SBram Moolenaar  assert_equal(true, res)
21706d69bf60SBram Moolenaar
21716d69bf60SBram Moolenaar  res = false
21726d69bf60SBram Moolenaar  if false || false
21736d69bf60SBram Moolenaar    res = true
21746d69bf60SBram Moolenaar  endif
21756d69bf60SBram Moolenaar  assert_equal(false, res)
21763988f64fSBram Moolenaar
21773988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
21783988f64fSBram Moolenaar  if false | eval 0 | endif
21793988f64fSBram Moolenaar  if false | eval burp + 234 | endif
21803988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
21813988f64fSBram Moolenaar  if false
21823988f64fSBram Moolenaar    burp
21833988f64fSBram Moolenaar  endif
218480c34ca3SBram Moolenaarenddef
21856d69bf60SBram Moolenaar
218680c34ca3SBram Moolenaardef Test_if_const_expr_fails()
2187d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2188d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2189d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
2190d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
21916d69bf60SBram Moolenaarenddef
21926d69bf60SBram Moolenaar
219372abcf42SBram Moolenaardef RunNested(i: number): number
219472abcf42SBram Moolenaar  let x: number = 0
219572abcf42SBram Moolenaar  if i % 2
219672abcf42SBram Moolenaar    if 1
2197f5be8cdbSBram Moolenaar      # comment
219872abcf42SBram Moolenaar    else
2199f5be8cdbSBram Moolenaar      # comment
220072abcf42SBram Moolenaar    endif
220172abcf42SBram Moolenaar    x += 1
220272abcf42SBram Moolenaar  else
220372abcf42SBram Moolenaar    x += 1000
220472abcf42SBram Moolenaar  endif
220572abcf42SBram Moolenaar  return x
220672abcf42SBram Moolenaarenddef
220772abcf42SBram Moolenaar
220872abcf42SBram Moolenaardef Test_nested_if()
220972abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
221072abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
221172abcf42SBram Moolenaarenddef
221272abcf42SBram Moolenaar
2213ad39c094SBram Moolenaardef Test_execute_cmd()
2214ad39c094SBram Moolenaar  new
2215ad39c094SBram Moolenaar  setline(1, 'default')
2216d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
2217ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2218a72cfb80SBram Moolenaar
2219d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
2220a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2221a72cfb80SBram Moolenaar
2222d2c61705SBram Moolenaar  let cmd1 = 'setline(1,'
2223ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
2224a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2225ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2226a72cfb80SBram Moolenaar
2227d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2228ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2229a72cfb80SBram Moolenaar
2230ad39c094SBram Moolenaar  let cmd_first = 'call '
2231ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
2232ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2233ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2234ad39c094SBram Moolenaar  bwipe!
2235585fea7bSBram Moolenaar
22362d6b20d6SBram Moolenaar  let n = true
22372d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
22382d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
22392d6b20d6SBram Moolenaar
2240e5abf7afSBram Moolenaar  echomsg [1, 2, 3] #{a: 1, b: 2}
2241e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2242e5abf7afSBram Moolenaar
2243d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2244d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2245d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2246ad39c094SBram Moolenaarenddef
2247ad39c094SBram Moolenaar
224847e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2249f5be8cdbSBram Moolenaar  # only checks line continuation
225047e880d6SBram Moolenaar  let lines =<< trim END
225147e880d6SBram Moolenaar      vim9script
225247e880d6SBram Moolenaar      execute 'g:someVar'
225347e880d6SBram Moolenaar                .. ' = ' ..
225447e880d6SBram Moolenaar                   '28'
225547e880d6SBram Moolenaar      assert_equal(28, g:someVar)
225647e880d6SBram Moolenaar      unlet g:someVar
225747e880d6SBram Moolenaar  END
225847e880d6SBram Moolenaar  CheckScriptSuccess(lines)
225947e880d6SBram Moolenaarenddef
226047e880d6SBram Moolenaar
2261ad39c094SBram Moolenaardef Test_echo_cmd()
2262a72cfb80SBram Moolenaar  echo 'some' # comment
2263585fea7bSBram Moolenaar  echon 'thing'
2264ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2265ad39c094SBram Moolenaar
2266a72cfb80SBram Moolenaar  echo "some" # comment
2267a72cfb80SBram Moolenaar  echon "thing"
2268a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2269a72cfb80SBram Moolenaar
2270ad39c094SBram Moolenaar  let str1 = 'some'
2271ad39c094SBram Moolenaar  let str2 = 'more'
2272ad39c094SBram Moolenaar  echo str1 str2
2273ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2274a72cfb80SBram Moolenaar
2275d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2276ad39c094SBram Moolenaarenddef
2277ad39c094SBram Moolenaar
2278f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2279f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2280f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2281f93c7feaSBram Moolenaar  echo 'clear'
2282df069eecSBram Moolenaar  :1messages
2283f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2284f93c7feaSBram Moolenaar
2285d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2286f93c7feaSBram Moolenaarenddef
2287f93c7feaSBram Moolenaar
228847e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2289f5be8cdbSBram Moolenaar  # only checks line continuation
229047e880d6SBram Moolenaar  let lines =<< trim END
229147e880d6SBram Moolenaar      vim9script
229247e880d6SBram Moolenaar      echomsg 'here'
229347e880d6SBram Moolenaar                .. ' is ' ..
229447e880d6SBram Moolenaar                   'a message'
229547e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
229647e880d6SBram Moolenaar  END
229747e880d6SBram Moolenaar  CheckScriptSuccess(lines)
229847e880d6SBram Moolenaarenddef
229947e880d6SBram Moolenaar
2300f93c7feaSBram Moolenaardef Test_echoerr_cmd()
230140ee466cSBram Moolenaar  try
230240ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
230340ee466cSBram Moolenaar  catch
230440ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
230540ee466cSBram Moolenaar  endtry
2306f93c7feaSBram Moolenaarenddef
2307f93c7feaSBram Moolenaar
230847e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2309f5be8cdbSBram Moolenaar  # only checks line continuation
231047e880d6SBram Moolenaar  let lines =<< trim END
231147e880d6SBram Moolenaar      vim9script
231247e880d6SBram Moolenaar      try
231347e880d6SBram Moolenaar        echoerr 'this'
231447e880d6SBram Moolenaar                .. ' is ' ..
231547e880d6SBram Moolenaar                   'wrong'
231647e880d6SBram Moolenaar      catch
231747e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
231847e880d6SBram Moolenaar      endtry
231947e880d6SBram Moolenaar  END
232047e880d6SBram Moolenaar  CheckScriptSuccess(lines)
232147e880d6SBram Moolenaarenddef
232247e880d6SBram Moolenaar
232341fe0617SBram Moolenaardef Test_for_outside_of_function()
232441fe0617SBram Moolenaar  let lines =<< trim END
232541fe0617SBram Moolenaar    vim9script
232641fe0617SBram Moolenaar    new
232741fe0617SBram Moolenaar    for var in range(0, 3)
232841fe0617SBram Moolenaar      append(line('$'), var)
232941fe0617SBram Moolenaar    endfor
233041fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
233141fe0617SBram Moolenaar    bwipe!
233241fe0617SBram Moolenaar  END
233341fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
233441fe0617SBram Moolenaar  source Xvim9for.vim
233541fe0617SBram Moolenaar  delete('Xvim9for.vim')
233641fe0617SBram Moolenaarenddef
23378a7d6542SBram Moolenaar
2338e8c4abbbSBram Moolenaardef Test_for_loop()
2339e8c4abbbSBram Moolenaar  let result = ''
2340e8c4abbbSBram Moolenaar  for cnt in range(7)
2341e8c4abbbSBram Moolenaar    if cnt == 4
2342e8c4abbbSBram Moolenaar      break
2343e8c4abbbSBram Moolenaar    endif
2344e8c4abbbSBram Moolenaar    if cnt == 2
2345e8c4abbbSBram Moolenaar      continue
2346e8c4abbbSBram Moolenaar    endif
2347e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2348e8c4abbbSBram Moolenaar  endfor
2349e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
23500ad3e894SBram Moolenaar
23510ad3e894SBram Moolenaar  let concat = ''
23520ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
23530ad3e894SBram Moolenaar    concat ..= str
23540ad3e894SBram Moolenaar  endfor
23550ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
2356e8c4abbbSBram Moolenaarenddef
2357e8c4abbbSBram Moolenaar
2358e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2359675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2360675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2361451c2e35SBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1017:')
2362822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
2363451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
2364675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2365675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2366675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2367e8c4abbbSBram Moolenaarenddef
2368e8c4abbbSBram Moolenaar
2369d0df1aacSBram Moolenaardef Test_while_loop()
2370d0df1aacSBram Moolenaar  let result = ''
2371d0df1aacSBram Moolenaar  let cnt = 0
2372d0df1aacSBram Moolenaar  while cnt < 555
2373d0df1aacSBram Moolenaar    if cnt == 3
2374d0df1aacSBram Moolenaar      break
2375d0df1aacSBram Moolenaar    endif
2376d0df1aacSBram Moolenaar    cnt += 1
2377d0df1aacSBram Moolenaar    if cnt == 2
2378d0df1aacSBram Moolenaar      continue
2379d0df1aacSBram Moolenaar    endif
2380d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2381d0df1aacSBram Moolenaar  endwhile
2382d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2383d0df1aacSBram Moolenaarenddef
2384d0df1aacSBram Moolenaar
2385e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2386675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2387675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2388675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2389675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2390675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2391675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2392675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
2393bd5da371SBram Moolenaarenddef
2394bd5da371SBram Moolenaar
23959645e2d9SBram Moolenaardef Test_interrupt_loop()
239697acfc78SBram Moolenaar  let caught = false
23979645e2d9SBram Moolenaar  let x = 0
239897acfc78SBram Moolenaar  try
23999645e2d9SBram Moolenaar    while 1
24009645e2d9SBram Moolenaar      x += 1
24019645e2d9SBram Moolenaar      if x == 100
24029645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
24039645e2d9SBram Moolenaar      endif
24049645e2d9SBram Moolenaar    endwhile
240597acfc78SBram Moolenaar  catch
240697acfc78SBram Moolenaar    caught = true
240797acfc78SBram Moolenaar    assert_equal(100, x)
240897acfc78SBram Moolenaar  endtry
240997acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
241025859dd7SBram Moolenaar  # consume the CTRL-C
241125859dd7SBram Moolenaar  getchar(0)
24129645e2d9SBram Moolenaarenddef
241320431c9dSBram Moolenaar
24144fdae999SBram Moolenaardef Test_automatic_line_continuation()
24154fdae999SBram Moolenaar  let mylist = [
24164fdae999SBram Moolenaar      'one',
24174fdae999SBram Moolenaar      'two',
24184fdae999SBram Moolenaar      'three',
2419f5be8cdbSBram Moolenaar      ] # comment
24204fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
24214fdae999SBram Moolenaar
24224fdae999SBram Moolenaar  let mydict = {
24234fdae999SBram Moolenaar      'one': 1,
24244fdae999SBram Moolenaar      'two': 2,
24254fdae999SBram Moolenaar      'three':
24264fdae999SBram Moolenaar          3,
2427f5be8cdbSBram Moolenaar      } # comment
24284fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
24294fdae999SBram Moolenaar  mydict = #{
24302c330432SBram Moolenaar      one: 1,  # comment
24312c330432SBram Moolenaar      two:     # comment
24322c330432SBram Moolenaar           2,  # comment
24332c330432SBram Moolenaar      three: 3 # comment
24342c330432SBram Moolenaar      }
24352c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
24362c330432SBram Moolenaar  mydict = #{
24372c330432SBram Moolenaar      one: 1,
24384fdae999SBram Moolenaar      two:
24394fdae999SBram Moolenaar           2,
24402c330432SBram Moolenaar      three: 3
24414fdae999SBram Moolenaar      }
24424fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
2443e6085c53SBram Moolenaar
2444e6085c53SBram Moolenaar  assert_equal(
2445e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2446e6085c53SBram Moolenaar        split('one two three')
2447e6085c53SBram Moolenaar        )
24484fdae999SBram Moolenaarenddef
24494fdae999SBram Moolenaar
24507a092245SBram Moolenaardef Test_vim9_comment()
24517a092245SBram Moolenaar  CheckScriptSuccess([
24527a092245SBram Moolenaar      'vim9script',
24537a092245SBram Moolenaar      '# something',
24547a092245SBram Moolenaar      ])
24557a092245SBram Moolenaar  CheckScriptFailure([
24567a092245SBram Moolenaar      'vim9script',
24577a092245SBram Moolenaar      ':# something',
24587a092245SBram Moolenaar      ], 'E488:')
24597a092245SBram Moolenaar  CheckScriptFailure([
24607a092245SBram Moolenaar      '# something',
24617a092245SBram Moolenaar      ], 'E488:')
24627a092245SBram Moolenaar  CheckScriptFailure([
24637a092245SBram Moolenaar      ':# something',
24647a092245SBram Moolenaar      ], 'E488:')
24657a092245SBram Moolenaar
24664a8d9f2eSBram Moolenaar  { # block start
24674a8d9f2eSBram Moolenaar  } # block end
24684a8d9f2eSBram Moolenaar  CheckDefFailure([
24694a8d9f2eSBram Moolenaar      '{# comment',
24704a8d9f2eSBram Moolenaar      ], 'E488:')
24714a8d9f2eSBram Moolenaar  CheckDefFailure([
24724a8d9f2eSBram Moolenaar      '{',
24734a8d9f2eSBram Moolenaar      '}# comment',
24744a8d9f2eSBram Moolenaar      ], 'E488:')
24754a8d9f2eSBram Moolenaar
24764a8d9f2eSBram Moolenaar  echo "yes" # comment
24774a8d9f2eSBram Moolenaar  CheckDefFailure([
24784a8d9f2eSBram Moolenaar      'echo "yes"# comment',
24794a8d9f2eSBram Moolenaar      ], 'E488:')
24807a092245SBram Moolenaar  CheckScriptSuccess([
24817a092245SBram Moolenaar      'vim9script',
24827a092245SBram Moolenaar      'echo "yes" # something',
24837a092245SBram Moolenaar      ])
24847a092245SBram Moolenaar  CheckScriptFailure([
24857a092245SBram Moolenaar      'vim9script',
24867a092245SBram Moolenaar      'echo "yes"# something',
24877a092245SBram Moolenaar      ], 'E121:')
24887a092245SBram Moolenaar  CheckScriptFailure([
24897a092245SBram Moolenaar      'vim9script',
24907a092245SBram Moolenaar      'echo# something',
24917a092245SBram Moolenaar      ], 'E121:')
24927a092245SBram Moolenaar  CheckScriptFailure([
24937a092245SBram Moolenaar      'echo "yes" # something',
24947a092245SBram Moolenaar      ], 'E121:')
24957a092245SBram Moolenaar
24964a8d9f2eSBram Moolenaar  exe "echo" # comment
24974a8d9f2eSBram Moolenaar  CheckDefFailure([
24984a8d9f2eSBram Moolenaar      'exe "echo"# comment',
24994a8d9f2eSBram Moolenaar      ], 'E488:')
25004a8d9f2eSBram Moolenaar  CheckScriptSuccess([
25014a8d9f2eSBram Moolenaar      'vim9script',
25024a8d9f2eSBram Moolenaar      'exe "echo" # something',
25034a8d9f2eSBram Moolenaar      ])
25044a8d9f2eSBram Moolenaar  CheckScriptFailure([
25054a8d9f2eSBram Moolenaar      'vim9script',
25064a8d9f2eSBram Moolenaar      'exe "echo"# something',
25074a8d9f2eSBram Moolenaar      ], 'E121:')
25084a8d9f2eSBram Moolenaar  CheckDefFailure([
25094a8d9f2eSBram Moolenaar      'exe # comment',
25104a8d9f2eSBram Moolenaar      ], 'E1015:')
25114a8d9f2eSBram Moolenaar  CheckScriptFailure([
25124a8d9f2eSBram Moolenaar      'vim9script',
25134a8d9f2eSBram Moolenaar      'exe# something',
25144a8d9f2eSBram Moolenaar      ], 'E121:')
25154a8d9f2eSBram Moolenaar  CheckScriptFailure([
25164a8d9f2eSBram Moolenaar      'exe "echo" # something',
25174a8d9f2eSBram Moolenaar      ], 'E121:')
25184a8d9f2eSBram Moolenaar
25197a092245SBram Moolenaar  CheckDefFailure([
25207a092245SBram Moolenaar      'try# comment',
25217a092245SBram Moolenaar      '  echo "yes"',
25227a092245SBram Moolenaar      'catch',
25237a092245SBram Moolenaar      'endtry',
25247a092245SBram Moolenaar      ], 'E488:')
25252c5ed4e3SBram Moolenaar  CheckScriptFailure([
25262c5ed4e3SBram Moolenaar      'vim9script',
25272c5ed4e3SBram Moolenaar      'try# comment',
25282c5ed4e3SBram Moolenaar      'echo "yes"',
25292c5ed4e3SBram Moolenaar      ], 'E488:')
25307a092245SBram Moolenaar  CheckDefFailure([
25317a092245SBram Moolenaar      'try',
2532a72cfb80SBram Moolenaar      '  throw#comment',
2533a72cfb80SBram Moolenaar      'catch',
2534a72cfb80SBram Moolenaar      'endtry',
2535a72cfb80SBram Moolenaar      ], 'E1015:')
2536a72cfb80SBram Moolenaar  CheckDefFailure([
2537a72cfb80SBram Moolenaar      'try',
2538a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2539a72cfb80SBram Moolenaar      'catch',
2540a72cfb80SBram Moolenaar      'endtry',
2541a72cfb80SBram Moolenaar      ], 'E488:')
2542a72cfb80SBram Moolenaar  CheckDefFailure([
2543a72cfb80SBram Moolenaar      'try',
25447a092245SBram Moolenaar      '  echo "yes"',
25457a092245SBram Moolenaar      'catch# comment',
25467a092245SBram Moolenaar      'endtry',
25477a092245SBram Moolenaar      ], 'E488:')
25482c5ed4e3SBram Moolenaar  CheckScriptFailure([
25492c5ed4e3SBram Moolenaar      'vim9script',
25502c5ed4e3SBram Moolenaar      'try',
25512c5ed4e3SBram Moolenaar      '  echo "yes"',
25522c5ed4e3SBram Moolenaar      'catch# comment',
25532c5ed4e3SBram Moolenaar      'endtry',
25542c5ed4e3SBram Moolenaar      ], 'E654:')
25552c5ed4e3SBram Moolenaar  CheckDefFailure([
25562c5ed4e3SBram Moolenaar      'try',
25572c5ed4e3SBram Moolenaar      '  echo "yes"',
25582c5ed4e3SBram Moolenaar      'catch /pat/# comment',
25592c5ed4e3SBram Moolenaar      'endtry',
25602c5ed4e3SBram Moolenaar      ], 'E488:')
25617a092245SBram Moolenaar  CheckDefFailure([
25627a092245SBram Moolenaar      'try',
25637a092245SBram Moolenaar      'echo "yes"',
25647a092245SBram Moolenaar      'catch',
25657a092245SBram Moolenaar      'endtry# comment',
25667a092245SBram Moolenaar      ], 'E488:')
25672c5ed4e3SBram Moolenaar  CheckScriptFailure([
25682c5ed4e3SBram Moolenaar      'vim9script',
25692c5ed4e3SBram Moolenaar      'try',
25702c5ed4e3SBram Moolenaar      '  echo "yes"',
25712c5ed4e3SBram Moolenaar      'catch',
25722c5ed4e3SBram Moolenaar      'endtry# comment',
25739b7bf9e9SBram Moolenaar      ], 'E488:')
25742c5ed4e3SBram Moolenaar
25752c5ed4e3SBram Moolenaar  CheckScriptSuccess([
25762c5ed4e3SBram Moolenaar      'vim9script',
25772c5ed4e3SBram Moolenaar      'hi # comment',
25782c5ed4e3SBram Moolenaar      ])
25792c5ed4e3SBram Moolenaar  CheckScriptFailure([
25802c5ed4e3SBram Moolenaar      'vim9script',
25812c5ed4e3SBram Moolenaar      'hi# comment',
25822c5ed4e3SBram Moolenaar      ], 'E416:')
25831966c248SBram Moolenaar  CheckScriptSuccess([
25841966c248SBram Moolenaar      'vim9script',
25851966c248SBram Moolenaar      'hi Search # comment',
25861966c248SBram Moolenaar      ])
25871966c248SBram Moolenaar  CheckScriptFailure([
25881966c248SBram Moolenaar      'vim9script',
25891966c248SBram Moolenaar      'hi Search# comment',
25901966c248SBram Moolenaar      ], 'E416:')
25911966c248SBram Moolenaar  CheckScriptSuccess([
25921966c248SBram Moolenaar      'vim9script',
25931966c248SBram Moolenaar      'hi link This Search # comment',
25941966c248SBram Moolenaar      ])
25951966c248SBram Moolenaar  CheckScriptFailure([
25961966c248SBram Moolenaar      'vim9script',
25971966c248SBram Moolenaar      'hi link This That# comment',
25981966c248SBram Moolenaar      ], 'E413:')
25991966c248SBram Moolenaar  CheckScriptSuccess([
26001966c248SBram Moolenaar      'vim9script',
26011966c248SBram Moolenaar      'hi clear This # comment',
26021966c248SBram Moolenaar      'hi clear # comment',
26031966c248SBram Moolenaar      ])
2604f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2605f5be8cdbSBram Moolenaar  # hi clear This# comment',
26061966c248SBram Moolenaar  CheckScriptFailure([
26071966c248SBram Moolenaar      'vim9script',
26081966c248SBram Moolenaar      'hi clear# comment',
26091966c248SBram Moolenaar      ], 'E416:')
26101966c248SBram Moolenaar
26111966c248SBram Moolenaar  CheckScriptSuccess([
26121966c248SBram Moolenaar      'vim9script',
26131966c248SBram Moolenaar      'hi Group term=bold',
26141966c248SBram Moolenaar      'match Group /todo/ # comment',
26151966c248SBram Moolenaar      ])
26161966c248SBram Moolenaar  CheckScriptFailure([
26171966c248SBram Moolenaar      'vim9script',
26181966c248SBram Moolenaar      'hi Group term=bold',
26191966c248SBram Moolenaar      'match Group /todo/# comment',
26201966c248SBram Moolenaar      ], 'E488:')
26211966c248SBram Moolenaar  CheckScriptSuccess([
26221966c248SBram Moolenaar      'vim9script',
26231966c248SBram Moolenaar      'match # comment',
26241966c248SBram Moolenaar      ])
26251966c248SBram Moolenaar  CheckScriptFailure([
26261966c248SBram Moolenaar      'vim9script',
26271966c248SBram Moolenaar      'match# comment',
26281966c248SBram Moolenaar      ], 'E475:')
26291966c248SBram Moolenaar  CheckScriptSuccess([
26301966c248SBram Moolenaar      'vim9script',
26311966c248SBram Moolenaar      'match none # comment',
26321966c248SBram Moolenaar      ])
26331966c248SBram Moolenaar  CheckScriptFailure([
26341966c248SBram Moolenaar      'vim9script',
26351966c248SBram Moolenaar      'match none# comment',
26361966c248SBram Moolenaar      ], 'E475:')
26371966c248SBram Moolenaar
26381966c248SBram Moolenaar  CheckScriptSuccess([
26391966c248SBram Moolenaar      'vim9script',
26401966c248SBram Moolenaar      'menutrans clear # comment',
26411966c248SBram Moolenaar      ])
26421966c248SBram Moolenaar  CheckScriptFailure([
26431966c248SBram Moolenaar      'vim9script',
26441966c248SBram Moolenaar      'menutrans clear# comment text',
26451966c248SBram Moolenaar      ], 'E474:')
26461966c248SBram Moolenaar
26471966c248SBram Moolenaar  CheckScriptSuccess([
26481966c248SBram Moolenaar      'vim9script',
26491966c248SBram Moolenaar      'syntax clear # comment',
26501966c248SBram Moolenaar      ])
26511966c248SBram Moolenaar  CheckScriptFailure([
26521966c248SBram Moolenaar      'vim9script',
26531966c248SBram Moolenaar      'syntax clear# comment text',
26541966c248SBram Moolenaar      ], 'E28:')
26551966c248SBram Moolenaar  CheckScriptSuccess([
26561966c248SBram Moolenaar      'vim9script',
26571966c248SBram Moolenaar      'syntax keyword Word some',
26581966c248SBram Moolenaar      'syntax clear Word # comment',
26591966c248SBram Moolenaar      ])
26601966c248SBram Moolenaar  CheckScriptFailure([
26611966c248SBram Moolenaar      'vim9script',
26621966c248SBram Moolenaar      'syntax keyword Word some',
26631966c248SBram Moolenaar      'syntax clear Word# comment text',
26641966c248SBram Moolenaar      ], 'E28:')
26651966c248SBram Moolenaar
26661966c248SBram Moolenaar  CheckScriptSuccess([
26671966c248SBram Moolenaar      'vim9script',
26681966c248SBram Moolenaar      'syntax list # comment',
26691966c248SBram Moolenaar      ])
26701966c248SBram Moolenaar  CheckScriptFailure([
26711966c248SBram Moolenaar      'vim9script',
26721966c248SBram Moolenaar      'syntax list# comment text',
26731966c248SBram Moolenaar      ], 'E28:')
26741966c248SBram Moolenaar
26751966c248SBram Moolenaar  CheckScriptSuccess([
26761966c248SBram Moolenaar      'vim9script',
26771966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
26781966c248SBram Moolenaar      ])
26791966c248SBram Moolenaar  CheckScriptFailure([
26801966c248SBram Moolenaar      'vim9script',
26811966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
26821966c248SBram Moolenaar      ], 'E475:')
26831966c248SBram Moolenaar
26841966c248SBram Moolenaar  CheckScriptSuccess([
26851966c248SBram Moolenaar      'vim9script',
26861966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
26871966c248SBram Moolenaar      ])
26881966c248SBram Moolenaar  CheckScriptFailure([
26891966c248SBram Moolenaar      'vim9script',
26901966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
26911966c248SBram Moolenaar      ], 'E789:')
26921966c248SBram Moolenaar
26931966c248SBram Moolenaar  CheckScriptSuccess([
26941966c248SBram Moolenaar      'vim9script',
26951966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
26961966c248SBram Moolenaar      ])
26971966c248SBram Moolenaar  CheckScriptFailure([
26981966c248SBram Moolenaar      'vim9script',
26991966c248SBram Moolenaar      'syntax match Word /pat/# comment',
27001966c248SBram Moolenaar      ], 'E402:')
27011966c248SBram Moolenaar
27021966c248SBram Moolenaar  CheckScriptSuccess([
27031966c248SBram Moolenaar      'vim9script',
27041966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
27051966c248SBram Moolenaar      ])
27061966c248SBram Moolenaar  CheckScriptFailure([
27071966c248SBram Moolenaar      'vim9script',
27081966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
27091966c248SBram Moolenaar      ], 'E475:')
27101966c248SBram Moolenaar  CheckScriptFailure([
27111966c248SBram Moolenaar      'vim9script',
27121966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
27131966c248SBram Moolenaar      ], 'E406:')
27141966c248SBram Moolenaar  CheckScriptFailure([
27151966c248SBram Moolenaar      'vim9script',
27161966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
27171966c248SBram Moolenaar      ], 'E475:')
27181966c248SBram Moolenaar
27191966c248SBram Moolenaar  CheckScriptSuccess([
27201966c248SBram Moolenaar      'vim9script',
27211966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
27221966c248SBram Moolenaar      ])
27231966c248SBram Moolenaar  CheckScriptFailure([
27241966c248SBram Moolenaar      'vim9script',
27251966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2726d032f34aSBram Moolenaar      ], 'E402:')
27271966c248SBram Moolenaar
27281966c248SBram Moolenaar  CheckScriptSuccess([
27291966c248SBram Moolenaar      'vim9script',
27301966c248SBram Moolenaar      'syntax sync # comment',
27311966c248SBram Moolenaar      ])
27321966c248SBram Moolenaar  CheckScriptFailure([
27331966c248SBram Moolenaar      'vim9script',
27341966c248SBram Moolenaar      'syntax sync# comment',
27351966c248SBram Moolenaar      ], 'E404:')
27361966c248SBram Moolenaar  CheckScriptSuccess([
27371966c248SBram Moolenaar      'vim9script',
27381966c248SBram Moolenaar      'syntax sync ccomment # comment',
27391966c248SBram Moolenaar      ])
27401966c248SBram Moolenaar  CheckScriptFailure([
27411966c248SBram Moolenaar      'vim9script',
27421966c248SBram Moolenaar      'syntax sync ccomment# comment',
27431966c248SBram Moolenaar      ], 'E404:')
27441966c248SBram Moolenaar
27451966c248SBram Moolenaar  CheckScriptSuccess([
27461966c248SBram Moolenaar      'vim9script',
27471966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
27481966c248SBram Moolenaar      ])
27491966c248SBram Moolenaar  CheckScriptFailure([
27501966c248SBram Moolenaar      'vim9script',
27511966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
27521966c248SBram Moolenaar      ], 'E475:')
2753a72cfb80SBram Moolenaar
2754a72cfb80SBram Moolenaar  CheckScriptSuccess([
2755a72cfb80SBram Moolenaar      'vim9script',
2756a72cfb80SBram Moolenaar      'command Echo echo # comment',
2757a72cfb80SBram Moolenaar      'command Echo # comment',
2758a72cfb80SBram Moolenaar      ])
2759a72cfb80SBram Moolenaar  CheckScriptFailure([
2760a72cfb80SBram Moolenaar      'vim9script',
2761a72cfb80SBram Moolenaar      'command Echo echo# comment',
2762a72cfb80SBram Moolenaar      'Echo',
2763a72cfb80SBram Moolenaar      ], 'E121:')
2764a72cfb80SBram Moolenaar  CheckScriptFailure([
2765a72cfb80SBram Moolenaar      'vim9script',
2766a72cfb80SBram Moolenaar      'command Echo# comment',
2767a72cfb80SBram Moolenaar      ], 'E182:')
2768a72cfb80SBram Moolenaar  CheckScriptFailure([
2769a72cfb80SBram Moolenaar      'vim9script',
2770a72cfb80SBram Moolenaar      'command Echo echo',
2771a72cfb80SBram Moolenaar      'command Echo# comment',
2772a72cfb80SBram Moolenaar      ], 'E182:')
2773a72cfb80SBram Moolenaar
2774a72cfb80SBram Moolenaar  CheckScriptSuccess([
2775a72cfb80SBram Moolenaar      'vim9script',
2776a72cfb80SBram Moolenaar      'function # comment',
2777a72cfb80SBram Moolenaar      ])
2778a72cfb80SBram Moolenaar  CheckScriptFailure([
2779a72cfb80SBram Moolenaar      'vim9script',
27809898107fSBram Moolenaar      'function " comment',
27819898107fSBram Moolenaar      ], 'E129:')
27829898107fSBram Moolenaar  CheckScriptFailure([
27839898107fSBram Moolenaar      'vim9script',
2784a72cfb80SBram Moolenaar      'function# comment',
2785a72cfb80SBram Moolenaar      ], 'E129:')
2786a72cfb80SBram Moolenaar  CheckScriptSuccess([
2787a72cfb80SBram Moolenaar      'vim9script',
2788a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2789a72cfb80SBram Moolenaar      ])
2790a72cfb80SBram Moolenaar  CheckScriptFailure([
2791a72cfb80SBram Moolenaar      'vim9script',
2792a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2793a72cfb80SBram Moolenaar      ], 'E488:')
2794a72cfb80SBram Moolenaar
2795a72cfb80SBram Moolenaar  CheckScriptSuccess([
2796a72cfb80SBram Moolenaar      'vim9script',
27974c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2798a72cfb80SBram Moolenaar      'endfunc',
27994c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2800a72cfb80SBram Moolenaar      ])
2801a72cfb80SBram Moolenaar  CheckScriptFailure([
2802a72cfb80SBram Moolenaar      'vim9script',
28034c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2804a72cfb80SBram Moolenaar      'endfunc',
28054c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2806a72cfb80SBram Moolenaar      ], 'E488:')
2807a72cfb80SBram Moolenaar
2808a72cfb80SBram Moolenaar  CheckScriptSuccess([
2809a72cfb80SBram Moolenaar      'vim9script',
2810a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2811a72cfb80SBram Moolenaar      ])
2812a72cfb80SBram Moolenaar  CheckScriptFailure([
2813a72cfb80SBram Moolenaar      'vim9script',
2814a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2815a72cfb80SBram Moolenaar      ], 'E488:')
2816e7e4838fSBram Moolenaar
2817e7e4838fSBram Moolenaar  CheckScriptFailure([
2818e7e4838fSBram Moolenaar      'def Test() " comment',
2819e7e4838fSBram Moolenaar      'enddef',
2820e7e4838fSBram Moolenaar      ], 'E488:')
2821e7e4838fSBram Moolenaar  CheckScriptFailure([
2822e7e4838fSBram Moolenaar      'vim9script',
2823e7e4838fSBram Moolenaar      'def Test() " comment',
2824e7e4838fSBram Moolenaar      'enddef',
2825e7e4838fSBram Moolenaar      ], 'E488:')
2826e7e4838fSBram Moolenaar
2827e7e4838fSBram Moolenaar  CheckScriptSuccess([
2828e7e4838fSBram Moolenaar      'func Test() " comment',
2829e7e4838fSBram Moolenaar      'endfunc',
2830e7e4838fSBram Moolenaar      ])
28319898107fSBram Moolenaar  CheckScriptSuccess([
2832e7e4838fSBram Moolenaar      'vim9script',
2833e7e4838fSBram Moolenaar      'func Test() " comment',
2834e7e4838fSBram Moolenaar      'endfunc',
28359898107fSBram Moolenaar      ])
2836e7e4838fSBram Moolenaar
2837e7e4838fSBram Moolenaar  CheckScriptSuccess([
2838e7e4838fSBram Moolenaar      'def Test() # comment',
2839e7e4838fSBram Moolenaar      'enddef',
2840e7e4838fSBram Moolenaar      ])
2841e7e4838fSBram Moolenaar  CheckScriptFailure([
2842e7e4838fSBram Moolenaar      'func Test() # comment',
2843e7e4838fSBram Moolenaar      'endfunc',
2844e7e4838fSBram Moolenaar      ], 'E488:')
28452c5ed4e3SBram Moolenaarenddef
28462c5ed4e3SBram Moolenaar
28472c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
28482c5ed4e3SBram Moolenaar  CheckCanRunGui
28492c5ed4e3SBram Moolenaar
28502c5ed4e3SBram Moolenaar  CheckScriptFailure([
28512c5ed4e3SBram Moolenaar      'vim9script',
28522c5ed4e3SBram Moolenaar      'gui#comment'
28532c5ed4e3SBram Moolenaar      ], 'E499:')
28542c5ed4e3SBram Moolenaar  CheckScriptFailure([
28552c5ed4e3SBram Moolenaar      'vim9script',
28562c5ed4e3SBram Moolenaar      'gui -f#comment'
28572c5ed4e3SBram Moolenaar      ], 'E499:')
28587a092245SBram Moolenaarenddef
28597a092245SBram Moolenaar
2860a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
28616797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
28626797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2863a26b9700SBram Moolenaar
2864a26b9700SBram Moolenaar  edit test.vim
2865a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2866a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2867a26b9700SBram Moolenaar
2868a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2869a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2870a26b9700SBram Moolenaar
2871a26b9700SBram Moolenaar  g:entered = 0
2872a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2873a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2874a26b9700SBram Moolenaar
2875a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2876a26b9700SBram Moolenaar
2877a26b9700SBram Moolenaar  au! TabEnter
2878a26b9700SBram Moolenaar  unlet g:entered
2879d72c1bf0SBram Moolenaar
2880d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2881d72c1bf0SBram Moolenaar      'vim9script',
28826797966dSBram Moolenaar      'g:var = 123',
2883e55b1c09SBram Moolenaar      'b:var = 456',
2884e55b1c09SBram Moolenaar      'w:var = 777',
2885e55b1c09SBram Moolenaar      't:var = 888',
2886d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2887d72c1bf0SBram Moolenaar      ])
2888d72c1bf0SBram Moolenaar
2889d72c1bf0SBram Moolenaar  CheckScriptFailure([
2890d72c1bf0SBram Moolenaar      'vim9script',
2891d72c1bf0SBram Moolenaar      'let g:var = 123',
2892e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2893e55b1c09SBram Moolenaar
2894e55b1c09SBram Moolenaar  CheckScriptFailure([
2895e55b1c09SBram Moolenaar      'vim9script',
2896e55b1c09SBram Moolenaar      'let b:var = 123',
2897e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2898e55b1c09SBram Moolenaar
2899e55b1c09SBram Moolenaar  CheckScriptFailure([
2900e55b1c09SBram Moolenaar      'vim9script',
2901e55b1c09SBram Moolenaar      'let w:var = 123',
2902e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2903e55b1c09SBram Moolenaar
2904e55b1c09SBram Moolenaar  CheckScriptFailure([
2905e55b1c09SBram Moolenaar      'vim9script',
2906e55b1c09SBram Moolenaar      'let t:var = 123',
2907e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2908e55b1c09SBram Moolenaar
2909e55b1c09SBram Moolenaar  CheckScriptFailure([
2910e55b1c09SBram Moolenaar      'vim9script',
2911e55b1c09SBram Moolenaar      'let v:version = 123',
2912e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2913e55b1c09SBram Moolenaar
2914e55b1c09SBram Moolenaar  CheckScriptFailure([
2915e55b1c09SBram Moolenaar      'vim9script',
2916e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2917e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
29186797966dSBram Moolenaar
29196797966dSBram Moolenaar  CheckScriptFailure([
29206797966dSBram Moolenaar      'vim9script',
29216797966dSBram Moolenaar      'g:var = 123',
292232e35117SBram Moolenaar      'unlet g:var# comment1',
2923d72c1bf0SBram Moolenaar      ], 'E108:')
2924d72c1bf0SBram Moolenaar
2925d72c1bf0SBram Moolenaar  CheckScriptFailure([
2926d72c1bf0SBram Moolenaar      'let g:var = 123',
2927d72c1bf0SBram Moolenaar      'unlet g:var # something',
2928d72c1bf0SBram Moolenaar      ], 'E488:')
2929faac4104SBram Moolenaar
2930faac4104SBram Moolenaar  CheckScriptSuccess([
2931faac4104SBram Moolenaar      'vim9script',
293232e35117SBram Moolenaar      'if 1 # comment2',
2933faac4104SBram Moolenaar      '  echo "yes"',
2934faac4104SBram Moolenaar      'elseif 2 #comment',
2935faac4104SBram Moolenaar      '  echo "no"',
2936faac4104SBram Moolenaar      'endif',
2937faac4104SBram Moolenaar      ])
2938faac4104SBram Moolenaar
2939faac4104SBram Moolenaar  CheckScriptFailure([
2940faac4104SBram Moolenaar      'vim9script',
294132e35117SBram Moolenaar      'if 1# comment3',
2942faac4104SBram Moolenaar      '  echo "yes"',
2943faac4104SBram Moolenaar      'endif',
2944faac4104SBram Moolenaar      ], 'E15:')
2945faac4104SBram Moolenaar
2946faac4104SBram Moolenaar  CheckScriptFailure([
2947faac4104SBram Moolenaar      'vim9script',
294832e35117SBram Moolenaar      'if 0 # comment4',
2949faac4104SBram Moolenaar      '  echo "yes"',
2950faac4104SBram Moolenaar      'elseif 2#comment',
2951faac4104SBram Moolenaar      '  echo "no"',
2952faac4104SBram Moolenaar      'endif',
2953faac4104SBram Moolenaar      ], 'E15:')
2954faac4104SBram Moolenaar
2955faac4104SBram Moolenaar  CheckScriptSuccess([
2956faac4104SBram Moolenaar      'vim9script',
295732e35117SBram Moolenaar      'let v = 1 # comment5',
2958faac4104SBram Moolenaar      ])
2959faac4104SBram Moolenaar
2960faac4104SBram Moolenaar  CheckScriptFailure([
2961faac4104SBram Moolenaar      'vim9script',
296232e35117SBram Moolenaar      'let v = 1# comment6',
296332e35117SBram Moolenaar      ], 'E15:')
2964faac4104SBram Moolenaar
2965faac4104SBram Moolenaar  CheckScriptSuccess([
2966faac4104SBram Moolenaar      'vim9script',
2967faac4104SBram Moolenaar      'new'
2968d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2969df069eecSBram Moolenaar      ':$',
2970faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2971faac4104SBram Moolenaar      'bwipe!',
2972faac4104SBram Moolenaar      ])
2973faac4104SBram Moolenaar
2974f5be8cdbSBram Moolenaar  CheckScriptFailure([
2975f5be8cdbSBram Moolenaar      'vim9script',
2976f5be8cdbSBram Moolenaar      'new'
2977d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2978f5be8cdbSBram Moolenaar      ':$',
2979f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2980f5be8cdbSBram Moolenaar      'bwipe!',
2981f5be8cdbSBram Moolenaar      ], 'E488:')
2982f5be8cdbSBram Moolenaar
2983f5be8cdbSBram Moolenaar  CheckScriptFailure([
2984f5be8cdbSBram Moolenaar      'vim9script',
2985f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2986f5be8cdbSBram Moolenaar      ], 'E477:')
2987a26b9700SBram Moolenaarenddef
2988a26b9700SBram Moolenaar
29897e5bd91dSBram Moolenaardef Test_finish()
29907e5bd91dSBram Moolenaar  let lines =<< trim END
29917e5bd91dSBram Moolenaar    vim9script
29926797966dSBram Moolenaar    g:res = 'one'
29937e5bd91dSBram Moolenaar    if v:false | finish | endif
29946797966dSBram Moolenaar    g:res = 'two'
29957e5bd91dSBram Moolenaar    finish
29966797966dSBram Moolenaar    g:res = 'three'
29977e5bd91dSBram Moolenaar  END
29987e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
29997e5bd91dSBram Moolenaar  source Xfinished
30007e5bd91dSBram Moolenaar  assert_equal('two', g:res)
30017e5bd91dSBram Moolenaar
30027e5bd91dSBram Moolenaar  unlet g:res
30037e5bd91dSBram Moolenaar  delete('Xfinished')
30047e5bd91dSBram Moolenaarenddef
30057e5bd91dSBram Moolenaar
300632e35117SBram Moolenaardef Test_let_func_call()
300732e35117SBram Moolenaar  let lines =<< trim END
300832e35117SBram Moolenaar    vim9script
300932e35117SBram Moolenaar    func GetValue()
301032e35117SBram Moolenaar      if exists('g:count')
301132e35117SBram Moolenaar        let g:count += 1
301232e35117SBram Moolenaar      else
301332e35117SBram Moolenaar        let g:count = 1
301432e35117SBram Moolenaar      endif
301532e35117SBram Moolenaar      return 'this'
301632e35117SBram Moolenaar    endfunc
301732e35117SBram Moolenaar    let val: string = GetValue()
3018f5be8cdbSBram Moolenaar    # env var is always a string
3019df671b46SBram Moolenaar    let env = $TERM
302032e35117SBram Moolenaar  END
302132e35117SBram Moolenaar  writefile(lines, 'Xfinished')
302232e35117SBram Moolenaar  source Xfinished
3023f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
302432e35117SBram Moolenaar  assert_equal(1, g:count)
302532e35117SBram Moolenaar
302632e35117SBram Moolenaar  unlet g:count
302732e35117SBram Moolenaar  delete('Xfinished')
302832e35117SBram Moolenaarenddef
302932e35117SBram Moolenaar
303032e35117SBram Moolenaardef Test_let_missing_type()
303132e35117SBram Moolenaar  let lines =<< trim END
303232e35117SBram Moolenaar    vim9script
3033df671b46SBram Moolenaar    let var = g:unknown
3034227a69deSBram Moolenaar  END
3035822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
3036227a69deSBram Moolenaar
3037227a69deSBram Moolenaar  lines =<< trim END
3038227a69deSBram Moolenaar    vim9script
3039227a69deSBram Moolenaar    let nr: number = 123
3040227a69deSBram Moolenaar    let var = nr
3041227a69deSBram Moolenaar  END
3042822ba247SBram Moolenaar  CheckScriptSuccess(lines)
304332e35117SBram Moolenaarenddef
304432e35117SBram Moolenaar
3045c82a5b5dSBram Moolenaardef Test_let_declaration()
3046c82a5b5dSBram Moolenaar  let lines =<< trim END
3047c82a5b5dSBram Moolenaar    vim9script
3048c82a5b5dSBram Moolenaar    let var: string
3049c82a5b5dSBram Moolenaar    g:var_uninit = var
3050c82a5b5dSBram Moolenaar    var = 'text'
3051c82a5b5dSBram Moolenaar    g:var_test = var
3052f5be8cdbSBram Moolenaar    # prefixing s: is optional
3053984dddbeSBram Moolenaar    s:var = 'prefixed'
3054984dddbeSBram Moolenaar    g:var_prefixed = s:var
3055984dddbeSBram Moolenaar
3056984dddbeSBram Moolenaar    let s:other: number
3057984dddbeSBram Moolenaar    other = 1234
3058984dddbeSBram Moolenaar    g:other_var = other
305953b29e48SBram Moolenaar
306053b29e48SBram Moolenaar    # type is inferred
306153b29e48SBram Moolenaar    s:dict = {'a': 222}
306253b29e48SBram Moolenaar    def GetDictVal(key: any)
306353b29e48SBram Moolenaar      g:dict_val = s:dict[key]
306453b29e48SBram Moolenaar    enddef
306553b29e48SBram Moolenaar    GetDictVal('a')
3066c82a5b5dSBram Moolenaar  END
3067c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
3068c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
3069c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
3070984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
3071984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
307253b29e48SBram Moolenaar  assert_equal(222, g:dict_val)
3073c82a5b5dSBram Moolenaar
3074c82a5b5dSBram Moolenaar  unlet g:var_uninit
3075c82a5b5dSBram Moolenaar  unlet g:var_test
3076984dddbeSBram Moolenaar  unlet g:var_prefixed
3077984dddbeSBram Moolenaar  unlet g:other_var
3078c82a5b5dSBram Moolenaarenddef
3079c82a5b5dSBram Moolenaar
3080c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
3081c5b1c20bSBram Moolenaar  let lines =<< trim END
3082c5b1c20bSBram Moolenaar    vim9script
3083c5b1c20bSBram Moolenaar    const var: string
3084c5b1c20bSBram Moolenaar  END
3085c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
3086c5b1c20bSBram Moolenaar
3087c5b1c20bSBram Moolenaar  lines =<< trim END
3088c5b1c20bSBram Moolenaar    vim9script
3089c5b1c20bSBram Moolenaar    let 9var: string
3090c5b1c20bSBram Moolenaar  END
3091c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
3092c5b1c20bSBram Moolenaarenddef
3093c5b1c20bSBram Moolenaar
309434db91f7SBram Moolenaardef Test_let_type_check()
309534db91f7SBram Moolenaar  let lines =<< trim END
309634db91f7SBram Moolenaar    vim9script
309734db91f7SBram Moolenaar    let var: string
309834db91f7SBram Moolenaar    var = 1234
309934db91f7SBram Moolenaar  END
3100451c2e35SBram Moolenaar  CheckScriptFailure(lines, 'E1012:')
3101984dddbeSBram Moolenaar
3102984dddbeSBram Moolenaar  lines =<< trim END
3103984dddbeSBram Moolenaar    vim9script
3104984dddbeSBram Moolenaar    let var:string
3105984dddbeSBram Moolenaar  END
3106984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
3107c5b1c20bSBram Moolenaar
3108c5b1c20bSBram Moolenaar  lines =<< trim END
3109c5b1c20bSBram Moolenaar    vim9script
3110c5b1c20bSBram Moolenaar    let var: asdf
3111c5b1c20bSBram Moolenaar  END
3112c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
3113a71e2633SBram Moolenaar
3114a71e2633SBram Moolenaar  lines =<< trim END
3115a71e2633SBram Moolenaar    vim9script
3116a71e2633SBram Moolenaar    let s:l: list<number>
3117a71e2633SBram Moolenaar    s:l = []
3118a71e2633SBram Moolenaar  END
3119a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
3120a71e2633SBram Moolenaar
3121a71e2633SBram Moolenaar  lines =<< trim END
3122a71e2633SBram Moolenaar    vim9script
3123a71e2633SBram Moolenaar    let s:d: dict<number>
3124a71e2633SBram Moolenaar    s:d = {}
3125a71e2633SBram Moolenaar  END
3126a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
312734db91f7SBram Moolenaarenddef
312834db91f7SBram Moolenaar
3129a5d0077eSBram Moolenaardef Test_forward_declaration()
3130a5d0077eSBram Moolenaar  let lines =<< trim END
3131a5d0077eSBram Moolenaar    vim9script
3132a5d0077eSBram Moolenaar    def GetValue(): string
3133a5d0077eSBram Moolenaar      return theVal
3134a5d0077eSBram Moolenaar    enddef
3135a5d0077eSBram Moolenaar    let theVal = 'something'
3136822ba247SBram Moolenaar    g:initVal = GetValue()
3137a5d0077eSBram Moolenaar    theVal = 'else'
3138a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3139a5d0077eSBram Moolenaar  END
3140a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3141a5d0077eSBram Moolenaar  source Xforward
3142a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3143a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3144a5d0077eSBram Moolenaar
3145a5d0077eSBram Moolenaar  unlet g:initVal
3146a5d0077eSBram Moolenaar  unlet g:laterVal
3147a5d0077eSBram Moolenaar  delete('Xforward')
3148a5d0077eSBram Moolenaarenddef
3149a5d0077eSBram Moolenaar
31509721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
31519721fb4eSBram Moolenaar  let legacy_lines =<< trim END
31529721fb4eSBram Moolenaar    source Xvim9_script.vim
31539721fb4eSBram Moolenaar
31549721fb4eSBram Moolenaar    call assert_false(exists('local'))
31559721fb4eSBram Moolenaar    call assert_false(exists('exported'))
31569721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
31579721fb4eSBram Moolenaar    call assert_equal('global', global)
31589721fb4eSBram Moolenaar    call assert_equal('global', g:global)
31599721fb4eSBram Moolenaar
31609721fb4eSBram Moolenaar    " imported variable becomes script-local
31619721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
31629721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
31639721fb4eSBram Moolenaar    call assert_false(exists('exported'))
31649721fb4eSBram Moolenaar
31659721fb4eSBram Moolenaar    " imported function becomes script-local
31669721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
31679721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
31689721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
31699721fb4eSBram Moolenaar  END
31709721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
31719721fb4eSBram Moolenaar
31729721fb4eSBram Moolenaar  let vim9_lines =<< trim END
31739721fb4eSBram Moolenaar    vim9script
31749721fb4eSBram Moolenaar    let local = 'local'
31759721fb4eSBram Moolenaar    g:global = 'global'
31769721fb4eSBram Moolenaar    export let exported = 'exported'
31779721fb4eSBram Moolenaar    export def GetText(): string
31789721fb4eSBram Moolenaar       return 'text'
31799721fb4eSBram Moolenaar    enddef
31809721fb4eSBram Moolenaar  END
31819721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
31829721fb4eSBram Moolenaar
31839721fb4eSBram Moolenaar  source Xlegacy_script.vim
31849721fb4eSBram Moolenaar
31859721fb4eSBram Moolenaar  assert_equal('global', g:global)
3186f5be8cdbSBram Moolenaar  unlet g:global
31879721fb4eSBram Moolenaar
31889721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
31899721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
31909721fb4eSBram Moolenaarenddef
3191a5d0077eSBram Moolenaar
31927d699701SBram Moolenaarfunc Test_vim9script_not_global()
31937d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
31947d699701SBram Moolenaar  let vim9lines =<< trim END
31957d699701SBram Moolenaar    vim9script
31967d699701SBram Moolenaar    let var = 'local'
31977d699701SBram Moolenaar    func TheFunc()
31987d699701SBram Moolenaar      echo 'local'
31997d699701SBram Moolenaar    endfunc
32007d699701SBram Moolenaar    def DefFunc()
32017d699701SBram Moolenaar      echo 'local'
32027d699701SBram Moolenaar    enddef
32037d699701SBram Moolenaar  END
32047d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
32057d699701SBram Moolenaar  source Xvim9script.vim
32067d699701SBram Moolenaar  try
32077d699701SBram Moolenaar    echo g:var
32087d699701SBram Moolenaar    assert_report('did not fail')
32097d699701SBram Moolenaar  catch /E121:/
32107d699701SBram Moolenaar    " caught
32117d699701SBram Moolenaar  endtry
32127d699701SBram Moolenaar  try
32137d699701SBram Moolenaar    call TheFunc()
32147d699701SBram Moolenaar    assert_report('did not fail')
32157d699701SBram Moolenaar  catch /E117:/
32167d699701SBram Moolenaar    " caught
32177d699701SBram Moolenaar  endtry
32187d699701SBram Moolenaar  try
32197d699701SBram Moolenaar    call DefFunc()
32207d699701SBram Moolenaar    assert_report('did not fail')
32217d699701SBram Moolenaar  catch /E117:/
32227d699701SBram Moolenaar    " caught
32237d699701SBram Moolenaar  endtry
32247d699701SBram Moolenaar
322525859dd7SBram Moolenaar  call delete('Xvim9script.vim')
32267d699701SBram Moolenaarendfunc
32277d699701SBram Moolenaar
3228eeb27bfeSBram Moolenaardef Test_vim9_copen()
3229eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3230eeb27bfeSBram Moolenaar  copen
3231eeb27bfeSBram Moolenaar  quit
3232eeb27bfeSBram Moolenaarenddef
3233eeb27bfeSBram Moolenaar
32342d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
32352d6b20d6SBram Moolenaardef Test_vim9_autoload()
32362d6b20d6SBram Moolenaar  let lines =<< trim END
32372d6b20d6SBram Moolenaar     vim9script
32382d6b20d6SBram Moolenaar     def foo#test()
32392d6b20d6SBram Moolenaar         echomsg getreg('"')
32402d6b20d6SBram Moolenaar     enddef
32412d6b20d6SBram Moolenaar  END
32422d6b20d6SBram Moolenaar
32432d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
32442d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
32452d6b20d6SBram Moolenaar  let save_rtp = &rtp
32462d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
32472d6b20d6SBram Moolenaar  augroup test
32482d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
32492d6b20d6SBram Moolenaar  augroup END
32502d6b20d6SBram Moolenaar
32512d6b20d6SBram Moolenaar  normal Y
32522d6b20d6SBram Moolenaar
32532d6b20d6SBram Moolenaar  augroup test
32542d6b20d6SBram Moolenaar    autocmd!
32552d6b20d6SBram Moolenaar  augroup END
32562d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
32572d6b20d6SBram Moolenaar  &rtp = save_rtp
32582d6b20d6SBram Moolenaarenddef
32592d6b20d6SBram Moolenaar
326081e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
326181e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
326281e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
326381e17fbeSBram Moolenaar  let lines =<< trim END
326481e17fbeSBram Moolenaar    let s:counter = 1
326581e17fbeSBram Moolenaar    def s:Func()
326681e17fbeSBram Moolenaar      au! CursorHold
326781e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
326881e17fbeSBram Moolenaar    enddef
326981e17fbeSBram Moolenaar    call s:Func()
327081e17fbeSBram Moolenaar    doau CursorHold
327181e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
327281e17fbeSBram Moolenaar    au! CursorHold
327381e17fbeSBram Moolenaar  END
327481e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
327581e17fbeSBram Moolenaarenddef
327681e17fbeSBram Moolenaar
32773896a105SBram Moolenaardef Test_cmdline_win()
32783896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
32793896a105SBram Moolenaar  # the command line window.
32803896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
32813896a105SBram Moolenaar  let export_lines =<< trim END
32823896a105SBram Moolenaar    vim9script
32833896a105SBram Moolenaar    export let That = 'yes'
32843896a105SBram Moolenaar  END
32853896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
32863896a105SBram Moolenaar  let import_lines =<< trim END
32873896a105SBram Moolenaar    vim9script
32883896a105SBram Moolenaar    import That from './Xexport.vim'
32893896a105SBram Moolenaar  END
32903896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
32913896a105SBram Moolenaar  let save_rtp = &rtp
32923896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
32933896a105SBram Moolenaar  syntax on
32943896a105SBram Moolenaar  augroup CmdWin
32953896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
32963896a105SBram Moolenaar  augroup END
32973896a105SBram Moolenaar  # this will open and also close the cmdline window
32983896a105SBram Moolenaar  feedkeys('q:', 'xt')
32993896a105SBram Moolenaar  assert_equal('yes', g:got_there)
33003896a105SBram Moolenaar
33013896a105SBram Moolenaar  augroup CmdWin
33023896a105SBram Moolenaar    au!
33033896a105SBram Moolenaar  augroup END
33043896a105SBram Moolenaar  &rtp = save_rtp
33053896a105SBram Moolenaar  delete('rtp', 'rf')
33063896a105SBram Moolenaarenddef
33073896a105SBram Moolenaar
3308e3d4685fSBram Moolenaardef Test_invalid_sid()
3309e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
331025859dd7SBram Moolenaar
3311e3d4685fSBram Moolenaar  if RunVim([], ['wq Xdidit'], '+"func <SNR>1_func"')
3312d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3313e3d4685fSBram Moolenaar  endif
3314e3d4685fSBram Moolenaar  delete('Xdidit')
3315e3d4685fSBram Moolenaarenddef
3316e3d4685fSBram Moolenaar
3317f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3318f0afd9e1SBram Moolenaar  let lines =<< trim END
3319f0afd9e1SBram Moolenaar    let var: any
3320f0afd9e1SBram Moolenaar    assert_equal(0, var)
3321f0afd9e1SBram Moolenaar  END
3322f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3323f0afd9e1SBram Moolenaarenddef
3324f0afd9e1SBram Moolenaar
3325585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3326585fea7bSBram Moolenaardef Test_substitute_cmd()
3327585fea7bSBram Moolenaar  new
3328585fea7bSBram Moolenaar  setline(1, 'something')
3329585fea7bSBram Moolenaar  :substitute(some(other(
3330585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3331585fea7bSBram Moolenaar  bwipe!
3332585fea7bSBram Moolenaar
3333f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3334585fea7bSBram Moolenaar  let lines =<< trim END
3335585fea7bSBram Moolenaar    vim9script
3336585fea7bSBram Moolenaar    new
3337585fea7bSBram Moolenaar    setline(1, 'something')
3338585fea7bSBram Moolenaar    :substitute(some(other(
3339585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3340585fea7bSBram Moolenaar    bwipe!
3341585fea7bSBram Moolenaar  END
3342585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3343585fea7bSBram Moolenaar  source Xvim9lines
3344585fea7bSBram Moolenaar
3345585fea7bSBram Moolenaar  delete('Xvim9lines')
3346585fea7bSBram Moolenaarenddef
3347585fea7bSBram Moolenaar
33488a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3349