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:')
1835e654230SBram Moolenaar  CheckDefExecFailure(['&ts = g:alist'], 'E1012: Type mismatch; expected number but got list<number>')
1840aae4809SBram Moolenaar  CheckDefFailure(['&ts = "xx"'], 'E1012:')
1855e654230SBram Moolenaar  CheckDefExecFailure(['&ts = g:astring'], 'E1012: Type mismatch; 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])
83471abe482SBram Moolenaar
83571abe482SBram Moolenaar    let varlist = [7, 8]
83671abe482SBram Moolenaar    const! constlist = [1, varlist, 3]
83771abe482SBram Moolenaar    varlist[0] = 77
83871abe482SBram Moolenaar    # TODO: does not work yet
83971abe482SBram Moolenaar    # constlist[1][1] = 88
84071abe482SBram Moolenaar    let cl = constlist[1]
84171abe482SBram Moolenaar    cl[1] = 88
84271abe482SBram Moolenaar    constlist->assert_equal([1, [77, 88], 3])
84371abe482SBram Moolenaar
84471abe482SBram Moolenaar    let vardict = #{five: 5, six: 6}
84571abe482SBram Moolenaar    const! constdict = #{one: 1, two: vardict, three: 3}
84671abe482SBram Moolenaar    vardict['five'] = 55
84771abe482SBram Moolenaar    # TODO: does not work yet
84871abe482SBram Moolenaar    # constdict['two']['six'] = 66
84971abe482SBram Moolenaar    let cd = constdict['two']
85071abe482SBram Moolenaar    cd['six'] = 66
85171abe482SBram 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]
9615e654230SBram Moolenaar  catch /E1012:/
96268d130c6SBram Moolenaar    n = 77
96368d130c6SBram Moolenaar  endtry
96468d130c6SBram Moolenaar  assert_equal(77, n)
96568d130c6SBram Moolenaar
96668d130c6SBram Moolenaar  try
96768d130c6SBram Moolenaar    n = l[g:astring]
9685e654230SBram Moolenaar  catch /E1012:/
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}
10195e654230SBram Moolenaar  catch /E1012:/
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
10335e654230SBram Moolenaar  catch /E1012:/
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
11729939f57bSBram Moolenaardef TryOne(): number
11739939f57bSBram Moolenaar  try
11749939f57bSBram Moolenaar    return 0
11759939f57bSBram Moolenaar  catch
11769939f57bSBram Moolenaar  endtry
11779939f57bSBram Moolenaar  return 0
11789939f57bSBram Moolenaarenddef
11799939f57bSBram Moolenaar
11809939f57bSBram Moolenaardef TryTwo(n: number): string
11819939f57bSBram Moolenaar  try
11829939f57bSBram Moolenaar    let x = {}
11839939f57bSBram Moolenaar  catch
11849939f57bSBram Moolenaar  endtry
11859939f57bSBram Moolenaar  return 'text'
11869939f57bSBram Moolenaarenddef
11879939f57bSBram Moolenaar
11889939f57bSBram Moolenaardef Test_try_catch_twice()
11899939f57bSBram Moolenaar  assert_equal('text', TryOne()->TryTwo())
11909939f57bSBram Moolenaarenddef
11919939f57bSBram Moolenaar
1192f575adffSBram Moolenaardef Test_try_catch_match()
1193f575adffSBram Moolenaar  let seq = 'a'
1194f575adffSBram Moolenaar  try
1195f575adffSBram Moolenaar    throw 'something'
1196f575adffSBram Moolenaar  catch /nothing/
1197f575adffSBram Moolenaar    seq ..= 'x'
1198f575adffSBram Moolenaar  catch /some/
1199f575adffSBram Moolenaar    seq ..= 'b'
1200f575adffSBram Moolenaar  catch /asdf/
1201f575adffSBram Moolenaar    seq ..= 'x'
1202e8c4abbbSBram Moolenaar  catch ?a\?sdf?
1203e8c4abbbSBram Moolenaar    seq ..= 'y'
1204f575adffSBram Moolenaar  finally
1205f575adffSBram Moolenaar    seq ..= 'c'
1206f575adffSBram Moolenaar  endtry
1207f575adffSBram Moolenaar  assert_equal('abc', seq)
1208257cc5eeSBram Moolenaarenddef
1209257cc5eeSBram Moolenaar
1210e8c4abbbSBram Moolenaardef Test_try_catch_fails()
1211d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
1212d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1213d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1214d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
1215d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1216d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
1217d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
1218d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1219d2c61705SBram Moolenaar  CheckDefFailure(['if 2', 'endtry'], 'E171:')
1220d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
1221585fea7bSBram Moolenaar
1222d2c61705SBram Moolenaar  CheckDefFailure(['throw'], 'E1015:')
1223d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
1224e8c4abbbSBram Moolenaarenddef
1225e8c4abbbSBram Moolenaar
1226006ad48bSBram Moolenaardef Test_throw_vimscript()
1227f5be8cdbSBram Moolenaar  # only checks line continuation
1228006ad48bSBram Moolenaar  let lines =<< trim END
1229006ad48bSBram Moolenaar      vim9script
1230006ad48bSBram Moolenaar      try
1231006ad48bSBram Moolenaar        throw 'one'
1232006ad48bSBram Moolenaar              .. 'two'
1233006ad48bSBram Moolenaar      catch
1234006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
1235006ad48bSBram Moolenaar      endtry
1236006ad48bSBram Moolenaar  END
1237006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
1238006ad48bSBram Moolenaarenddef
1239006ad48bSBram Moolenaar
1240ed677f55SBram Moolenaardef Test_error_in_nested_function()
1241ed677f55SBram Moolenaar  # an error in a nested :function aborts executin in the calling :def function
1242ed677f55SBram Moolenaar  let lines =<< trim END
1243ed677f55SBram Moolenaar      vim9script
1244ed677f55SBram Moolenaar      def Func()
1245ed677f55SBram Moolenaar        Error()
1246ed677f55SBram Moolenaar        g:test_var = 1
1247ed677f55SBram Moolenaar      enddef
1248ed677f55SBram Moolenaar      func Error() abort
1249ed677f55SBram Moolenaar        eval [][0]
1250ed677f55SBram Moolenaar      endfunc
1251ed677f55SBram Moolenaar      Func()
1252ed677f55SBram Moolenaar  END
1253ed677f55SBram Moolenaar  g:test_var = 0
1254ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
1255ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
1256ed677f55SBram Moolenaarenddef
1257ed677f55SBram Moolenaar
125837c83711SBram Moolenaardef Test_cexpr_vimscript()
1259f5be8cdbSBram Moolenaar  # only checks line continuation
126037c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
126137c83711SBram Moolenaar  let lines =<< trim END
126237c83711SBram Moolenaar      vim9script
126337c83711SBram Moolenaar      cexpr 'File'
126437c83711SBram Moolenaar                .. ' someFile' ..
126537c83711SBram Moolenaar                   ' line 19'
126637c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
126737c83711SBram Moolenaar  END
126837c83711SBram Moolenaar  CheckScriptSuccess(lines)
126937c83711SBram Moolenaar  set errorformat&
127037c83711SBram Moolenaarenddef
127137c83711SBram Moolenaar
1272c9edd6b5SBram Moolenaardef Test_statusline_syntax()
1273c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
1274c9edd6b5SBram Moolenaar  let lines =<< trim END
1275c9edd6b5SBram Moolenaar      vim9script
1276c9edd6b5SBram Moolenaar      func g:Status()
1277c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
1278c9edd6b5SBram Moolenaar      endfunc
1279c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
1280c9edd6b5SBram Moolenaar      redrawstatus
1281c9edd6b5SBram Moolenaar      set laststatus statusline=
1282c9edd6b5SBram Moolenaar  END
1283c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
1284c9edd6b5SBram Moolenaarenddef
1285c9edd6b5SBram Moolenaar
1286b209750bSBram Moolenaardef Test_list_vimscript()
1287b209750bSBram Moolenaar  # checks line continuation and comments
1288b209750bSBram Moolenaar  let lines =<< trim END
1289b209750bSBram Moolenaar      vim9script
1290b209750bSBram Moolenaar      let mylist = [
1291b209750bSBram Moolenaar            'one',
1292b209750bSBram Moolenaar            # comment
1293b209750bSBram Moolenaar            'two', # empty line follows
1294b209750bSBram Moolenaar
1295b209750bSBram Moolenaar            'three',
1296b209750bSBram Moolenaar            ]
1297b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
1298b209750bSBram Moolenaar  END
1299b209750bSBram Moolenaar  CheckScriptSuccess(lines)
130066250c93SBram Moolenaar
130166250c93SBram Moolenaar  # check all lines from heredoc are kept
130266250c93SBram Moolenaar  lines =<< trim END
130366250c93SBram Moolenaar      # comment 1
130466250c93SBram Moolenaar      two
130566250c93SBram Moolenaar      # comment 3
130666250c93SBram Moolenaar
130766250c93SBram Moolenaar      five
130866250c93SBram Moolenaar      # comment 6
130966250c93SBram Moolenaar  END
131066250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
1311b209750bSBram Moolenaarenddef
1312b209750bSBram Moolenaar
13132a1381c3SBram Moolenaarif has('channel')
131440ee466cSBram Moolenaar  let someJob = test_null_job()
131540ee466cSBram Moolenaar
131640ee466cSBram Moolenaar  def FuncWithError()
131740ee466cSBram Moolenaar    echomsg g:someJob
131840ee466cSBram Moolenaar  enddef
131940ee466cSBram Moolenaar
132040ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
132140ee466cSBram Moolenaar    try
132240ee466cSBram Moolenaar      call FuncWithError()
132340ee466cSBram Moolenaar    catch
132440ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
132540ee466cSBram Moolenaar    endtry
132640ee466cSBram Moolenaar  endfunc
13272a1381c3SBram Moolenaarendif
132840ee466cSBram Moolenaar
13298a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
13308a7d6542SBram Moolenaar  vim9script
13318a7d6542SBram Moolenaar  let name: string = 'bob'
13328a7d6542SBram Moolenaar  def Concat(arg: string): string
13338a7d6542SBram Moolenaar    return name .. arg
13348a7d6542SBram Moolenaar  enddef
1335227a69deSBram Moolenaar  g:result = Concat('bie')
1336227a69deSBram Moolenaar  g:localname = name
13378a7d6542SBram Moolenaar
13388a7d6542SBram Moolenaar  export const CONST = 1234
13398a7d6542SBram Moolenaar  export let exported = 9876
13406e587dcbSBram Moolenaar  export let exp_name = 'John'
13418a7d6542SBram Moolenaar  export def Exported(): string
13428a7d6542SBram Moolenaar    return 'Exported'
13438a7d6542SBram Moolenaar  enddef
13448a7d6542SBram MoolenaarEND
13458a7d6542SBram Moolenaar
1346b3ca9824SBram Moolenaardef Undo_export_script_lines()
1347b3ca9824SBram Moolenaar  unlet g:result
1348b3ca9824SBram Moolenaar  unlet g:localname
1349b3ca9824SBram Moolenaarenddef
1350b3ca9824SBram Moolenaar
13515269bd2aSBram Moolenaardef Test_vim9_import_export()
13528a7d6542SBram Moolenaar  let import_script_lines =<< trim END
13538a7d6542SBram Moolenaar    vim9script
13548a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
13558a7d6542SBram Moolenaar    g:imported = exported
13566e587dcbSBram Moolenaar    exported += 3
13576e587dcbSBram Moolenaar    g:imported_added = exported
13588a7d6542SBram Moolenaar    g:imported_func = Exported()
13596e587dcbSBram Moolenaar
136040f4f7a4SBram Moolenaar    def GetExported(): string
136140f4f7a4SBram Moolenaar      let local_dict = #{ref: Exported}
136240f4f7a4SBram Moolenaar      return local_dict.ref()
136340f4f7a4SBram Moolenaar    enddef
136440f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
136540f4f7a4SBram Moolenaar
13666e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
13676e587dcbSBram Moolenaar    g:imported_name = exp_name
13686e587dcbSBram Moolenaar    exp_name ..= ' Doe'
13696e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
13705381c7a1SBram Moolenaar    g:imported_later = exported
13718a7d6542SBram Moolenaar  END
13728a7d6542SBram Moolenaar
13738a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
13748a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
13758a7d6542SBram Moolenaar
13768a7d6542SBram Moolenaar  source Ximport.vim
13778a7d6542SBram Moolenaar
13788a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
13798a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
13808a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
13816e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
13825381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
13838a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
138440f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
13856e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
13866e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
13878a7d6542SBram Moolenaar  assert_false(exists('g:name'))
13888a7d6542SBram Moolenaar
1389b3ca9824SBram Moolenaar  Undo_export_script_lines()
13908a7d6542SBram Moolenaar  unlet g:imported
13916e587dcbSBram Moolenaar  unlet g:imported_added
13925381c7a1SBram Moolenaar  unlet g:imported_later
13938a7d6542SBram Moolenaar  unlet g:imported_func
13946e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
13958a7d6542SBram Moolenaar  delete('Ximport.vim')
1396f2d5c240SBram Moolenaar
13971c991144SBram Moolenaar  # similar, with line breaks
13981c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
13991c991144SBram Moolenaar    vim9script
14001c991144SBram Moolenaar    import {
14011c991144SBram Moolenaar        exported,
14021c991144SBram Moolenaar        Exported,
14031c991144SBram Moolenaar        }
14041c991144SBram Moolenaar        from
14051c991144SBram Moolenaar        './Xexport.vim'
14061c991144SBram Moolenaar    g:imported = exported
14071c991144SBram Moolenaar    exported += 5
14081c991144SBram Moolenaar    g:imported_added = exported
14091c991144SBram Moolenaar    g:imported_func = Exported()
14101c991144SBram Moolenaar  END
14111c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
14121c991144SBram Moolenaar  source Ximport_lbr.vim
14131c991144SBram Moolenaar
14141c991144SBram Moolenaar  assert_equal(9876, g:imported)
14151c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
14161c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
14171c991144SBram Moolenaar
14181c991144SBram Moolenaar  # exported script not sourced again
14191c991144SBram Moolenaar  assert_false(exists('g:result'))
14201c991144SBram Moolenaar  unlet g:imported
14211c991144SBram Moolenaar  unlet g:imported_added
14221c991144SBram Moolenaar  unlet g:imported_func
14231c991144SBram Moolenaar  delete('Ximport_lbr.vim')
14241c991144SBram Moolenaar
14251c991144SBram Moolenaar  # import inside :def function
14265381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
14275381c7a1SBram Moolenaar    vim9script
14285381c7a1SBram Moolenaar    def ImportInDef()
14295381c7a1SBram Moolenaar      import exported from './Xexport.vim'
14305381c7a1SBram Moolenaar      g:imported = exported
14315381c7a1SBram Moolenaar      exported += 7
14325381c7a1SBram Moolenaar      g:imported_added = exported
14335381c7a1SBram Moolenaar    enddef
14345381c7a1SBram Moolenaar    ImportInDef()
14355381c7a1SBram Moolenaar  END
14365381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
14375381c7a1SBram Moolenaar  source Ximport2.vim
1438f5be8cdbSBram Moolenaar  # TODO: this should be 9879
14395381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
14405381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
14415381c7a1SBram Moolenaar  unlet g:imported
14425381c7a1SBram Moolenaar  unlet g:imported_added
14435381c7a1SBram Moolenaar  delete('Ximport2.vim')
14445381c7a1SBram Moolenaar
1445f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
1446f2d5c240SBram Moolenaar    vim9script
1447f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1448f2d5c240SBram Moolenaar    def UseExport()
1449f2d5c240SBram Moolenaar      g:imported = Export.exported
1450f2d5c240SBram Moolenaar    enddef
1451f2d5c240SBram Moolenaar    UseExport()
1452f2d5c240SBram Moolenaar  END
1453f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1454f2d5c240SBram Moolenaar  source Ximport.vim
14555381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1456f2d5c240SBram Moolenaar
1457599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
1458599c89c8SBram Moolenaar    vim9script
1459599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1460599c89c8SBram Moolenaar    def Func()
1461599c89c8SBram Moolenaar      let dummy = 1
1462599c89c8SBram Moolenaar      let imported = Export + dummy
1463599c89c8SBram Moolenaar    enddef
1464822ba247SBram Moolenaar    defcompile
1465599c89c8SBram Moolenaar  END
1466599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
146744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
1468599c89c8SBram Moolenaar
1469599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
1470599c89c8SBram Moolenaar    vim9script
1471599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1472599c89c8SBram Moolenaar    def Func()
1473599c89c8SBram Moolenaar      let imported = Export . exported
1474599c89c8SBram Moolenaar    enddef
1475822ba247SBram Moolenaar    defcompile
1476599c89c8SBram Moolenaar  END
1477599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
147844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
1479599c89c8SBram Moolenaar
1480599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
1481599c89c8SBram Moolenaar    vim9script
1482599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1483599c89c8SBram Moolenaar    def Func()
1484599c89c8SBram Moolenaar      let imported = Export.
1485599c89c8SBram Moolenaar    enddef
1486822ba247SBram Moolenaar    defcompile
1487599c89c8SBram Moolenaar  END
1488599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
148944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1490599c89c8SBram Moolenaar
14911c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
14921c991144SBram Moolenaar    vim9script
14931c991144SBram Moolenaar    import *
14941c991144SBram Moolenaar        as Export
14951c991144SBram Moolenaar        from
14961c991144SBram Moolenaar        './Xexport.vim'
14971c991144SBram Moolenaar    def UseExport()
14981c991144SBram Moolenaar      g:imported = Export.exported
14991c991144SBram Moolenaar    enddef
15001c991144SBram Moolenaar    UseExport()
15011c991144SBram Moolenaar  END
15021c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
15031c991144SBram Moolenaar  source Ximport.vim
15041c991144SBram Moolenaar  assert_equal(9883, g:imported)
15051c991144SBram Moolenaar
1506f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1507f2d5c240SBram Moolenaar    vim9script
1508f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1509f2d5c240SBram Moolenaar  END
1510f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
151144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1512f2d5c240SBram Moolenaar
1513f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1514fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1515fa29c8abSBram Moolenaar    vim9script
1516fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1517fa29c8abSBram Moolenaar  END
1518fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
151944d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1520fa29c8abSBram Moolenaar
1521f5be8cdbSBram Moolenaar  # try to import something that is already defined
15225269bd2aSBram Moolenaar  let import_already_defined =<< trim END
15235269bd2aSBram Moolenaar    vim9script
15245269bd2aSBram Moolenaar    let exported = 'something'
15255269bd2aSBram Moolenaar    import exported from './Xexport.vim'
15265269bd2aSBram Moolenaar  END
15275269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
152844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
15295269bd2aSBram Moolenaar
1530f5be8cdbSBram Moolenaar  # try to import something that is already defined
15315269bd2aSBram Moolenaar  import_already_defined =<< trim END
15325269bd2aSBram Moolenaar    vim9script
15335269bd2aSBram Moolenaar    let exported = 'something'
15345269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
15355269bd2aSBram Moolenaar  END
15365269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
153744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
15385269bd2aSBram Moolenaar
1539f5be8cdbSBram Moolenaar  # try to import something that is already defined
15405269bd2aSBram Moolenaar  import_already_defined =<< trim END
15415269bd2aSBram Moolenaar    vim9script
15425269bd2aSBram Moolenaar    let exported = 'something'
15435269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
15445269bd2aSBram Moolenaar  END
15455269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
154644d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
15475269bd2aSBram Moolenaar
1548f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1549fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1550fa29c8abSBram Moolenaar    vim9script
1551fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1552fa29c8abSBram Moolenaar  END
1553fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
155444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1555fa29c8abSBram Moolenaar
1556fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1557fa29c8abSBram Moolenaar    vim9script
1558fa29c8abSBram Moolenaar    import name './Xexport.vim'
1559fa29c8abSBram Moolenaar  END
1560fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
156144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1562fa29c8abSBram Moolenaar
1563fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1564fa29c8abSBram Moolenaar    vim9script
1565fa29c8abSBram Moolenaar    import name from Xexport.vim
1566fa29c8abSBram Moolenaar  END
1567fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
156844d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
1569fa29c8abSBram Moolenaar
1570fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1571fa29c8abSBram Moolenaar    vim9script
1572fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1573fa29c8abSBram Moolenaar  END
1574fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
157544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1576fa29c8abSBram Moolenaar
1577fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1578fa29c8abSBram Moolenaar    vim9script
1579fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1580fa29c8abSBram Moolenaar  END
15815269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
158244d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1583fa29c8abSBram Moolenaar
1584f2d5c240SBram Moolenaar  delete('Ximport.vim')
15855269bd2aSBram Moolenaar  delete('Ximport3.vim')
15868a7d6542SBram Moolenaar  delete('Xexport.vim')
15878a7d6542SBram Moolenaar
1588f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1589750802b5SBram Moolenaar  set cpo&vi
1590750802b5SBram Moolenaar  let cpo_before = &cpo
1591750802b5SBram Moolenaar  let lines =<< trim END
1592750802b5SBram Moolenaar    vim9script
1593750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1594750802b5SBram Moolenaar  END
1595750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1596750802b5SBram Moolenaar  source Xvim9_script
1597750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1598750802b5SBram Moolenaar  set cpo&vim
1599750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1600750802b5SBram Moolenaar  delete('Xvim9_script')
1601750802b5SBram Moolenaarenddef
1602750802b5SBram Moolenaar
1603803af686SBram Moolenaarfunc g:Trigger()
1604803af686SBram Moolenaar  source Ximport.vim
1605803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1606803af686SBram Moolenaarendfunc
1607803af686SBram Moolenaar
1608803af686SBram Moolenaardef Test_import_export_expr_map()
1609803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1610803af686SBram Moolenaar  let export_lines =<< trim END
1611803af686SBram Moolenaar    vim9script
1612803af686SBram Moolenaar    export def That(): string
1613803af686SBram Moolenaar      return 'yes'
1614803af686SBram Moolenaar    enddef
1615803af686SBram Moolenaar  END
1616803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1617803af686SBram Moolenaar
1618803af686SBram Moolenaar  let import_lines =<< trim END
1619803af686SBram Moolenaar    vim9script
1620803af686SBram Moolenaar    import That from './Xexport_that.vim'
1621803af686SBram Moolenaar    assert_equal('yes', That())
1622803af686SBram Moolenaar  END
1623803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1624803af686SBram Moolenaar
1625803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1626803af686SBram Moolenaar  feedkeys('trigger', "xt")
1627803af686SBram Moolenaar
1628730b2483SBram Moolenaar  delete('Xexport_that.vim')
1629803af686SBram Moolenaar  delete('Ximport.vim')
1630803af686SBram Moolenaar  nunmap trigger
1631803af686SBram Moolenaarenddef
1632803af686SBram Moolenaar
16338e1986e3SBram Moolenaardef Test_import_in_filetype()
16348e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
16358e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
16368e1986e3SBram Moolenaar  let export_lines =<< trim END
16378e1986e3SBram Moolenaar    vim9script
16388e1986e3SBram Moolenaar    export let That = 'yes'
16398e1986e3SBram Moolenaar  END
1640730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
16418e1986e3SBram Moolenaar
16428e1986e3SBram Moolenaar  let import_lines =<< trim END
16438e1986e3SBram Moolenaar    vim9script
1644730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
16458e1986e3SBram Moolenaar    assert_equal('yes', That)
16468e1986e3SBram Moolenaar    g:did_load_mytpe = 1
16478e1986e3SBram Moolenaar  END
16488e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
16498e1986e3SBram Moolenaar
16508e1986e3SBram Moolenaar  let save_rtp = &rtp
16518e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
16528e1986e3SBram Moolenaar
16538e1986e3SBram Moolenaar  filetype plugin on
16548e1986e3SBram Moolenaar  copen
16558e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
16568e1986e3SBram Moolenaar
16578e1986e3SBram Moolenaar  quit!
1658730b2483SBram Moolenaar  delete('Xexport_ft.vim')
16598e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
16608e1986e3SBram Moolenaar  &rtp = save_rtp
16618e1986e3SBram Moolenaarenddef
16628e1986e3SBram Moolenaar
1663efa94447SBram Moolenaardef Test_use_import_in_mapping()
1664efa94447SBram Moolenaar  let lines =<< trim END
1665efa94447SBram Moolenaar      vim9script
1666efa94447SBram Moolenaar      export def Funcx()
1667efa94447SBram Moolenaar        g:result = 42
1668efa94447SBram Moolenaar      enddef
1669efa94447SBram Moolenaar  END
1670efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1671efa94447SBram Moolenaar  lines =<< trim END
1672efa94447SBram Moolenaar      vim9script
1673efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1674b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1675efa94447SBram Moolenaar  END
1676efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1677efa94447SBram Moolenaar
1678efa94447SBram Moolenaar  source Xmapscript.vim
1679b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1680efa94447SBram Moolenaar  assert_equal(42, g:result)
1681efa94447SBram Moolenaar
1682efa94447SBram Moolenaar  unlet g:result
1683efa94447SBram Moolenaar  delete('XsomeExport.vim')
1684efa94447SBram Moolenaar  delete('Xmapscript.vim')
1685b3ca9824SBram Moolenaar  nunmap <F3>
1686efa94447SBram Moolenaarenddef
1687efa94447SBram Moolenaar
1688750802b5SBram Moolenaardef Test_vim9script_fails()
16898a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
16908a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1691750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
16929721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
16939b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1694750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1695750802b5SBram Moolenaar
1696451c2e35SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1012:')
1697c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1698c785b9a7SBram Moolenaar
1699e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1700e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
17018a7d6542SBram Moolenaarenddef
17028a7d6542SBram Moolenaar
1703f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1704101f4810SBram Moolenaar  CheckRunVimInTerminal
1705101f4810SBram Moolenaar
17069bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1707c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
17089bb3eb3eSBram Moolenaarendfunc
17099bb3eb3eSBram Moolenaar
1710c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1711101f4810SBram Moolenaar  let export =<< trim END
1712101f4810SBram Moolenaar    vim9script
1713101f4810SBram Moolenaar    export def Foo(): number
1714101f4810SBram Moolenaar        return 0
1715101f4810SBram Moolenaar    enddef
1716101f4810SBram Moolenaar  END
1717730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1718101f4810SBram Moolenaar
1719730b2483SBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{
17209bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
17219bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1722101f4810SBram Moolenaar
1723730b2483SBram Moolenaar  delete('XexportCmd.vim')
17249bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
17259bb3eb3eSBram Moolenaarenddef
1726101f4810SBram Moolenaar
17274c17ad94SBram Moolenaardef Test_vim9script_reload_import()
17288a7d6542SBram Moolenaar  let lines =<< trim END
17298a7d6542SBram Moolenaar    vim9script
17308a7d6542SBram Moolenaar    const var = ''
17318a7d6542SBram Moolenaar    let valone = 1234
17328a7d6542SBram Moolenaar    def MyFunc(arg: string)
17338a7d6542SBram Moolenaar       valone = 5678
17348a7d6542SBram Moolenaar    enddef
17358a7d6542SBram Moolenaar  END
17368a7d6542SBram Moolenaar  let morelines =<< trim END
17378a7d6542SBram Moolenaar    let valtwo = 222
17388a7d6542SBram Moolenaar    export def GetValtwo(): number
17398a7d6542SBram Moolenaar      return valtwo
17408a7d6542SBram Moolenaar    enddef
17418a7d6542SBram Moolenaar  END
174203afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
17438a7d6542SBram Moolenaar  source Xreload.vim
17448a7d6542SBram Moolenaar  source Xreload.vim
17458a7d6542SBram Moolenaar  source Xreload.vim
17468a7d6542SBram Moolenaar
17478a7d6542SBram Moolenaar  let testlines =<< trim END
17488a7d6542SBram Moolenaar    vim9script
17498a7d6542SBram Moolenaar    def TheFunc()
17508a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
17518a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
17528a7d6542SBram Moolenaar    enddef
17538a7d6542SBram Moolenaar    TheFunc()
17548a7d6542SBram Moolenaar  END
17558a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
17568a7d6542SBram Moolenaar  source Ximport.vim
17578a7d6542SBram Moolenaar
1758f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1759f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
17608a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
17618a7d6542SBram Moolenaar  source Ximport.vim
17628a7d6542SBram Moolenaar
1763f5be8cdbSBram Moolenaar  # cannot declare a var twice
17648a7d6542SBram Moolenaar  lines =<< trim END
17658a7d6542SBram Moolenaar    vim9script
17668a7d6542SBram Moolenaar    let valone = 1234
17678a7d6542SBram Moolenaar    let valone = 5678
17688a7d6542SBram Moolenaar  END
17698a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
177044d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
17718a7d6542SBram Moolenaar
17728a7d6542SBram Moolenaar  delete('Xreload.vim')
17738a7d6542SBram Moolenaar  delete('Ximport.vim')
17748a7d6542SBram Moolenaarenddef
17758a7d6542SBram Moolenaar
177695006e3dSBram Moolenaardef s:RetSome(): string
177795006e3dSBram Moolenaar  return 'some'
177895006e3dSBram Moolenaarenddef
177995006e3dSBram Moolenaar
1780fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1781fe465a01SBram Moolenaar" script-local name.
1782fe465a01SBram Moolenaardef Test_vim9script_funcref()
1783fe465a01SBram Moolenaar  let sortlines =<< trim END
1784fe465a01SBram Moolenaar      vim9script
1785fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1786bed36b93SBram Moolenaar        return i2 - i1
1787fe465a01SBram Moolenaar      enddef
1788fe465a01SBram Moolenaar
1789fe465a01SBram Moolenaar      export def FastSort(): list<number>
1790fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1791fe465a01SBram Moolenaar      enddef
1792fe465a01SBram Moolenaar  END
1793fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1794fe465a01SBram Moolenaar
1795fe465a01SBram Moolenaar  let lines =<< trim END
1796fe465a01SBram Moolenaar    vim9script
1797fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1798fe465a01SBram Moolenaar    def Test()
1799fe465a01SBram Moolenaar      g:result = FastSort()
1800fe465a01SBram Moolenaar    enddef
1801fe465a01SBram Moolenaar    Test()
1802fe465a01SBram Moolenaar  END
1803fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1804fe465a01SBram Moolenaar
1805fe465a01SBram Moolenaar  source Xscript.vim
1806fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1807fe465a01SBram Moolenaar
1808fe465a01SBram Moolenaar  unlet g:result
1809fe465a01SBram Moolenaar  delete('Xsort.vim')
1810fe465a01SBram Moolenaar  delete('Xscript.vim')
181195006e3dSBram Moolenaar
181295006e3dSBram Moolenaar  let Funcref = function('s:RetSome')
181395006e3dSBram Moolenaar  assert_equal('some', Funcref())
1814fe465a01SBram Moolenaarenddef
1815fe465a01SBram Moolenaar
1816601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1817601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1818601e76acSBram Moolenaar" function reference.
1819c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1820c620c055SBram Moolenaar  let filterLines =<< trim END
1821c620c055SBram Moolenaar    vim9script
1822c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1823c620c055SBram Moolenaar      return idx % 2 == 1
1824c620c055SBram Moolenaar    enddef
1825c620c055SBram Moolenaar    export def FastFilter(): list<number>
1826c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1827c620c055SBram Moolenaar    enddef
1828601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1829601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1830601e76acSBram Moolenaar    enddef
1831c620c055SBram Moolenaar  END
1832c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1833c620c055SBram Moolenaar
1834c620c055SBram Moolenaar  let lines =<< trim END
1835c620c055SBram Moolenaar    vim9script
1836601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1837c620c055SBram Moolenaar    def Test()
1838c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1839c620c055SBram Moolenaar    enddef
1840c620c055SBram Moolenaar    Test()
1841601e76acSBram Moolenaar    def TestDirect()
1842601e76acSBram Moolenaar      let x: list<number> = FastFilterDirect()
1843601e76acSBram Moolenaar    enddef
1844601e76acSBram Moolenaar    TestDirect()
1845c620c055SBram Moolenaar  END
1846601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1847c620c055SBram Moolenaar  delete('Xfilter.vim')
1848c620c055SBram Moolenaarenddef
1849c620c055SBram Moolenaar
18504c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
18514c17ad94SBram Moolenaar  let first_lines =<< trim END
18524c17ad94SBram Moolenaar    vim9script
18534c17ad94SBram Moolenaar    def FuncYes(): string
18544c17ad94SBram Moolenaar      return 'yes'
18554c17ad94SBram Moolenaar    enddef
18564c17ad94SBram Moolenaar  END
185703afdcf1SBram Moolenaar  let withno_lines =<< trim END
18584c17ad94SBram Moolenaar    def FuncNo(): string
18594c17ad94SBram Moolenaar      return 'no'
18604c17ad94SBram Moolenaar    enddef
18614c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
18624c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
18634c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
186403afdcf1SBram Moolenaar    enddef
186503afdcf1SBram Moolenaar  END
186603afdcf1SBram Moolenaar  let nono_lines =<< trim END
186703afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
186803afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
186944d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
18704c17ad94SBram Moolenaar    enddef
18714c17ad94SBram Moolenaar  END
18724c17ad94SBram Moolenaar
18734c17ad94SBram Moolenaar  # FuncNo() is defined
187403afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
18754c17ad94SBram Moolenaar  source Xreloaded.vim
18764c17ad94SBram Moolenaar  g:DoCheck(true)
18774c17ad94SBram Moolenaar
18784c17ad94SBram Moolenaar  # FuncNo() is not redefined
187903afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
18804c17ad94SBram Moolenaar  source Xreloaded.vim
188103afdcf1SBram Moolenaar  g:DoCheck()
18824c17ad94SBram Moolenaar
18834c17ad94SBram Moolenaar  # FuncNo() is back
188403afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
18854c17ad94SBram Moolenaar  source Xreloaded.vim
188603afdcf1SBram Moolenaar  g:DoCheck()
18874c17ad94SBram Moolenaar
18884c17ad94SBram Moolenaar  delete('Xreloaded.vim')
18894c17ad94SBram Moolenaarenddef
18904c17ad94SBram Moolenaar
189189483d40SBram Moolenaardef Test_vim9script_reload_delvar()
189289483d40SBram Moolenaar  # write the script with a script-local variable
189389483d40SBram Moolenaar  let lines =<< trim END
189489483d40SBram Moolenaar    vim9script
189589483d40SBram Moolenaar    let var = 'string'
189689483d40SBram Moolenaar  END
189789483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
189889483d40SBram Moolenaar  source XreloadVar.vim
189989483d40SBram Moolenaar
190089483d40SBram Moolenaar  # now write the script using the same variable locally - works
190189483d40SBram Moolenaar  lines =<< trim END
190289483d40SBram Moolenaar    vim9script
190389483d40SBram Moolenaar    def Func()
190489483d40SBram Moolenaar      let var = 'string'
190589483d40SBram Moolenaar    enddef
190689483d40SBram Moolenaar  END
190789483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
190889483d40SBram Moolenaar  source XreloadVar.vim
190989483d40SBram Moolenaar
191089483d40SBram Moolenaar  delete('XreloadVar.vim')
191189483d40SBram Moolenaarenddef
191289483d40SBram Moolenaar
19138a7d6542SBram Moolenaardef Test_import_absolute()
19148a7d6542SBram Moolenaar  let import_lines = [
1915e6085c53SBram Moolenaar        'vim9script',
1916e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1917e6085c53SBram Moolenaar        'def UseExported()',
1918e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1919e6085c53SBram Moolenaar        '  exported = 8888',
1920e6085c53SBram Moolenaar        '  g:imported_after = exported',
1921e6085c53SBram Moolenaar        'enddef',
1922e6085c53SBram Moolenaar        'UseExported()',
1923e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1924e6085c53SBram Moolenaar        ]
19258a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
19268a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
19278a7d6542SBram Moolenaar
19288a7d6542SBram Moolenaar  source Ximport_abs.vim
19298a7d6542SBram Moolenaar
19308a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
19314e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1932675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1933675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1934675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1935675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1936675f716eSBram Moolenaar          'exported = 8888.*' ..
1937675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1938675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1939675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1940675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1941e6085c53SBram Moolenaar        g:import_disassembled)
1942b3ca9824SBram Moolenaar
1943b3ca9824SBram Moolenaar  Undo_export_script_lines()
19448a7d6542SBram Moolenaar  unlet g:imported_abs
19454e12a5dfSBram Moolenaar  unlet g:import_disassembled
19468a7d6542SBram Moolenaar
19478a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
19488a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
19498a7d6542SBram Moolenaarenddef
19508a7d6542SBram Moolenaar
19518a7d6542SBram Moolenaardef Test_import_rtp()
19528a7d6542SBram Moolenaar  let import_lines = [
1953e6085c53SBram Moolenaar        'vim9script',
1954e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1955e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1956e6085c53SBram Moolenaar        ]
19578a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
19588a7d6542SBram Moolenaar  mkdir('import')
19598a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
19608a7d6542SBram Moolenaar
19618a7d6542SBram Moolenaar  let save_rtp = &rtp
19628a7d6542SBram Moolenaar  &rtp = getcwd()
19638a7d6542SBram Moolenaar  source Ximport_rtp.vim
19648a7d6542SBram Moolenaar  &rtp = save_rtp
19658a7d6542SBram Moolenaar
19668a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
19678a7d6542SBram Moolenaar
1968b3ca9824SBram Moolenaar  Undo_export_script_lines()
1969b3ca9824SBram Moolenaar  unlet g:imported_rtp
19708a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
197189483d40SBram Moolenaar  delete('import', 'rf')
19728a7d6542SBram Moolenaarenddef
19738a7d6542SBram Moolenaar
197425e0f586SBram Moolenaardef Test_import_compile_error()
197525e0f586SBram Moolenaar  let export_lines = [
197625e0f586SBram Moolenaar        'vim9script',
197725e0f586SBram Moolenaar        'export def ExpFunc(): string',
197825e0f586SBram Moolenaar        '  return notDefined',
197925e0f586SBram Moolenaar        'enddef',
198025e0f586SBram Moolenaar        ]
198125e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
198225e0f586SBram Moolenaar
198325e0f586SBram Moolenaar  let import_lines = [
198425e0f586SBram Moolenaar        'vim9script',
198525e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
198625e0f586SBram Moolenaar        'def ImpFunc()',
198725e0f586SBram Moolenaar        '  echo ExpFunc()',
198825e0f586SBram Moolenaar        'enddef',
198925e0f586SBram Moolenaar        'defcompile',
199025e0f586SBram Moolenaar        ]
199125e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
199225e0f586SBram Moolenaar
199325e0f586SBram Moolenaar  try
199425e0f586SBram Moolenaar    source Ximport.vim
199525e0f586SBram Moolenaar  catch /E1001/
1996f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
19977707228aSBram Moolenaar    assert_match('E1001: Variable not found: notDefined', v:exception)
199825e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
199925e0f586SBram Moolenaar  endtry
200025e0f586SBram Moolenaar
200125e0f586SBram Moolenaar  delete('Xexported.vim')
200225e0f586SBram Moolenaar  delete('Ximport.vim')
200325e0f586SBram Moolenaarenddef
200425e0f586SBram Moolenaar
2005c4ce36d4SBram Moolenaardef Test_func_redefine_error()
2006c4ce36d4SBram Moolenaar  let lines = [
2007c4ce36d4SBram Moolenaar        'vim9script',
2008c4ce36d4SBram Moolenaar        'def Func()',
2009c4ce36d4SBram Moolenaar        '  eval [][0]',
2010c4ce36d4SBram Moolenaar        'enddef',
2011c4ce36d4SBram Moolenaar        'Func()',
2012c4ce36d4SBram Moolenaar        ]
2013c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
2014c4ce36d4SBram Moolenaar
2015c4ce36d4SBram Moolenaar  for count in range(3)
2016c4ce36d4SBram Moolenaar    try
2017c4ce36d4SBram Moolenaar      source Xtestscript.vim
2018c4ce36d4SBram Moolenaar    catch /E684/
2019c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
2020c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
2021c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
2022c4ce36d4SBram Moolenaar    endtry
2023c4ce36d4SBram Moolenaar  endfor
2024c4ce36d4SBram Moolenaar
2025c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
2026c4ce36d4SBram Moolenaarenddef
2027c4ce36d4SBram Moolenaar
2028eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
2029eef2102eSBram Moolenaar  let export_lines =<< trim END
2030eef2102eSBram Moolenaar      vim9script
2031eef2102eSBram Moolenaar      export def Func()
2032eef2102eSBram Moolenaar        echo 'imported'
2033eef2102eSBram Moolenaar      enddef
2034eef2102eSBram Moolenaar  END
2035eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
2036eef2102eSBram Moolenaar
2037eef2102eSBram Moolenaar  let lines =<< trim END
2038eef2102eSBram Moolenaar    vim9script
2039eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
2040eef2102eSBram Moolenaar    def Func()
2041eef2102eSBram Moolenaar      echo 'local to function'
2042eef2102eSBram Moolenaar    enddef
2043eef2102eSBram Moolenaar  END
2044eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2045eef2102eSBram Moolenaar
2046eef2102eSBram Moolenaar  lines =<< trim END
2047eef2102eSBram Moolenaar    vim9script
2048eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
2049eef2102eSBram Moolenaar    def Outer()
2050eef2102eSBram Moolenaar      def Func()
2051eef2102eSBram Moolenaar        echo 'local to function'
2052eef2102eSBram Moolenaar      enddef
2053eef2102eSBram Moolenaar    enddef
2054eef2102eSBram Moolenaar    defcompile
2055eef2102eSBram Moolenaar  END
2056eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2057eef2102eSBram Moolenaar
2058eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
2059eef2102eSBram Moolenaarenddef
2060eef2102eSBram Moolenaar
2061b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
2062b9a2cac3SBram Moolenaar  let lines =<< trim END
2063b9a2cac3SBram Moolenaar    vim9script
2064b9a2cac3SBram Moolenaar    def Func()
2065b9a2cac3SBram Moolenaar      echo 'one'
2066b9a2cac3SBram Moolenaar    enddef
2067b9a2cac3SBram Moolenaar    def Func()
2068b9a2cac3SBram Moolenaar      echo 'two'
2069b9a2cac3SBram Moolenaar    enddef
2070b9a2cac3SBram Moolenaar  END
2071b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2072fa211f3cSBram Moolenaar
2073fa211f3cSBram Moolenaar  lines =<< trim END
2074fa211f3cSBram Moolenaar    vim9script
2075fa211f3cSBram Moolenaar    def Foo(): string
2076fa211f3cSBram Moolenaar      return 'foo'
2077fa211f3cSBram Moolenaar      enddef
2078fa211f3cSBram Moolenaar    def Func()
2079fa211f3cSBram Moolenaar      let  Foo = {-> 'lambda'}
2080fa211f3cSBram Moolenaar    enddef
2081fa211f3cSBram Moolenaar    defcompile
2082fa211f3cSBram Moolenaar  END
2083fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2084b9a2cac3SBram Moolenaarenddef
2085b9a2cac3SBram Moolenaar
20868a7d6542SBram Moolenaardef Test_fixed_size_list()
2087f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
20888a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
20898a7d6542SBram Moolenaar  l->remove(0)
20908a7d6542SBram Moolenaar  l->add(5)
20918a7d6542SBram Moolenaar  l->insert(99, 1)
20920f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
20938a7d6542SBram Moolenaarenddef
20948a7d6542SBram Moolenaar
2095ae616494SBram Moolenaardef Test_no_insert_xit()
2096d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
2097d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
2098d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
2099d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
2100d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
2101ae616494SBram Moolenaar
2102ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
2103ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
2104ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
2105ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
2106f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
2107f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
2108f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
2109f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
2110f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
2111ae616494SBram Moolenaarenddef
2112ae616494SBram Moolenaar
2113158906cfSBram Moolenaardef IfElse(what: number): string
2114158906cfSBram Moolenaar  let res = ''
2115158906cfSBram Moolenaar  if what == 1
2116158906cfSBram Moolenaar    res = "one"
2117158906cfSBram Moolenaar  elseif what == 2
2118158906cfSBram Moolenaar    res = "two"
2119a259d8d3SBram Moolenaar  else
2120158906cfSBram Moolenaar    res = "three"
2121a259d8d3SBram Moolenaar  endif
2122158906cfSBram Moolenaar  return res
2123a259d8d3SBram Moolenaarenddef
2124a259d8d3SBram Moolenaar
2125158906cfSBram Moolenaardef Test_if_elseif_else()
2126158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
2127158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
2128158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
21290f18b6d1SBram Moolenaarenddef
21300f18b6d1SBram Moolenaar
2131e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
2132d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
2133d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
2134d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
2135d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
2136d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
2137e8c4abbbSBram Moolenaarenddef
2138e8c4abbbSBram Moolenaar
21396d69bf60SBram Moolenaarlet g:bool_true = v:true
21406d69bf60SBram Moolenaarlet g:bool_false = v:false
21416d69bf60SBram Moolenaar
21426d69bf60SBram Moolenaardef Test_if_const_expr()
21436d69bf60SBram Moolenaar  let res = false
21446d69bf60SBram Moolenaar  if true ? true : false
21456d69bf60SBram Moolenaar    res = true
21466d69bf60SBram Moolenaar  endif
21476d69bf60SBram Moolenaar  assert_equal(true, res)
21486d69bf60SBram Moolenaar
2149585fea7bSBram Moolenaar  g:glob = 2
2150585fea7bSBram Moolenaar  if false
21516797966dSBram Moolenaar    execute('g:glob = 3')
2152585fea7bSBram Moolenaar  endif
2153585fea7bSBram Moolenaar  assert_equal(2, g:glob)
2154585fea7bSBram Moolenaar  if true
21556797966dSBram Moolenaar    execute('g:glob = 3')
2156585fea7bSBram Moolenaar  endif
2157585fea7bSBram Moolenaar  assert_equal(3, g:glob)
2158585fea7bSBram Moolenaar
21596d69bf60SBram Moolenaar  res = false
21606d69bf60SBram Moolenaar  if g:bool_true ? true : false
21616d69bf60SBram Moolenaar    res = true
21626d69bf60SBram Moolenaar  endif
21636d69bf60SBram Moolenaar  assert_equal(true, res)
21646d69bf60SBram Moolenaar
21656d69bf60SBram Moolenaar  res = false
21666d69bf60SBram Moolenaar  if true ? g:bool_true : false
21676d69bf60SBram Moolenaar    res = true
21686d69bf60SBram Moolenaar  endif
21696d69bf60SBram Moolenaar  assert_equal(true, res)
21706d69bf60SBram Moolenaar
21716d69bf60SBram Moolenaar  res = false
21726d69bf60SBram Moolenaar  if true ? true : g:bool_false
21736d69bf60SBram Moolenaar    res = true
21746d69bf60SBram Moolenaar  endif
21756d69bf60SBram Moolenaar  assert_equal(true, res)
21766d69bf60SBram Moolenaar
21776d69bf60SBram Moolenaar  res = false
21786d69bf60SBram Moolenaar  if true ? false : true
21796d69bf60SBram Moolenaar    res = true
21806d69bf60SBram Moolenaar  endif
21816d69bf60SBram Moolenaar  assert_equal(false, res)
21826d69bf60SBram Moolenaar
21836d69bf60SBram Moolenaar  res = false
21846d69bf60SBram Moolenaar  if false ? false : true
21856d69bf60SBram Moolenaar    res = true
21866d69bf60SBram Moolenaar  endif
21876d69bf60SBram Moolenaar  assert_equal(true, res)
21886d69bf60SBram Moolenaar
21896d69bf60SBram Moolenaar  res = false
21906d69bf60SBram Moolenaar  if false ? true : false
21916d69bf60SBram Moolenaar    res = true
21926d69bf60SBram Moolenaar  endif
21936d69bf60SBram Moolenaar  assert_equal(false, res)
21946d69bf60SBram Moolenaar
21956d69bf60SBram Moolenaar  res = false
2196e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2197e8c4abbbSBram Moolenaar    res = true
2198e8c4abbbSBram Moolenaar  endif
2199e8c4abbbSBram Moolenaar  assert_equal(false, res)
2200e8c4abbbSBram Moolenaar
2201e8c4abbbSBram Moolenaar  res = false
22026d69bf60SBram Moolenaar  if true && true
22036d69bf60SBram Moolenaar    res = true
22046d69bf60SBram Moolenaar  endif
22056d69bf60SBram Moolenaar  assert_equal(true, res)
22066d69bf60SBram Moolenaar
22076d69bf60SBram Moolenaar  res = false
22086d69bf60SBram Moolenaar  if true && false
22096d69bf60SBram Moolenaar    res = true
22106d69bf60SBram Moolenaar  endif
22116d69bf60SBram Moolenaar  assert_equal(false, res)
22126d69bf60SBram Moolenaar
22136d69bf60SBram Moolenaar  res = false
22146d69bf60SBram Moolenaar  if g:bool_true && false
22156d69bf60SBram Moolenaar    res = true
22166d69bf60SBram Moolenaar  endif
22176d69bf60SBram Moolenaar  assert_equal(false, res)
22186d69bf60SBram Moolenaar
22196d69bf60SBram Moolenaar  res = false
22206d69bf60SBram Moolenaar  if true && g:bool_false
22216d69bf60SBram Moolenaar    res = true
22226d69bf60SBram Moolenaar  endif
22236d69bf60SBram Moolenaar  assert_equal(false, res)
22246d69bf60SBram Moolenaar
22256d69bf60SBram Moolenaar  res = false
22266d69bf60SBram Moolenaar  if false && false
22276d69bf60SBram Moolenaar    res = true
22286d69bf60SBram Moolenaar  endif
22296d69bf60SBram Moolenaar  assert_equal(false, res)
22306d69bf60SBram Moolenaar
22316d69bf60SBram Moolenaar  res = false
22326d69bf60SBram Moolenaar  if true || false
22336d69bf60SBram Moolenaar    res = true
22346d69bf60SBram Moolenaar  endif
22356d69bf60SBram Moolenaar  assert_equal(true, res)
22366d69bf60SBram Moolenaar
22376d69bf60SBram Moolenaar  res = false
22386d69bf60SBram Moolenaar  if g:bool_true || false
22396d69bf60SBram Moolenaar    res = true
22406d69bf60SBram Moolenaar  endif
22416d69bf60SBram Moolenaar  assert_equal(true, res)
22426d69bf60SBram Moolenaar
22436d69bf60SBram Moolenaar  res = false
22446d69bf60SBram Moolenaar  if true || g:bool_false
22456d69bf60SBram Moolenaar    res = true
22466d69bf60SBram Moolenaar  endif
22476d69bf60SBram Moolenaar  assert_equal(true, res)
22486d69bf60SBram Moolenaar
22496d69bf60SBram Moolenaar  res = false
22506d69bf60SBram Moolenaar  if false || false
22516d69bf60SBram Moolenaar    res = true
22526d69bf60SBram Moolenaar  endif
22536d69bf60SBram Moolenaar  assert_equal(false, res)
22543988f64fSBram Moolenaar
22553988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
22563988f64fSBram Moolenaar  if false | eval 0 | endif
22573988f64fSBram Moolenaar  if false | eval burp + 234 | endif
22583988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
22593988f64fSBram Moolenaar  if false
22603988f64fSBram Moolenaar    burp
22613988f64fSBram Moolenaar  endif
226280c34ca3SBram Moolenaarenddef
22636d69bf60SBram Moolenaar
226480c34ca3SBram Moolenaardef Test_if_const_expr_fails()
2265d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2266d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2267d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
2268d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
22696d69bf60SBram Moolenaarenddef
22706d69bf60SBram Moolenaar
227172abcf42SBram Moolenaardef RunNested(i: number): number
227272abcf42SBram Moolenaar  let x: number = 0
227372abcf42SBram Moolenaar  if i % 2
227472abcf42SBram Moolenaar    if 1
2275f5be8cdbSBram Moolenaar      # comment
227672abcf42SBram Moolenaar    else
2277f5be8cdbSBram Moolenaar      # comment
227872abcf42SBram Moolenaar    endif
227972abcf42SBram Moolenaar    x += 1
228072abcf42SBram Moolenaar  else
228172abcf42SBram Moolenaar    x += 1000
228272abcf42SBram Moolenaar  endif
228372abcf42SBram Moolenaar  return x
228472abcf42SBram Moolenaarenddef
228572abcf42SBram Moolenaar
228672abcf42SBram Moolenaardef Test_nested_if()
228772abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
228872abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
228972abcf42SBram Moolenaarenddef
229072abcf42SBram Moolenaar
2291ad39c094SBram Moolenaardef Test_execute_cmd()
2292ad39c094SBram Moolenaar  new
2293ad39c094SBram Moolenaar  setline(1, 'default')
2294d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
2295ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2296a72cfb80SBram Moolenaar
2297d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
2298a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2299a72cfb80SBram Moolenaar
2300d2c61705SBram Moolenaar  let cmd1 = 'setline(1,'
2301ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
2302a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2303ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2304a72cfb80SBram Moolenaar
2305d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2306ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2307a72cfb80SBram Moolenaar
2308ad39c094SBram Moolenaar  let cmd_first = 'call '
2309ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
2310ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2311ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2312ad39c094SBram Moolenaar  bwipe!
2313585fea7bSBram Moolenaar
23142d6b20d6SBram Moolenaar  let n = true
23152d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
23162d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
23172d6b20d6SBram Moolenaar
2318e5abf7afSBram Moolenaar  echomsg [1, 2, 3] #{a: 1, b: 2}
2319e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2320e5abf7afSBram Moolenaar
2321d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2322d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2323d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2324ad39c094SBram Moolenaarenddef
2325ad39c094SBram Moolenaar
232647e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2327f5be8cdbSBram Moolenaar  # only checks line continuation
232847e880d6SBram Moolenaar  let lines =<< trim END
232947e880d6SBram Moolenaar      vim9script
233047e880d6SBram Moolenaar      execute 'g:someVar'
233147e880d6SBram Moolenaar                .. ' = ' ..
233247e880d6SBram Moolenaar                   '28'
233347e880d6SBram Moolenaar      assert_equal(28, g:someVar)
233447e880d6SBram Moolenaar      unlet g:someVar
233547e880d6SBram Moolenaar  END
233647e880d6SBram Moolenaar  CheckScriptSuccess(lines)
233747e880d6SBram Moolenaarenddef
233847e880d6SBram Moolenaar
2339ad39c094SBram Moolenaardef Test_echo_cmd()
2340a72cfb80SBram Moolenaar  echo 'some' # comment
2341585fea7bSBram Moolenaar  echon 'thing'
2342ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2343ad39c094SBram Moolenaar
2344a72cfb80SBram Moolenaar  echo "some" # comment
2345a72cfb80SBram Moolenaar  echon "thing"
2346a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2347a72cfb80SBram Moolenaar
2348ad39c094SBram Moolenaar  let str1 = 'some'
2349ad39c094SBram Moolenaar  let str2 = 'more'
2350ad39c094SBram Moolenaar  echo str1 str2
2351ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2352a72cfb80SBram Moolenaar
2353d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2354ad39c094SBram Moolenaarenddef
2355ad39c094SBram Moolenaar
2356f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2357f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2358f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2359f93c7feaSBram Moolenaar  echo 'clear'
2360df069eecSBram Moolenaar  :1messages
2361f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2362f93c7feaSBram Moolenaar
2363d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2364f93c7feaSBram Moolenaarenddef
2365f93c7feaSBram Moolenaar
236647e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2367f5be8cdbSBram Moolenaar  # only checks line continuation
236847e880d6SBram Moolenaar  let lines =<< trim END
236947e880d6SBram Moolenaar      vim9script
237047e880d6SBram Moolenaar      echomsg 'here'
237147e880d6SBram Moolenaar                .. ' is ' ..
237247e880d6SBram Moolenaar                   'a message'
237347e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
237447e880d6SBram Moolenaar  END
237547e880d6SBram Moolenaar  CheckScriptSuccess(lines)
237647e880d6SBram Moolenaarenddef
237747e880d6SBram Moolenaar
2378f93c7feaSBram Moolenaardef Test_echoerr_cmd()
237940ee466cSBram Moolenaar  try
238040ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
238140ee466cSBram Moolenaar  catch
238240ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
238340ee466cSBram Moolenaar  endtry
2384f93c7feaSBram Moolenaarenddef
2385f93c7feaSBram Moolenaar
238647e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2387f5be8cdbSBram Moolenaar  # only checks line continuation
238847e880d6SBram Moolenaar  let lines =<< trim END
238947e880d6SBram Moolenaar      vim9script
239047e880d6SBram Moolenaar      try
239147e880d6SBram Moolenaar        echoerr 'this'
239247e880d6SBram Moolenaar                .. ' is ' ..
239347e880d6SBram Moolenaar                   'wrong'
239447e880d6SBram Moolenaar      catch
239547e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
239647e880d6SBram Moolenaar      endtry
239747e880d6SBram Moolenaar  END
239847e880d6SBram Moolenaar  CheckScriptSuccess(lines)
239947e880d6SBram Moolenaarenddef
240047e880d6SBram Moolenaar
240141fe0617SBram Moolenaardef Test_for_outside_of_function()
240241fe0617SBram Moolenaar  let lines =<< trim END
240341fe0617SBram Moolenaar    vim9script
240441fe0617SBram Moolenaar    new
240541fe0617SBram Moolenaar    for var in range(0, 3)
240641fe0617SBram Moolenaar      append(line('$'), var)
240741fe0617SBram Moolenaar    endfor
240841fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
240941fe0617SBram Moolenaar    bwipe!
241041fe0617SBram Moolenaar  END
241141fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
241241fe0617SBram Moolenaar  source Xvim9for.vim
241341fe0617SBram Moolenaar  delete('Xvim9for.vim')
241441fe0617SBram Moolenaarenddef
24158a7d6542SBram Moolenaar
2416e8c4abbbSBram Moolenaardef Test_for_loop()
2417e8c4abbbSBram Moolenaar  let result = ''
2418e8c4abbbSBram Moolenaar  for cnt in range(7)
2419e8c4abbbSBram Moolenaar    if cnt == 4
2420e8c4abbbSBram Moolenaar      break
2421e8c4abbbSBram Moolenaar    endif
2422e8c4abbbSBram Moolenaar    if cnt == 2
2423e8c4abbbSBram Moolenaar      continue
2424e8c4abbbSBram Moolenaar    endif
2425e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2426e8c4abbbSBram Moolenaar  endfor
2427e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
24280ad3e894SBram Moolenaar
24290ad3e894SBram Moolenaar  let concat = ''
24300ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
24310ad3e894SBram Moolenaar    concat ..= str
24320ad3e894SBram Moolenaar  endfor
24330ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
2434e8c4abbbSBram Moolenaarenddef
2435e8c4abbbSBram Moolenaar
2436e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2437675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2438675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2439451c2e35SBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1017:')
2440822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
2441451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
2442675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2443675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2444675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2445e8c4abbbSBram Moolenaarenddef
2446e8c4abbbSBram Moolenaar
2447d0df1aacSBram Moolenaardef Test_while_loop()
2448d0df1aacSBram Moolenaar  let result = ''
2449d0df1aacSBram Moolenaar  let cnt = 0
2450d0df1aacSBram Moolenaar  while cnt < 555
2451d0df1aacSBram Moolenaar    if cnt == 3
2452d0df1aacSBram Moolenaar      break
2453d0df1aacSBram Moolenaar    endif
2454d0df1aacSBram Moolenaar    cnt += 1
2455d0df1aacSBram Moolenaar    if cnt == 2
2456d0df1aacSBram Moolenaar      continue
2457d0df1aacSBram Moolenaar    endif
2458d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2459d0df1aacSBram Moolenaar  endwhile
2460d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2461d0df1aacSBram Moolenaarenddef
2462d0df1aacSBram Moolenaar
2463e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2464675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2465675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2466675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2467675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2468675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2469675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2470675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
2471bd5da371SBram Moolenaarenddef
2472bd5da371SBram Moolenaar
24739645e2d9SBram Moolenaardef Test_interrupt_loop()
247497acfc78SBram Moolenaar  let caught = false
24759645e2d9SBram Moolenaar  let x = 0
247697acfc78SBram Moolenaar  try
24779645e2d9SBram Moolenaar    while 1
24789645e2d9SBram Moolenaar      x += 1
24799645e2d9SBram Moolenaar      if x == 100
24809645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
24819645e2d9SBram Moolenaar      endif
24829645e2d9SBram Moolenaar    endwhile
248397acfc78SBram Moolenaar  catch
248497acfc78SBram Moolenaar    caught = true
248597acfc78SBram Moolenaar    assert_equal(100, x)
248697acfc78SBram Moolenaar  endtry
248797acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
248825859dd7SBram Moolenaar  # consume the CTRL-C
248925859dd7SBram Moolenaar  getchar(0)
24909645e2d9SBram Moolenaarenddef
249120431c9dSBram Moolenaar
24924fdae999SBram Moolenaardef Test_automatic_line_continuation()
24934fdae999SBram Moolenaar  let mylist = [
24944fdae999SBram Moolenaar      'one',
24954fdae999SBram Moolenaar      'two',
24964fdae999SBram Moolenaar      'three',
2497f5be8cdbSBram Moolenaar      ] # comment
24984fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
24994fdae999SBram Moolenaar
25004fdae999SBram Moolenaar  let mydict = {
25014fdae999SBram Moolenaar      'one': 1,
25024fdae999SBram Moolenaar      'two': 2,
25034fdae999SBram Moolenaar      'three':
25044fdae999SBram Moolenaar          3,
2505f5be8cdbSBram Moolenaar      } # comment
25064fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
25074fdae999SBram Moolenaar  mydict = #{
25082c330432SBram Moolenaar      one: 1,  # comment
25092c330432SBram Moolenaar      two:     # comment
25102c330432SBram Moolenaar           2,  # comment
25112c330432SBram Moolenaar      three: 3 # comment
25122c330432SBram Moolenaar      }
25132c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
25142c330432SBram Moolenaar  mydict = #{
25152c330432SBram Moolenaar      one: 1,
25164fdae999SBram Moolenaar      two:
25174fdae999SBram Moolenaar           2,
25182c330432SBram Moolenaar      three: 3
25194fdae999SBram Moolenaar      }
25204fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
2521e6085c53SBram Moolenaar
2522e6085c53SBram Moolenaar  assert_equal(
2523e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2524e6085c53SBram Moolenaar        split('one two three')
2525e6085c53SBram Moolenaar        )
25264fdae999SBram Moolenaarenddef
25274fdae999SBram Moolenaar
25287a092245SBram Moolenaardef Test_vim9_comment()
25297a092245SBram Moolenaar  CheckScriptSuccess([
25307a092245SBram Moolenaar      'vim9script',
25317a092245SBram Moolenaar      '# something',
25327a092245SBram Moolenaar      ])
25337a092245SBram Moolenaar  CheckScriptFailure([
25347a092245SBram Moolenaar      'vim9script',
25357a092245SBram Moolenaar      ':# something',
25367a092245SBram Moolenaar      ], 'E488:')
25377a092245SBram Moolenaar  CheckScriptFailure([
25387a092245SBram Moolenaar      '# something',
25397a092245SBram Moolenaar      ], 'E488:')
25407a092245SBram Moolenaar  CheckScriptFailure([
25417a092245SBram Moolenaar      ':# something',
25427a092245SBram Moolenaar      ], 'E488:')
25437a092245SBram Moolenaar
25444a8d9f2eSBram Moolenaar  { # block start
25454a8d9f2eSBram Moolenaar  } # block end
25464a8d9f2eSBram Moolenaar  CheckDefFailure([
25474a8d9f2eSBram Moolenaar      '{# comment',
25484a8d9f2eSBram Moolenaar      ], 'E488:')
25494a8d9f2eSBram Moolenaar  CheckDefFailure([
25504a8d9f2eSBram Moolenaar      '{',
25514a8d9f2eSBram Moolenaar      '}# comment',
25524a8d9f2eSBram Moolenaar      ], 'E488:')
25534a8d9f2eSBram Moolenaar
25544a8d9f2eSBram Moolenaar  echo "yes" # comment
25554a8d9f2eSBram Moolenaar  CheckDefFailure([
25564a8d9f2eSBram Moolenaar      'echo "yes"# comment',
25574a8d9f2eSBram Moolenaar      ], 'E488:')
25587a092245SBram Moolenaar  CheckScriptSuccess([
25597a092245SBram Moolenaar      'vim9script',
25607a092245SBram Moolenaar      'echo "yes" # something',
25617a092245SBram Moolenaar      ])
25627a092245SBram Moolenaar  CheckScriptFailure([
25637a092245SBram Moolenaar      'vim9script',
25647a092245SBram Moolenaar      'echo "yes"# something',
25657a092245SBram Moolenaar      ], 'E121:')
25667a092245SBram Moolenaar  CheckScriptFailure([
25677a092245SBram Moolenaar      'vim9script',
25687a092245SBram Moolenaar      'echo# something',
25697a092245SBram Moolenaar      ], 'E121:')
25707a092245SBram Moolenaar  CheckScriptFailure([
25717a092245SBram Moolenaar      'echo "yes" # something',
25727a092245SBram Moolenaar      ], 'E121:')
25737a092245SBram Moolenaar
25744a8d9f2eSBram Moolenaar  exe "echo" # comment
25754a8d9f2eSBram Moolenaar  CheckDefFailure([
25764a8d9f2eSBram Moolenaar      'exe "echo"# comment',
25774a8d9f2eSBram Moolenaar      ], 'E488:')
25784a8d9f2eSBram Moolenaar  CheckScriptSuccess([
25794a8d9f2eSBram Moolenaar      'vim9script',
25804a8d9f2eSBram Moolenaar      'exe "echo" # something',
25814a8d9f2eSBram Moolenaar      ])
25824a8d9f2eSBram Moolenaar  CheckScriptFailure([
25834a8d9f2eSBram Moolenaar      'vim9script',
25844a8d9f2eSBram Moolenaar      'exe "echo"# something',
25854a8d9f2eSBram Moolenaar      ], 'E121:')
25864a8d9f2eSBram Moolenaar  CheckDefFailure([
25874a8d9f2eSBram Moolenaar      'exe # comment',
25884a8d9f2eSBram Moolenaar      ], 'E1015:')
25894a8d9f2eSBram Moolenaar  CheckScriptFailure([
25904a8d9f2eSBram Moolenaar      'vim9script',
25914a8d9f2eSBram Moolenaar      'exe# something',
25924a8d9f2eSBram Moolenaar      ], 'E121:')
25934a8d9f2eSBram Moolenaar  CheckScriptFailure([
25944a8d9f2eSBram Moolenaar      'exe "echo" # something',
25954a8d9f2eSBram Moolenaar      ], 'E121:')
25964a8d9f2eSBram Moolenaar
25977a092245SBram Moolenaar  CheckDefFailure([
25987a092245SBram Moolenaar      'try# comment',
25997a092245SBram Moolenaar      '  echo "yes"',
26007a092245SBram Moolenaar      'catch',
26017a092245SBram Moolenaar      'endtry',
26027a092245SBram Moolenaar      ], 'E488:')
26032c5ed4e3SBram Moolenaar  CheckScriptFailure([
26042c5ed4e3SBram Moolenaar      'vim9script',
26052c5ed4e3SBram Moolenaar      'try# comment',
26062c5ed4e3SBram Moolenaar      'echo "yes"',
26072c5ed4e3SBram Moolenaar      ], 'E488:')
26087a092245SBram Moolenaar  CheckDefFailure([
26097a092245SBram Moolenaar      'try',
2610a72cfb80SBram Moolenaar      '  throw#comment',
2611a72cfb80SBram Moolenaar      'catch',
2612a72cfb80SBram Moolenaar      'endtry',
2613a72cfb80SBram Moolenaar      ], 'E1015:')
2614a72cfb80SBram Moolenaar  CheckDefFailure([
2615a72cfb80SBram Moolenaar      'try',
2616a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2617a72cfb80SBram Moolenaar      'catch',
2618a72cfb80SBram Moolenaar      'endtry',
2619a72cfb80SBram Moolenaar      ], 'E488:')
2620a72cfb80SBram Moolenaar  CheckDefFailure([
2621a72cfb80SBram Moolenaar      'try',
26227a092245SBram Moolenaar      '  echo "yes"',
26237a092245SBram Moolenaar      'catch# comment',
26247a092245SBram Moolenaar      'endtry',
26257a092245SBram Moolenaar      ], 'E488:')
26262c5ed4e3SBram Moolenaar  CheckScriptFailure([
26272c5ed4e3SBram Moolenaar      'vim9script',
26282c5ed4e3SBram Moolenaar      'try',
26292c5ed4e3SBram Moolenaar      '  echo "yes"',
26302c5ed4e3SBram Moolenaar      'catch# comment',
26312c5ed4e3SBram Moolenaar      'endtry',
26322c5ed4e3SBram Moolenaar      ], 'E654:')
26332c5ed4e3SBram Moolenaar  CheckDefFailure([
26342c5ed4e3SBram Moolenaar      'try',
26352c5ed4e3SBram Moolenaar      '  echo "yes"',
26362c5ed4e3SBram Moolenaar      'catch /pat/# comment',
26372c5ed4e3SBram Moolenaar      'endtry',
26382c5ed4e3SBram Moolenaar      ], 'E488:')
26397a092245SBram Moolenaar  CheckDefFailure([
26407a092245SBram Moolenaar      'try',
26417a092245SBram Moolenaar      'echo "yes"',
26427a092245SBram Moolenaar      'catch',
26437a092245SBram Moolenaar      'endtry# comment',
26447a092245SBram Moolenaar      ], 'E488:')
26452c5ed4e3SBram Moolenaar  CheckScriptFailure([
26462c5ed4e3SBram Moolenaar      'vim9script',
26472c5ed4e3SBram Moolenaar      'try',
26482c5ed4e3SBram Moolenaar      '  echo "yes"',
26492c5ed4e3SBram Moolenaar      'catch',
26502c5ed4e3SBram Moolenaar      'endtry# comment',
26519b7bf9e9SBram Moolenaar      ], 'E488:')
26522c5ed4e3SBram Moolenaar
26532c5ed4e3SBram Moolenaar  CheckScriptSuccess([
26542c5ed4e3SBram Moolenaar      'vim9script',
26552c5ed4e3SBram Moolenaar      'hi # comment',
26562c5ed4e3SBram Moolenaar      ])
26572c5ed4e3SBram Moolenaar  CheckScriptFailure([
26582c5ed4e3SBram Moolenaar      'vim9script',
26592c5ed4e3SBram Moolenaar      'hi# comment',
26602c5ed4e3SBram Moolenaar      ], 'E416:')
26611966c248SBram Moolenaar  CheckScriptSuccess([
26621966c248SBram Moolenaar      'vim9script',
26631966c248SBram Moolenaar      'hi Search # comment',
26641966c248SBram Moolenaar      ])
26651966c248SBram Moolenaar  CheckScriptFailure([
26661966c248SBram Moolenaar      'vim9script',
26671966c248SBram Moolenaar      'hi Search# comment',
26681966c248SBram Moolenaar      ], 'E416:')
26691966c248SBram Moolenaar  CheckScriptSuccess([
26701966c248SBram Moolenaar      'vim9script',
26711966c248SBram Moolenaar      'hi link This Search # comment',
26721966c248SBram Moolenaar      ])
26731966c248SBram Moolenaar  CheckScriptFailure([
26741966c248SBram Moolenaar      'vim9script',
26751966c248SBram Moolenaar      'hi link This That# comment',
26761966c248SBram Moolenaar      ], 'E413:')
26771966c248SBram Moolenaar  CheckScriptSuccess([
26781966c248SBram Moolenaar      'vim9script',
26791966c248SBram Moolenaar      'hi clear This # comment',
26801966c248SBram Moolenaar      'hi clear # comment',
26811966c248SBram Moolenaar      ])
2682f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2683f5be8cdbSBram Moolenaar  # hi clear This# comment',
26841966c248SBram Moolenaar  CheckScriptFailure([
26851966c248SBram Moolenaar      'vim9script',
26861966c248SBram Moolenaar      'hi clear# comment',
26871966c248SBram Moolenaar      ], 'E416:')
26881966c248SBram Moolenaar
26891966c248SBram Moolenaar  CheckScriptSuccess([
26901966c248SBram Moolenaar      'vim9script',
26911966c248SBram Moolenaar      'hi Group term=bold',
26921966c248SBram Moolenaar      'match Group /todo/ # comment',
26931966c248SBram Moolenaar      ])
26941966c248SBram Moolenaar  CheckScriptFailure([
26951966c248SBram Moolenaar      'vim9script',
26961966c248SBram Moolenaar      'hi Group term=bold',
26971966c248SBram Moolenaar      'match Group /todo/# comment',
26981966c248SBram Moolenaar      ], 'E488:')
26991966c248SBram Moolenaar  CheckScriptSuccess([
27001966c248SBram Moolenaar      'vim9script',
27011966c248SBram Moolenaar      'match # comment',
27021966c248SBram Moolenaar      ])
27031966c248SBram Moolenaar  CheckScriptFailure([
27041966c248SBram Moolenaar      'vim9script',
27051966c248SBram Moolenaar      'match# comment',
27061966c248SBram Moolenaar      ], 'E475:')
27071966c248SBram Moolenaar  CheckScriptSuccess([
27081966c248SBram Moolenaar      'vim9script',
27091966c248SBram Moolenaar      'match none # comment',
27101966c248SBram Moolenaar      ])
27111966c248SBram Moolenaar  CheckScriptFailure([
27121966c248SBram Moolenaar      'vim9script',
27131966c248SBram Moolenaar      'match none# comment',
27141966c248SBram Moolenaar      ], 'E475:')
27151966c248SBram Moolenaar
27161966c248SBram Moolenaar  CheckScriptSuccess([
27171966c248SBram Moolenaar      'vim9script',
27181966c248SBram Moolenaar      'menutrans clear # comment',
27191966c248SBram Moolenaar      ])
27201966c248SBram Moolenaar  CheckScriptFailure([
27211966c248SBram Moolenaar      'vim9script',
27221966c248SBram Moolenaar      'menutrans clear# comment text',
27231966c248SBram Moolenaar      ], 'E474:')
27241966c248SBram Moolenaar
27251966c248SBram Moolenaar  CheckScriptSuccess([
27261966c248SBram Moolenaar      'vim9script',
27271966c248SBram Moolenaar      'syntax clear # comment',
27281966c248SBram Moolenaar      ])
27291966c248SBram Moolenaar  CheckScriptFailure([
27301966c248SBram Moolenaar      'vim9script',
27311966c248SBram Moolenaar      'syntax clear# comment text',
27321966c248SBram Moolenaar      ], 'E28:')
27331966c248SBram Moolenaar  CheckScriptSuccess([
27341966c248SBram Moolenaar      'vim9script',
27351966c248SBram Moolenaar      'syntax keyword Word some',
27361966c248SBram Moolenaar      'syntax clear Word # comment',
27371966c248SBram Moolenaar      ])
27381966c248SBram Moolenaar  CheckScriptFailure([
27391966c248SBram Moolenaar      'vim9script',
27401966c248SBram Moolenaar      'syntax keyword Word some',
27411966c248SBram Moolenaar      'syntax clear Word# comment text',
27421966c248SBram Moolenaar      ], 'E28:')
27431966c248SBram Moolenaar
27441966c248SBram Moolenaar  CheckScriptSuccess([
27451966c248SBram Moolenaar      'vim9script',
27461966c248SBram Moolenaar      'syntax list # comment',
27471966c248SBram Moolenaar      ])
27481966c248SBram Moolenaar  CheckScriptFailure([
27491966c248SBram Moolenaar      'vim9script',
27501966c248SBram Moolenaar      'syntax list# comment text',
27511966c248SBram Moolenaar      ], 'E28:')
27521966c248SBram Moolenaar
27531966c248SBram Moolenaar  CheckScriptSuccess([
27541966c248SBram Moolenaar      'vim9script',
27551966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
27561966c248SBram Moolenaar      ])
27571966c248SBram Moolenaar  CheckScriptFailure([
27581966c248SBram Moolenaar      'vim9script',
27591966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
27601966c248SBram Moolenaar      ], 'E475:')
27611966c248SBram Moolenaar
27621966c248SBram Moolenaar  CheckScriptSuccess([
27631966c248SBram Moolenaar      'vim9script',
27641966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
27651966c248SBram Moolenaar      ])
27661966c248SBram Moolenaar  CheckScriptFailure([
27671966c248SBram Moolenaar      'vim9script',
27681966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
27691966c248SBram Moolenaar      ], 'E789:')
27701966c248SBram Moolenaar
27711966c248SBram Moolenaar  CheckScriptSuccess([
27721966c248SBram Moolenaar      'vim9script',
27731966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
27741966c248SBram Moolenaar      ])
27751966c248SBram Moolenaar  CheckScriptFailure([
27761966c248SBram Moolenaar      'vim9script',
27771966c248SBram Moolenaar      'syntax match Word /pat/# comment',
27781966c248SBram Moolenaar      ], 'E402:')
27791966c248SBram Moolenaar
27801966c248SBram Moolenaar  CheckScriptSuccess([
27811966c248SBram Moolenaar      'vim9script',
27821966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
27831966c248SBram Moolenaar      ])
27841966c248SBram Moolenaar  CheckScriptFailure([
27851966c248SBram Moolenaar      'vim9script',
27861966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
27871966c248SBram Moolenaar      ], 'E475:')
27881966c248SBram Moolenaar  CheckScriptFailure([
27891966c248SBram Moolenaar      'vim9script',
27901966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
27911966c248SBram Moolenaar      ], 'E406:')
27921966c248SBram Moolenaar  CheckScriptFailure([
27931966c248SBram Moolenaar      'vim9script',
27941966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
27951966c248SBram Moolenaar      ], 'E475:')
27961966c248SBram Moolenaar
27971966c248SBram Moolenaar  CheckScriptSuccess([
27981966c248SBram Moolenaar      'vim9script',
27991966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
28001966c248SBram Moolenaar      ])
28011966c248SBram Moolenaar  CheckScriptFailure([
28021966c248SBram Moolenaar      'vim9script',
28031966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2804d032f34aSBram Moolenaar      ], 'E402:')
28051966c248SBram Moolenaar
28061966c248SBram Moolenaar  CheckScriptSuccess([
28071966c248SBram Moolenaar      'vim9script',
28081966c248SBram Moolenaar      'syntax sync # comment',
28091966c248SBram Moolenaar      ])
28101966c248SBram Moolenaar  CheckScriptFailure([
28111966c248SBram Moolenaar      'vim9script',
28121966c248SBram Moolenaar      'syntax sync# comment',
28131966c248SBram Moolenaar      ], 'E404:')
28141966c248SBram Moolenaar  CheckScriptSuccess([
28151966c248SBram Moolenaar      'vim9script',
28161966c248SBram Moolenaar      'syntax sync ccomment # comment',
28171966c248SBram Moolenaar      ])
28181966c248SBram Moolenaar  CheckScriptFailure([
28191966c248SBram Moolenaar      'vim9script',
28201966c248SBram Moolenaar      'syntax sync ccomment# comment',
28211966c248SBram Moolenaar      ], 'E404:')
28221966c248SBram Moolenaar
28231966c248SBram Moolenaar  CheckScriptSuccess([
28241966c248SBram Moolenaar      'vim9script',
28251966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
28261966c248SBram Moolenaar      ])
28271966c248SBram Moolenaar  CheckScriptFailure([
28281966c248SBram Moolenaar      'vim9script',
28291966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
28301966c248SBram Moolenaar      ], 'E475:')
2831a72cfb80SBram Moolenaar
2832a72cfb80SBram Moolenaar  CheckScriptSuccess([
2833a72cfb80SBram Moolenaar      'vim9script',
2834a72cfb80SBram Moolenaar      'command Echo echo # comment',
2835a72cfb80SBram Moolenaar      'command Echo # comment',
2836a72cfb80SBram Moolenaar      ])
2837a72cfb80SBram Moolenaar  CheckScriptFailure([
2838a72cfb80SBram Moolenaar      'vim9script',
2839a72cfb80SBram Moolenaar      'command Echo echo# comment',
2840a72cfb80SBram Moolenaar      'Echo',
2841a72cfb80SBram Moolenaar      ], 'E121:')
2842a72cfb80SBram Moolenaar  CheckScriptFailure([
2843a72cfb80SBram Moolenaar      'vim9script',
2844a72cfb80SBram Moolenaar      'command Echo# comment',
2845a72cfb80SBram Moolenaar      ], 'E182:')
2846a72cfb80SBram Moolenaar  CheckScriptFailure([
2847a72cfb80SBram Moolenaar      'vim9script',
2848a72cfb80SBram Moolenaar      'command Echo echo',
2849a72cfb80SBram Moolenaar      'command Echo# comment',
2850a72cfb80SBram Moolenaar      ], 'E182:')
2851a72cfb80SBram Moolenaar
2852a72cfb80SBram Moolenaar  CheckScriptSuccess([
2853a72cfb80SBram Moolenaar      'vim9script',
2854a72cfb80SBram Moolenaar      'function # comment',
2855a72cfb80SBram Moolenaar      ])
2856a72cfb80SBram Moolenaar  CheckScriptFailure([
2857a72cfb80SBram Moolenaar      'vim9script',
28589898107fSBram Moolenaar      'function " comment',
28599898107fSBram Moolenaar      ], 'E129:')
28609898107fSBram Moolenaar  CheckScriptFailure([
28619898107fSBram Moolenaar      'vim9script',
2862a72cfb80SBram Moolenaar      'function# comment',
2863a72cfb80SBram Moolenaar      ], 'E129:')
2864a72cfb80SBram Moolenaar  CheckScriptSuccess([
2865a72cfb80SBram Moolenaar      'vim9script',
2866a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2867a72cfb80SBram Moolenaar      ])
2868a72cfb80SBram Moolenaar  CheckScriptFailure([
2869a72cfb80SBram Moolenaar      'vim9script',
2870a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2871a72cfb80SBram Moolenaar      ], 'E488:')
2872a72cfb80SBram Moolenaar
2873a72cfb80SBram Moolenaar  CheckScriptSuccess([
2874a72cfb80SBram Moolenaar      'vim9script',
28754c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2876a72cfb80SBram Moolenaar      'endfunc',
28774c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2878a72cfb80SBram Moolenaar      ])
2879a72cfb80SBram Moolenaar  CheckScriptFailure([
2880a72cfb80SBram Moolenaar      'vim9script',
28814c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2882a72cfb80SBram Moolenaar      'endfunc',
28834c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2884a72cfb80SBram Moolenaar      ], 'E488:')
2885a72cfb80SBram Moolenaar
2886a72cfb80SBram Moolenaar  CheckScriptSuccess([
2887a72cfb80SBram Moolenaar      'vim9script',
2888a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2889a72cfb80SBram Moolenaar      ])
2890a72cfb80SBram Moolenaar  CheckScriptFailure([
2891a72cfb80SBram Moolenaar      'vim9script',
2892a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2893a72cfb80SBram Moolenaar      ], 'E488:')
2894e7e4838fSBram Moolenaar
2895e7e4838fSBram Moolenaar  CheckScriptFailure([
2896e7e4838fSBram Moolenaar      'def Test() " comment',
2897e7e4838fSBram Moolenaar      'enddef',
2898e7e4838fSBram Moolenaar      ], 'E488:')
2899e7e4838fSBram Moolenaar  CheckScriptFailure([
2900e7e4838fSBram Moolenaar      'vim9script',
2901e7e4838fSBram Moolenaar      'def Test() " comment',
2902e7e4838fSBram Moolenaar      'enddef',
2903e7e4838fSBram Moolenaar      ], 'E488:')
2904e7e4838fSBram Moolenaar
2905e7e4838fSBram Moolenaar  CheckScriptSuccess([
2906e7e4838fSBram Moolenaar      'func Test() " comment',
2907e7e4838fSBram Moolenaar      'endfunc',
2908e7e4838fSBram Moolenaar      ])
29099898107fSBram Moolenaar  CheckScriptSuccess([
2910e7e4838fSBram Moolenaar      'vim9script',
2911e7e4838fSBram Moolenaar      'func Test() " comment',
2912e7e4838fSBram Moolenaar      'endfunc',
29139898107fSBram Moolenaar      ])
2914e7e4838fSBram Moolenaar
2915e7e4838fSBram Moolenaar  CheckScriptSuccess([
2916e7e4838fSBram Moolenaar      'def Test() # comment',
2917e7e4838fSBram Moolenaar      'enddef',
2918e7e4838fSBram Moolenaar      ])
2919e7e4838fSBram Moolenaar  CheckScriptFailure([
2920e7e4838fSBram Moolenaar      'func Test() # comment',
2921e7e4838fSBram Moolenaar      'endfunc',
2922e7e4838fSBram Moolenaar      ], 'E488:')
29232c5ed4e3SBram Moolenaarenddef
29242c5ed4e3SBram Moolenaar
29252c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
29262c5ed4e3SBram Moolenaar  CheckCanRunGui
29272c5ed4e3SBram Moolenaar
29282c5ed4e3SBram Moolenaar  CheckScriptFailure([
29292c5ed4e3SBram Moolenaar      'vim9script',
29302c5ed4e3SBram Moolenaar      'gui#comment'
29312c5ed4e3SBram Moolenaar      ], 'E499:')
29322c5ed4e3SBram Moolenaar  CheckScriptFailure([
29332c5ed4e3SBram Moolenaar      'vim9script',
29342c5ed4e3SBram Moolenaar      'gui -f#comment'
29352c5ed4e3SBram Moolenaar      ], 'E499:')
29367a092245SBram Moolenaarenddef
29377a092245SBram Moolenaar
2938a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
29396797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
29406797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2941a26b9700SBram Moolenaar
2942a26b9700SBram Moolenaar  edit test.vim
2943a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2944a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2945a26b9700SBram Moolenaar
2946a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2947a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2948a26b9700SBram Moolenaar
2949a26b9700SBram Moolenaar  g:entered = 0
2950a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2951a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2952a26b9700SBram Moolenaar
2953a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2954a26b9700SBram Moolenaar
2955a26b9700SBram Moolenaar  au! TabEnter
2956a26b9700SBram Moolenaar  unlet g:entered
2957d72c1bf0SBram Moolenaar
2958d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2959d72c1bf0SBram Moolenaar      'vim9script',
29606797966dSBram Moolenaar      'g:var = 123',
2961e55b1c09SBram Moolenaar      'b:var = 456',
2962e55b1c09SBram Moolenaar      'w:var = 777',
2963e55b1c09SBram Moolenaar      't:var = 888',
2964d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2965d72c1bf0SBram Moolenaar      ])
2966d72c1bf0SBram Moolenaar
2967d72c1bf0SBram Moolenaar  CheckScriptFailure([
2968d72c1bf0SBram Moolenaar      'vim9script',
2969d72c1bf0SBram Moolenaar      'let g:var = 123',
2970e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2971e55b1c09SBram Moolenaar
2972e55b1c09SBram Moolenaar  CheckScriptFailure([
2973e55b1c09SBram Moolenaar      'vim9script',
2974e55b1c09SBram Moolenaar      'let b:var = 123',
2975e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2976e55b1c09SBram Moolenaar
2977e55b1c09SBram Moolenaar  CheckScriptFailure([
2978e55b1c09SBram Moolenaar      'vim9script',
2979e55b1c09SBram Moolenaar      'let w:var = 123',
2980e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2981e55b1c09SBram Moolenaar
2982e55b1c09SBram Moolenaar  CheckScriptFailure([
2983e55b1c09SBram Moolenaar      'vim9script',
2984e55b1c09SBram Moolenaar      'let t:var = 123',
2985e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2986e55b1c09SBram Moolenaar
2987e55b1c09SBram Moolenaar  CheckScriptFailure([
2988e55b1c09SBram Moolenaar      'vim9script',
2989e55b1c09SBram Moolenaar      'let v:version = 123',
2990e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2991e55b1c09SBram Moolenaar
2992e55b1c09SBram Moolenaar  CheckScriptFailure([
2993e55b1c09SBram Moolenaar      'vim9script',
2994e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2995e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
29966797966dSBram Moolenaar
29976797966dSBram Moolenaar  CheckScriptFailure([
29986797966dSBram Moolenaar      'vim9script',
29996797966dSBram Moolenaar      'g:var = 123',
300032e35117SBram Moolenaar      'unlet g:var# comment1',
3001d72c1bf0SBram Moolenaar      ], 'E108:')
3002d72c1bf0SBram Moolenaar
3003d72c1bf0SBram Moolenaar  CheckScriptFailure([
3004d72c1bf0SBram Moolenaar      'let g:var = 123',
3005d72c1bf0SBram Moolenaar      'unlet g:var # something',
3006d72c1bf0SBram Moolenaar      ], 'E488:')
3007faac4104SBram Moolenaar
3008faac4104SBram Moolenaar  CheckScriptSuccess([
3009faac4104SBram Moolenaar      'vim9script',
301032e35117SBram Moolenaar      'if 1 # comment2',
3011faac4104SBram Moolenaar      '  echo "yes"',
3012faac4104SBram Moolenaar      'elseif 2 #comment',
3013faac4104SBram Moolenaar      '  echo "no"',
3014faac4104SBram Moolenaar      'endif',
3015faac4104SBram Moolenaar      ])
3016faac4104SBram Moolenaar
3017faac4104SBram Moolenaar  CheckScriptFailure([
3018faac4104SBram Moolenaar      'vim9script',
301932e35117SBram Moolenaar      'if 1# comment3',
3020faac4104SBram Moolenaar      '  echo "yes"',
3021faac4104SBram Moolenaar      'endif',
3022faac4104SBram Moolenaar      ], 'E15:')
3023faac4104SBram Moolenaar
3024faac4104SBram Moolenaar  CheckScriptFailure([
3025faac4104SBram Moolenaar      'vim9script',
302632e35117SBram Moolenaar      'if 0 # comment4',
3027faac4104SBram Moolenaar      '  echo "yes"',
3028faac4104SBram Moolenaar      'elseif 2#comment',
3029faac4104SBram Moolenaar      '  echo "no"',
3030faac4104SBram Moolenaar      'endif',
3031faac4104SBram Moolenaar      ], 'E15:')
3032faac4104SBram Moolenaar
3033faac4104SBram Moolenaar  CheckScriptSuccess([
3034faac4104SBram Moolenaar      'vim9script',
303532e35117SBram Moolenaar      'let v = 1 # comment5',
3036faac4104SBram Moolenaar      ])
3037faac4104SBram Moolenaar
3038faac4104SBram Moolenaar  CheckScriptFailure([
3039faac4104SBram Moolenaar      'vim9script',
304032e35117SBram Moolenaar      'let v = 1# comment6',
304132e35117SBram Moolenaar      ], 'E15:')
3042faac4104SBram Moolenaar
3043faac4104SBram Moolenaar  CheckScriptSuccess([
3044faac4104SBram Moolenaar      'vim9script',
3045faac4104SBram Moolenaar      'new'
3046d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3047df069eecSBram Moolenaar      ':$',
3048faac4104SBram Moolenaar      'dsearch /pat/ #comment',
3049faac4104SBram Moolenaar      'bwipe!',
3050faac4104SBram Moolenaar      ])
3051faac4104SBram Moolenaar
3052f5be8cdbSBram Moolenaar  CheckScriptFailure([
3053f5be8cdbSBram Moolenaar      'vim9script',
3054f5be8cdbSBram Moolenaar      'new'
3055d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
3056f5be8cdbSBram Moolenaar      ':$',
3057f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
3058f5be8cdbSBram Moolenaar      'bwipe!',
3059f5be8cdbSBram Moolenaar      ], 'E488:')
3060f5be8cdbSBram Moolenaar
3061f5be8cdbSBram Moolenaar  CheckScriptFailure([
3062f5be8cdbSBram Moolenaar      'vim9script',
3063f5be8cdbSBram Moolenaar      'func! SomeFunc()',
3064f5be8cdbSBram Moolenaar      ], 'E477:')
3065a26b9700SBram Moolenaarenddef
3066a26b9700SBram Moolenaar
30677e5bd91dSBram Moolenaardef Test_finish()
30687e5bd91dSBram Moolenaar  let lines =<< trim END
30697e5bd91dSBram Moolenaar    vim9script
30706797966dSBram Moolenaar    g:res = 'one'
30717e5bd91dSBram Moolenaar    if v:false | finish | endif
30726797966dSBram Moolenaar    g:res = 'two'
30737e5bd91dSBram Moolenaar    finish
30746797966dSBram Moolenaar    g:res = 'three'
30757e5bd91dSBram Moolenaar  END
30767e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
30777e5bd91dSBram Moolenaar  source Xfinished
30787e5bd91dSBram Moolenaar  assert_equal('two', g:res)
30797e5bd91dSBram Moolenaar
30807e5bd91dSBram Moolenaar  unlet g:res
30817e5bd91dSBram Moolenaar  delete('Xfinished')
30827e5bd91dSBram Moolenaarenddef
30837e5bd91dSBram Moolenaar
308432e35117SBram Moolenaardef Test_let_func_call()
308532e35117SBram Moolenaar  let lines =<< trim END
308632e35117SBram Moolenaar    vim9script
308732e35117SBram Moolenaar    func GetValue()
308832e35117SBram Moolenaar      if exists('g:count')
308932e35117SBram Moolenaar        let g:count += 1
309032e35117SBram Moolenaar      else
309132e35117SBram Moolenaar        let g:count = 1
309232e35117SBram Moolenaar      endif
309332e35117SBram Moolenaar      return 'this'
309432e35117SBram Moolenaar    endfunc
309532e35117SBram Moolenaar    let val: string = GetValue()
3096f5be8cdbSBram Moolenaar    # env var is always a string
3097df671b46SBram Moolenaar    let env = $TERM
309832e35117SBram Moolenaar  END
309932e35117SBram Moolenaar  writefile(lines, 'Xfinished')
310032e35117SBram Moolenaar  source Xfinished
3101f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
310232e35117SBram Moolenaar  assert_equal(1, g:count)
310332e35117SBram Moolenaar
310432e35117SBram Moolenaar  unlet g:count
310532e35117SBram Moolenaar  delete('Xfinished')
310632e35117SBram Moolenaarenddef
310732e35117SBram Moolenaar
310832e35117SBram Moolenaardef Test_let_missing_type()
310932e35117SBram Moolenaar  let lines =<< trim END
311032e35117SBram Moolenaar    vim9script
3111df671b46SBram Moolenaar    let var = g:unknown
3112227a69deSBram Moolenaar  END
3113822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
3114227a69deSBram Moolenaar
3115227a69deSBram Moolenaar  lines =<< trim END
3116227a69deSBram Moolenaar    vim9script
3117227a69deSBram Moolenaar    let nr: number = 123
3118227a69deSBram Moolenaar    let var = nr
3119227a69deSBram Moolenaar  END
3120822ba247SBram Moolenaar  CheckScriptSuccess(lines)
312132e35117SBram Moolenaarenddef
312232e35117SBram Moolenaar
3123c82a5b5dSBram Moolenaardef Test_let_declaration()
3124c82a5b5dSBram Moolenaar  let lines =<< trim END
3125c82a5b5dSBram Moolenaar    vim9script
3126c82a5b5dSBram Moolenaar    let var: string
3127c82a5b5dSBram Moolenaar    g:var_uninit = var
3128c82a5b5dSBram Moolenaar    var = 'text'
3129c82a5b5dSBram Moolenaar    g:var_test = var
3130f5be8cdbSBram Moolenaar    # prefixing s: is optional
3131984dddbeSBram Moolenaar    s:var = 'prefixed'
3132984dddbeSBram Moolenaar    g:var_prefixed = s:var
3133984dddbeSBram Moolenaar
3134984dddbeSBram Moolenaar    let s:other: number
3135984dddbeSBram Moolenaar    other = 1234
3136984dddbeSBram Moolenaar    g:other_var = other
313753b29e48SBram Moolenaar
313853b29e48SBram Moolenaar    # type is inferred
313953b29e48SBram Moolenaar    s:dict = {'a': 222}
314053b29e48SBram Moolenaar    def GetDictVal(key: any)
314153b29e48SBram Moolenaar      g:dict_val = s:dict[key]
314253b29e48SBram Moolenaar    enddef
314353b29e48SBram Moolenaar    GetDictVal('a')
3144c82a5b5dSBram Moolenaar  END
3145c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
3146c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
3147c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
3148984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
3149984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
315053b29e48SBram Moolenaar  assert_equal(222, g:dict_val)
3151c82a5b5dSBram Moolenaar
3152c82a5b5dSBram Moolenaar  unlet g:var_uninit
3153c82a5b5dSBram Moolenaar  unlet g:var_test
3154984dddbeSBram Moolenaar  unlet g:var_prefixed
3155984dddbeSBram Moolenaar  unlet g:other_var
3156c82a5b5dSBram Moolenaarenddef
3157c82a5b5dSBram Moolenaar
3158c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
3159c5b1c20bSBram Moolenaar  let lines =<< trim END
3160c5b1c20bSBram Moolenaar    vim9script
3161c5b1c20bSBram Moolenaar    const var: string
3162c5b1c20bSBram Moolenaar  END
3163c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
3164c5b1c20bSBram Moolenaar
3165c5b1c20bSBram Moolenaar  lines =<< trim END
3166c5b1c20bSBram Moolenaar    vim9script
3167c5b1c20bSBram Moolenaar    let 9var: string
3168c5b1c20bSBram Moolenaar  END
3169c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
3170c5b1c20bSBram Moolenaarenddef
3171c5b1c20bSBram Moolenaar
317234db91f7SBram Moolenaardef Test_let_type_check()
317334db91f7SBram Moolenaar  let lines =<< trim END
317434db91f7SBram Moolenaar    vim9script
317534db91f7SBram Moolenaar    let var: string
317634db91f7SBram Moolenaar    var = 1234
317734db91f7SBram Moolenaar  END
3178451c2e35SBram Moolenaar  CheckScriptFailure(lines, 'E1012:')
3179984dddbeSBram Moolenaar
3180984dddbeSBram Moolenaar  lines =<< trim END
3181984dddbeSBram Moolenaar    vim9script
3182984dddbeSBram Moolenaar    let var:string
3183984dddbeSBram Moolenaar  END
3184984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
3185c5b1c20bSBram Moolenaar
3186c5b1c20bSBram Moolenaar  lines =<< trim END
3187c5b1c20bSBram Moolenaar    vim9script
3188c5b1c20bSBram Moolenaar    let var: asdf
3189c5b1c20bSBram Moolenaar  END
3190c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
3191a71e2633SBram Moolenaar
3192a71e2633SBram Moolenaar  lines =<< trim END
3193a71e2633SBram Moolenaar    vim9script
3194a71e2633SBram Moolenaar    let s:l: list<number>
3195a71e2633SBram Moolenaar    s:l = []
3196a71e2633SBram Moolenaar  END
3197a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
3198a71e2633SBram Moolenaar
3199a71e2633SBram Moolenaar  lines =<< trim END
3200a71e2633SBram Moolenaar    vim9script
3201a71e2633SBram Moolenaar    let s:d: dict<number>
3202a71e2633SBram Moolenaar    s:d = {}
3203a71e2633SBram Moolenaar  END
3204a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
320534db91f7SBram Moolenaarenddef
320634db91f7SBram Moolenaar
32075e654230SBram Moolenaarlet g:dict_number = #{one: 1, two: 2}
32085e654230SBram Moolenaar
32095e654230SBram Moolenaardef Test_let_list_dict_type()
32105e654230SBram Moolenaar  let ll: list<number>
32115e654230SBram Moolenaar  ll = [1, 2, 2, 3, 3, 3]->uniq()
32125e654230SBram Moolenaar  ll->assert_equal([1, 2, 3])
32135e654230SBram Moolenaar
32145e654230SBram Moolenaar  let dd: dict<number>
32155e654230SBram Moolenaar  dd = g:dict_number
32165e654230SBram Moolenaar  dd->assert_equal(g:dict_number)
32175e654230SBram Moolenaar
32185e654230SBram Moolenaar  let lines =<< trim END
32195e654230SBram Moolenaar      let ll: list<number>
32205e654230SBram Moolenaar      ll = [1, 2, 3]->map('"one"')
32215e654230SBram Moolenaar  END
32225e654230SBram Moolenaar  CheckDefExecFailure(lines, 'E1012: Type mismatch; expected list<number> but got list<string>')
32235e654230SBram Moolenaarenddef
32245e654230SBram Moolenaar
3225a5d0077eSBram Moolenaardef Test_forward_declaration()
3226a5d0077eSBram Moolenaar  let lines =<< trim END
3227a5d0077eSBram Moolenaar    vim9script
3228a5d0077eSBram Moolenaar    def GetValue(): string
3229a5d0077eSBram Moolenaar      return theVal
3230a5d0077eSBram Moolenaar    enddef
3231a5d0077eSBram Moolenaar    let theVal = 'something'
3232822ba247SBram Moolenaar    g:initVal = GetValue()
3233a5d0077eSBram Moolenaar    theVal = 'else'
3234a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3235a5d0077eSBram Moolenaar  END
3236a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3237a5d0077eSBram Moolenaar  source Xforward
3238a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3239a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3240a5d0077eSBram Moolenaar
3241a5d0077eSBram Moolenaar  unlet g:initVal
3242a5d0077eSBram Moolenaar  unlet g:laterVal
3243a5d0077eSBram Moolenaar  delete('Xforward')
3244a5d0077eSBram Moolenaarenddef
3245a5d0077eSBram Moolenaar
32469721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
32479721fb4eSBram Moolenaar  let legacy_lines =<< trim END
32489721fb4eSBram Moolenaar    source Xvim9_script.vim
32499721fb4eSBram Moolenaar
32509721fb4eSBram Moolenaar    call assert_false(exists('local'))
32519721fb4eSBram Moolenaar    call assert_false(exists('exported'))
32529721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
32539721fb4eSBram Moolenaar    call assert_equal('global', global)
32549721fb4eSBram Moolenaar    call assert_equal('global', g:global)
32559721fb4eSBram Moolenaar
32569721fb4eSBram Moolenaar    " imported variable becomes script-local
32579721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
32589721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
32599721fb4eSBram Moolenaar    call assert_false(exists('exported'))
32609721fb4eSBram Moolenaar
32619721fb4eSBram Moolenaar    " imported function becomes script-local
32629721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
32639721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
32649721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
32659721fb4eSBram Moolenaar  END
32669721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
32679721fb4eSBram Moolenaar
32689721fb4eSBram Moolenaar  let vim9_lines =<< trim END
32699721fb4eSBram Moolenaar    vim9script
32709721fb4eSBram Moolenaar    let local = 'local'
32719721fb4eSBram Moolenaar    g:global = 'global'
32729721fb4eSBram Moolenaar    export let exported = 'exported'
32739721fb4eSBram Moolenaar    export def GetText(): string
32749721fb4eSBram Moolenaar       return 'text'
32759721fb4eSBram Moolenaar    enddef
32769721fb4eSBram Moolenaar  END
32779721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
32789721fb4eSBram Moolenaar
32799721fb4eSBram Moolenaar  source Xlegacy_script.vim
32809721fb4eSBram Moolenaar
32819721fb4eSBram Moolenaar  assert_equal('global', g:global)
3282f5be8cdbSBram Moolenaar  unlet g:global
32839721fb4eSBram Moolenaar
32849721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
32859721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
32869721fb4eSBram Moolenaarenddef
3287a5d0077eSBram Moolenaar
32887d699701SBram Moolenaarfunc Test_vim9script_not_global()
32897d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
32907d699701SBram Moolenaar  let vim9lines =<< trim END
32917d699701SBram Moolenaar    vim9script
32927d699701SBram Moolenaar    let var = 'local'
32937d699701SBram Moolenaar    func TheFunc()
32947d699701SBram Moolenaar      echo 'local'
32957d699701SBram Moolenaar    endfunc
32967d699701SBram Moolenaar    def DefFunc()
32977d699701SBram Moolenaar      echo 'local'
32987d699701SBram Moolenaar    enddef
32997d699701SBram Moolenaar  END
33007d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
33017d699701SBram Moolenaar  source Xvim9script.vim
33027d699701SBram Moolenaar  try
33037d699701SBram Moolenaar    echo g:var
33047d699701SBram Moolenaar    assert_report('did not fail')
33057d699701SBram Moolenaar  catch /E121:/
33067d699701SBram Moolenaar    " caught
33077d699701SBram Moolenaar  endtry
33087d699701SBram Moolenaar  try
33097d699701SBram Moolenaar    call TheFunc()
33107d699701SBram Moolenaar    assert_report('did not fail')
33117d699701SBram Moolenaar  catch /E117:/
33127d699701SBram Moolenaar    " caught
33137d699701SBram Moolenaar  endtry
33147d699701SBram Moolenaar  try
33157d699701SBram Moolenaar    call DefFunc()
33167d699701SBram Moolenaar    assert_report('did not fail')
33177d699701SBram Moolenaar  catch /E117:/
33187d699701SBram Moolenaar    " caught
33197d699701SBram Moolenaar  endtry
33207d699701SBram Moolenaar
332125859dd7SBram Moolenaar  call delete('Xvim9script.vim')
33227d699701SBram Moolenaarendfunc
33237d699701SBram Moolenaar
3324eeb27bfeSBram Moolenaardef Test_vim9_copen()
3325eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3326eeb27bfeSBram Moolenaar  copen
3327eeb27bfeSBram Moolenaar  quit
3328eeb27bfeSBram Moolenaarenddef
3329eeb27bfeSBram Moolenaar
33302d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
33312d6b20d6SBram Moolenaardef Test_vim9_autoload()
33322d6b20d6SBram Moolenaar  let lines =<< trim END
33332d6b20d6SBram Moolenaar     vim9script
33342d6b20d6SBram Moolenaar     def foo#test()
33352d6b20d6SBram Moolenaar         echomsg getreg('"')
33362d6b20d6SBram Moolenaar     enddef
33372d6b20d6SBram Moolenaar  END
33382d6b20d6SBram Moolenaar
33392d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
33402d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
33412d6b20d6SBram Moolenaar  let save_rtp = &rtp
33422d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
33432d6b20d6SBram Moolenaar  augroup test
33442d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
33452d6b20d6SBram Moolenaar  augroup END
33462d6b20d6SBram Moolenaar
33472d6b20d6SBram Moolenaar  normal Y
33482d6b20d6SBram Moolenaar
33492d6b20d6SBram Moolenaar  augroup test
33502d6b20d6SBram Moolenaar    autocmd!
33512d6b20d6SBram Moolenaar  augroup END
33522d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
33532d6b20d6SBram Moolenaar  &rtp = save_rtp
33542d6b20d6SBram Moolenaarenddef
33552d6b20d6SBram Moolenaar
3356*77e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset.
3357*77e5dcc3SBram Moolenaardef Test_vim9_autoload_error()
3358*77e5dcc3SBram Moolenaar  let lines =<< trim END
3359*77e5dcc3SBram Moolenaar      vim9script
3360*77e5dcc3SBram Moolenaar      def crash#func()
3361*77e5dcc3SBram Moolenaar          try
3362*77e5dcc3SBram Moolenaar              for x in List()
3363*77e5dcc3SBram Moolenaar              endfor
3364*77e5dcc3SBram Moolenaar          catch
3365*77e5dcc3SBram Moolenaar          endtry
3366*77e5dcc3SBram Moolenaar          g:ok = true
3367*77e5dcc3SBram Moolenaar      enddef
3368*77e5dcc3SBram Moolenaar      fu List()
3369*77e5dcc3SBram Moolenaar          invalid
3370*77e5dcc3SBram Moolenaar      endfu
3371*77e5dcc3SBram Moolenaar      try
3372*77e5dcc3SBram Moolenaar          invalid
3373*77e5dcc3SBram Moolenaar      catch /wontmatch/
3374*77e5dcc3SBram Moolenaar      endtry
3375*77e5dcc3SBram Moolenaar  END
3376*77e5dcc3SBram Moolenaar  call mkdir('Xruntime/autoload', 'p')
3377*77e5dcc3SBram Moolenaar  call writefile(lines, 'Xruntime/autoload/crash.vim')
3378*77e5dcc3SBram Moolenaar
3379*77e5dcc3SBram Moolenaar  # run in a separate Vim to avoid the side effects of assert_fails()
3380*77e5dcc3SBram Moolenaar  lines =<< trim END
3381*77e5dcc3SBram Moolenaar    exe 'set rtp^=' .. getcwd() .. '/Xruntime'
3382*77e5dcc3SBram Moolenaar    call crash#func()
3383*77e5dcc3SBram Moolenaar    call writefile(['ok'], 'Xdidit')
3384*77e5dcc3SBram Moolenaar    qall
3385*77e5dcc3SBram Moolenaar  END
3386*77e5dcc3SBram Moolenaar  writefile(lines, 'Xscript')
3387*77e5dcc3SBram Moolenaar  RunVim([], [], '-S Xscript')
3388*77e5dcc3SBram Moolenaar  assert_equal(['ok'], readfile('Xdidit'))
3389*77e5dcc3SBram Moolenaar
3390*77e5dcc3SBram Moolenaar  delete('Xdidit')
3391*77e5dcc3SBram Moolenaar  delete('Xscript')
3392*77e5dcc3SBram Moolenaar  delete('Xruntime', 'rf')
3393*77e5dcc3SBram Moolenaarenddef
3394*77e5dcc3SBram Moolenaar
339581e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
339681e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
339781e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
339881e17fbeSBram Moolenaar  let lines =<< trim END
339981e17fbeSBram Moolenaar    let s:counter = 1
340081e17fbeSBram Moolenaar    def s:Func()
340181e17fbeSBram Moolenaar      au! CursorHold
340281e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
340381e17fbeSBram Moolenaar    enddef
340481e17fbeSBram Moolenaar    call s:Func()
340581e17fbeSBram Moolenaar    doau CursorHold
340681e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
340781e17fbeSBram Moolenaar    au! CursorHold
340881e17fbeSBram Moolenaar  END
340981e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
341081e17fbeSBram Moolenaarenddef
341181e17fbeSBram Moolenaar
34123896a105SBram Moolenaardef Test_cmdline_win()
34133896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
34143896a105SBram Moolenaar  # the command line window.
34153896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
34163896a105SBram Moolenaar  let export_lines =<< trim END
34173896a105SBram Moolenaar    vim9script
34183896a105SBram Moolenaar    export let That = 'yes'
34193896a105SBram Moolenaar  END
34203896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
34213896a105SBram Moolenaar  let import_lines =<< trim END
34223896a105SBram Moolenaar    vim9script
34233896a105SBram Moolenaar    import That from './Xexport.vim'
34243896a105SBram Moolenaar  END
34253896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
34263896a105SBram Moolenaar  let save_rtp = &rtp
34273896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
34283896a105SBram Moolenaar  syntax on
34293896a105SBram Moolenaar  augroup CmdWin
34303896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
34313896a105SBram Moolenaar  augroup END
34323896a105SBram Moolenaar  # this will open and also close the cmdline window
34333896a105SBram Moolenaar  feedkeys('q:', 'xt')
34343896a105SBram Moolenaar  assert_equal('yes', g:got_there)
34353896a105SBram Moolenaar
34363896a105SBram Moolenaar  augroup CmdWin
34373896a105SBram Moolenaar    au!
34383896a105SBram Moolenaar  augroup END
34393896a105SBram Moolenaar  &rtp = save_rtp
34403896a105SBram Moolenaar  delete('rtp', 'rf')
34413896a105SBram Moolenaarenddef
34423896a105SBram Moolenaar
3443e3d4685fSBram Moolenaardef Test_invalid_sid()
3444e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
344525859dd7SBram Moolenaar
3446e3d4685fSBram Moolenaar  if RunVim([], ['wq Xdidit'], '+"func <SNR>1_func"')
3447d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3448e3d4685fSBram Moolenaar  endif
3449e3d4685fSBram Moolenaar  delete('Xdidit')
3450e3d4685fSBram Moolenaarenddef
3451e3d4685fSBram Moolenaar
3452f0afd9e1SBram Moolenaardef Test_unset_any_variable()
3453f0afd9e1SBram Moolenaar  let lines =<< trim END
3454f0afd9e1SBram Moolenaar    let var: any
3455f0afd9e1SBram Moolenaar    assert_equal(0, var)
3456f0afd9e1SBram Moolenaar  END
3457f0afd9e1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3458f0afd9e1SBram Moolenaarenddef
3459f0afd9e1SBram Moolenaar
3460585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3461585fea7bSBram Moolenaardef Test_substitute_cmd()
3462585fea7bSBram Moolenaar  new
3463585fea7bSBram Moolenaar  setline(1, 'something')
3464585fea7bSBram Moolenaar  :substitute(some(other(
3465585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3466585fea7bSBram Moolenaar  bwipe!
3467585fea7bSBram Moolenaar
3468f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3469585fea7bSBram Moolenaar  let lines =<< trim END
3470585fea7bSBram Moolenaar    vim9script
3471585fea7bSBram Moolenaar    new
3472585fea7bSBram Moolenaar    setline(1, 'something')
3473585fea7bSBram Moolenaar    :substitute(some(other(
3474585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3475585fea7bSBram Moolenaar    bwipe!
3476585fea7bSBram Moolenaar  END
3477585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3478585fea7bSBram Moolenaar  source Xvim9lines
3479585fea7bSBram Moolenaar
3480585fea7bSBram Moolenaar  delete('Xvim9lines')
3481585fea7bSBram Moolenaarenddef
3482585fea7bSBram Moolenaar
34838a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3484