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:')
824dbeecb2bSBram Moolenaar  CheckDefFailure(['const list = [1, 2]', 'let list = [3, 4]'], 'E1017:')
82508052228SBram Moolenaar  CheckDefFailure(['const two'], 'E1021:')
82608052228SBram Moolenaar  CheckDefFailure(['const &option'], 'E996:')
827dbeecb2bSBram Moolenaar
828dbeecb2bSBram Moolenaar  let lines =<< trim END
829dbeecb2bSBram Moolenaar    const list = [1, 2, 3]
830dbeecb2bSBram Moolenaar    list[0] = 4
8310b4c66c6SBram Moolenaar    list->assert_equal([4, 2, 3])
8320b4c66c6SBram Moolenaar    const! other = [5, 6, 7]
8330b4c66c6SBram Moolenaar    other->assert_equal([5, 6, 7])
834*71abe482SBram Moolenaar
835*71abe482SBram Moolenaar    let varlist = [7, 8]
836*71abe482SBram Moolenaar    const! constlist = [1, varlist, 3]
837*71abe482SBram Moolenaar    varlist[0] = 77
838*71abe482SBram Moolenaar    # TODO: does not work yet
839*71abe482SBram Moolenaar    # constlist[1][1] = 88
840*71abe482SBram Moolenaar    let cl = constlist[1]
841*71abe482SBram Moolenaar    cl[1] = 88
842*71abe482SBram Moolenaar    constlist->assert_equal([1, [77, 88], 3])
843*71abe482SBram Moolenaar
844*71abe482SBram Moolenaar    let vardict = #{five: 5, six: 6}
845*71abe482SBram Moolenaar    const! constdict = #{one: 1, two: vardict, three: 3}
846*71abe482SBram Moolenaar    vardict['five'] = 55
847*71abe482SBram Moolenaar    # TODO: does not work yet
848*71abe482SBram Moolenaar    # constdict['two']['six'] = 66
849*71abe482SBram Moolenaar    let cd = constdict['two']
850*71abe482SBram Moolenaar    cd['six'] = 66
851*71abe482SBram Moolenaar    constdict->assert_equal(#{one: 1, two: #{five: 55, six: 66}, three: 3})
852dbeecb2bSBram Moolenaar  END
853dbeecb2bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
85408052228SBram Moolenaarenddef
8558a7d6542SBram Moolenaar
8560b4c66c6SBram Moolenaardef Test_const_bang()
8570b4c66c6SBram Moolenaar  let lines =<< trim END
8580b4c66c6SBram Moolenaar      const! var = 234
8590b4c66c6SBram Moolenaar      var = 99
8600b4c66c6SBram Moolenaar  END
8610b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1018:', 2)
8620b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
8630b4c66c6SBram Moolenaar
8640b4c66c6SBram Moolenaar  lines =<< trim END
8650b4c66c6SBram Moolenaar      const! ll = [2, 3, 4]
8660b4c66c6SBram Moolenaar      ll[0] = 99
8670b4c66c6SBram Moolenaar  END
8680b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1119:', 2)
8690b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
8700b4c66c6SBram Moolenaar
8710b4c66c6SBram Moolenaar  lines =<< trim END
8720b4c66c6SBram Moolenaar      const! ll = [2, 3, 4]
8730b4c66c6SBram Moolenaar      ll[3] = 99
8740b4c66c6SBram Moolenaar  END
8750b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1118:', 2)
8760b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
8770b4c66c6SBram Moolenaar
8780b4c66c6SBram Moolenaar  lines =<< trim END
8790b4c66c6SBram Moolenaar      const! dd = #{one: 1, two: 2}
8800b4c66c6SBram Moolenaar      dd["one"] = 99
8810b4c66c6SBram Moolenaar  END
8820b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1121:', 2)
8830b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
8840b4c66c6SBram Moolenaar
8850b4c66c6SBram Moolenaar  lines =<< trim END
8860b4c66c6SBram Moolenaar      const! dd = #{one: 1, two: 2}
8870b4c66c6SBram Moolenaar      dd["three"] = 99
8880b4c66c6SBram Moolenaar  END
8890b4c66c6SBram Moolenaar  CheckDefExecFailure(lines, 'E1120:')
8900b4c66c6SBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
8910b4c66c6SBram Moolenaarenddef
8920b4c66c6SBram Moolenaar
893df069eecSBram Moolenaardef Test_range_no_colon()
894d2c61705SBram Moolenaar  CheckDefFailure(['%s/a/b/'], 'E1050:')
895d2c61705SBram Moolenaar  CheckDefFailure(['+ s/a/b/'], 'E1050:')
896d2c61705SBram Moolenaar  CheckDefFailure(['- s/a/b/'], 'E1050:')
897d2c61705SBram Moolenaar  CheckDefFailure(['. s/a/b/'], 'E1050:')
898df069eecSBram Moolenaarenddef
899df069eecSBram Moolenaar
900df069eecSBram Moolenaar
9018a7d6542SBram Moolenaardef Test_block()
9028a7d6542SBram Moolenaar  let outer = 1
9038a7d6542SBram Moolenaar  {
9048a7d6542SBram Moolenaar    let inner = 2
9058a7d6542SBram Moolenaar    assert_equal(1, outer)
9068a7d6542SBram Moolenaar    assert_equal(2, inner)
9078a7d6542SBram Moolenaar  }
9088a7d6542SBram Moolenaar  assert_equal(1, outer)
9098a7d6542SBram Moolenaarenddef
9108a7d6542SBram Moolenaar
91108052228SBram Moolenaardef Test_block_failure()
91208052228SBram Moolenaar  CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
91308052228SBram Moolenaar  CheckDefFailure(['}'], 'E1025:')
91408052228SBram Moolenaar  CheckDefFailure(['{', 'echo 1'], 'E1026:')
91508052228SBram Moolenaarenddef
9168a7d6542SBram Moolenaar
917d032f34aSBram Moolenaarfunc g:NoSuchFunc()
918d032f34aSBram Moolenaar  echo 'none'
919d032f34aSBram Moolenaarendfunc
920d032f34aSBram Moolenaar
9218a7d6542SBram Moolenaardef Test_try_catch()
9228a7d6542SBram Moolenaar  let l = []
9237a092245SBram Moolenaar  try # comment
9248a7d6542SBram Moolenaar    add(l, '1')
9258a7d6542SBram Moolenaar    throw 'wrong'
9268a7d6542SBram Moolenaar    add(l, '2')
9277a092245SBram Moolenaar  catch # comment
9288a7d6542SBram Moolenaar    add(l, v:exception)
9297a092245SBram Moolenaar  finally # comment
9308a7d6542SBram Moolenaar    add(l, '3')
9317a092245SBram Moolenaar  endtry # comment
9328a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
93368d130c6SBram Moolenaar
934e859312eSBram Moolenaar  l = []
935e859312eSBram Moolenaar  try
936e859312eSBram Moolenaar    try
937e859312eSBram Moolenaar      add(l, '1')
938e859312eSBram Moolenaar      throw 'wrong'
939e859312eSBram Moolenaar      add(l, '2')
940e859312eSBram Moolenaar    catch /right/
941e859312eSBram Moolenaar      add(l, v:exception)
942e859312eSBram Moolenaar    endtry
943e859312eSBram Moolenaar  catch /wrong/
944e859312eSBram Moolenaar    add(l, 'caught')
945e859312eSBram Moolenaar  finally
946e859312eSBram Moolenaar    add(l, 'finally')
947e859312eSBram Moolenaar  endtry
948e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
949e859312eSBram Moolenaar
95068d130c6SBram Moolenaar  let n: number
95168d130c6SBram Moolenaar  try
95268d130c6SBram Moolenaar    n = l[3]
95368d130c6SBram Moolenaar  catch /E684:/
95468d130c6SBram Moolenaar    n = 99
95568d130c6SBram Moolenaar  endtry
95668d130c6SBram Moolenaar  assert_equal(99, n)
95768d130c6SBram Moolenaar
95868d130c6SBram Moolenaar  try
959cc673e74SBram Moolenaar    # string slice returns a string, not a number
96068d130c6SBram Moolenaar    n = g:astring[3]
96156acb094SBram Moolenaar  catch /E1029:/
96268d130c6SBram Moolenaar    n = 77
96368d130c6SBram Moolenaar  endtry
96468d130c6SBram Moolenaar  assert_equal(77, n)
96568d130c6SBram Moolenaar
96668d130c6SBram Moolenaar  try
96768d130c6SBram Moolenaar    n = l[g:astring]
96856acb094SBram Moolenaar  catch /E1029:/
96956acb094SBram Moolenaar    n = 88
97068d130c6SBram Moolenaar  endtry
97156acb094SBram Moolenaar  assert_equal(88, n)
97268d130c6SBram Moolenaar
97368d130c6SBram Moolenaar  try
97468d130c6SBram Moolenaar    n = s:does_not_exist
97568d130c6SBram Moolenaar  catch /E121:/
976f0b9f43cSBram Moolenaar    n = 111
977f0b9f43cSBram Moolenaar  endtry
978f0b9f43cSBram Moolenaar  assert_equal(111, n)
979f0b9f43cSBram Moolenaar
980f0b9f43cSBram Moolenaar  try
981f0b9f43cSBram Moolenaar    n = g:does_not_exist
982f0b9f43cSBram Moolenaar  catch /E121:/
98368d130c6SBram Moolenaar    n = 121
98468d130c6SBram Moolenaar  endtry
98568d130c6SBram Moolenaar  assert_equal(121, n)
98668d130c6SBram Moolenaar
98768d130c6SBram Moolenaar  let d = #{one: 1}
98868d130c6SBram Moolenaar  try
98968d130c6SBram Moolenaar    n = d[g:astring]
99068d130c6SBram Moolenaar  catch /E716:/
99168d130c6SBram Moolenaar    n = 222
99268d130c6SBram Moolenaar  endtry
99368d130c6SBram Moolenaar  assert_equal(222, n)
994f0b9f43cSBram Moolenaar
995f0b9f43cSBram Moolenaar  try
996f0b9f43cSBram Moolenaar    n = -g:astring
997f0b9f43cSBram Moolenaar  catch /E39:/
998f0b9f43cSBram Moolenaar    n = 233
999f0b9f43cSBram Moolenaar  endtry
1000f0b9f43cSBram Moolenaar  assert_equal(233, n)
1001f0b9f43cSBram Moolenaar
1002f0b9f43cSBram Moolenaar  try
1003f0b9f43cSBram Moolenaar    n = +g:astring
1004f0b9f43cSBram Moolenaar  catch /E1030:/
1005f0b9f43cSBram Moolenaar    n = 244
1006f0b9f43cSBram Moolenaar  endtry
1007f0b9f43cSBram Moolenaar  assert_equal(244, n)
1008f0b9f43cSBram Moolenaar
1009f0b9f43cSBram Moolenaar  try
1010f0b9f43cSBram Moolenaar    n = +g:alist
1011f0b9f43cSBram Moolenaar  catch /E745:/
1012f0b9f43cSBram Moolenaar    n = 255
1013f0b9f43cSBram Moolenaar  endtry
1014f0b9f43cSBram Moolenaar  assert_equal(255, n)
1015f0b9f43cSBram Moolenaar
1016f0b9f43cSBram Moolenaar  let nd: dict<any>
1017f0b9f43cSBram Moolenaar  try
1018f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
1019f0b9f43cSBram Moolenaar  catch /E1029:/
1020f0b9f43cSBram Moolenaar    n = 266
1021f0b9f43cSBram Moolenaar  endtry
1022f0b9f43cSBram Moolenaar  assert_equal(266, n)
1023f0b9f43cSBram Moolenaar
1024f0b9f43cSBram Moolenaar  try
1025f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
1026f0b9f43cSBram Moolenaar  catch /E1093:/
1027f0b9f43cSBram Moolenaar    n = 277
1028f0b9f43cSBram Moolenaar  endtry
1029f0b9f43cSBram Moolenaar  assert_equal(277, n)
1030f0b9f43cSBram Moolenaar
1031e859312eSBram Moolenaar  try
1032e859312eSBram Moolenaar    &ts = g:astring
1033e859312eSBram Moolenaar  catch /E1029:/
1034e859312eSBram Moolenaar    n = 288
1035e859312eSBram Moolenaar  endtry
1036e859312eSBram Moolenaar  assert_equal(288, n)
1037e859312eSBram Moolenaar
1038e859312eSBram Moolenaar  try
1039e859312eSBram Moolenaar    &backspace = 'asdf'
1040e859312eSBram Moolenaar  catch /E474:/
1041e859312eSBram Moolenaar    n = 299
1042e859312eSBram Moolenaar  endtry
1043e859312eSBram Moolenaar  assert_equal(299, n)
1044e859312eSBram Moolenaar
1045e859312eSBram Moolenaar  l = [1]
1046e859312eSBram Moolenaar  try
1047e859312eSBram Moolenaar    l[3] = 3
1048e859312eSBram Moolenaar  catch /E684:/
1049e859312eSBram Moolenaar    n = 300
1050e859312eSBram Moolenaar  endtry
1051e859312eSBram Moolenaar  assert_equal(300, n)
1052e859312eSBram Moolenaar
1053e859312eSBram Moolenaar  try
1054e859312eSBram Moolenaar    unlet g:does_not_exist
1055e859312eSBram Moolenaar  catch /E108:/
1056e859312eSBram Moolenaar    n = 322
1057e859312eSBram Moolenaar  endtry
1058e859312eSBram Moolenaar  assert_equal(322, n)
1059e859312eSBram Moolenaar
1060e859312eSBram Moolenaar  try
1061e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
1062e859312eSBram Moolenaar  catch /E721:/
1063e859312eSBram Moolenaar    n = 333
1064e859312eSBram Moolenaar  endtry
1065e859312eSBram Moolenaar  assert_equal(333, n)
1066e859312eSBram Moolenaar
1067e859312eSBram Moolenaar  try
1068e859312eSBram Moolenaar    l = DeletedFunc()
1069e859312eSBram Moolenaar  catch /E933:/
1070e859312eSBram Moolenaar    n = 344
1071e859312eSBram Moolenaar  endtry
1072e859312eSBram Moolenaar  assert_equal(344, n)
1073d032f34aSBram Moolenaar
1074d032f34aSBram Moolenaar  try
1075d032f34aSBram Moolenaar    echo len(v:true)
1076d032f34aSBram Moolenaar  catch /E701:/
1077d032f34aSBram Moolenaar    n = 355
1078d032f34aSBram Moolenaar  endtry
1079d032f34aSBram Moolenaar  assert_equal(355, n)
1080d032f34aSBram Moolenaar
1081d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
1082d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
1083d032f34aSBram Moolenaar  try
1084d032f34aSBram Moolenaar    echo P()
1085d032f34aSBram Moolenaar  catch /E117:/
1086d032f34aSBram Moolenaar    n = 366
1087d032f34aSBram Moolenaar  endtry
1088d032f34aSBram Moolenaar  assert_equal(366, n)
1089d032f34aSBram Moolenaar
1090d032f34aSBram Moolenaar  try
1091d032f34aSBram Moolenaar    echo g:NoSuchFunc()
1092d032f34aSBram Moolenaar  catch /E117:/
1093d032f34aSBram Moolenaar    n = 377
1094d032f34aSBram Moolenaar  endtry
1095d032f34aSBram Moolenaar  assert_equal(377, n)
1096d032f34aSBram Moolenaar
1097d032f34aSBram Moolenaar  try
1098d032f34aSBram Moolenaar    echo g:alist + 4
1099d032f34aSBram Moolenaar  catch /E745:/
1100d032f34aSBram Moolenaar    n = 388
1101d032f34aSBram Moolenaar  endtry
1102d032f34aSBram Moolenaar  assert_equal(388, n)
1103d032f34aSBram Moolenaar
1104d032f34aSBram Moolenaar  try
1105d032f34aSBram Moolenaar    echo 4 + g:alist
1106d032f34aSBram Moolenaar  catch /E745:/
1107d032f34aSBram Moolenaar    n = 399
1108d032f34aSBram Moolenaar  endtry
1109d032f34aSBram Moolenaar  assert_equal(399, n)
1110d032f34aSBram Moolenaar
1111d032f34aSBram Moolenaar  try
1112d032f34aSBram Moolenaar    echo g:alist.member
1113d032f34aSBram Moolenaar  catch /E715:/
1114d032f34aSBram Moolenaar    n = 400
1115d032f34aSBram Moolenaar  endtry
1116d032f34aSBram Moolenaar  assert_equal(400, n)
1117d032f34aSBram Moolenaar
1118d032f34aSBram Moolenaar  try
1119d032f34aSBram Moolenaar    echo d.member
1120d032f34aSBram Moolenaar  catch /E716:/
1121d032f34aSBram Moolenaar    n = 411
1122d032f34aSBram Moolenaar  endtry
1123d032f34aSBram Moolenaar  assert_equal(411, n)
11248a7d6542SBram Moolenaarenddef
11258a7d6542SBram Moolenaar
1126e859312eSBram Moolenaardef DeletedFunc(): list<any>
1127e859312eSBram Moolenaar  return ['delete me']
1128e859312eSBram Moolenaarenddef
1129e859312eSBram Moolenaardefcompile
1130e859312eSBram Moolenaardelfunc DeletedFunc
1131e859312eSBram Moolenaar
1132257cc5eeSBram Moolenaardef ThrowFromDef()
1133a72cfb80SBram Moolenaar  throw "getout" # comment
1134257cc5eeSBram Moolenaarenddef
1135257cc5eeSBram Moolenaar
1136257cc5eeSBram Moolenaarfunc CatchInFunc()
1137257cc5eeSBram Moolenaar  try
1138257cc5eeSBram Moolenaar    call ThrowFromDef()
1139257cc5eeSBram Moolenaar  catch
1140257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
1141257cc5eeSBram Moolenaar  endtry
1142257cc5eeSBram Moolenaarendfunc
1143257cc5eeSBram Moolenaar
1144257cc5eeSBram Moolenaardef CatchInDef()
1145257cc5eeSBram Moolenaar  try
1146257cc5eeSBram Moolenaar    ThrowFromDef()
1147257cc5eeSBram Moolenaar  catch
1148257cc5eeSBram Moolenaar    g:thrown_def = v:exception
1149257cc5eeSBram Moolenaar  endtry
1150257cc5eeSBram Moolenaarenddef
1151257cc5eeSBram Moolenaar
1152f575adffSBram Moolenaardef ReturnFinally(): string
1153f575adffSBram Moolenaar  try
1154f575adffSBram Moolenaar    return 'intry'
1155f575adffSBram Moolenaar  finally
1156f575adffSBram Moolenaar    g:in_finally = 'finally'
1157f575adffSBram Moolenaar  endtry
1158f575adffSBram Moolenaar  return 'end'
1159f575adffSBram Moolenaarenddef
1160f575adffSBram Moolenaar
1161257cc5eeSBram Moolenaardef Test_try_catch_nested()
1162257cc5eeSBram Moolenaar  CatchInFunc()
1163257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
1164257cc5eeSBram Moolenaar
1165257cc5eeSBram Moolenaar  CatchInDef()
1166257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
1167f575adffSBram Moolenaar
1168f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
1169f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
1170f575adffSBram Moolenaarenddef
1171f575adffSBram Moolenaar
1172f575adffSBram Moolenaardef Test_try_catch_match()
1173f575adffSBram Moolenaar  let seq = 'a'
1174f575adffSBram Moolenaar  try
1175f575adffSBram Moolenaar    throw 'something'
1176f575adffSBram Moolenaar  catch /nothing/
1177f575adffSBram Moolenaar    seq ..= 'x'
1178f575adffSBram Moolenaar  catch /some/
1179f575adffSBram Moolenaar    seq ..= 'b'
1180f575adffSBram Moolenaar  catch /asdf/
1181f575adffSBram Moolenaar    seq ..= 'x'
1182e8c4abbbSBram Moolenaar  catch ?a\?sdf?
1183e8c4abbbSBram Moolenaar    seq ..= 'y'
1184f575adffSBram Moolenaar  finally
1185f575adffSBram Moolenaar    seq ..= 'c'
1186f575adffSBram Moolenaar  endtry
1187f575adffSBram Moolenaar  assert_equal('abc', seq)
1188257cc5eeSBram Moolenaarenddef
1189257cc5eeSBram Moolenaar
1190e8c4abbbSBram Moolenaardef Test_try_catch_fails()
1191d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
1192d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1193d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1194d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
1195d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1196d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
1197d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
1198d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1199d2c61705SBram Moolenaar  CheckDefFailure(['if 2', 'endtry'], 'E171:')
1200d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
1201585fea7bSBram Moolenaar
1202d2c61705SBram Moolenaar  CheckDefFailure(['throw'], 'E1015:')
1203d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
1204e8c4abbbSBram Moolenaarenddef
1205e8c4abbbSBram Moolenaar
1206006ad48bSBram Moolenaardef Test_throw_vimscript()
1207f5be8cdbSBram Moolenaar  # only checks line continuation
1208006ad48bSBram Moolenaar  let lines =<< trim END
1209006ad48bSBram Moolenaar      vim9script
1210006ad48bSBram Moolenaar      try
1211006ad48bSBram Moolenaar        throw 'one'
1212006ad48bSBram Moolenaar              .. 'two'
1213006ad48bSBram Moolenaar      catch
1214006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
1215006ad48bSBram Moolenaar      endtry
1216006ad48bSBram Moolenaar  END
1217006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
1218006ad48bSBram Moolenaarenddef
1219006ad48bSBram Moolenaar
1220ed677f55SBram Moolenaardef Test_error_in_nested_function()
1221ed677f55SBram Moolenaar  # an error in a nested :function aborts executin in the calling :def function
1222ed677f55SBram Moolenaar  let lines =<< trim END
1223ed677f55SBram Moolenaar      vim9script
1224ed677f55SBram Moolenaar      def Func()
1225ed677f55SBram Moolenaar        Error()
1226ed677f55SBram Moolenaar        g:test_var = 1
1227ed677f55SBram Moolenaar      enddef
1228ed677f55SBram Moolenaar      func Error() abort
1229ed677f55SBram Moolenaar        eval [][0]
1230ed677f55SBram Moolenaar      endfunc
1231ed677f55SBram Moolenaar      Func()
1232ed677f55SBram Moolenaar  END
1233ed677f55SBram Moolenaar  g:test_var = 0
1234ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
1235ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
1236ed677f55SBram Moolenaarenddef
1237ed677f55SBram Moolenaar
123837c83711SBram Moolenaardef Test_cexpr_vimscript()
1239f5be8cdbSBram Moolenaar  # only checks line continuation
124037c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
124137c83711SBram Moolenaar  let lines =<< trim END
124237c83711SBram Moolenaar      vim9script
124337c83711SBram Moolenaar      cexpr 'File'
124437c83711SBram Moolenaar                .. ' someFile' ..
124537c83711SBram Moolenaar                   ' line 19'
124637c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
124737c83711SBram Moolenaar  END
124837c83711SBram Moolenaar  CheckScriptSuccess(lines)
124937c83711SBram Moolenaar  set errorformat&
125037c83711SBram Moolenaarenddef
125137c83711SBram Moolenaar
1252c9edd6b5SBram Moolenaardef Test_statusline_syntax()
1253c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
1254c9edd6b5SBram Moolenaar  let lines =<< trim END
1255c9edd6b5SBram Moolenaar      vim9script
1256c9edd6b5SBram Moolenaar      func g:Status()
1257c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
1258c9edd6b5SBram Moolenaar      endfunc
1259c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
1260c9edd6b5SBram Moolenaar      redrawstatus
1261c9edd6b5SBram Moolenaar      set laststatus statusline=
1262c9edd6b5SBram Moolenaar  END
1263c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
1264c9edd6b5SBram Moolenaarenddef
1265c9edd6b5SBram Moolenaar
1266b209750bSBram Moolenaardef Test_list_vimscript()
1267b209750bSBram Moolenaar  # checks line continuation and comments
1268b209750bSBram Moolenaar  let lines =<< trim END
1269b209750bSBram Moolenaar      vim9script
1270b209750bSBram Moolenaar      let mylist = [
1271b209750bSBram Moolenaar            'one',
1272b209750bSBram Moolenaar            # comment
1273b209750bSBram Moolenaar            'two', # empty line follows
1274b209750bSBram Moolenaar
1275b209750bSBram Moolenaar            'three',
1276b209750bSBram Moolenaar            ]
1277b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
1278b209750bSBram Moolenaar  END
1279b209750bSBram Moolenaar  CheckScriptSuccess(lines)
128066250c93SBram Moolenaar
128166250c93SBram Moolenaar  # check all lines from heredoc are kept
128266250c93SBram Moolenaar  lines =<< trim END
128366250c93SBram Moolenaar      # comment 1
128466250c93SBram Moolenaar      two
128566250c93SBram Moolenaar      # comment 3
128666250c93SBram Moolenaar
128766250c93SBram Moolenaar      five
128866250c93SBram Moolenaar      # comment 6
128966250c93SBram Moolenaar  END
129066250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
1291b209750bSBram Moolenaarenddef
1292b209750bSBram Moolenaar
12932a1381c3SBram Moolenaarif has('channel')
129440ee466cSBram Moolenaar  let someJob = test_null_job()
129540ee466cSBram Moolenaar
129640ee466cSBram Moolenaar  def FuncWithError()
129740ee466cSBram Moolenaar    echomsg g:someJob
129840ee466cSBram Moolenaar  enddef
129940ee466cSBram Moolenaar
130040ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
130140ee466cSBram Moolenaar    try
130240ee466cSBram Moolenaar      call FuncWithError()
130340ee466cSBram Moolenaar    catch
130440ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
130540ee466cSBram Moolenaar    endtry
130640ee466cSBram Moolenaar  endfunc
13072a1381c3SBram Moolenaarendif
130840ee466cSBram Moolenaar
13098a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
13108a7d6542SBram Moolenaar  vim9script
13118a7d6542SBram Moolenaar  let name: string = 'bob'
13128a7d6542SBram Moolenaar  def Concat(arg: string): string
13138a7d6542SBram Moolenaar    return name .. arg
13148a7d6542SBram Moolenaar  enddef
1315227a69deSBram Moolenaar  g:result = Concat('bie')
1316227a69deSBram Moolenaar  g:localname = name
13178a7d6542SBram Moolenaar
13188a7d6542SBram Moolenaar  export const CONST = 1234
13198a7d6542SBram Moolenaar  export let exported = 9876
13206e587dcbSBram Moolenaar  export let exp_name = 'John'
13218a7d6542SBram Moolenaar  export def Exported(): string
13228a7d6542SBram Moolenaar    return 'Exported'
13238a7d6542SBram Moolenaar  enddef
13248a7d6542SBram MoolenaarEND
13258a7d6542SBram Moolenaar
1326b3ca9824SBram Moolenaardef Undo_export_script_lines()
1327b3ca9824SBram Moolenaar  unlet g:result
1328b3ca9824SBram Moolenaar  unlet g:localname
1329b3ca9824SBram Moolenaarenddef
1330b3ca9824SBram Moolenaar
13315269bd2aSBram Moolenaardef Test_vim9_import_export()
13328a7d6542SBram Moolenaar  let import_script_lines =<< trim END
13338a7d6542SBram Moolenaar    vim9script
13348a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
13358a7d6542SBram Moolenaar    g:imported = exported
13366e587dcbSBram Moolenaar    exported += 3
13376e587dcbSBram Moolenaar    g:imported_added = exported
13388a7d6542SBram Moolenaar    g:imported_func = Exported()
13396e587dcbSBram Moolenaar
134040f4f7a4SBram Moolenaar    def GetExported(): string
134140f4f7a4SBram Moolenaar      let local_dict = #{ref: Exported}
134240f4f7a4SBram Moolenaar      return local_dict.ref()
134340f4f7a4SBram Moolenaar    enddef
134440f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
134540f4f7a4SBram Moolenaar
13466e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
13476e587dcbSBram Moolenaar    g:imported_name = exp_name
13486e587dcbSBram Moolenaar    exp_name ..= ' Doe'
13496e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
13505381c7a1SBram Moolenaar    g:imported_later = exported
13518a7d6542SBram Moolenaar  END
13528a7d6542SBram Moolenaar
13538a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
13548a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
13558a7d6542SBram Moolenaar
13568a7d6542SBram Moolenaar  source Ximport.vim
13578a7d6542SBram Moolenaar
13588a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
13598a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
13608a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
13616e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
13625381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
13638a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
136440f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
13656e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
13666e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
13678a7d6542SBram Moolenaar  assert_false(exists('g:name'))
13688a7d6542SBram Moolenaar
1369b3ca9824SBram Moolenaar  Undo_export_script_lines()
13708a7d6542SBram Moolenaar  unlet g:imported
13716e587dcbSBram Moolenaar  unlet g:imported_added
13725381c7a1SBram Moolenaar  unlet g:imported_later
13738a7d6542SBram Moolenaar  unlet g:imported_func
13746e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
13758a7d6542SBram Moolenaar  delete('Ximport.vim')
1376f2d5c240SBram Moolenaar
13771c991144SBram Moolenaar  # similar, with line breaks
13781c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
13791c991144SBram Moolenaar    vim9script
13801c991144SBram Moolenaar    import {
13811c991144SBram Moolenaar        exported,
13821c991144SBram Moolenaar        Exported,
13831c991144SBram Moolenaar        }
13841c991144SBram Moolenaar        from
13851c991144SBram Moolenaar        './Xexport.vim'
13861c991144SBram Moolenaar    g:imported = exported
13871c991144SBram Moolenaar    exported += 5
13881c991144SBram Moolenaar    g:imported_added = exported
13891c991144SBram Moolenaar    g:imported_func = Exported()
13901c991144SBram Moolenaar  END
13911c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
13921c991144SBram Moolenaar  source Ximport_lbr.vim
13931c991144SBram Moolenaar
13941c991144SBram Moolenaar  assert_equal(9876, g:imported)
13951c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
13961c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
13971c991144SBram Moolenaar
13981c991144SBram Moolenaar  # exported script not sourced again
13991c991144SBram Moolenaar  assert_false(exists('g:result'))
14001c991144SBram Moolenaar  unlet g:imported
14011c991144SBram Moolenaar  unlet g:imported_added
14021c991144SBram Moolenaar  unlet g:imported_func
14031c991144SBram Moolenaar  delete('Ximport_lbr.vim')
14041c991144SBram Moolenaar
14051c991144SBram Moolenaar  # import inside :def function
14065381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
14075381c7a1SBram Moolenaar    vim9script
14085381c7a1SBram Moolenaar    def ImportInDef()
14095381c7a1SBram Moolenaar      import exported from './Xexport.vim'
14105381c7a1SBram Moolenaar      g:imported = exported
14115381c7a1SBram Moolenaar      exported += 7
14125381c7a1SBram Moolenaar      g:imported_added = exported
14135381c7a1SBram Moolenaar    enddef
14145381c7a1SBram Moolenaar    ImportInDef()
14155381c7a1SBram Moolenaar  END
14165381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
14175381c7a1SBram Moolenaar  source Ximport2.vim
1418f5be8cdbSBram Moolenaar  # TODO: this should be 9879
14195381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
14205381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
14215381c7a1SBram Moolenaar  unlet g:imported
14225381c7a1SBram Moolenaar  unlet g:imported_added
14235381c7a1SBram Moolenaar  delete('Ximport2.vim')
14245381c7a1SBram Moolenaar
1425f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
1426f2d5c240SBram Moolenaar    vim9script
1427f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1428f2d5c240SBram Moolenaar    def UseExport()
1429f2d5c240SBram Moolenaar      g:imported = Export.exported
1430f2d5c240SBram Moolenaar    enddef
1431f2d5c240SBram Moolenaar    UseExport()
1432f2d5c240SBram Moolenaar  END
1433f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1434f2d5c240SBram Moolenaar  source Ximport.vim
14355381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1436f2d5c240SBram Moolenaar
1437599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
1438599c89c8SBram Moolenaar    vim9script
1439599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1440599c89c8SBram Moolenaar    def Func()
1441599c89c8SBram Moolenaar      let dummy = 1
1442599c89c8SBram Moolenaar      let imported = Export + dummy
1443599c89c8SBram Moolenaar    enddef
1444822ba247SBram Moolenaar    defcompile
1445599c89c8SBram Moolenaar  END
1446599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
144744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
1448599c89c8SBram Moolenaar
1449599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
1450599c89c8SBram Moolenaar    vim9script
1451599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1452599c89c8SBram Moolenaar    def Func()
1453599c89c8SBram Moolenaar      let imported = Export . exported
1454599c89c8SBram Moolenaar    enddef
1455822ba247SBram Moolenaar    defcompile
1456599c89c8SBram Moolenaar  END
1457599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
145844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
1459599c89c8SBram Moolenaar
1460599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
1461599c89c8SBram Moolenaar    vim9script
1462599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1463599c89c8SBram Moolenaar    def Func()
1464599c89c8SBram Moolenaar      let imported = Export.
1465599c89c8SBram Moolenaar    enddef
1466822ba247SBram Moolenaar    defcompile
1467599c89c8SBram Moolenaar  END
1468599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
146944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1470599c89c8SBram Moolenaar
14711c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
14721c991144SBram Moolenaar    vim9script
14731c991144SBram Moolenaar    import *
14741c991144SBram Moolenaar        as Export
14751c991144SBram Moolenaar        from
14761c991144SBram Moolenaar        './Xexport.vim'
14771c991144SBram Moolenaar    def UseExport()
14781c991144SBram Moolenaar      g:imported = Export.exported
14791c991144SBram Moolenaar    enddef
14801c991144SBram Moolenaar    UseExport()
14811c991144SBram Moolenaar  END
14821c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
14831c991144SBram Moolenaar  source Ximport.vim
14841c991144SBram Moolenaar  assert_equal(9883, g:imported)
14851c991144SBram Moolenaar
1486f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1487f2d5c240SBram Moolenaar    vim9script
1488f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1489f2d5c240SBram Moolenaar  END
1490f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
149144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1492f2d5c240SBram Moolenaar
1493f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1494fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1495fa29c8abSBram Moolenaar    vim9script
1496fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1497fa29c8abSBram Moolenaar  END
1498fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
149944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1500fa29c8abSBram Moolenaar
1501f5be8cdbSBram Moolenaar  # try to import something that is already defined
15025269bd2aSBram Moolenaar  let import_already_defined =<< trim END
15035269bd2aSBram Moolenaar    vim9script
15045269bd2aSBram Moolenaar    let exported = 'something'
15055269bd2aSBram Moolenaar    import exported from './Xexport.vim'
15065269bd2aSBram Moolenaar  END
15075269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
150844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
15095269bd2aSBram Moolenaar
1510f5be8cdbSBram Moolenaar  # try to import something that is already defined
15115269bd2aSBram Moolenaar  import_already_defined =<< trim END
15125269bd2aSBram Moolenaar    vim9script
15135269bd2aSBram Moolenaar    let exported = 'something'
15145269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
15155269bd2aSBram Moolenaar  END
15165269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
151744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
15185269bd2aSBram Moolenaar
1519f5be8cdbSBram Moolenaar  # try to import something that is already defined
15205269bd2aSBram Moolenaar  import_already_defined =<< trim END
15215269bd2aSBram Moolenaar    vim9script
15225269bd2aSBram Moolenaar    let exported = 'something'
15235269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
15245269bd2aSBram Moolenaar  END
15255269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
152644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
15275269bd2aSBram Moolenaar
1528f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1529fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1530fa29c8abSBram Moolenaar    vim9script
1531fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1532fa29c8abSBram Moolenaar  END
1533fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
153444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1535fa29c8abSBram Moolenaar
1536fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1537fa29c8abSBram Moolenaar    vim9script
1538fa29c8abSBram Moolenaar    import name './Xexport.vim'
1539fa29c8abSBram Moolenaar  END
1540fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
154144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1542fa29c8abSBram Moolenaar
1543fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1544fa29c8abSBram Moolenaar    vim9script
1545fa29c8abSBram Moolenaar    import name from Xexport.vim
1546fa29c8abSBram Moolenaar  END
1547fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
154844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
1549fa29c8abSBram Moolenaar
1550fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1551fa29c8abSBram Moolenaar    vim9script
1552fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1553fa29c8abSBram Moolenaar  END
1554fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
155544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1556fa29c8abSBram Moolenaar
1557fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1558fa29c8abSBram Moolenaar    vim9script
1559fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1560fa29c8abSBram Moolenaar  END
15615269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
156244d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1563fa29c8abSBram Moolenaar
1564f2d5c240SBram Moolenaar  delete('Ximport.vim')
15655269bd2aSBram Moolenaar  delete('Ximport3.vim')
15668a7d6542SBram Moolenaar  delete('Xexport.vim')
15678a7d6542SBram Moolenaar
1568f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1569750802b5SBram Moolenaar  set cpo&vi
1570750802b5SBram Moolenaar  let cpo_before = &cpo
1571750802b5SBram Moolenaar  let lines =<< trim END
1572750802b5SBram Moolenaar    vim9script
1573750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1574750802b5SBram Moolenaar  END
1575750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1576750802b5SBram Moolenaar  source Xvim9_script
1577750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1578750802b5SBram Moolenaar  set cpo&vim
1579750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1580750802b5SBram Moolenaar  delete('Xvim9_script')
1581750802b5SBram Moolenaarenddef
1582750802b5SBram Moolenaar
1583803af686SBram Moolenaarfunc g:Trigger()
1584803af686SBram Moolenaar  source Ximport.vim
1585803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1586803af686SBram Moolenaarendfunc
1587803af686SBram Moolenaar
1588803af686SBram Moolenaardef Test_import_export_expr_map()
1589803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1590803af686SBram Moolenaar  let export_lines =<< trim END
1591803af686SBram Moolenaar    vim9script
1592803af686SBram Moolenaar    export def That(): string
1593803af686SBram Moolenaar      return 'yes'
1594803af686SBram Moolenaar    enddef
1595803af686SBram Moolenaar  END
1596803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1597803af686SBram Moolenaar
1598803af686SBram Moolenaar  let import_lines =<< trim END
1599803af686SBram Moolenaar    vim9script
1600803af686SBram Moolenaar    import That from './Xexport_that.vim'
1601803af686SBram Moolenaar    assert_equal('yes', That())
1602803af686SBram Moolenaar  END
1603803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1604803af686SBram Moolenaar
1605803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1606803af686SBram Moolenaar  feedkeys('trigger', "xt")
1607803af686SBram Moolenaar
1608730b2483SBram Moolenaar  delete('Xexport_that.vim')
1609803af686SBram Moolenaar  delete('Ximport.vim')
1610803af686SBram Moolenaar  nunmap trigger
1611803af686SBram Moolenaarenddef
1612803af686SBram Moolenaar
16138e1986e3SBram Moolenaardef Test_import_in_filetype()
16148e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
16158e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
16168e1986e3SBram Moolenaar  let export_lines =<< trim END
16178e1986e3SBram Moolenaar    vim9script
16188e1986e3SBram Moolenaar    export let That = 'yes'
16198e1986e3SBram Moolenaar  END
1620730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
16218e1986e3SBram Moolenaar
16228e1986e3SBram Moolenaar  let import_lines =<< trim END
16238e1986e3SBram Moolenaar    vim9script
1624730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
16258e1986e3SBram Moolenaar    assert_equal('yes', That)
16268e1986e3SBram Moolenaar    g:did_load_mytpe = 1
16278e1986e3SBram Moolenaar  END
16288e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
16298e1986e3SBram Moolenaar
16308e1986e3SBram Moolenaar  let save_rtp = &rtp
16318e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
16328e1986e3SBram Moolenaar
16338e1986e3SBram Moolenaar  filetype plugin on
16348e1986e3SBram Moolenaar  copen
16358e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
16368e1986e3SBram Moolenaar
16378e1986e3SBram Moolenaar  quit!
1638730b2483SBram Moolenaar  delete('Xexport_ft.vim')
16398e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
16408e1986e3SBram Moolenaar  &rtp = save_rtp
16418e1986e3SBram Moolenaarenddef
16428e1986e3SBram Moolenaar
1643efa94447SBram Moolenaardef Test_use_import_in_mapping()
1644efa94447SBram Moolenaar  let lines =<< trim END
1645efa94447SBram Moolenaar      vim9script
1646efa94447SBram Moolenaar      export def Funcx()
1647efa94447SBram Moolenaar        g:result = 42
1648efa94447SBram Moolenaar      enddef
1649efa94447SBram Moolenaar  END
1650efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1651efa94447SBram Moolenaar  lines =<< trim END
1652efa94447SBram Moolenaar      vim9script
1653efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1654b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1655efa94447SBram Moolenaar  END
1656efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1657efa94447SBram Moolenaar
1658efa94447SBram Moolenaar  source Xmapscript.vim
1659b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1660efa94447SBram Moolenaar  assert_equal(42, g:result)
1661efa94447SBram Moolenaar
1662efa94447SBram Moolenaar  unlet g:result
1663efa94447SBram Moolenaar  delete('XsomeExport.vim')
1664efa94447SBram Moolenaar  delete('Xmapscript.vim')
1665b3ca9824SBram Moolenaar  nunmap <F3>
1666efa94447SBram Moolenaarenddef
1667efa94447SBram Moolenaar
1668750802b5SBram Moolenaardef Test_vim9script_fails()
16698a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
16708a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1671750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
16729721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
16739b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1674750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1675750802b5SBram Moolenaar
1676451c2e35SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1012:')
1677c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1678c785b9a7SBram Moolenaar
1679e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1680e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
16818a7d6542SBram Moolenaarenddef
16828a7d6542SBram Moolenaar
1683f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1684101f4810SBram Moolenaar  CheckRunVimInTerminal
1685101f4810SBram Moolenaar
16869bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1687c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
16889bb3eb3eSBram Moolenaarendfunc
16899bb3eb3eSBram Moolenaar
1690c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1691101f4810SBram Moolenaar  let export =<< trim END
1692101f4810SBram Moolenaar    vim9script
1693101f4810SBram Moolenaar    export def Foo(): number
1694101f4810SBram Moolenaar        return 0
1695101f4810SBram Moolenaar    enddef
1696101f4810SBram Moolenaar  END
1697730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1698101f4810SBram Moolenaar
1699730b2483SBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{
17009bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
17019bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1702101f4810SBram Moolenaar
1703730b2483SBram Moolenaar  delete('XexportCmd.vim')
17049bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
17059bb3eb3eSBram Moolenaarenddef
1706101f4810SBram Moolenaar
17074c17ad94SBram Moolenaardef Test_vim9script_reload_import()
17088a7d6542SBram Moolenaar  let lines =<< trim END
17098a7d6542SBram Moolenaar    vim9script
17108a7d6542SBram Moolenaar    const var = ''
17118a7d6542SBram Moolenaar    let valone = 1234
17128a7d6542SBram Moolenaar    def MyFunc(arg: string)
17138a7d6542SBram Moolenaar       valone = 5678
17148a7d6542SBram Moolenaar    enddef
17158a7d6542SBram Moolenaar  END
17168a7d6542SBram Moolenaar  let morelines =<< trim END
17178a7d6542SBram Moolenaar    let valtwo = 222
17188a7d6542SBram Moolenaar    export def GetValtwo(): number
17198a7d6542SBram Moolenaar      return valtwo
17208a7d6542SBram Moolenaar    enddef
17218a7d6542SBram Moolenaar  END
172203afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
17238a7d6542SBram Moolenaar  source Xreload.vim
17248a7d6542SBram Moolenaar  source Xreload.vim
17258a7d6542SBram Moolenaar  source Xreload.vim
17268a7d6542SBram Moolenaar
17278a7d6542SBram Moolenaar  let testlines =<< trim END
17288a7d6542SBram Moolenaar    vim9script
17298a7d6542SBram Moolenaar    def TheFunc()
17308a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
17318a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
17328a7d6542SBram Moolenaar    enddef
17338a7d6542SBram Moolenaar    TheFunc()
17348a7d6542SBram Moolenaar  END
17358a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
17368a7d6542SBram Moolenaar  source Ximport.vim
17378a7d6542SBram Moolenaar
1738f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1739f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
17408a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
17418a7d6542SBram Moolenaar  source Ximport.vim
17428a7d6542SBram Moolenaar
1743f5be8cdbSBram Moolenaar  # cannot declare a var twice
17448a7d6542SBram Moolenaar  lines =<< trim END
17458a7d6542SBram Moolenaar    vim9script
17468a7d6542SBram Moolenaar    let valone = 1234
17478a7d6542SBram Moolenaar    let valone = 5678
17488a7d6542SBram Moolenaar  END
17498a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
175044d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
17518a7d6542SBram Moolenaar
17528a7d6542SBram Moolenaar  delete('Xreload.vim')
17538a7d6542SBram Moolenaar  delete('Ximport.vim')
17548a7d6542SBram Moolenaarenddef
17558a7d6542SBram Moolenaar
175695006e3dSBram Moolenaardef s:RetSome(): string
175795006e3dSBram Moolenaar  return 'some'
175895006e3dSBram Moolenaarenddef
175995006e3dSBram Moolenaar
1760fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1761fe465a01SBram Moolenaar" script-local name.
1762fe465a01SBram Moolenaardef Test_vim9script_funcref()
1763fe465a01SBram Moolenaar  let sortlines =<< trim END
1764fe465a01SBram Moolenaar      vim9script
1765fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1766bed36b93SBram Moolenaar        return i2 - i1
1767fe465a01SBram Moolenaar      enddef
1768fe465a01SBram Moolenaar
1769fe465a01SBram Moolenaar      export def FastSort(): list<number>
1770fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1771fe465a01SBram Moolenaar      enddef
1772fe465a01SBram Moolenaar  END
1773fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1774fe465a01SBram Moolenaar
1775fe465a01SBram Moolenaar  let lines =<< trim END
1776fe465a01SBram Moolenaar    vim9script
1777fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1778fe465a01SBram Moolenaar    def Test()
1779fe465a01SBram Moolenaar      g:result = FastSort()
1780fe465a01SBram Moolenaar    enddef
1781fe465a01SBram Moolenaar    Test()
1782fe465a01SBram Moolenaar  END
1783fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1784fe465a01SBram Moolenaar
1785fe465a01SBram Moolenaar  source Xscript.vim
1786fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1787fe465a01SBram Moolenaar
1788fe465a01SBram Moolenaar  unlet g:result
1789fe465a01SBram Moolenaar  delete('Xsort.vim')
1790fe465a01SBram Moolenaar  delete('Xscript.vim')
179195006e3dSBram Moolenaar
179295006e3dSBram Moolenaar  let Funcref = function('s:RetSome')
179395006e3dSBram Moolenaar  assert_equal('some', Funcref())
1794fe465a01SBram Moolenaarenddef
1795fe465a01SBram Moolenaar
1796601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1797601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1798601e76acSBram Moolenaar" function reference.
1799c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1800c620c055SBram Moolenaar  let filterLines =<< trim END
1801c620c055SBram Moolenaar    vim9script
1802c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1803c620c055SBram Moolenaar      return idx % 2 == 1
1804c620c055SBram Moolenaar    enddef
1805c620c055SBram Moolenaar    export def FastFilter(): list<number>
1806c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1807c620c055SBram Moolenaar    enddef
1808601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1809601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1810601e76acSBram Moolenaar    enddef
1811c620c055SBram Moolenaar  END
1812c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1813c620c055SBram Moolenaar
1814c620c055SBram Moolenaar  let lines =<< trim END
1815c620c055SBram Moolenaar    vim9script
1816601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1817c620c055SBram Moolenaar    def Test()
1818c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1819c620c055SBram Moolenaar    enddef
1820c620c055SBram Moolenaar    Test()
1821601e76acSBram Moolenaar    def TestDirect()
1822601e76acSBram Moolenaar      let x: list<number> = FastFilterDirect()
1823601e76acSBram Moolenaar    enddef
1824601e76acSBram Moolenaar    TestDirect()
1825c620c055SBram Moolenaar  END
1826601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1827c620c055SBram Moolenaar  delete('Xfilter.vim')
1828c620c055SBram Moolenaarenddef
1829c620c055SBram Moolenaar
18304c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
18314c17ad94SBram Moolenaar  let first_lines =<< trim END
18324c17ad94SBram Moolenaar    vim9script
18334c17ad94SBram Moolenaar    def FuncYes(): string
18344c17ad94SBram Moolenaar      return 'yes'
18354c17ad94SBram Moolenaar    enddef
18364c17ad94SBram Moolenaar  END
183703afdcf1SBram Moolenaar  let withno_lines =<< trim END
18384c17ad94SBram Moolenaar    def FuncNo(): string
18394c17ad94SBram Moolenaar      return 'no'
18404c17ad94SBram Moolenaar    enddef
18414c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
18424c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
18434c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
184403afdcf1SBram Moolenaar    enddef
184503afdcf1SBram Moolenaar  END
184603afdcf1SBram Moolenaar  let nono_lines =<< trim END
184703afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
184803afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
184944d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
18504c17ad94SBram Moolenaar    enddef
18514c17ad94SBram Moolenaar  END
18524c17ad94SBram Moolenaar
18534c17ad94SBram Moolenaar  # FuncNo() is defined
185403afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
18554c17ad94SBram Moolenaar  source Xreloaded.vim
18564c17ad94SBram Moolenaar  g:DoCheck(true)
18574c17ad94SBram Moolenaar
18584c17ad94SBram Moolenaar  # FuncNo() is not redefined
185903afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
18604c17ad94SBram Moolenaar  source Xreloaded.vim
186103afdcf1SBram Moolenaar  g:DoCheck()
18624c17ad94SBram Moolenaar
18634c17ad94SBram Moolenaar  # FuncNo() is back
186403afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
18654c17ad94SBram Moolenaar  source Xreloaded.vim
186603afdcf1SBram Moolenaar  g:DoCheck()
18674c17ad94SBram Moolenaar
18684c17ad94SBram Moolenaar  delete('Xreloaded.vim')
18694c17ad94SBram Moolenaarenddef
18704c17ad94SBram Moolenaar
187189483d40SBram Moolenaardef Test_vim9script_reload_delvar()
187289483d40SBram Moolenaar  # write the script with a script-local variable
187389483d40SBram Moolenaar  let lines =<< trim END
187489483d40SBram Moolenaar    vim9script
187589483d40SBram Moolenaar    let var = 'string'
187689483d40SBram Moolenaar  END
187789483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
187889483d40SBram Moolenaar  source XreloadVar.vim
187989483d40SBram Moolenaar
188089483d40SBram Moolenaar  # now write the script using the same variable locally - works
188189483d40SBram Moolenaar  lines =<< trim END
188289483d40SBram Moolenaar    vim9script
188389483d40SBram Moolenaar    def Func()
188489483d40SBram Moolenaar      let var = 'string'
188589483d40SBram Moolenaar    enddef
188689483d40SBram Moolenaar  END
188789483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
188889483d40SBram Moolenaar  source XreloadVar.vim
188989483d40SBram Moolenaar
189089483d40SBram Moolenaar  delete('XreloadVar.vim')
189189483d40SBram Moolenaarenddef
189289483d40SBram Moolenaar
18938a7d6542SBram Moolenaardef Test_import_absolute()
18948a7d6542SBram Moolenaar  let import_lines = [
1895e6085c53SBram Moolenaar        'vim9script',
1896e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1897e6085c53SBram Moolenaar        'def UseExported()',
1898e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1899e6085c53SBram Moolenaar        '  exported = 8888',
1900e6085c53SBram Moolenaar        '  g:imported_after = exported',
1901e6085c53SBram Moolenaar        'enddef',
1902e6085c53SBram Moolenaar        'UseExported()',
1903e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1904e6085c53SBram Moolenaar        ]
19058a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
19068a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
19078a7d6542SBram Moolenaar
19088a7d6542SBram Moolenaar  source Ximport_abs.vim
19098a7d6542SBram Moolenaar
19108a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
19114e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1912675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1913675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1914675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1915675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1916675f716eSBram Moolenaar          'exported = 8888.*' ..
1917675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1918675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1919675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1920675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1921e6085c53SBram Moolenaar        g:import_disassembled)
1922b3ca9824SBram Moolenaar
1923b3ca9824SBram Moolenaar  Undo_export_script_lines()
19248a7d6542SBram Moolenaar  unlet g:imported_abs
19254e12a5dfSBram Moolenaar  unlet g:import_disassembled
19268a7d6542SBram Moolenaar
19278a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
19288a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
19298a7d6542SBram Moolenaarenddef
19308a7d6542SBram Moolenaar
19318a7d6542SBram Moolenaardef Test_import_rtp()
19328a7d6542SBram Moolenaar  let import_lines = [
1933e6085c53SBram Moolenaar        'vim9script',
1934e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1935e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1936e6085c53SBram Moolenaar        ]
19378a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
19388a7d6542SBram Moolenaar  mkdir('import')
19398a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
19408a7d6542SBram Moolenaar
19418a7d6542SBram Moolenaar  let save_rtp = &rtp
19428a7d6542SBram Moolenaar  &rtp = getcwd()
19438a7d6542SBram Moolenaar  source Ximport_rtp.vim
19448a7d6542SBram Moolenaar  &rtp = save_rtp
19458a7d6542SBram Moolenaar
19468a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
19478a7d6542SBram Moolenaar
1948b3ca9824SBram Moolenaar  Undo_export_script_lines()
1949b3ca9824SBram Moolenaar  unlet g:imported_rtp
19508a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
195189483d40SBram Moolenaar  delete('import', 'rf')
19528a7d6542SBram Moolenaarenddef
19538a7d6542SBram Moolenaar
195425e0f586SBram Moolenaardef Test_import_compile_error()
195525e0f586SBram Moolenaar  let export_lines = [
195625e0f586SBram Moolenaar        'vim9script',
195725e0f586SBram Moolenaar        'export def ExpFunc(): string',
195825e0f586SBram Moolenaar        '  return notDefined',
195925e0f586SBram Moolenaar        'enddef',
196025e0f586SBram Moolenaar        ]
196125e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
196225e0f586SBram Moolenaar
196325e0f586SBram Moolenaar  let import_lines = [
196425e0f586SBram Moolenaar        'vim9script',
196525e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
196625e0f586SBram Moolenaar        'def ImpFunc()',
196725e0f586SBram Moolenaar        '  echo ExpFunc()',
196825e0f586SBram Moolenaar        'enddef',
196925e0f586SBram Moolenaar        'defcompile',
197025e0f586SBram Moolenaar        ]
197125e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
197225e0f586SBram Moolenaar
197325e0f586SBram Moolenaar  try
197425e0f586SBram Moolenaar    source Ximport.vim
197525e0f586SBram Moolenaar  catch /E1001/
1976f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
197725e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
197825e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
197925e0f586SBram Moolenaar  endtry
198025e0f586SBram Moolenaar
198125e0f586SBram Moolenaar  delete('Xexported.vim')
198225e0f586SBram Moolenaar  delete('Ximport.vim')
198325e0f586SBram Moolenaarenddef
198425e0f586SBram Moolenaar
1985c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1986c4ce36d4SBram Moolenaar  let lines = [
1987c4ce36d4SBram Moolenaar        'vim9script',
1988c4ce36d4SBram Moolenaar        'def Func()',
1989c4ce36d4SBram Moolenaar        '  eval [][0]',
1990c4ce36d4SBram Moolenaar        'enddef',
1991c4ce36d4SBram Moolenaar        'Func()',
1992c4ce36d4SBram Moolenaar        ]
1993c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1994c4ce36d4SBram Moolenaar
1995c4ce36d4SBram Moolenaar  for count in range(3)
1996c4ce36d4SBram Moolenaar    try
1997c4ce36d4SBram Moolenaar      source Xtestscript.vim
1998c4ce36d4SBram Moolenaar    catch /E684/
1999c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
2000c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
2001c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
2002c4ce36d4SBram Moolenaar    endtry
2003c4ce36d4SBram Moolenaar  endfor
2004c4ce36d4SBram Moolenaar
2005c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
2006c4ce36d4SBram Moolenaarenddef
2007c4ce36d4SBram Moolenaar
2008eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
2009eef2102eSBram Moolenaar  let export_lines =<< trim END
2010eef2102eSBram Moolenaar      vim9script
2011eef2102eSBram Moolenaar      export def Func()
2012eef2102eSBram Moolenaar        echo 'imported'
2013eef2102eSBram Moolenaar      enddef
2014eef2102eSBram Moolenaar  END
2015eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
2016eef2102eSBram Moolenaar
2017eef2102eSBram Moolenaar  let lines =<< trim END
2018eef2102eSBram Moolenaar    vim9script
2019eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
2020eef2102eSBram Moolenaar    def Func()
2021eef2102eSBram Moolenaar      echo 'local to function'
2022eef2102eSBram Moolenaar    enddef
2023eef2102eSBram Moolenaar  END
2024eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2025eef2102eSBram Moolenaar
2026eef2102eSBram Moolenaar  lines =<< trim END
2027eef2102eSBram Moolenaar    vim9script
2028eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
2029eef2102eSBram Moolenaar    def Outer()
2030eef2102eSBram Moolenaar      def Func()
2031eef2102eSBram Moolenaar        echo 'local to function'
2032eef2102eSBram Moolenaar      enddef
2033eef2102eSBram Moolenaar    enddef
2034eef2102eSBram Moolenaar    defcompile
2035eef2102eSBram Moolenaar  END
2036eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2037eef2102eSBram Moolenaar
2038eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
2039eef2102eSBram Moolenaarenddef
2040eef2102eSBram Moolenaar
2041b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
2042b9a2cac3SBram Moolenaar  let lines =<< trim END
2043b9a2cac3SBram Moolenaar    vim9script
2044b9a2cac3SBram Moolenaar    def Func()
2045b9a2cac3SBram Moolenaar      echo 'one'
2046b9a2cac3SBram Moolenaar    enddef
2047b9a2cac3SBram Moolenaar    def Func()
2048b9a2cac3SBram Moolenaar      echo 'two'
2049b9a2cac3SBram Moolenaar    enddef
2050b9a2cac3SBram Moolenaar  END
2051b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2052fa211f3cSBram Moolenaar
2053fa211f3cSBram Moolenaar  lines =<< trim END
2054fa211f3cSBram Moolenaar    vim9script
2055fa211f3cSBram Moolenaar    def Foo(): string
2056fa211f3cSBram Moolenaar      return 'foo'
2057fa211f3cSBram Moolenaar      enddef
2058fa211f3cSBram Moolenaar    def Func()
2059fa211f3cSBram Moolenaar      let  Foo = {-> 'lambda'}
2060fa211f3cSBram Moolenaar    enddef
2061fa211f3cSBram Moolenaar    defcompile
2062fa211f3cSBram Moolenaar  END
2063fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2064b9a2cac3SBram Moolenaarenddef
2065b9a2cac3SBram Moolenaar
20668a7d6542SBram Moolenaardef Test_fixed_size_list()
2067f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
20688a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
20698a7d6542SBram Moolenaar  l->remove(0)
20708a7d6542SBram Moolenaar  l->add(5)
20718a7d6542SBram Moolenaar  l->insert(99, 1)
20720f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
20738a7d6542SBram Moolenaarenddef
20748a7d6542SBram Moolenaar
2075ae616494SBram Moolenaardef Test_no_insert_xit()
2076d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
2077d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
2078d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
2079d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
2080d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
2081ae616494SBram Moolenaar
2082ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
2083ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
2084ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
2085ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
2086f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
2087f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
2088f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
2089f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
2090f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
2091ae616494SBram Moolenaarenddef
2092ae616494SBram Moolenaar
2093158906cfSBram Moolenaardef IfElse(what: number): string
2094158906cfSBram Moolenaar  let res = ''
2095158906cfSBram Moolenaar  if what == 1
2096158906cfSBram Moolenaar    res = "one"
2097158906cfSBram Moolenaar  elseif what == 2
2098158906cfSBram Moolenaar    res = "two"
2099a259d8d3SBram Moolenaar  else
2100158906cfSBram Moolenaar    res = "three"
2101a259d8d3SBram Moolenaar  endif
2102158906cfSBram Moolenaar  return res
2103a259d8d3SBram Moolenaarenddef
2104a259d8d3SBram Moolenaar
2105158906cfSBram Moolenaardef Test_if_elseif_else()
2106158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
2107158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
2108158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
21090f18b6d1SBram Moolenaarenddef
21100f18b6d1SBram Moolenaar
2111e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
2112d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
2113d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
2114d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
2115d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
2116d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
2117e8c4abbbSBram Moolenaarenddef
2118e8c4abbbSBram Moolenaar
21196d69bf60SBram Moolenaarlet g:bool_true = v:true
21206d69bf60SBram Moolenaarlet g:bool_false = v:false
21216d69bf60SBram Moolenaar
21226d69bf60SBram Moolenaardef Test_if_const_expr()
21236d69bf60SBram Moolenaar  let res = false
21246d69bf60SBram Moolenaar  if true ? true : false
21256d69bf60SBram Moolenaar    res = true
21266d69bf60SBram Moolenaar  endif
21276d69bf60SBram Moolenaar  assert_equal(true, res)
21286d69bf60SBram Moolenaar
2129585fea7bSBram Moolenaar  g:glob = 2
2130585fea7bSBram Moolenaar  if false
21316797966dSBram Moolenaar    execute('g:glob = 3')
2132585fea7bSBram Moolenaar  endif
2133585fea7bSBram Moolenaar  assert_equal(2, g:glob)
2134585fea7bSBram Moolenaar  if true
21356797966dSBram Moolenaar    execute('g:glob = 3')
2136585fea7bSBram Moolenaar  endif
2137585fea7bSBram Moolenaar  assert_equal(3, g:glob)
2138585fea7bSBram Moolenaar
21396d69bf60SBram Moolenaar  res = false
21406d69bf60SBram Moolenaar  if g:bool_true ? true : false
21416d69bf60SBram Moolenaar    res = true
21426d69bf60SBram Moolenaar  endif
21436d69bf60SBram Moolenaar  assert_equal(true, res)
21446d69bf60SBram Moolenaar
21456d69bf60SBram Moolenaar  res = false
21466d69bf60SBram Moolenaar  if true ? g:bool_true : false
21476d69bf60SBram Moolenaar    res = true
21486d69bf60SBram Moolenaar  endif
21496d69bf60SBram Moolenaar  assert_equal(true, res)
21506d69bf60SBram Moolenaar
21516d69bf60SBram Moolenaar  res = false
21526d69bf60SBram Moolenaar  if true ? true : g:bool_false
21536d69bf60SBram Moolenaar    res = true
21546d69bf60SBram Moolenaar  endif
21556d69bf60SBram Moolenaar  assert_equal(true, res)
21566d69bf60SBram Moolenaar
21576d69bf60SBram Moolenaar  res = false
21586d69bf60SBram Moolenaar  if true ? false : true
21596d69bf60SBram Moolenaar    res = true
21606d69bf60SBram Moolenaar  endif
21616d69bf60SBram Moolenaar  assert_equal(false, res)
21626d69bf60SBram Moolenaar
21636d69bf60SBram Moolenaar  res = false
21646d69bf60SBram Moolenaar  if false ? false : true
21656d69bf60SBram Moolenaar    res = true
21666d69bf60SBram Moolenaar  endif
21676d69bf60SBram Moolenaar  assert_equal(true, res)
21686d69bf60SBram Moolenaar
21696d69bf60SBram Moolenaar  res = false
21706d69bf60SBram Moolenaar  if false ? true : false
21716d69bf60SBram Moolenaar    res = true
21726d69bf60SBram Moolenaar  endif
21736d69bf60SBram Moolenaar  assert_equal(false, res)
21746d69bf60SBram Moolenaar
21756d69bf60SBram Moolenaar  res = false
2176e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2177e8c4abbbSBram Moolenaar    res = true
2178e8c4abbbSBram Moolenaar  endif
2179e8c4abbbSBram Moolenaar  assert_equal(false, res)
2180e8c4abbbSBram Moolenaar
2181e8c4abbbSBram Moolenaar  res = false
21826d69bf60SBram Moolenaar  if true && true
21836d69bf60SBram Moolenaar    res = true
21846d69bf60SBram Moolenaar  endif
21856d69bf60SBram Moolenaar  assert_equal(true, res)
21866d69bf60SBram Moolenaar
21876d69bf60SBram Moolenaar  res = false
21886d69bf60SBram Moolenaar  if true && false
21896d69bf60SBram Moolenaar    res = true
21906d69bf60SBram Moolenaar  endif
21916d69bf60SBram Moolenaar  assert_equal(false, res)
21926d69bf60SBram Moolenaar
21936d69bf60SBram Moolenaar  res = false
21946d69bf60SBram Moolenaar  if g:bool_true && false
21956d69bf60SBram Moolenaar    res = true
21966d69bf60SBram Moolenaar  endif
21976d69bf60SBram Moolenaar  assert_equal(false, res)
21986d69bf60SBram Moolenaar
21996d69bf60SBram Moolenaar  res = false
22006d69bf60SBram Moolenaar  if true && g:bool_false
22016d69bf60SBram Moolenaar    res = true
22026d69bf60SBram Moolenaar  endif
22036d69bf60SBram Moolenaar  assert_equal(false, res)
22046d69bf60SBram Moolenaar
22056d69bf60SBram Moolenaar  res = false
22066d69bf60SBram Moolenaar  if false && false
22076d69bf60SBram Moolenaar    res = true
22086d69bf60SBram Moolenaar  endif
22096d69bf60SBram Moolenaar  assert_equal(false, res)
22106d69bf60SBram Moolenaar
22116d69bf60SBram Moolenaar  res = false
22126d69bf60SBram Moolenaar  if true || false
22136d69bf60SBram Moolenaar    res = true
22146d69bf60SBram Moolenaar  endif
22156d69bf60SBram Moolenaar  assert_equal(true, res)
22166d69bf60SBram Moolenaar
22176d69bf60SBram Moolenaar  res = false
22186d69bf60SBram Moolenaar  if g:bool_true || false
22196d69bf60SBram Moolenaar    res = true
22206d69bf60SBram Moolenaar  endif
22216d69bf60SBram Moolenaar  assert_equal(true, res)
22226d69bf60SBram Moolenaar
22236d69bf60SBram Moolenaar  res = false
22246d69bf60SBram Moolenaar  if true || g:bool_false
22256d69bf60SBram Moolenaar    res = true
22266d69bf60SBram Moolenaar  endif
22276d69bf60SBram Moolenaar  assert_equal(true, res)
22286d69bf60SBram Moolenaar
22296d69bf60SBram Moolenaar  res = false
22306d69bf60SBram Moolenaar  if false || false
22316d69bf60SBram Moolenaar    res = true
22326d69bf60SBram Moolenaar  endif
22336d69bf60SBram Moolenaar  assert_equal(false, res)
22343988f64fSBram Moolenaar
22353988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
22363988f64fSBram Moolenaar  if false | eval 0 | endif
22373988f64fSBram Moolenaar  if false | eval burp + 234 | endif
22383988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
22393988f64fSBram Moolenaar  if false
22403988f64fSBram Moolenaar    burp
22413988f64fSBram Moolenaar  endif
224280c34ca3SBram Moolenaarenddef
22436d69bf60SBram Moolenaar
224480c34ca3SBram Moolenaardef Test_if_const_expr_fails()
2245d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2246d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2247d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
2248d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
22496d69bf60SBram Moolenaarenddef
22506d69bf60SBram Moolenaar
225172abcf42SBram Moolenaardef RunNested(i: number): number
225272abcf42SBram Moolenaar  let x: number = 0
225372abcf42SBram Moolenaar  if i % 2
225472abcf42SBram Moolenaar    if 1
2255f5be8cdbSBram Moolenaar      # comment
225672abcf42SBram Moolenaar    else
2257f5be8cdbSBram Moolenaar      # comment
225872abcf42SBram Moolenaar    endif
225972abcf42SBram Moolenaar    x += 1
226072abcf42SBram Moolenaar  else
226172abcf42SBram Moolenaar    x += 1000
226272abcf42SBram Moolenaar  endif
226372abcf42SBram Moolenaar  return x
226472abcf42SBram Moolenaarenddef
226572abcf42SBram Moolenaar
226672abcf42SBram Moolenaardef Test_nested_if()
226772abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
226872abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
226972abcf42SBram Moolenaarenddef
227072abcf42SBram Moolenaar
2271ad39c094SBram Moolenaardef Test_execute_cmd()
2272ad39c094SBram Moolenaar  new
2273ad39c094SBram Moolenaar  setline(1, 'default')
2274d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
2275ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2276a72cfb80SBram Moolenaar
2277d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
2278a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2279a72cfb80SBram Moolenaar
2280d2c61705SBram Moolenaar  let cmd1 = 'setline(1,'
2281ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
2282a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2283ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2284a72cfb80SBram Moolenaar
2285d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2286ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2287a72cfb80SBram Moolenaar
2288ad39c094SBram Moolenaar  let cmd_first = 'call '
2289ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
2290ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2291ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2292ad39c094SBram Moolenaar  bwipe!
2293585fea7bSBram Moolenaar
22942d6b20d6SBram Moolenaar  let n = true
22952d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
22962d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
22972d6b20d6SBram Moolenaar
2298e5abf7afSBram Moolenaar  echomsg [1, 2, 3] #{a: 1, b: 2}
2299e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2300e5abf7afSBram Moolenaar
2301d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2302d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2303d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2304ad39c094SBram Moolenaarenddef
2305ad39c094SBram Moolenaar
230647e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2307f5be8cdbSBram Moolenaar  # only checks line continuation
230847e880d6SBram Moolenaar  let lines =<< trim END
230947e880d6SBram Moolenaar      vim9script
231047e880d6SBram Moolenaar      execute 'g:someVar'
231147e880d6SBram Moolenaar                .. ' = ' ..
231247e880d6SBram Moolenaar                   '28'
231347e880d6SBram Moolenaar      assert_equal(28, g:someVar)
231447e880d6SBram Moolenaar      unlet g:someVar
231547e880d6SBram Moolenaar  END
231647e880d6SBram Moolenaar  CheckScriptSuccess(lines)
231747e880d6SBram Moolenaarenddef
231847e880d6SBram Moolenaar
2319ad39c094SBram Moolenaardef Test_echo_cmd()
2320a72cfb80SBram Moolenaar  echo 'some' # comment
2321585fea7bSBram Moolenaar  echon 'thing'
2322ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2323ad39c094SBram Moolenaar
2324a72cfb80SBram Moolenaar  echo "some" # comment
2325a72cfb80SBram Moolenaar  echon "thing"
2326a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2327a72cfb80SBram Moolenaar
2328ad39c094SBram Moolenaar  let str1 = 'some'
2329ad39c094SBram Moolenaar  let str2 = 'more'
2330ad39c094SBram Moolenaar  echo str1 str2
2331ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2332a72cfb80SBram Moolenaar
2333d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2334ad39c094SBram Moolenaarenddef
2335ad39c094SBram Moolenaar
2336f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2337f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2338f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2339f93c7feaSBram Moolenaar  echo 'clear'
2340df069eecSBram Moolenaar  :1messages
2341f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2342f93c7feaSBram Moolenaar
2343d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2344f93c7feaSBram Moolenaarenddef
2345f93c7feaSBram Moolenaar
234647e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2347f5be8cdbSBram Moolenaar  # only checks line continuation
234847e880d6SBram Moolenaar  let lines =<< trim END
234947e880d6SBram Moolenaar      vim9script
235047e880d6SBram Moolenaar      echomsg 'here'
235147e880d6SBram Moolenaar                .. ' is ' ..
235247e880d6SBram Moolenaar                   'a message'
235347e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
235447e880d6SBram Moolenaar  END
235547e880d6SBram Moolenaar  CheckScriptSuccess(lines)
235647e880d6SBram Moolenaarenddef
235747e880d6SBram Moolenaar
2358f93c7feaSBram Moolenaardef Test_echoerr_cmd()
235940ee466cSBram Moolenaar  try
236040ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
236140ee466cSBram Moolenaar  catch
236240ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
236340ee466cSBram Moolenaar  endtry
2364f93c7feaSBram Moolenaarenddef
2365f93c7feaSBram Moolenaar
236647e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2367f5be8cdbSBram Moolenaar  # only checks line continuation
236847e880d6SBram Moolenaar  let lines =<< trim END
236947e880d6SBram Moolenaar      vim9script
237047e880d6SBram Moolenaar      try
237147e880d6SBram Moolenaar        echoerr 'this'
237247e880d6SBram Moolenaar                .. ' is ' ..
237347e880d6SBram Moolenaar                   'wrong'
237447e880d6SBram Moolenaar      catch
237547e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
237647e880d6SBram Moolenaar      endtry
237747e880d6SBram Moolenaar  END
237847e880d6SBram Moolenaar  CheckScriptSuccess(lines)
237947e880d6SBram Moolenaarenddef
238047e880d6SBram Moolenaar
238141fe0617SBram Moolenaardef Test_for_outside_of_function()
238241fe0617SBram Moolenaar  let lines =<< trim END
238341fe0617SBram Moolenaar    vim9script
238441fe0617SBram Moolenaar    new
238541fe0617SBram Moolenaar    for var in range(0, 3)
238641fe0617SBram Moolenaar      append(line('$'), var)
238741fe0617SBram Moolenaar    endfor
238841fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
238941fe0617SBram Moolenaar    bwipe!
239041fe0617SBram Moolenaar  END
239141fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
239241fe0617SBram Moolenaar  source Xvim9for.vim
239341fe0617SBram Moolenaar  delete('Xvim9for.vim')
239441fe0617SBram Moolenaarenddef
23958a7d6542SBram Moolenaar
2396e8c4abbbSBram Moolenaardef Test_for_loop()
2397e8c4abbbSBram Moolenaar  let result = ''
2398e8c4abbbSBram Moolenaar  for cnt in range(7)
2399e8c4abbbSBram Moolenaar    if cnt == 4
2400e8c4abbbSBram Moolenaar      break
2401e8c4abbbSBram Moolenaar    endif
2402e8c4abbbSBram Moolenaar    if cnt == 2
2403e8c4abbbSBram Moolenaar      continue
2404e8c4abbbSBram Moolenaar    endif
2405e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2406e8c4abbbSBram Moolenaar  endfor
2407e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
24080ad3e894SBram Moolenaar
24090ad3e894SBram Moolenaar  let concat = ''
24100ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
24110ad3e894SBram Moolenaar    concat ..= str
24120ad3e894SBram Moolenaar  endfor
24130ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
2414e8c4abbbSBram Moolenaarenddef
2415e8c4abbbSBram Moolenaar
2416e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2417675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2418675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2419451c2e35SBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1017:')
2420822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
2421451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
2422675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2423675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2424675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2425e8c4abbbSBram Moolenaarenddef
2426e8c4abbbSBram Moolenaar
2427d0df1aacSBram Moolenaardef Test_while_loop()
2428d0df1aacSBram Moolenaar  let result = ''
2429d0df1aacSBram Moolenaar  let cnt = 0
2430d0df1aacSBram Moolenaar  while cnt < 555
2431d0df1aacSBram Moolenaar    if cnt == 3
2432d0df1aacSBram Moolenaar      break
2433d0df1aacSBram Moolenaar    endif
2434d0df1aacSBram Moolenaar    cnt += 1
2435d0df1aacSBram Moolenaar    if cnt == 2
2436d0df1aacSBram Moolenaar      continue
2437d0df1aacSBram Moolenaar    endif
2438d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2439d0df1aacSBram Moolenaar  endwhile
2440d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2441d0df1aacSBram Moolenaarenddef
2442d0df1aacSBram Moolenaar
2443e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2444675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2445675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2446675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2447675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2448675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2449675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2450675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
2451bd5da371SBram Moolenaarenddef
2452bd5da371SBram Moolenaar
24539645e2d9SBram Moolenaardef Test_interrupt_loop()
245497acfc78SBram Moolenaar  let caught = false
24559645e2d9SBram Moolenaar  let x = 0
245697acfc78SBram Moolenaar  try
24579645e2d9SBram Moolenaar    while 1
24589645e2d9SBram Moolenaar      x += 1
24599645e2d9SBram Moolenaar      if x == 100
24609645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
24619645e2d9SBram Moolenaar      endif
24629645e2d9SBram Moolenaar    endwhile
246397acfc78SBram Moolenaar  catch
246497acfc78SBram Moolenaar    caught = true
246597acfc78SBram Moolenaar    assert_equal(100, x)
246697acfc78SBram Moolenaar  endtry
246797acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
246825859dd7SBram Moolenaar  # consume the CTRL-C
246925859dd7SBram Moolenaar  getchar(0)
24709645e2d9SBram Moolenaarenddef
247120431c9dSBram Moolenaar
24724fdae999SBram Moolenaardef Test_automatic_line_continuation()
24734fdae999SBram Moolenaar  let mylist = [
24744fdae999SBram Moolenaar      'one',
24754fdae999SBram Moolenaar      'two',
24764fdae999SBram Moolenaar      'three',
2477f5be8cdbSBram Moolenaar      ] # comment
24784fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
24794fdae999SBram Moolenaar
24804fdae999SBram Moolenaar  let mydict = {
24814fdae999SBram Moolenaar      'one': 1,
24824fdae999SBram Moolenaar      'two': 2,
24834fdae999SBram Moolenaar      'three':
24844fdae999SBram Moolenaar          3,
2485f5be8cdbSBram Moolenaar      } # comment
24864fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
24874fdae999SBram Moolenaar  mydict = #{
24882c330432SBram Moolenaar      one: 1,  # comment
24892c330432SBram Moolenaar      two:     # comment
24902c330432SBram Moolenaar           2,  # comment
24912c330432SBram Moolenaar      three: 3 # comment
24922c330432SBram Moolenaar      }
24932c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
24942c330432SBram Moolenaar  mydict = #{
24952c330432SBram Moolenaar      one: 1,
24964fdae999SBram Moolenaar      two:
24974fdae999SBram Moolenaar           2,
24982c330432SBram Moolenaar      three: 3
24994fdae999SBram Moolenaar      }
25004fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
2501e6085c53SBram Moolenaar
2502e6085c53SBram Moolenaar  assert_equal(
2503e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2504e6085c53SBram Moolenaar        split('one two three')
2505e6085c53SBram Moolenaar        )
25064fdae999SBram Moolenaarenddef
25074fdae999SBram Moolenaar
25087a092245SBram Moolenaardef Test_vim9_comment()
25097a092245SBram Moolenaar  CheckScriptSuccess([
25107a092245SBram Moolenaar      'vim9script',
25117a092245SBram Moolenaar      '# something',
25127a092245SBram Moolenaar      ])
25137a092245SBram Moolenaar  CheckScriptFailure([
25147a092245SBram Moolenaar      'vim9script',
25157a092245SBram Moolenaar      ':# something',
25167a092245SBram Moolenaar      ], 'E488:')
25177a092245SBram Moolenaar  CheckScriptFailure([
25187a092245SBram Moolenaar      '# something',
25197a092245SBram Moolenaar      ], 'E488:')
25207a092245SBram Moolenaar  CheckScriptFailure([
25217a092245SBram Moolenaar      ':# something',
25227a092245SBram Moolenaar      ], 'E488:')
25237a092245SBram Moolenaar
25244a8d9f2eSBram Moolenaar  { # block start
25254a8d9f2eSBram Moolenaar  } # block end
25264a8d9f2eSBram Moolenaar  CheckDefFailure([
25274a8d9f2eSBram Moolenaar      '{# comment',
25284a8d9f2eSBram Moolenaar      ], 'E488:')
25294a8d9f2eSBram Moolenaar  CheckDefFailure([
25304a8d9f2eSBram Moolenaar      '{',
25314a8d9f2eSBram Moolenaar      '}# comment',
25324a8d9f2eSBram Moolenaar      ], 'E488:')
25334a8d9f2eSBram Moolenaar
25344a8d9f2eSBram Moolenaar  echo "yes" # comment
25354a8d9f2eSBram Moolenaar  CheckDefFailure([
25364a8d9f2eSBram Moolenaar      'echo "yes"# comment',
25374a8d9f2eSBram Moolenaar      ], 'E488:')
25387a092245SBram Moolenaar  CheckScriptSuccess([
25397a092245SBram Moolenaar      'vim9script',
25407a092245SBram Moolenaar      'echo "yes" # something',
25417a092245SBram Moolenaar      ])
25427a092245SBram Moolenaar  CheckScriptFailure([
25437a092245SBram Moolenaar      'vim9script',
25447a092245SBram Moolenaar      'echo "yes"# something',
25457a092245SBram Moolenaar      ], 'E121:')
25467a092245SBram Moolenaar  CheckScriptFailure([
25477a092245SBram Moolenaar      'vim9script',
25487a092245SBram Moolenaar      'echo# something',
25497a092245SBram Moolenaar      ], 'E121:')
25507a092245SBram Moolenaar  CheckScriptFailure([
25517a092245SBram Moolenaar      'echo "yes" # something',
25527a092245SBram Moolenaar      ], 'E121:')
25537a092245SBram Moolenaar
25544a8d9f2eSBram Moolenaar  exe "echo" # comment
25554a8d9f2eSBram Moolenaar  CheckDefFailure([
25564a8d9f2eSBram Moolenaar      'exe "echo"# comment',
25574a8d9f2eSBram Moolenaar      ], 'E488:')
25584a8d9f2eSBram Moolenaar  CheckScriptSuccess([
25594a8d9f2eSBram Moolenaar      'vim9script',
25604a8d9f2eSBram Moolenaar      'exe "echo" # something',
25614a8d9f2eSBram Moolenaar      ])
25624a8d9f2eSBram Moolenaar  CheckScriptFailure([
25634a8d9f2eSBram Moolenaar      'vim9script',
25644a8d9f2eSBram Moolenaar      'exe "echo"# something',
25654a8d9f2eSBram Moolenaar      ], 'E121:')
25664a8d9f2eSBram Moolenaar  CheckDefFailure([
25674a8d9f2eSBram Moolenaar      'exe # comment',
25684a8d9f2eSBram Moolenaar      ], 'E1015:')
25694a8d9f2eSBram Moolenaar  CheckScriptFailure([
25704a8d9f2eSBram Moolenaar      'vim9script',
25714a8d9f2eSBram Moolenaar      'exe# something',
25724a8d9f2eSBram Moolenaar      ], 'E121:')
25734a8d9f2eSBram Moolenaar  CheckScriptFailure([
25744a8d9f2eSBram Moolenaar      'exe "echo" # something',
25754a8d9f2eSBram Moolenaar      ], 'E121:')
25764a8d9f2eSBram Moolenaar
25777a092245SBram Moolenaar  CheckDefFailure([
25787a092245SBram Moolenaar      'try# comment',
25797a092245SBram Moolenaar      '  echo "yes"',
25807a092245SBram Moolenaar      'catch',
25817a092245SBram Moolenaar      'endtry',
25827a092245SBram Moolenaar      ], 'E488:')
25832c5ed4e3SBram Moolenaar  CheckScriptFailure([
25842c5ed4e3SBram Moolenaar      'vim9script',
25852c5ed4e3SBram Moolenaar      'try# comment',
25862c5ed4e3SBram Moolenaar      'echo "yes"',
25872c5ed4e3SBram Moolenaar      ], 'E488:')
25887a092245SBram Moolenaar  CheckDefFailure([
25897a092245SBram Moolenaar      'try',
2590a72cfb80SBram Moolenaar      '  throw#comment',
2591a72cfb80SBram Moolenaar      'catch',
2592a72cfb80SBram Moolenaar      'endtry',
2593a72cfb80SBram Moolenaar      ], 'E1015:')
2594a72cfb80SBram Moolenaar  CheckDefFailure([
2595a72cfb80SBram Moolenaar      'try',
2596a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2597a72cfb80SBram Moolenaar      'catch',
2598a72cfb80SBram Moolenaar      'endtry',
2599a72cfb80SBram Moolenaar      ], 'E488:')
2600a72cfb80SBram Moolenaar  CheckDefFailure([
2601a72cfb80SBram Moolenaar      'try',
26027a092245SBram Moolenaar      '  echo "yes"',
26037a092245SBram Moolenaar      'catch# comment',
26047a092245SBram Moolenaar      'endtry',
26057a092245SBram Moolenaar      ], 'E488:')
26062c5ed4e3SBram Moolenaar  CheckScriptFailure([
26072c5ed4e3SBram Moolenaar      'vim9script',
26082c5ed4e3SBram Moolenaar      'try',
26092c5ed4e3SBram Moolenaar      '  echo "yes"',
26102c5ed4e3SBram Moolenaar      'catch# comment',
26112c5ed4e3SBram Moolenaar      'endtry',
26122c5ed4e3SBram Moolenaar      ], 'E654:')
26132c5ed4e3SBram Moolenaar  CheckDefFailure([
26142c5ed4e3SBram Moolenaar      'try',
26152c5ed4e3SBram Moolenaar      '  echo "yes"',
26162c5ed4e3SBram Moolenaar      'catch /pat/# comment',
26172c5ed4e3SBram Moolenaar      'endtry',
26182c5ed4e3SBram Moolenaar      ], 'E488:')
26197a092245SBram Moolenaar  CheckDefFailure([
26207a092245SBram Moolenaar      'try',
26217a092245SBram Moolenaar      'echo "yes"',
26227a092245SBram Moolenaar      'catch',
26237a092245SBram Moolenaar      'endtry# comment',
26247a092245SBram Moolenaar      ], 'E488:')
26252c5ed4e3SBram Moolenaar  CheckScriptFailure([
26262c5ed4e3SBram Moolenaar      'vim9script',
26272c5ed4e3SBram Moolenaar      'try',
26282c5ed4e3SBram Moolenaar      '  echo "yes"',
26292c5ed4e3SBram Moolenaar      'catch',
26302c5ed4e3SBram Moolenaar      'endtry# comment',
26319b7bf9e9SBram Moolenaar      ], 'E488:')
26322c5ed4e3SBram Moolenaar
26332c5ed4e3SBram Moolenaar  CheckScriptSuccess([
26342c5ed4e3SBram Moolenaar      'vim9script',
26352c5ed4e3SBram Moolenaar      'hi # comment',
26362c5ed4e3SBram Moolenaar      ])
26372c5ed4e3SBram Moolenaar  CheckScriptFailure([
26382c5ed4e3SBram Moolenaar      'vim9script',
26392c5ed4e3SBram Moolenaar      'hi# comment',
26402c5ed4e3SBram Moolenaar      ], 'E416:')
26411966c248SBram Moolenaar  CheckScriptSuccess([
26421966c248SBram Moolenaar      'vim9script',
26431966c248SBram Moolenaar      'hi Search # comment',
26441966c248SBram Moolenaar      ])
26451966c248SBram Moolenaar  CheckScriptFailure([
26461966c248SBram Moolenaar      'vim9script',
26471966c248SBram Moolenaar      'hi Search# comment',
26481966c248SBram Moolenaar      ], 'E416:')
26491966c248SBram Moolenaar  CheckScriptSuccess([
26501966c248SBram Moolenaar      'vim9script',
26511966c248SBram Moolenaar      'hi link This Search # comment',
26521966c248SBram Moolenaar      ])
26531966c248SBram Moolenaar  CheckScriptFailure([
26541966c248SBram Moolenaar      'vim9script',
26551966c248SBram Moolenaar      'hi link This That# comment',
26561966c248SBram Moolenaar      ], 'E413:')
26571966c248SBram Moolenaar  CheckScriptSuccess([
26581966c248SBram Moolenaar      'vim9script',
26591966c248SBram Moolenaar      'hi clear This # comment',
26601966c248SBram Moolenaar      'hi clear # comment',
26611966c248SBram Moolenaar      ])
2662f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2663f5be8cdbSBram Moolenaar  # hi clear This# comment',
26641966c248SBram Moolenaar  CheckScriptFailure([
26651966c248SBram Moolenaar      'vim9script',
26661966c248SBram Moolenaar      'hi clear# comment',
26671966c248SBram Moolenaar      ], 'E416:')
26681966c248SBram Moolenaar
26691966c248SBram Moolenaar  CheckScriptSuccess([
26701966c248SBram Moolenaar      'vim9script',
26711966c248SBram Moolenaar      'hi Group term=bold',
26721966c248SBram Moolenaar      'match Group /todo/ # comment',
26731966c248SBram Moolenaar      ])
26741966c248SBram Moolenaar  CheckScriptFailure([
26751966c248SBram Moolenaar      'vim9script',
26761966c248SBram Moolenaar      'hi Group term=bold',
26771966c248SBram Moolenaar      'match Group /todo/# comment',
26781966c248SBram Moolenaar      ], 'E488:')
26791966c248SBram Moolenaar  CheckScriptSuccess([
26801966c248SBram Moolenaar      'vim9script',
26811966c248SBram Moolenaar      'match # comment',
26821966c248SBram Moolenaar      ])
26831966c248SBram Moolenaar  CheckScriptFailure([
26841966c248SBram Moolenaar      'vim9script',
26851966c248SBram Moolenaar      'match# comment',
26861966c248SBram Moolenaar      ], 'E475:')
26871966c248SBram Moolenaar  CheckScriptSuccess([
26881966c248SBram Moolenaar      'vim9script',
26891966c248SBram Moolenaar      'match none # comment',
26901966c248SBram Moolenaar      ])
26911966c248SBram Moolenaar  CheckScriptFailure([
26921966c248SBram Moolenaar      'vim9script',
26931966c248SBram Moolenaar      'match none# comment',
26941966c248SBram Moolenaar      ], 'E475:')
26951966c248SBram Moolenaar
26961966c248SBram Moolenaar  CheckScriptSuccess([
26971966c248SBram Moolenaar      'vim9script',
26981966c248SBram Moolenaar      'menutrans clear # comment',
26991966c248SBram Moolenaar      ])
27001966c248SBram Moolenaar  CheckScriptFailure([
27011966c248SBram Moolenaar      'vim9script',
27021966c248SBram Moolenaar      'menutrans clear# comment text',
27031966c248SBram Moolenaar      ], 'E474:')
27041966c248SBram Moolenaar
27051966c248SBram Moolenaar  CheckScriptSuccess([
27061966c248SBram Moolenaar      'vim9script',
27071966c248SBram Moolenaar      'syntax clear # comment',
27081966c248SBram Moolenaar      ])
27091966c248SBram Moolenaar  CheckScriptFailure([
27101966c248SBram Moolenaar      'vim9script',
27111966c248SBram Moolenaar      'syntax clear# comment text',
27121966c248SBram Moolenaar      ], 'E28:')
27131966c248SBram Moolenaar  CheckScriptSuccess([
27141966c248SBram Moolenaar      'vim9script',
27151966c248SBram Moolenaar      'syntax keyword Word some',
27161966c248SBram Moolenaar      'syntax clear Word # comment',
27171966c248SBram Moolenaar      ])
27181966c248SBram Moolenaar  CheckScriptFailure([
27191966c248SBram Moolenaar      'vim9script',
27201966c248SBram Moolenaar      'syntax keyword Word some',
27211966c248SBram Moolenaar      'syntax clear Word# comment text',
27221966c248SBram Moolenaar      ], 'E28:')
27231966c248SBram Moolenaar
27241966c248SBram Moolenaar  CheckScriptSuccess([
27251966c248SBram Moolenaar      'vim9script',
27261966c248SBram Moolenaar      'syntax list # comment',
27271966c248SBram Moolenaar      ])
27281966c248SBram Moolenaar  CheckScriptFailure([
27291966c248SBram Moolenaar      'vim9script',
27301966c248SBram Moolenaar      'syntax list# comment text',
27311966c248SBram Moolenaar      ], 'E28:')
27321966c248SBram Moolenaar
27331966c248SBram Moolenaar  CheckScriptSuccess([
27341966c248SBram Moolenaar      'vim9script',
27351966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
27361966c248SBram Moolenaar      ])
27371966c248SBram Moolenaar  CheckScriptFailure([
27381966c248SBram Moolenaar      'vim9script',
27391966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
27401966c248SBram Moolenaar      ], 'E475:')
27411966c248SBram Moolenaar
27421966c248SBram Moolenaar  CheckScriptSuccess([
27431966c248SBram Moolenaar      'vim9script',
27441966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
27451966c248SBram Moolenaar      ])
27461966c248SBram Moolenaar  CheckScriptFailure([
27471966c248SBram Moolenaar      'vim9script',
27481966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
27491966c248SBram Moolenaar      ], 'E789:')
27501966c248SBram Moolenaar
27511966c248SBram Moolenaar  CheckScriptSuccess([
27521966c248SBram Moolenaar      'vim9script',
27531966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
27541966c248SBram Moolenaar      ])
27551966c248SBram Moolenaar  CheckScriptFailure([
27561966c248SBram Moolenaar      'vim9script',
27571966c248SBram Moolenaar      'syntax match Word /pat/# comment',
27581966c248SBram Moolenaar      ], 'E402:')
27591966c248SBram Moolenaar
27601966c248SBram Moolenaar  CheckScriptSuccess([
27611966c248SBram Moolenaar      'vim9script',
27621966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
27631966c248SBram Moolenaar      ])
27641966c248SBram Moolenaar  CheckScriptFailure([
27651966c248SBram Moolenaar      'vim9script',
27661966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
27671966c248SBram Moolenaar      ], 'E475:')
27681966c248SBram Moolenaar  CheckScriptFailure([
27691966c248SBram Moolenaar      'vim9script',
27701966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
27711966c248SBram Moolenaar      ], 'E406:')
27721966c248SBram Moolenaar  CheckScriptFailure([
27731966c248SBram Moolenaar      'vim9script',
27741966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
27751966c248SBram Moolenaar      ], 'E475:')
27761966c248SBram Moolenaar
27771966c248SBram Moolenaar  CheckScriptSuccess([
27781966c248SBram Moolenaar      'vim9script',
27791966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
27801966c248SBram Moolenaar      ])
27811966c248SBram Moolenaar  CheckScriptFailure([
27821966c248SBram Moolenaar      'vim9script',
27831966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2784d032f34aSBram Moolenaar      ], 'E402:')
27851966c248SBram Moolenaar
27861966c248SBram Moolenaar  CheckScriptSuccess([
27871966c248SBram Moolenaar      'vim9script',
27881966c248SBram Moolenaar      'syntax sync # comment',
27891966c248SBram Moolenaar      ])
27901966c248SBram Moolenaar  CheckScriptFailure([
27911966c248SBram Moolenaar      'vim9script',
27921966c248SBram Moolenaar      'syntax sync# comment',
27931966c248SBram Moolenaar      ], 'E404:')
27941966c248SBram Moolenaar  CheckScriptSuccess([
27951966c248SBram Moolenaar      'vim9script',
27961966c248SBram Moolenaar      'syntax sync ccomment # comment',
27971966c248SBram Moolenaar      ])
27981966c248SBram Moolenaar  CheckScriptFailure([
27991966c248SBram Moolenaar      'vim9script',
28001966c248SBram Moolenaar      'syntax sync ccomment# comment',
28011966c248SBram Moolenaar      ], 'E404:')
28021966c248SBram Moolenaar
28031966c248SBram Moolenaar  CheckScriptSuccess([
28041966c248SBram Moolenaar      'vim9script',
28051966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
28061966c248SBram Moolenaar      ])
28071966c248SBram Moolenaar  CheckScriptFailure([
28081966c248SBram Moolenaar      'vim9script',
28091966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
28101966c248SBram Moolenaar      ], 'E475:')
2811a72cfb80SBram Moolenaar
2812a72cfb80SBram Moolenaar  CheckScriptSuccess([
2813a72cfb80SBram Moolenaar      'vim9script',
2814a72cfb80SBram Moolenaar      'command Echo echo # comment',
2815a72cfb80SBram Moolenaar      'command Echo # comment',
2816a72cfb80SBram Moolenaar      ])
2817a72cfb80SBram Moolenaar  CheckScriptFailure([
2818a72cfb80SBram Moolenaar      'vim9script',
2819a72cfb80SBram Moolenaar      'command Echo echo# comment',
2820a72cfb80SBram Moolenaar      'Echo',
2821a72cfb80SBram Moolenaar      ], 'E121:')
2822a72cfb80SBram Moolenaar  CheckScriptFailure([
2823a72cfb80SBram Moolenaar      'vim9script',
2824a72cfb80SBram Moolenaar      'command Echo# comment',
2825a72cfb80SBram Moolenaar      ], 'E182:')
2826a72cfb80SBram Moolenaar  CheckScriptFailure([
2827a72cfb80SBram Moolenaar      'vim9script',
2828a72cfb80SBram Moolenaar      'command Echo echo',
2829a72cfb80SBram Moolenaar      'command Echo# comment',
2830a72cfb80SBram Moolenaar      ], 'E182:')
2831a72cfb80SBram Moolenaar
2832a72cfb80SBram Moolenaar  CheckScriptSuccess([
2833a72cfb80SBram Moolenaar      'vim9script',
2834a72cfb80SBram Moolenaar      'function # comment',
2835a72cfb80SBram Moolenaar      ])
2836a72cfb80SBram Moolenaar  CheckScriptFailure([
2837a72cfb80SBram Moolenaar      'vim9script',
28389898107fSBram Moolenaar      'function " comment',
28399898107fSBram Moolenaar      ], 'E129:')
28409898107fSBram Moolenaar  CheckScriptFailure([
28419898107fSBram Moolenaar      'vim9script',
2842a72cfb80SBram Moolenaar      'function# comment',
2843a72cfb80SBram Moolenaar      ], 'E129:')
2844a72cfb80SBram Moolenaar  CheckScriptSuccess([
2845a72cfb80SBram Moolenaar      'vim9script',
2846a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2847a72cfb80SBram Moolenaar      ])
2848a72cfb80SBram Moolenaar  CheckScriptFailure([
2849a72cfb80SBram Moolenaar      'vim9script',
2850a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2851a72cfb80SBram Moolenaar      ], 'E488:')
2852a72cfb80SBram Moolenaar
2853a72cfb80SBram Moolenaar  CheckScriptSuccess([
2854a72cfb80SBram Moolenaar      'vim9script',
28554c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2856a72cfb80SBram Moolenaar      'endfunc',
28574c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2858a72cfb80SBram Moolenaar      ])
2859a72cfb80SBram Moolenaar  CheckScriptFailure([
2860a72cfb80SBram Moolenaar      'vim9script',
28614c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2862a72cfb80SBram Moolenaar      'endfunc',
28634c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2864a72cfb80SBram Moolenaar      ], 'E488:')
2865a72cfb80SBram Moolenaar
2866a72cfb80SBram Moolenaar  CheckScriptSuccess([
2867a72cfb80SBram Moolenaar      'vim9script',
2868a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2869a72cfb80SBram Moolenaar      ])
2870a72cfb80SBram Moolenaar  CheckScriptFailure([
2871a72cfb80SBram Moolenaar      'vim9script',
2872a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2873a72cfb80SBram Moolenaar      ], 'E488:')
2874e7e4838fSBram Moolenaar
2875e7e4838fSBram Moolenaar  CheckScriptFailure([
2876e7e4838fSBram Moolenaar      'def Test() " comment',
2877e7e4838fSBram Moolenaar      'enddef',
2878e7e4838fSBram Moolenaar      ], 'E488:')
2879e7e4838fSBram Moolenaar  CheckScriptFailure([
2880e7e4838fSBram Moolenaar      'vim9script',
2881e7e4838fSBram Moolenaar      'def Test() " comment',
2882e7e4838fSBram Moolenaar      'enddef',
2883e7e4838fSBram Moolenaar      ], 'E488:')
2884e7e4838fSBram Moolenaar
2885e7e4838fSBram Moolenaar  CheckScriptSuccess([
2886e7e4838fSBram Moolenaar      'func Test() " comment',
2887e7e4838fSBram Moolenaar      'endfunc',
2888e7e4838fSBram Moolenaar      ])
28899898107fSBram Moolenaar  CheckScriptSuccess([
2890e7e4838fSBram Moolenaar      'vim9script',
2891e7e4838fSBram Moolenaar      'func Test() " comment',
2892e7e4838fSBram Moolenaar      'endfunc',
28939898107fSBram Moolenaar      ])
2894e7e4838fSBram Moolenaar
2895e7e4838fSBram Moolenaar  CheckScriptSuccess([
2896e7e4838fSBram Moolenaar      'def Test() # comment',
2897e7e4838fSBram Moolenaar      'enddef',
2898e7e4838fSBram Moolenaar      ])
2899e7e4838fSBram Moolenaar  CheckScriptFailure([
2900e7e4838fSBram Moolenaar      'func Test() # comment',
2901e7e4838fSBram Moolenaar      'endfunc',
2902e7e4838fSBram Moolenaar      ], 'E488:')
29032c5ed4e3SBram Moolenaarenddef
29042c5ed4e3SBram Moolenaar
29052c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
29062c5ed4e3SBram Moolenaar  CheckCanRunGui
29072c5ed4e3SBram Moolenaar
29082c5ed4e3SBram Moolenaar  CheckScriptFailure([
29092c5ed4e3SBram Moolenaar      'vim9script',
29102c5ed4e3SBram Moolenaar      'gui#comment'
29112c5ed4e3SBram Moolenaar      ], 'E499:')
29122c5ed4e3SBram Moolenaar  CheckScriptFailure([
29132c5ed4e3SBram Moolenaar      'vim9script',
29142c5ed4e3SBram Moolenaar      'gui -f#comment'
29152c5ed4e3SBram Moolenaar      ], 'E499:')
29167a092245SBram Moolenaarenddef
29177a092245SBram Moolenaar
2918a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
29196797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
29206797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2921a26b9700SBram Moolenaar
2922a26b9700SBram Moolenaar  edit test.vim
2923a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2924a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2925a26b9700SBram Moolenaar
2926a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2927a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2928a26b9700SBram Moolenaar
2929a26b9700SBram Moolenaar  g:entered = 0
2930a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2931a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2932a26b9700SBram Moolenaar
2933a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2934a26b9700SBram Moolenaar
2935a26b9700SBram Moolenaar  au! TabEnter
2936a26b9700SBram Moolenaar  unlet g:entered
2937d72c1bf0SBram Moolenaar
2938d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2939d72c1bf0SBram Moolenaar      'vim9script',
29406797966dSBram Moolenaar      'g:var = 123',
2941e55b1c09SBram Moolenaar      'b:var = 456',
2942e55b1c09SBram Moolenaar      'w:var = 777',
2943e55b1c09SBram Moolenaar      't:var = 888',
2944d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2945d72c1bf0SBram Moolenaar      ])
2946d72c1bf0SBram Moolenaar
2947d72c1bf0SBram Moolenaar  CheckScriptFailure([
2948d72c1bf0SBram Moolenaar      'vim9script',
2949d72c1bf0SBram Moolenaar      'let g:var = 123',
2950e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2951e55b1c09SBram Moolenaar
2952e55b1c09SBram Moolenaar  CheckScriptFailure([
2953e55b1c09SBram Moolenaar      'vim9script',
2954e55b1c09SBram Moolenaar      'let b:var = 123',
2955e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2956e55b1c09SBram Moolenaar
2957e55b1c09SBram Moolenaar  CheckScriptFailure([
2958e55b1c09SBram Moolenaar      'vim9script',
2959e55b1c09SBram Moolenaar      'let w:var = 123',
2960e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2961e55b1c09SBram Moolenaar
2962e55b1c09SBram Moolenaar  CheckScriptFailure([
2963e55b1c09SBram Moolenaar      'vim9script',
2964e55b1c09SBram Moolenaar      'let t:var = 123',
2965e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2966e55b1c09SBram Moolenaar
2967e55b1c09SBram Moolenaar  CheckScriptFailure([
2968e55b1c09SBram Moolenaar      'vim9script',
2969e55b1c09SBram Moolenaar      'let v:version = 123',
2970e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2971e55b1c09SBram Moolenaar
2972e55b1c09SBram Moolenaar  CheckScriptFailure([
2973e55b1c09SBram Moolenaar      'vim9script',
2974e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2975e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
29766797966dSBram Moolenaar
29776797966dSBram Moolenaar  CheckScriptFailure([
29786797966dSBram Moolenaar      'vim9script',
29796797966dSBram Moolenaar      'g:var = 123',
298032e35117SBram Moolenaar      'unlet g:var# comment1',
2981d72c1bf0SBram Moolenaar      ], 'E108:')
2982d72c1bf0SBram Moolenaar
2983d72c1bf0SBram Moolenaar  CheckScriptFailure([
2984d72c1bf0SBram Moolenaar      'let g:var = 123',
2985d72c1bf0SBram Moolenaar      'unlet g:var # something',
2986d72c1bf0SBram Moolenaar      ], 'E488:')
2987faac4104SBram Moolenaar
2988faac4104SBram Moolenaar  CheckScriptSuccess([
2989faac4104SBram Moolenaar      'vim9script',
299032e35117SBram Moolenaar      'if 1 # comment2',
2991faac4104SBram Moolenaar      '  echo "yes"',
2992faac4104SBram Moolenaar      'elseif 2 #comment',
2993faac4104SBram Moolenaar      '  echo "no"',
2994faac4104SBram Moolenaar      'endif',
2995faac4104SBram Moolenaar      ])
2996faac4104SBram Moolenaar
2997faac4104SBram Moolenaar  CheckScriptFailure([
2998faac4104SBram Moolenaar      'vim9script',
299932e35117SBram Moolenaar      'if 1# comment3',
3000faac4104SBram Moolenaar      '  echo "yes"',
3001faac4104SBram Moolenaar      'endif',
3002faac4104SBram Moolenaar      ], 'E15:')
3003faac4104SBram Moolenaar
3004faac4104SBram Moolenaar  CheckScriptFailure([
3005faac4104SBram Moolenaar      'vim9script',
300632e35117SBram Moolenaar      'if 0 # comment4',
3007faac4104SBram Moolenaar      '  echo "yes"',
3008faac4104SBram Moolenaar      'elseif 2#comment',
3009faac4104SBram Moolenaar      '  echo "no"',
3010faac4104SBram Moolenaar      'endif',
3011faac4104SBram Moolenaar      ], 'E15:')
3012faac4104SBram Moolenaar
3013faac4104SBram Moolenaar  CheckScriptSuccess([
3014faac4104SBram Moolenaar      'vim9script',
301532e35117SBram Moolenaar      'let v = 1 # comment5',
3016faac4104SBram Moolenaar      ])
3017faac4104SBram Moolenaar
3018faac4104SBram Moolenaar  CheckScriptFailure([
3019faac4104SBram Moolenaar      'vim9script',
302032e35117SBram Moolenaar      'let v = 1# comment6',
302132e35117SBram Moolenaar      ], 'E15:')
3022faac4104SBram Moolenaar
3023faac4104SBram Moolenaar  CheckScriptSuccess([
3024faac4104SBram Moolenaar      'vim9script',
3025faac4104SBram Moolenaar      'new'
3026d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3027df069eecSBram Moolenaar      ':$',
3028faac4104SBram Moolenaar      'dsearch /pat/ #comment',
3029faac4104SBram Moolenaar      'bwipe!',
3030faac4104SBram Moolenaar      ])
3031faac4104SBram Moolenaar
3032f5be8cdbSBram Moolenaar  CheckScriptFailure([
3033f5be8cdbSBram Moolenaar      'vim9script',
3034f5be8cdbSBram Moolenaar      'new'
3035d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3036f5be8cdbSBram Moolenaar      ':$',
3037f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
3038f5be8cdbSBram Moolenaar      'bwipe!',
3039f5be8cdbSBram Moolenaar      ], 'E488:')
3040f5be8cdbSBram Moolenaar
3041f5be8cdbSBram Moolenaar  CheckScriptFailure([
3042f5be8cdbSBram Moolenaar      'vim9script',
3043f5be8cdbSBram Moolenaar      'func! SomeFunc()',
3044f5be8cdbSBram Moolenaar      ], 'E477:')
3045a26b9700SBram Moolenaarenddef
3046a26b9700SBram Moolenaar
30477e5bd91dSBram Moolenaardef Test_finish()
30487e5bd91dSBram Moolenaar  let lines =<< trim END
30497e5bd91dSBram Moolenaar    vim9script
30506797966dSBram Moolenaar    g:res = 'one'
30517e5bd91dSBram Moolenaar    if v:false | finish | endif
30526797966dSBram Moolenaar    g:res = 'two'
30537e5bd91dSBram Moolenaar    finish
30546797966dSBram Moolenaar    g:res = 'three'
30557e5bd91dSBram Moolenaar  END
30567e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
30577e5bd91dSBram Moolenaar  source Xfinished
30587e5bd91dSBram Moolenaar  assert_equal('two', g:res)
30597e5bd91dSBram Moolenaar
30607e5bd91dSBram Moolenaar  unlet g:res
30617e5bd91dSBram Moolenaar  delete('Xfinished')
30627e5bd91dSBram Moolenaarenddef
30637e5bd91dSBram Moolenaar
306432e35117SBram Moolenaardef Test_let_func_call()
306532e35117SBram Moolenaar  let lines =<< trim END
306632e35117SBram Moolenaar    vim9script
306732e35117SBram Moolenaar    func GetValue()
306832e35117SBram Moolenaar      if exists('g:count')
306932e35117SBram Moolenaar        let g:count += 1
307032e35117SBram Moolenaar      else
307132e35117SBram Moolenaar        let g:count = 1
307232e35117SBram Moolenaar      endif
307332e35117SBram Moolenaar      return 'this'
307432e35117SBram Moolenaar    endfunc
307532e35117SBram Moolenaar    let val: string = GetValue()
3076f5be8cdbSBram Moolenaar    # env var is always a string
3077df671b46SBram Moolenaar    let env = $TERM
307832e35117SBram Moolenaar  END
307932e35117SBram Moolenaar  writefile(lines, 'Xfinished')
308032e35117SBram Moolenaar  source Xfinished
3081f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
308232e35117SBram Moolenaar  assert_equal(1, g:count)
308332e35117SBram Moolenaar
308432e35117SBram Moolenaar  unlet g:count
308532e35117SBram Moolenaar  delete('Xfinished')
308632e35117SBram Moolenaarenddef
308732e35117SBram Moolenaar
308832e35117SBram Moolenaardef Test_let_missing_type()
308932e35117SBram Moolenaar  let lines =<< trim END
309032e35117SBram Moolenaar    vim9script
3091df671b46SBram Moolenaar    let var = g:unknown
3092227a69deSBram Moolenaar  END
3093822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
3094227a69deSBram Moolenaar
3095227a69deSBram Moolenaar  lines =<< trim END
3096227a69deSBram Moolenaar    vim9script
3097227a69deSBram Moolenaar    let nr: number = 123
3098227a69deSBram Moolenaar    let var = nr
3099227a69deSBram Moolenaar  END
3100822ba247SBram Moolenaar  CheckScriptSuccess(lines)
310132e35117SBram Moolenaarenddef
310232e35117SBram Moolenaar
3103c82a5b5dSBram Moolenaardef Test_let_declaration()
3104c82a5b5dSBram Moolenaar  let lines =<< trim END
3105c82a5b5dSBram Moolenaar    vim9script
3106c82a5b5dSBram Moolenaar    let var: string
3107c82a5b5dSBram Moolenaar    g:var_uninit = var
3108c82a5b5dSBram Moolenaar    var = 'text'
3109c82a5b5dSBram Moolenaar    g:var_test = var
3110f5be8cdbSBram Moolenaar    # prefixing s: is optional
3111984dddbeSBram Moolenaar    s:var = 'prefixed'
3112984dddbeSBram Moolenaar    g:var_prefixed = s:var
3113984dddbeSBram Moolenaar
3114984dddbeSBram Moolenaar    let s:other: number
3115984dddbeSBram Moolenaar    other = 1234
3116984dddbeSBram Moolenaar    g:other_var = other
311753b29e48SBram Moolenaar
311853b29e48SBram Moolenaar    # type is inferred
311953b29e48SBram Moolenaar    s:dict = {'a': 222}
312053b29e48SBram Moolenaar    def GetDictVal(key: any)
312153b29e48SBram Moolenaar      g:dict_val = s:dict[key]
312253b29e48SBram Moolenaar    enddef
312353b29e48SBram Moolenaar    GetDictVal('a')
3124c82a5b5dSBram Moolenaar  END
3125c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
3126c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
3127c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
3128984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
3129984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
313053b29e48SBram Moolenaar  assert_equal(222, g:dict_val)
3131c82a5b5dSBram Moolenaar
3132c82a5b5dSBram Moolenaar  unlet g:var_uninit
3133c82a5b5dSBram Moolenaar  unlet g:var_test
3134984dddbeSBram Moolenaar  unlet g:var_prefixed
3135984dddbeSBram Moolenaar  unlet g:other_var
3136c82a5b5dSBram Moolenaarenddef
3137c82a5b5dSBram Moolenaar
3138c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
3139c5b1c20bSBram Moolenaar  let lines =<< trim END
3140c5b1c20bSBram Moolenaar    vim9script
3141c5b1c20bSBram Moolenaar    const var: string
3142c5b1c20bSBram Moolenaar  END
3143c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
3144c5b1c20bSBram Moolenaar
3145c5b1c20bSBram Moolenaar  lines =<< trim END
3146c5b1c20bSBram Moolenaar    vim9script
3147c5b1c20bSBram Moolenaar    let 9var: string
3148c5b1c20bSBram Moolenaar  END
3149c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
3150c5b1c20bSBram Moolenaarenddef
3151c5b1c20bSBram Moolenaar
315234db91f7SBram Moolenaardef Test_let_type_check()
315334db91f7SBram Moolenaar  let lines =<< trim END
315434db91f7SBram Moolenaar    vim9script
315534db91f7SBram Moolenaar    let var: string
315634db91f7SBram Moolenaar    var = 1234
315734db91f7SBram Moolenaar  END
3158451c2e35SBram Moolenaar  CheckScriptFailure(lines, 'E1012:')
3159984dddbeSBram Moolenaar
3160984dddbeSBram Moolenaar  lines =<< trim END
3161984dddbeSBram Moolenaar    vim9script
3162984dddbeSBram Moolenaar    let var:string
3163984dddbeSBram Moolenaar  END
3164984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
3165c5b1c20bSBram Moolenaar
3166c5b1c20bSBram Moolenaar  lines =<< trim END
3167c5b1c20bSBram Moolenaar    vim9script
3168c5b1c20bSBram Moolenaar    let var: asdf
3169c5b1c20bSBram Moolenaar  END
3170c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
3171a71e2633SBram Moolenaar
3172a71e2633SBram Moolenaar  lines =<< trim END
3173a71e2633SBram Moolenaar    vim9script
3174a71e2633SBram Moolenaar    let s:l: list<number>
3175a71e2633SBram Moolenaar    s:l = []
3176a71e2633SBram Moolenaar  END
3177a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
3178a71e2633SBram Moolenaar
3179a71e2633SBram Moolenaar  lines =<< trim END
3180a71e2633SBram Moolenaar    vim9script
3181a71e2633SBram Moolenaar    let s:d: dict<number>
3182a71e2633SBram Moolenaar    s:d = {}
3183a71e2633SBram Moolenaar  END
3184a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
318534db91f7SBram Moolenaarenddef
318634db91f7SBram Moolenaar
3187a5d0077eSBram Moolenaardef Test_forward_declaration()
3188a5d0077eSBram Moolenaar  let lines =<< trim END
3189a5d0077eSBram Moolenaar    vim9script
3190a5d0077eSBram Moolenaar    def GetValue(): string
3191a5d0077eSBram Moolenaar      return theVal
3192a5d0077eSBram Moolenaar    enddef
3193a5d0077eSBram Moolenaar    let theVal = 'something'
3194822ba247SBram Moolenaar    g:initVal = GetValue()
3195a5d0077eSBram Moolenaar    theVal = 'else'
3196a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3197a5d0077eSBram Moolenaar  END
3198a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3199a5d0077eSBram Moolenaar  source Xforward
3200a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3201a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3202a5d0077eSBram Moolenaar
3203a5d0077eSBram Moolenaar  unlet g:initVal
3204a5d0077eSBram Moolenaar  unlet g:laterVal
3205a5d0077eSBram Moolenaar  delete('Xforward')
3206a5d0077eSBram Moolenaarenddef
3207a5d0077eSBram Moolenaar
32089721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
32099721fb4eSBram Moolenaar  let legacy_lines =<< trim END
32109721fb4eSBram Moolenaar    source Xvim9_script.vim
32119721fb4eSBram Moolenaar
32129721fb4eSBram Moolenaar    call assert_false(exists('local'))
32139721fb4eSBram Moolenaar    call assert_false(exists('exported'))
32149721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
32159721fb4eSBram Moolenaar    call assert_equal('global', global)
32169721fb4eSBram Moolenaar    call assert_equal('global', g:global)
32179721fb4eSBram Moolenaar
32189721fb4eSBram Moolenaar    " imported variable becomes script-local
32199721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
32209721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
32219721fb4eSBram Moolenaar    call assert_false(exists('exported'))
32229721fb4eSBram Moolenaar
32239721fb4eSBram Moolenaar    " imported function becomes script-local
32249721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
32259721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
32269721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
32279721fb4eSBram Moolenaar  END
32289721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
32299721fb4eSBram Moolenaar
32309721fb4eSBram Moolenaar  let vim9_lines =<< trim END
32319721fb4eSBram Moolenaar    vim9script
32329721fb4eSBram Moolenaar    let local = 'local'
32339721fb4eSBram Moolenaar    g:global = 'global'
32349721fb4eSBram Moolenaar    export let exported = 'exported'
32359721fb4eSBram Moolenaar    export def GetText(): string
32369721fb4eSBram Moolenaar       return 'text'
32379721fb4eSBram Moolenaar    enddef
32389721fb4eSBram Moolenaar  END
32399721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
32409721fb4eSBram Moolenaar
32419721fb4eSBram Moolenaar  source Xlegacy_script.vim
32429721fb4eSBram Moolenaar
32439721fb4eSBram Moolenaar  assert_equal('global', g:global)
3244f5be8cdbSBram Moolenaar  unlet g:global
32459721fb4eSBram Moolenaar
32469721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
32479721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
32489721fb4eSBram Moolenaarenddef
3249a5d0077eSBram Moolenaar
32507d699701SBram Moolenaarfunc Test_vim9script_not_global()
32517d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
32527d699701SBram Moolenaar  let vim9lines =<< trim END
32537d699701SBram Moolenaar    vim9script
32547d699701SBram Moolenaar    let var = 'local'
32557d699701SBram Moolenaar    func TheFunc()
32567d699701SBram Moolenaar      echo 'local'
32577d699701SBram Moolenaar    endfunc
32587d699701SBram Moolenaar    def DefFunc()
32597d699701SBram Moolenaar      echo 'local'
32607d699701SBram Moolenaar    enddef
32617d699701SBram Moolenaar  END
32627d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
32637d699701SBram Moolenaar  source Xvim9script.vim
32647d699701SBram Moolenaar  try
32657d699701SBram Moolenaar    echo g:var
32667d699701SBram Moolenaar    assert_report('did not fail')
32677d699701SBram Moolenaar  catch /E121:/
32687d699701SBram Moolenaar    " caught
32697d699701SBram Moolenaar  endtry
32707d699701SBram Moolenaar  try
32717d699701SBram Moolenaar    call TheFunc()
32727d699701SBram Moolenaar    assert_report('did not fail')
32737d699701SBram Moolenaar  catch /E117:/
32747d699701SBram Moolenaar    " caught
32757d699701SBram Moolenaar  endtry
32767d699701SBram Moolenaar  try
32777d699701SBram Moolenaar    call DefFunc()
32787d699701SBram Moolenaar    assert_report('did not fail')
32797d699701SBram Moolenaar  catch /E117:/
32807d699701SBram Moolenaar    " caught
32817d699701SBram Moolenaar  endtry
32827d699701SBram Moolenaar
328325859dd7SBram Moolenaar  call delete('Xvim9script.vim')
32847d699701SBram Moolenaarendfunc
32857d699701SBram Moolenaar
3286eeb27bfeSBram Moolenaardef Test_vim9_copen()
3287eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3288eeb27bfeSBram Moolenaar  copen
3289eeb27bfeSBram Moolenaar  quit
3290eeb27bfeSBram Moolenaarenddef
3291eeb27bfeSBram Moolenaar
32922d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
32932d6b20d6SBram Moolenaardef Test_vim9_autoload()
32942d6b20d6SBram Moolenaar  let lines =<< trim END
32952d6b20d6SBram Moolenaar     vim9script
32962d6b20d6SBram Moolenaar     def foo#test()
32972d6b20d6SBram Moolenaar         echomsg getreg('"')
32982d6b20d6SBram Moolenaar     enddef
32992d6b20d6SBram Moolenaar  END
33002d6b20d6SBram Moolenaar
33012d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
33022d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
33032d6b20d6SBram Moolenaar  let save_rtp = &rtp
33042d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
33052d6b20d6SBram Moolenaar  augroup test
33062d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
33072d6b20d6SBram Moolenaar  augroup END
33082d6b20d6SBram Moolenaar
33092d6b20d6SBram Moolenaar  normal Y
33102d6b20d6SBram Moolenaar
33112d6b20d6SBram Moolenaar  augroup test
33122d6b20d6SBram Moolenaar    autocmd!
33132d6b20d6SBram Moolenaar  augroup END
33142d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
33152d6b20d6SBram Moolenaar  &rtp = save_rtp
33162d6b20d6SBram Moolenaarenddef
33172d6b20d6SBram Moolenaar
331881e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
331981e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
332081e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
332181e17fbeSBram Moolenaar  let lines =<< trim END
332281e17fbeSBram Moolenaar    let s:counter = 1
332381e17fbeSBram Moolenaar    def s:Func()
332481e17fbeSBram Moolenaar      au! CursorHold
332581e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
332681e17fbeSBram Moolenaar    enddef
332781e17fbeSBram Moolenaar    call s:Func()
332881e17fbeSBram Moolenaar    doau CursorHold
332981e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
333081e17fbeSBram Moolenaar    au! CursorHold
333181e17fbeSBram Moolenaar  END
333281e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
333381e17fbeSBram Moolenaarenddef
333481e17fbeSBram Moolenaar
33353896a105SBram Moolenaardef Test_cmdline_win()
33363896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
33373896a105SBram Moolenaar  # the command line window.
33383896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
33393896a105SBram Moolenaar  let export_lines =<< trim END
33403896a105SBram Moolenaar    vim9script
33413896a105SBram Moolenaar    export let That = 'yes'
33423896a105SBram Moolenaar  END
33433896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
33443896a105SBram Moolenaar  let import_lines =<< trim END
33453896a105SBram Moolenaar    vim9script
33463896a105SBram Moolenaar    import That from './Xexport.vim'
33473896a105SBram Moolenaar  END
33483896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
33493896a105SBram Moolenaar  let save_rtp = &rtp
33503896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
33513896a105SBram Moolenaar  syntax on
33523896a105SBram Moolenaar  augroup CmdWin
33533896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
33543896a105SBram Moolenaar  augroup END
33553896a105SBram Moolenaar  # this will open and also close the cmdline window
33563896a105SBram Moolenaar  feedkeys('q:', 'xt')
33573896a105SBram Moolenaar  assert_equal('yes', g:got_there)
33583896a105SBram Moolenaar
33593896a105SBram Moolenaar  augroup CmdWin
33603896a105SBram Moolenaar    au!
33613896a105SBram Moolenaar  augroup END
33623896a105SBram Moolenaar  &rtp = save_rtp
33633896a105SBram Moolenaar  delete('rtp', 'rf')
33643896a105SBram Moolenaarenddef
33653896a105SBram Moolenaar
3366e3d4685fSBram Moolenaardef Test_invalid_sid()
3367e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
336825859dd7SBram Moolenaar
3369e3d4685fSBram Moolenaar  if RunVim([], ['wq Xdidit'], '+"func <SNR>1_func"')
3370d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3371e3d4685fSBram Moolenaar  endif
3372e3d4685fSBram Moolenaar  delete('Xdidit')
3373e3d4685fSBram Moolenaarenddef
3374e3d4685fSBram Moolenaar
3375f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3376f0afd9e1SBram Moolenaar  let lines =<< trim END
3377f0afd9e1SBram Moolenaar    let var: any
3378f0afd9e1SBram Moolenaar    assert_equal(0, var)
3379f0afd9e1SBram Moolenaar  END
3380f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3381f0afd9e1SBram Moolenaarenddef
3382f0afd9e1SBram Moolenaar
3383585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3384585fea7bSBram Moolenaardef Test_substitute_cmd()
3385585fea7bSBram Moolenaar  new
3386585fea7bSBram Moolenaar  setline(1, 'something')
3387585fea7bSBram Moolenaar  :substitute(some(other(
3388585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3389585fea7bSBram Moolenaar  bwipe!
3390585fea7bSBram Moolenaar
3391f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3392585fea7bSBram Moolenaar  let lines =<< trim END
3393585fea7bSBram Moolenaar    vim9script
3394585fea7bSBram Moolenaar    new
3395585fea7bSBram Moolenaar    setline(1, 'something')
3396585fea7bSBram Moolenaar    :substitute(some(other(
3397585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3398585fea7bSBram Moolenaar    bwipe!
3399585fea7bSBram Moolenaar  END
3400585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3401585fea7bSBram Moolenaar  source Xvim9lines
3402585fea7bSBram Moolenaar
3403585fea7bSBram Moolenaar  delete('Xvim9lines')
3404585fea7bSBram Moolenaarenddef
3405585fea7bSBram Moolenaar
34068a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3407