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
49*4ed124ccSBram Moolenaar  assert_equal(false, bool3)
5029a86ffeSBram Moolenaar  let bool4: bool = 1
51*4ed124ccSBram Moolenaar  assert_equal(true, bool4)
52*4ed124ccSBram Moolenaar
53*4ed124ccSBram Moolenaar  let bool5: bool = 'yes' && 'no'
54*4ed124ccSBram Moolenaar  assert_equal(true, bool5)
55*4ed124ccSBram Moolenaar  let bool6: bool = [] && 99
56*4ed124ccSBram Moolenaar  assert_equal(false, bool6)
57*4ed124ccSBram Moolenaar  let bool7: bool = [] || #{a: 1} && 99
58*4ed124ccSBram 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()
67*4ed124ccSBram Moolenaar    assert_equal(true, flag)
68ba7c0d7bSBram Moolenaar    flag = 0
69*4ed124ccSBram Moolenaar    # assert_equal(false, flag)
70ba7c0d7bSBram Moolenaar    flag = 1
71*4ed124ccSBram Moolenaar    # assert_equal(true, flag)
72*4ed124ccSBram Moolenaar    # flag = 99 || 123
73*4ed124ccSBram Moolenaar    # assert_equal(true, flag)
74*4ed124ccSBram Moolenaar    # flag = 'yes' && []
75*4ed124ccSBram Moolenaar    # assert_equal(false, flag)
76ba7c0d7bSBram Moolenaar  END
77ba7c0d7bSBram Moolenaar  CheckScriptSuccess(lines)
78ba7c0d7bSBram Moolenaar  CheckDefAndScriptFailure(['let x: bool = 2'], 'E1012:')
79ba7c0d7bSBram Moolenaar  CheckDefAndScriptFailure(['let x: bool = -1'], 'E1012:')
80ba7c0d7bSBram Moolenaar  CheckDefAndScriptFailure(['let x: bool = [1]'], 'E1012:')
81ba7c0d7bSBram Moolenaar  CheckDefAndScriptFailure(['let x: bool = {}'], 'E1012:')
82ba7c0d7bSBram Moolenaar  CheckDefAndScriptFailure(['let x: bool = "x"'], 'E1012:')
83ba7c0d7bSBram Moolenaarenddef
84ba7c0d7bSBram Moolenaar
85ba7c0d7bSBram Moolenaardef Test_assignment()
86d2c61705SBram Moolenaar  CheckDefFailure(['let x:string'], 'E1069:')
87d2c61705SBram Moolenaar  CheckDefFailure(['let x:string = "x"'], 'E1069:')
88d2c61705SBram Moolenaar  CheckDefFailure(['let a:string = "x"'], 'E1069:')
89d2c61705SBram Moolenaar  CheckDefFailure(['let lambda = {-> "lambda"}'], 'E704:')
90f93c7feaSBram Moolenaar
914cdb13ceSBram Moolenaar  let nr: number = 1234
92d2c61705SBram Moolenaar  CheckDefFailure(['let nr: number = "asdf"'], 'E1012:')
934cdb13ceSBram Moolenaar
94b209750bSBram Moolenaar  let a: number = 6 #comment
959be61bbbSBram Moolenaar  assert_equal(6, a)
969be61bbbSBram Moolenaar
9742a480bfSBram Moolenaar  if has('channel')
9842a480bfSBram Moolenaar    let chan1: channel
99fbdd08edSBram Moolenaar    let job1: job
100f51cb4e0SBram Moolenaar    let job2: job = job_start('willfail')
10142a480bfSBram Moolenaar  endif
102fbdd08edSBram Moolenaar  if has('float')
103fbdd08edSBram Moolenaar    let float1: float = 3.4
104fbdd08edSBram Moolenaar  endif
1055deeb3f1SBram Moolenaar  let Funky1: func
1065deeb3f1SBram Moolenaar  let Funky2: func = function('len')
1074c17ad94SBram Moolenaar  let Party2: func = funcref('g:Test_syntax')
10842a480bfSBram Moolenaar
109b209750bSBram Moolenaar  g:newvar = 'new'  #comment
110401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
111401d9ffbSBram Moolenaar
112401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
113401d9ffbSBram Moolenaar  g:existing = 'no'
114401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
115401d9ffbSBram Moolenaar
116b283a8a6SBram Moolenaar  v:char = 'abc'
1176e587dcbSBram Moolenaar  assert_equal('abc', v:char)
118b283a8a6SBram Moolenaar
119b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
1206e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
121b283a8a6SBram Moolenaar  $ENVVAR = ''
1226e587dcbSBram Moolenaar
123b5ed2660SBram Moolenaar  let lines =<< trim END
124b5ed2660SBram Moolenaar    vim9script
125b5ed2660SBram Moolenaar    $ENVVAR = 'barfoo'
126b5ed2660SBram Moolenaar    assert_equal('barfoo', $ENVVAR)
127b5ed2660SBram Moolenaar    $ENVVAR = ''
128b5ed2660SBram Moolenaar  END
129d2c61705SBram Moolenaar  CheckScriptSuccess(lines)
130b5ed2660SBram Moolenaar
131fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
132fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
133fd1823e0SBram Moolenaar  s:addToMe += 222
134fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
1350bbf722aSBram Moolenaar  s:newVar = 'new'
1360bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
137a8c17704SBram Moolenaar
138a8c17704SBram Moolenaar  set ts=7
139a8c17704SBram Moolenaar  &ts += 1
140a8c17704SBram Moolenaar  assert_equal(8, &ts)
14180c34ca3SBram Moolenaar  &ts -= 3
14280c34ca3SBram Moolenaar  assert_equal(5, &ts)
14380c34ca3SBram Moolenaar  &ts *= 2
14480c34ca3SBram Moolenaar  assert_equal(10, &ts)
14580c34ca3SBram Moolenaar  &ts /= 3
14680c34ca3SBram Moolenaar  assert_equal(3, &ts)
14780c34ca3SBram Moolenaar  set ts=10
14880c34ca3SBram Moolenaar  &ts %= 4
14980c34ca3SBram Moolenaar  assert_equal(2, &ts)
150b5ed2660SBram Moolenaar
15193ad1471SBram Moolenaar  if has('float')
15293ad1471SBram Moolenaar    let f100: float = 100.0
15393ad1471SBram Moolenaar    f100 /= 5
15493ad1471SBram Moolenaar    assert_equal(20.0, f100)
15593ad1471SBram Moolenaar
15693ad1471SBram Moolenaar    let f200: float = 200.0
15793ad1471SBram Moolenaar    f200 /= 5.0
15893ad1471SBram Moolenaar    assert_equal(40.0, f200)
15993ad1471SBram Moolenaar
16093ad1471SBram Moolenaar    CheckDefFailure(['let nr: number = 200', 'nr /= 5.0'], 'E1012:')
16193ad1471SBram Moolenaar  endif
16293ad1471SBram Moolenaar
163b5ed2660SBram Moolenaar  lines =<< trim END
164b5ed2660SBram Moolenaar    &ts = 6
165b5ed2660SBram Moolenaar    &ts += 3
166b5ed2660SBram Moolenaar    assert_equal(9, &ts)
1672e800955SBram Moolenaar
1682e800955SBram Moolenaar    &l:ts = 6
1692e800955SBram Moolenaar    assert_equal(6, &ts)
1702e800955SBram Moolenaar    &l:ts += 2
1712e800955SBram Moolenaar    assert_equal(8, &ts)
1722e800955SBram Moolenaar
1732e800955SBram Moolenaar    &g:ts = 6
1742e800955SBram Moolenaar    assert_equal(6, &g:ts)
1752e800955SBram Moolenaar    &g:ts += 2
1762e800955SBram Moolenaar    assert_equal(8, &g:ts)
177b5ed2660SBram Moolenaar  END
1782e800955SBram Moolenaar  CheckDefAndScriptSuccess(lines)
179b5ed2660SBram Moolenaar
1800aae4809SBram Moolenaar  CheckDefFailure(['&notex += 3'], 'E113:')
1810aae4809SBram Moolenaar  CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
1820aae4809SBram Moolenaar  CheckDefFailure(['&ts = [7]'], 'E1012:')
1830aae4809SBram Moolenaar  CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list')
1840aae4809SBram Moolenaar  CheckDefFailure(['&ts = "xx"'], 'E1012:')
1850aae4809SBram Moolenaar  CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string')
1860aae4809SBram Moolenaar  CheckDefFailure(['&path += 3'], 'E1012:')
1870aae4809SBram Moolenaar  CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
188cb711abfSBram Moolenaar  # test freeing ISN_STOREOPT
1890aae4809SBram Moolenaar  CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
19080c34ca3SBram Moolenaar  &ts = 8
191a8c17704SBram Moolenaar
1920aae4809SBram Moolenaar  lines =<< trim END
1930aae4809SBram Moolenaar    let save_TI = &t_TI
1940aae4809SBram Moolenaar    &t_TI = ''
1950aae4809SBram Moolenaar    assert_equal('', &t_TI)
1960aae4809SBram Moolenaar    &t_TI = 'xxx'
1970aae4809SBram Moolenaar    assert_equal('xxx', &t_TI)
1980aae4809SBram Moolenaar    &t_TI = save_TI
1990aae4809SBram Moolenaar  END
200ba7c0d7bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
2010aae4809SBram Moolenaar
2020aae4809SBram Moolenaar  CheckDefFailure(['&t_TI = 123'], 'E1012:')
2030aae4809SBram Moolenaar  CheckScriptFailure(['vim9script', '&t_TI = 123'], 'E928:')
2040aae4809SBram Moolenaar
2050aae4809SBram Moolenaar  CheckDefFailure(['let s:var = 123'], 'E1101:')
2060aae4809SBram Moolenaar  CheckDefFailure(['let s:var: number'], 'E1101:')
20733afa244SBram Moolenaar
208f9b2b496SBram Moolenaar  lines =<< trim END
209f9b2b496SBram Moolenaar    vim9script
210f9b2b496SBram Moolenaar    def SomeFunc()
211f9b2b496SBram Moolenaar      s:var = 123
212f9b2b496SBram Moolenaar    enddef
213f9b2b496SBram Moolenaar    defcompile
214f9b2b496SBram Moolenaar  END
215d2c61705SBram Moolenaar  CheckScriptFailure(lines, 'E1089:')
216f9b2b496SBram Moolenaar
217a8c17704SBram Moolenaar  g:inc_counter += 1
218a8c17704SBram Moolenaar  assert_equal(2, g:inc_counter)
219a8c17704SBram Moolenaar
220a8c17704SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
221a8c17704SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
222d2c61705SBram Moolenaar  CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1051:')
223d2c61705SBram Moolenaar  CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1012:')
224a8c17704SBram Moolenaar
225b5ed2660SBram Moolenaar  lines =<< trim END
226b5ed2660SBram Moolenaar    @c = 'areg'
227b5ed2660SBram Moolenaar    @c ..= 'add'
228b5ed2660SBram Moolenaar    assert_equal('aregadd', @c)
229b5ed2660SBram Moolenaar  END
2302e800955SBram Moolenaar  CheckDefAndScriptSuccess(lines)
2312e800955SBram Moolenaar
232d2c61705SBram Moolenaar  CheckDefFailure(['@a += "more"'], 'E1051:')
233d2c61705SBram Moolenaar  CheckDefFailure(['@a += 123'], 'E1012:')
234b5ed2660SBram Moolenaar
235e69f6d04SBram Moolenaar  v:errmsg = 'none'
236e69f6d04SBram Moolenaar  v:errmsg ..= 'again'
237e69f6d04SBram Moolenaar  assert_equal('noneagain', v:errmsg)
238d2c61705SBram Moolenaar  CheckDefFailure(['v:errmsg += "more"'], 'E1051:')
239d2c61705SBram Moolenaar  CheckDefFailure(['v:errmsg += 123'], 'E1012:')
24033afa244SBram Moolenaar
24133afa244SBram Moolenaar  # single letter variables
24233afa244SBram Moolenaar  a = 123
24333afa244SBram Moolenaar  assert_equal(123, a)
24433afa244SBram Moolenaar  let b: number
24533afa244SBram Moolenaar  b = 123
24633afa244SBram Moolenaar  assert_equal(123, b)
24733afa244SBram Moolenaar  let g: number
24833afa244SBram Moolenaar  g = 123
24933afa244SBram Moolenaar  assert_equal(123, g)
25033afa244SBram Moolenaar  let s: number
25133afa244SBram Moolenaar  s = 123
25233afa244SBram Moolenaar  assert_equal(123, s)
25333afa244SBram Moolenaar  let t: number
25433afa244SBram Moolenaar  t = 123
25533afa244SBram Moolenaar  assert_equal(123, t)
25633afa244SBram Moolenaar  let v: number
25733afa244SBram Moolenaar  v = 123
25833afa244SBram Moolenaar  assert_equal(123, v)
25933afa244SBram Moolenaar  let w: number
26033afa244SBram Moolenaar  w = 123
26133afa244SBram Moolenaar  assert_equal(123, w)
2625deeb3f1SBram Moolenaarenddef
2635deeb3f1SBram Moolenaar
2643b74b6b4SBram Moolenaardef Test_vim9_single_char_vars()
2653b74b6b4SBram Moolenaar  let lines =<< trim END
2663b74b6b4SBram Moolenaar      vim9script
2673b74b6b4SBram Moolenaar
268f5be8cdbSBram Moolenaar      # single character variable declarations work
2693b74b6b4SBram Moolenaar      let a: string
2703b74b6b4SBram Moolenaar      let b: number
2713b74b6b4SBram Moolenaar      let l: list<any>
2723b74b6b4SBram Moolenaar      let s: string
2733b74b6b4SBram Moolenaar      let t: number
2743b74b6b4SBram Moolenaar      let v: number
2753b74b6b4SBram Moolenaar      let w: number
2763b74b6b4SBram Moolenaar
277f5be8cdbSBram Moolenaar      # script-local variables can be used without s: prefix
2783b74b6b4SBram Moolenaar      a = 'script-a'
2793b74b6b4SBram Moolenaar      b = 111
2803b74b6b4SBram Moolenaar      l = [1, 2, 3]
2813b74b6b4SBram Moolenaar      s = 'script-s'
2823b74b6b4SBram Moolenaar      t = 222
2833b74b6b4SBram Moolenaar      v = 333
2843b74b6b4SBram Moolenaar      w = 444
2853b74b6b4SBram Moolenaar
2863b74b6b4SBram Moolenaar      assert_equal('script-a', a)
2873b74b6b4SBram Moolenaar      assert_equal(111, b)
2883b74b6b4SBram Moolenaar      assert_equal([1, 2, 3], l)
2893b74b6b4SBram Moolenaar      assert_equal('script-s', s)
2903b74b6b4SBram Moolenaar      assert_equal(222, t)
2913b74b6b4SBram Moolenaar      assert_equal(333, v)
2923b74b6b4SBram Moolenaar      assert_equal(444, w)
2933b74b6b4SBram Moolenaar  END
2943b74b6b4SBram Moolenaar  writefile(lines, 'Xsinglechar')
2953b74b6b4SBram Moolenaar  source Xsinglechar
2963b74b6b4SBram Moolenaar  delete('Xsinglechar')
2973b74b6b4SBram Moolenaarenddef
2983b74b6b4SBram Moolenaar
29984370087SBram Moolenaardef Test_assignment_list()
30084370087SBram Moolenaar  let list1: list<bool> = [false, true, false]
30184370087SBram Moolenaar  let list2: list<number> = [1, 2, 3]
30284370087SBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
30384370087SBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
30484370087SBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
30584370087SBram Moolenaar
30684370087SBram Moolenaar  let listS: list<string> = []
30784370087SBram Moolenaar  let listN: list<number> = []
30884370087SBram Moolenaar
30984370087SBram Moolenaar  assert_equal([1, 2, 3], list2)
31084370087SBram Moolenaar  list2[-1] = 99
31184370087SBram Moolenaar  assert_equal([1, 2, 99], list2)
31284370087SBram Moolenaar  list2[-2] = 88
31384370087SBram Moolenaar  assert_equal([1, 88, 99], list2)
31484370087SBram Moolenaar  list2[-3] = 77
31584370087SBram Moolenaar  assert_equal([77, 88, 99], list2)
316dd29f1b0SBram Moolenaar  list2 += [100]
317dd29f1b0SBram Moolenaar  assert_equal([77, 88, 99, 100], list2)
318dd29f1b0SBram Moolenaar
319dd29f1b0SBram Moolenaar  list3 += ['end']
320dd29f1b0SBram Moolenaar  assert_equal(['sdf', 'asdf', 'end'], list3)
321dd29f1b0SBram Moolenaar
322dd29f1b0SBram Moolenaar
323d2c61705SBram Moolenaar  CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
324d2c61705SBram Moolenaar  CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:')
32584370087SBram Moolenaar
32684370087SBram Moolenaar  # type becomes list<any>
32784370087SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
32884370087SBram Moolenaarenddef
32984370087SBram Moolenaar
330b31be3f9SBram Moolenaardef Test_assignment_list_vim9script()
331b31be3f9SBram Moolenaar  let lines =<< trim END
332b31be3f9SBram Moolenaar    vim9script
333b31be3f9SBram Moolenaar    let v1: number
334b31be3f9SBram Moolenaar    let v2: number
335b31be3f9SBram Moolenaar    let v3: number
336b31be3f9SBram Moolenaar    [v1, v2, v3] = [1, 2, 3]
337b31be3f9SBram Moolenaar    assert_equal([1, 2, 3], [v1, v2, v3])
338b31be3f9SBram Moolenaar  END
339d2c61705SBram Moolenaar  CheckScriptSuccess(lines)
340b31be3f9SBram Moolenaarenddef
341b31be3f9SBram Moolenaar
34284370087SBram Moolenaardef Test_assignment_dict()
34384370087SBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
34484370087SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
34584370087SBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
34684370087SBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
34774fae513SBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, two: 0z02}
34884370087SBram Moolenaar
349f5be8cdbSBram Moolenaar  # overwrite
350c785b9a7SBram Moolenaar  dict3['key'] = 'another'
351c785b9a7SBram Moolenaar
35258626872SBram Moolenaar  # empty key can be used
35358626872SBram Moolenaar  let dd = {}
35458626872SBram Moolenaar  dd[""] = 6
35558626872SBram Moolenaar  assert_equal({'': 6}, dd)
35684370087SBram Moolenaar
35784370087SBram Moolenaar  # type becomes dict<any>
35884370087SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
3598e4c8c85SBram Moolenaar
3608e4c8c85SBram Moolenaar  # assignment to script-local dict
3618e4c8c85SBram Moolenaar  let lines =<< trim END
3628e4c8c85SBram Moolenaar    vim9script
3638e4c8c85SBram Moolenaar    let test: dict<any> = {}
3648e4c8c85SBram Moolenaar    def FillDict(): dict<any>
3658e4c8c85SBram Moolenaar      test['a'] = 43
3668e4c8c85SBram Moolenaar      return test
3678e4c8c85SBram Moolenaar    enddef
3688e4c8c85SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3698e4c8c85SBram Moolenaar  END
3708e4c8c85SBram Moolenaar  call CheckScriptSuccess(lines)
3718e4c8c85SBram Moolenaar
3728e4c8c85SBram Moolenaar  lines =<< trim END
3738e4c8c85SBram Moolenaar    vim9script
3748e4c8c85SBram Moolenaar    let test: dict<any>
3758e4c8c85SBram Moolenaar    def FillDict(): dict<any>
3768e4c8c85SBram Moolenaar      test['a'] = 43
3778e4c8c85SBram Moolenaar      return test
3788e4c8c85SBram Moolenaar    enddef
3798e4c8c85SBram Moolenaar    FillDict()
3808e4c8c85SBram Moolenaar  END
3818e4c8c85SBram Moolenaar  call CheckScriptFailure(lines, 'E1103:')
3822caa1594SBram Moolenaar
3832caa1594SBram Moolenaar  # assignment to global dict
3842caa1594SBram Moolenaar  lines =<< trim END
3852caa1594SBram Moolenaar    vim9script
3862caa1594SBram Moolenaar    g:test = {}
3872caa1594SBram Moolenaar    def FillDict(): dict<any>
3882caa1594SBram Moolenaar      g:test['a'] = 43
3892caa1594SBram Moolenaar      return g:test
3902caa1594SBram Moolenaar    enddef
3912caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
3922caa1594SBram Moolenaar  END
3932caa1594SBram Moolenaar  call CheckScriptSuccess(lines)
3942caa1594SBram Moolenaar
3952caa1594SBram Moolenaar  # assignment to buffer dict
3962caa1594SBram Moolenaar  lines =<< trim END
3972caa1594SBram Moolenaar    vim9script
3982caa1594SBram Moolenaar    b:test = {}
3992caa1594SBram Moolenaar    def FillDict(): dict<any>
4002caa1594SBram Moolenaar      b:test['a'] = 43
4012caa1594SBram Moolenaar      return b:test
4022caa1594SBram Moolenaar    enddef
4032caa1594SBram Moolenaar    assert_equal(#{a: 43}, FillDict())
4042caa1594SBram Moolenaar  END
4052caa1594SBram Moolenaar  call CheckScriptSuccess(lines)
40684370087SBram Moolenaarenddef
40784370087SBram Moolenaar
408d3aac291SBram Moolenaardef Test_assignment_local()
409f5be8cdbSBram Moolenaar  # Test in a separated file in order not to the current buffer/window/tab is
410f5be8cdbSBram Moolenaar  # changed.
411d3aac291SBram Moolenaar  let script_lines: list<string> =<< trim END
412d3aac291SBram Moolenaar    let b:existing = 'yes'
413d3aac291SBram Moolenaar    let w:existing = 'yes'
414d3aac291SBram Moolenaar    let t:existing = 'yes'
415d3aac291SBram Moolenaar
416d3aac291SBram Moolenaar    def Test_assignment_local_internal()
417d3aac291SBram Moolenaar      b:newvar = 'new'
418d3aac291SBram Moolenaar      assert_equal('new', b:newvar)
419d3aac291SBram Moolenaar      assert_equal('yes', b:existing)
420d3aac291SBram Moolenaar      b:existing = 'no'
421d3aac291SBram Moolenaar      assert_equal('no', b:existing)
422396f3138SBram Moolenaar      b:existing ..= 'NO'
423396f3138SBram Moolenaar      assert_equal('noNO', b:existing)
424d3aac291SBram Moolenaar
425d3aac291SBram Moolenaar      w:newvar = 'new'
426d3aac291SBram Moolenaar      assert_equal('new', w:newvar)
427d3aac291SBram Moolenaar      assert_equal('yes', w:existing)
428d3aac291SBram Moolenaar      w:existing = 'no'
429d3aac291SBram Moolenaar      assert_equal('no', w:existing)
430396f3138SBram Moolenaar      w:existing ..= 'NO'
431396f3138SBram Moolenaar      assert_equal('noNO', w:existing)
432d3aac291SBram Moolenaar
433d3aac291SBram Moolenaar      t:newvar = 'new'
434d3aac291SBram Moolenaar      assert_equal('new', t:newvar)
435d3aac291SBram Moolenaar      assert_equal('yes', t:existing)
436d3aac291SBram Moolenaar      t:existing = 'no'
437d3aac291SBram Moolenaar      assert_equal('no', t:existing)
438396f3138SBram Moolenaar      t:existing ..= 'NO'
439396f3138SBram Moolenaar      assert_equal('noNO', t:existing)
440d3aac291SBram Moolenaar    enddef
441d3aac291SBram Moolenaar    call Test_assignment_local_internal()
442d3aac291SBram Moolenaar  END
443d3aac291SBram Moolenaar  call CheckScriptSuccess(script_lines)
444d3aac291SBram Moolenaarenddef
445d3aac291SBram Moolenaar
4465deeb3f1SBram Moolenaardef Test_assignment_default()
447e69f6d04SBram Moolenaar
448cb711abfSBram Moolenaar  # Test default values.
449e69f6d04SBram Moolenaar  let thebool: bool
450e69f6d04SBram Moolenaar  assert_equal(v:false, thebool)
451e69f6d04SBram Moolenaar
452e69f6d04SBram Moolenaar  let thenumber: number
453e69f6d04SBram Moolenaar  assert_equal(0, thenumber)
454e69f6d04SBram Moolenaar
455e69f6d04SBram Moolenaar  if has('float')
456e69f6d04SBram Moolenaar    let thefloat: float
457e69f6d04SBram Moolenaar    assert_equal(0.0, thefloat)
458e69f6d04SBram Moolenaar  endif
459e69f6d04SBram Moolenaar
460e69f6d04SBram Moolenaar  let thestring: string
461e69f6d04SBram Moolenaar  assert_equal('', thestring)
462e69f6d04SBram Moolenaar
463e69f6d04SBram Moolenaar  let theblob: blob
464e69f6d04SBram Moolenaar  assert_equal(0z, theblob)
465e69f6d04SBram Moolenaar
4665deeb3f1SBram Moolenaar  let Thefunc: func
4675deeb3f1SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
468e69f6d04SBram Moolenaar
469e69f6d04SBram Moolenaar  let thelist: list<any>
470e69f6d04SBram Moolenaar  assert_equal([], thelist)
471e69f6d04SBram Moolenaar
472e69f6d04SBram Moolenaar  let thedict: dict<any>
473e69f6d04SBram Moolenaar  assert_equal({}, thedict)
474e69f6d04SBram Moolenaar
4752c869deeSBram Moolenaar  if has('channel')
476e69f6d04SBram Moolenaar    let thejob: job
477e69f6d04SBram Moolenaar    assert_equal(test_null_job(), thejob)
478e69f6d04SBram Moolenaar
479e69f6d04SBram Moolenaar    let thechannel: channel
480e69f6d04SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
481c785b9a7SBram Moolenaar
482c785b9a7SBram Moolenaar    if has('unix') && executable('cat')
483f5be8cdbSBram Moolenaar      # check with non-null job and channel, types must match
484c785b9a7SBram Moolenaar      thejob = job_start("cat ", #{})
485c785b9a7SBram Moolenaar      thechannel = job_getchannel(thejob)
486c785b9a7SBram Moolenaar      job_stop(thejob, 'kill')
487c785b9a7SBram Moolenaar    endif
4882c869deeSBram Moolenaar  endif
489585fea7bSBram Moolenaar
490585fea7bSBram Moolenaar  let nr = 1234 | nr = 5678
491585fea7bSBram Moolenaar  assert_equal(5678, nr)
4928a7d6542SBram Moolenaarenddef
4938a7d6542SBram Moolenaar
49447a519a9SBram Moolenaardef Test_assignment_var_list()
49547a519a9SBram Moolenaar  let v1: string
49647a519a9SBram Moolenaar  let v2: string
4979af78769SBram Moolenaar  let vrem: list<string>
4989af78769SBram Moolenaar  [v1] = ['aaa']
4999af78769SBram Moolenaar  assert_equal('aaa', v1)
5009af78769SBram Moolenaar
50147a519a9SBram Moolenaar  [v1, v2] = ['one', 'two']
50247a519a9SBram Moolenaar  assert_equal('one', v1)
50347a519a9SBram Moolenaar  assert_equal('two', v2)
5049af78769SBram Moolenaar
5059af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two']
5069af78769SBram Moolenaar  assert_equal('one', v1)
5079af78769SBram Moolenaar  assert_equal('two', v2)
5089af78769SBram Moolenaar  assert_equal([], vrem)
5099af78769SBram Moolenaar
5109af78769SBram Moolenaar  [v1, v2; vrem] = ['one', 'two', 'three']
5119af78769SBram Moolenaar  assert_equal('one', v1)
5129af78769SBram Moolenaar  assert_equal('two', v2)
5139af78769SBram Moolenaar  assert_equal(['three'], vrem)
5141c199f9cSBram Moolenaar
5151c199f9cSBram Moolenaar  [&ts, &sw] = [3, 4]
5161c199f9cSBram Moolenaar  assert_equal(3, &ts)
5171c199f9cSBram Moolenaar  assert_equal(4, &sw)
5181c199f9cSBram Moolenaar  set ts=8 sw=4
51947a519a9SBram Moolenaarenddef
52047a519a9SBram Moolenaar
521c7e44a7eSBram Moolenaardef Test_assignment_vim9script()
522c7e44a7eSBram Moolenaar  let lines =<< trim END
523c7e44a7eSBram Moolenaar    vim9script
524c7e44a7eSBram Moolenaar    def Func(): list<number>
525c7e44a7eSBram Moolenaar      return [1, 2]
526c7e44a7eSBram Moolenaar    enddef
527c7e44a7eSBram Moolenaar    let var1: number
528c7e44a7eSBram Moolenaar    let var2: number
529c7e44a7eSBram Moolenaar    [var1, var2] =
530c7e44a7eSBram Moolenaar          Func()
531c7e44a7eSBram Moolenaar    assert_equal(1, var1)
532c7e44a7eSBram Moolenaar    assert_equal(2, var2)
533c7e44a7eSBram Moolenaar    let ll =
534c7e44a7eSBram Moolenaar          Func()
535c7e44a7eSBram Moolenaar    assert_equal([1, 2], ll)
53683144546SBram Moolenaar
53783144546SBram Moolenaar    @/ = 'text'
53883144546SBram Moolenaar    assert_equal('text', @/)
53983144546SBram Moolenaar    @0 = 'zero'
54083144546SBram Moolenaar    assert_equal('zero', @0)
54183144546SBram Moolenaar    @1 = 'one'
54283144546SBram Moolenaar    assert_equal('one', @1)
54383144546SBram Moolenaar    @9 = 'nine'
54483144546SBram Moolenaar    assert_equal('nine', @9)
54583144546SBram Moolenaar    @- = 'minus'
54683144546SBram Moolenaar    assert_equal('minus', @-)
54783144546SBram Moolenaar    if has('clipboard_working')
54883144546SBram Moolenaar      @* = 'star'
54983144546SBram Moolenaar      assert_equal('star', @*)
55083144546SBram Moolenaar      @+ = 'plus'
55183144546SBram Moolenaar      assert_equal('plus', @+)
55283144546SBram Moolenaar    endif
55395dd9f25SBram Moolenaar
55495dd9f25SBram Moolenaar    let a: number = 123
55595dd9f25SBram Moolenaar    assert_equal(123, a)
55695dd9f25SBram Moolenaar    let s: string = 'yes'
55795dd9f25SBram Moolenaar    assert_equal('yes', s)
55895dd9f25SBram Moolenaar    let b: number = 42
55995dd9f25SBram Moolenaar    assert_equal(42, b)
56095dd9f25SBram Moolenaar    let w: number = 43
56195dd9f25SBram Moolenaar    assert_equal(43, w)
56295dd9f25SBram Moolenaar    let t: number = 44
56395dd9f25SBram Moolenaar    assert_equal(44, t)
564c7e44a7eSBram Moolenaar  END
565c7e44a7eSBram Moolenaar  CheckScriptSuccess(lines)
566c7e44a7eSBram Moolenaarenddef
567c7e44a7eSBram Moolenaar
568cab27678SBram Moolenaardef Mess(): string
569cab27678SBram Moolenaar  v:foldstart = 123
570cab27678SBram Moolenaar  return 'xxx'
571cab27678SBram Moolenaarenddef
572cab27678SBram Moolenaar
573d72c1bf0SBram Moolenaardef Test_assignment_failure()
574d2c61705SBram Moolenaar  CheckDefFailure(['let var=234'], 'E1004:')
575d2c61705SBram Moolenaar  CheckDefFailure(['let var =234'], 'E1004:')
576d2c61705SBram Moolenaar  CheckDefFailure(['let var= 234'], 'E1004:')
5778a7d6542SBram Moolenaar
578d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:')
579d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='")
580d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:')
581d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:')
582d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:')
583d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='")
584d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:')
585d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='")
58663be3d4bSBram Moolenaar
587d2c61705SBram Moolenaar  CheckDefFailure(['let true = 1'], 'E1034:')
588d2c61705SBram Moolenaar  CheckDefFailure(['let false = 1'], 'E1034:')
5898a7d6542SBram Moolenaar
590d2c61705SBram Moolenaar  CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
591d2c61705SBram Moolenaar  CheckDefExecFailure(['let a: number',
5929af78769SBram Moolenaar                       '[a] = test_null_list()'], 'E1093:')
593d2c61705SBram Moolenaar  CheckDefExecFailure(['let a: number',
5949af78769SBram Moolenaar                       '[a] = []'], 'E1093:')
595d2c61705SBram Moolenaar  CheckDefExecFailure(['let x: number',
5969af78769SBram Moolenaar                       'let y: number',
5979af78769SBram Moolenaar                       '[x, y] = [1]'], 'E1093:')
598d2c61705SBram Moolenaar  CheckDefExecFailure(['let x: number',
5999af78769SBram Moolenaar                       'let y: number',
6009af78769SBram Moolenaar                       'let z: list<number>',
6019af78769SBram Moolenaar                       '[x, y; z] = [1]'], 'E1093:')
6029be61bbbSBram Moolenaar
603d2c61705SBram Moolenaar  CheckDefFailure(['let somevar'], "E1022:")
604d2c61705SBram Moolenaar  CheckDefFailure(['let &tabstop = 4'], 'E1052:')
605d2c61705SBram Moolenaar  CheckDefFailure(['&g:option = 5'], 'E113:')
606d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:')
6079be61bbbSBram Moolenaar
608d2c61705SBram Moolenaar  CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
609d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:')
6109be61bbbSBram Moolenaar
611434d72cbSBram Moolenaar  if has('dnd')
612d2c61705SBram Moolenaar    CheckDefFailure(['let @~ = 5'], 'E1066:')
613434d72cbSBram Moolenaar  else
614d2c61705SBram Moolenaar    CheckDefFailure(['let @~ = 5'], 'E354:')
615d2c61705SBram Moolenaar    CheckDefFailure(['@~ = 5'], 'E354:')
616434d72cbSBram Moolenaar  endif
617d2c61705SBram Moolenaar  CheckDefFailure(['let @a = 5'], 'E1066:')
618d2c61705SBram Moolenaar  CheckDefFailure(['let @/ = "x"'], 'E1066:')
619d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:')
6209be61bbbSBram Moolenaar
621d2c61705SBram Moolenaar  CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
622d2c61705SBram Moolenaar  CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
623d2c61705SBram Moolenaar  CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
624d2c61705SBram Moolenaar  CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
6259be61bbbSBram Moolenaar
626d2c61705SBram Moolenaar  CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
627d2c61705SBram Moolenaar  CheckDefFailure(['let xnr += 4'], 'E1020:', 1)
628d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let xnr += 4'], 'E1020:')
629d2c61705SBram Moolenaar  CheckDefFailure(["let xnr = xnr + 1"], 'E1001:', 1)
630d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'let xnr = xnr + 4'], 'E121:')
6319be61bbbSBram Moolenaar
632d2c61705SBram Moolenaar  CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1108:')
63333fa29cfSBram Moolenaar
634d2c61705SBram Moolenaar  CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
635d2c61705SBram Moolenaar  CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
6368a7d6542SBram Moolenaar
637d2c61705SBram Moolenaar  CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
638d2c61705SBram Moolenaar  CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
6398a7d6542SBram Moolenaar
640d2c61705SBram Moolenaar  CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
641d2c61705SBram Moolenaar  CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
64242a480bfSBram Moolenaar
643d2c61705SBram Moolenaar  CheckDefFailure(['let var: dict <number>'], 'E1068:')
644d2c61705SBram Moolenaar  CheckDefFailure(['let var: dict<number'], 'E1009:')
645cab27678SBram Moolenaar
646d2c61705SBram Moolenaar  assert_fails('s/^/\=Mess()/n', 'E794:')
647d2c61705SBram Moolenaar  CheckDefFailure(['let var: dict<number'], 'E1009:')
64843e969d3SBram Moolenaar
649d2c61705SBram Moolenaar  CheckDefFailure(['w:foo: number = 10'],
65043e969d3SBram Moolenaar                  'E488: Trailing characters: : number = 1')
651d2c61705SBram Moolenaar  CheckDefFailure(['t:foo: bool = true'],
65243e969d3SBram Moolenaar                  'E488: Trailing characters: : bool = true')
653d2c61705SBram Moolenaar  CheckDefFailure(['b:foo: string = "x"'],
65443e969d3SBram Moolenaar                  'E488: Trailing characters: : string = "x"')
655d2c61705SBram Moolenaar  CheckDefFailure(['g:foo: number = 123'],
65643e969d3SBram Moolenaar                  'E488: Trailing characters: : number = 123')
657d72c1bf0SBram Moolenaarenddef
658d72c1bf0SBram Moolenaar
659d72c1bf0SBram Moolenaardef Test_unlet()
660d72c1bf0SBram Moolenaar  g:somevar = 'yes'
661d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
662d72c1bf0SBram Moolenaar  unlet g:somevar
663d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
664d72c1bf0SBram Moolenaar  unlet! g:somevar
665d72c1bf0SBram Moolenaar
6668436773fSBram Moolenaar  # also works for script-local variable in legacy Vim script
6678436773fSBram Moolenaar  s:somevar = 'legacy'
6688436773fSBram Moolenaar  assert_true(exists('s:somevar'))
6698436773fSBram Moolenaar  unlet s:somevar
6708436773fSBram Moolenaar  assert_false(exists('s:somevar'))
6718436773fSBram Moolenaar  unlet! s:somevar
6728436773fSBram Moolenaar
673d2c61705SBram Moolenaar  CheckScriptFailure([
674d72c1bf0SBram Moolenaar   'vim9script',
675d72c1bf0SBram Moolenaar   'let svar = 123',
676d72c1bf0SBram Moolenaar   'unlet svar',
677d72c1bf0SBram Moolenaar   ], 'E1081:')
678d2c61705SBram Moolenaar  CheckScriptFailure([
679d72c1bf0SBram Moolenaar   'vim9script',
680d72c1bf0SBram Moolenaar   'let svar = 123',
681d72c1bf0SBram Moolenaar   'unlet s:svar',
682d72c1bf0SBram Moolenaar   ], 'E1081:')
683d2c61705SBram Moolenaar  CheckScriptFailure([
684d72c1bf0SBram Moolenaar   'vim9script',
685d72c1bf0SBram Moolenaar   'let svar = 123',
686d72c1bf0SBram Moolenaar   'def Func()',
687d72c1bf0SBram Moolenaar   '  unlet svar',
688d72c1bf0SBram Moolenaar   'enddef',
689822ba247SBram Moolenaar   'defcompile',
690d72c1bf0SBram Moolenaar   ], 'E1081:')
691d2c61705SBram Moolenaar  CheckScriptFailure([
692d72c1bf0SBram Moolenaar   'vim9script',
693d72c1bf0SBram Moolenaar   'let svar = 123',
694d72c1bf0SBram Moolenaar   'def Func()',
695d72c1bf0SBram Moolenaar   '  unlet s:svar',
696d72c1bf0SBram Moolenaar   'enddef',
697822ba247SBram Moolenaar   'defcompile',
698d72c1bf0SBram Moolenaar   ], 'E1081:')
6997bdaea6eSBram Moolenaar
7007bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
7017bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
7027bdaea6eSBram Moolenaar  unlet $ENVVAR
7037bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
704d72c1bf0SBram Moolenaarenddef
705599c89c8SBram Moolenaar
7064c17ad94SBram Moolenaardef Test_delfunction()
707f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
7084c17ad94SBram Moolenaar  CheckScriptSuccess([
7094c17ad94SBram Moolenaar      'vim9script',
7104c17ad94SBram Moolenaar      'func CheckMe()',
7114c17ad94SBram Moolenaar      '  return 123',
7124c17ad94SBram Moolenaar      'endfunc',
7134c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
7144c17ad94SBram Moolenaar      ])
7154c17ad94SBram Moolenaar
716f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
7174c17ad94SBram Moolenaar  CheckScriptFailure([
7184c17ad94SBram Moolenaar      'vim9script',
7194c17ad94SBram Moolenaar      'func DeleteMe1()',
7204c17ad94SBram Moolenaar      'endfunc',
7214c17ad94SBram Moolenaar      'delfunction DeleteMe1',
7224c17ad94SBram Moolenaar      ], 'E1084:')
7234c17ad94SBram Moolenaar  CheckScriptFailure([
7244c17ad94SBram Moolenaar      'vim9script',
7254c17ad94SBram Moolenaar      'func DeleteMe2()',
7264c17ad94SBram Moolenaar      'endfunc',
7274c17ad94SBram Moolenaar      'def DoThat()',
7284c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
7294c17ad94SBram Moolenaar      'enddef',
7304c17ad94SBram Moolenaar      'DoThat()',
7314c17ad94SBram Moolenaar      ], 'E1084:')
7324c17ad94SBram Moolenaar  CheckScriptFailure([
7334c17ad94SBram Moolenaar      'vim9script',
7344c17ad94SBram Moolenaar      'def DeleteMe3()',
7354c17ad94SBram Moolenaar      'enddef',
7364c17ad94SBram Moolenaar      'delfunction DeleteMe3',
7374c17ad94SBram Moolenaar      ], 'E1084:')
7384c17ad94SBram Moolenaar  CheckScriptFailure([
7394c17ad94SBram Moolenaar      'vim9script',
7404c17ad94SBram Moolenaar      'def DeleteMe4()',
7414c17ad94SBram Moolenaar      'enddef',
7424c17ad94SBram Moolenaar      'def DoThat()',
7434c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
7444c17ad94SBram Moolenaar      'enddef',
7454c17ad94SBram Moolenaar      'DoThat()',
7464c17ad94SBram Moolenaar      ], 'E1084:')
747925e9fd6SBram Moolenaar
748925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
749925e9fd6SBram Moolenaar  let lines =<< trim END
750925e9fd6SBram Moolenaar      vim9script
751925e9fd6SBram Moolenaar      def g:Global(): string
752925e9fd6SBram Moolenaar        return "yes"
753925e9fd6SBram Moolenaar      enddef
754925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
755925e9fd6SBram Moolenaar      def! g:Global(): string
756925e9fd6SBram Moolenaar        return "no"
757925e9fd6SBram Moolenaar      enddef
758925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
759925e9fd6SBram Moolenaar      delfunc g:Global
760925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
761925e9fd6SBram Moolenaar  END
762925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
763925e9fd6SBram Moolenaar
764925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
765925e9fd6SBram Moolenaar  lines =<< trim END
766925e9fd6SBram Moolenaar      vim9script
767925e9fd6SBram Moolenaar      func g:Global()
768925e9fd6SBram Moolenaar        return "yes"
769925e9fd6SBram Moolenaar      endfunc
770925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
771925e9fd6SBram Moolenaar      def! g:Global(): string
772925e9fd6SBram Moolenaar        return "no"
773925e9fd6SBram Moolenaar      enddef
774925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
775925e9fd6SBram Moolenaar      delfunc g:Global
776925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
777925e9fd6SBram Moolenaar  END
778925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
779925e9fd6SBram Moolenaar
780925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
781925e9fd6SBram Moolenaar  lines =<< trim END
782925e9fd6SBram Moolenaar      vim9script
783925e9fd6SBram Moolenaar      def g:Global(): string
784925e9fd6SBram Moolenaar        return "yes"
785925e9fd6SBram Moolenaar      enddef
786925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
787925e9fd6SBram Moolenaar      func! g:Global()
788925e9fd6SBram Moolenaar        return "no"
789925e9fd6SBram Moolenaar      endfunc
790925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
791925e9fd6SBram Moolenaar      delfunc g:Global
792925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
793925e9fd6SBram Moolenaar  END
794925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
7954c17ad94SBram Moolenaarenddef
7964c17ad94SBram Moolenaar
797599c89c8SBram Moolenaarfunc Test_wrong_type()
798599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
799599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
800599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
801599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
802599c89c8SBram Moolenaar
803599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
804599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
80542a480bfSBram Moolenaar
80642a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
80742a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
80842a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
80942a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
81042a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
81142a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
81242a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
81342a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
81442a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
81542a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
81642a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
817a0a9f43aSBram Moolenaar
818a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
819a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
8208a7d6542SBram Moolenaarendfunc
8218a7d6542SBram Moolenaar
8228a7d6542SBram Moolenaarfunc Test_const()
8238a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
8248a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
8258a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
8269be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
8278a7d6542SBram Moolenaarendfunc
8288a7d6542SBram Moolenaar
829df069eecSBram Moolenaardef Test_range_no_colon()
830d2c61705SBram Moolenaar  CheckDefFailure(['%s/a/b/'], 'E1050:')
831d2c61705SBram Moolenaar  CheckDefFailure(['+ s/a/b/'], 'E1050:')
832d2c61705SBram Moolenaar  CheckDefFailure(['- s/a/b/'], 'E1050:')
833d2c61705SBram Moolenaar  CheckDefFailure(['. s/a/b/'], 'E1050:')
834df069eecSBram Moolenaarenddef
835df069eecSBram Moolenaar
836df069eecSBram Moolenaar
8378a7d6542SBram Moolenaardef Test_block()
8388a7d6542SBram Moolenaar  let outer = 1
8398a7d6542SBram Moolenaar  {
8408a7d6542SBram Moolenaar    let inner = 2
8418a7d6542SBram Moolenaar    assert_equal(1, outer)
8428a7d6542SBram Moolenaar    assert_equal(2, inner)
8438a7d6542SBram Moolenaar  }
8448a7d6542SBram Moolenaar  assert_equal(1, outer)
8458a7d6542SBram Moolenaarenddef
8468a7d6542SBram Moolenaar
8478a7d6542SBram Moolenaarfunc Test_block_failure()
8488a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
849585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
850585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
8518a7d6542SBram Moolenaarendfunc
8528a7d6542SBram Moolenaar
853d032f34aSBram Moolenaarfunc g:NoSuchFunc()
854d032f34aSBram Moolenaar  echo 'none'
855d032f34aSBram Moolenaarendfunc
856d032f34aSBram Moolenaar
8578a7d6542SBram Moolenaardef Test_try_catch()
8588a7d6542SBram Moolenaar  let l = []
8597a092245SBram Moolenaar  try # comment
8608a7d6542SBram Moolenaar    add(l, '1')
8618a7d6542SBram Moolenaar    throw 'wrong'
8628a7d6542SBram Moolenaar    add(l, '2')
8637a092245SBram Moolenaar  catch # comment
8648a7d6542SBram Moolenaar    add(l, v:exception)
8657a092245SBram Moolenaar  finally # comment
8668a7d6542SBram Moolenaar    add(l, '3')
8677a092245SBram Moolenaar  endtry # comment
8688a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
86968d130c6SBram Moolenaar
870e859312eSBram Moolenaar  l = []
871e859312eSBram Moolenaar  try
872e859312eSBram Moolenaar    try
873e859312eSBram Moolenaar      add(l, '1')
874e859312eSBram Moolenaar      throw 'wrong'
875e859312eSBram Moolenaar      add(l, '2')
876e859312eSBram Moolenaar    catch /right/
877e859312eSBram Moolenaar      add(l, v:exception)
878e859312eSBram Moolenaar    endtry
879e859312eSBram Moolenaar  catch /wrong/
880e859312eSBram Moolenaar    add(l, 'caught')
881e859312eSBram Moolenaar  finally
882e859312eSBram Moolenaar    add(l, 'finally')
883e859312eSBram Moolenaar  endtry
884e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
885e859312eSBram Moolenaar
88668d130c6SBram Moolenaar  let n: number
88768d130c6SBram Moolenaar  try
88868d130c6SBram Moolenaar    n = l[3]
88968d130c6SBram Moolenaar  catch /E684:/
89068d130c6SBram Moolenaar    n = 99
89168d130c6SBram Moolenaar  endtry
89268d130c6SBram Moolenaar  assert_equal(99, n)
89368d130c6SBram Moolenaar
89468d130c6SBram Moolenaar  try
895cc673e74SBram Moolenaar    # string slice returns a string, not a number
89668d130c6SBram Moolenaar    n = g:astring[3]
89756acb094SBram Moolenaar  catch /E1029:/
89868d130c6SBram Moolenaar    n = 77
89968d130c6SBram Moolenaar  endtry
90068d130c6SBram Moolenaar  assert_equal(77, n)
90168d130c6SBram Moolenaar
90268d130c6SBram Moolenaar  try
90368d130c6SBram Moolenaar    n = l[g:astring]
90456acb094SBram Moolenaar  catch /E1029:/
90556acb094SBram Moolenaar    n = 88
90668d130c6SBram Moolenaar  endtry
90756acb094SBram Moolenaar  assert_equal(88, n)
90868d130c6SBram Moolenaar
90968d130c6SBram Moolenaar  try
91068d130c6SBram Moolenaar    n = s:does_not_exist
91168d130c6SBram Moolenaar  catch /E121:/
912f0b9f43cSBram Moolenaar    n = 111
913f0b9f43cSBram Moolenaar  endtry
914f0b9f43cSBram Moolenaar  assert_equal(111, n)
915f0b9f43cSBram Moolenaar
916f0b9f43cSBram Moolenaar  try
917f0b9f43cSBram Moolenaar    n = g:does_not_exist
918f0b9f43cSBram Moolenaar  catch /E121:/
91968d130c6SBram Moolenaar    n = 121
92068d130c6SBram Moolenaar  endtry
92168d130c6SBram Moolenaar  assert_equal(121, n)
92268d130c6SBram Moolenaar
92368d130c6SBram Moolenaar  let d = #{one: 1}
92468d130c6SBram Moolenaar  try
92568d130c6SBram Moolenaar    n = d[g:astring]
92668d130c6SBram Moolenaar  catch /E716:/
92768d130c6SBram Moolenaar    n = 222
92868d130c6SBram Moolenaar  endtry
92968d130c6SBram Moolenaar  assert_equal(222, n)
930f0b9f43cSBram Moolenaar
931f0b9f43cSBram Moolenaar  try
932f0b9f43cSBram Moolenaar    n = -g:astring
933f0b9f43cSBram Moolenaar  catch /E39:/
934f0b9f43cSBram Moolenaar    n = 233
935f0b9f43cSBram Moolenaar  endtry
936f0b9f43cSBram Moolenaar  assert_equal(233, n)
937f0b9f43cSBram Moolenaar
938f0b9f43cSBram Moolenaar  try
939f0b9f43cSBram Moolenaar    n = +g:astring
940f0b9f43cSBram Moolenaar  catch /E1030:/
941f0b9f43cSBram Moolenaar    n = 244
942f0b9f43cSBram Moolenaar  endtry
943f0b9f43cSBram Moolenaar  assert_equal(244, n)
944f0b9f43cSBram Moolenaar
945f0b9f43cSBram Moolenaar  try
946f0b9f43cSBram Moolenaar    n = +g:alist
947f0b9f43cSBram Moolenaar  catch /E745:/
948f0b9f43cSBram Moolenaar    n = 255
949f0b9f43cSBram Moolenaar  endtry
950f0b9f43cSBram Moolenaar  assert_equal(255, n)
951f0b9f43cSBram Moolenaar
952f0b9f43cSBram Moolenaar  let nd: dict<any>
953f0b9f43cSBram Moolenaar  try
954f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
955f0b9f43cSBram Moolenaar  catch /E1029:/
956f0b9f43cSBram Moolenaar    n = 266
957f0b9f43cSBram Moolenaar  endtry
958f0b9f43cSBram Moolenaar  assert_equal(266, n)
959f0b9f43cSBram Moolenaar
960f0b9f43cSBram Moolenaar  try
961f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
962f0b9f43cSBram Moolenaar  catch /E1093:/
963f0b9f43cSBram Moolenaar    n = 277
964f0b9f43cSBram Moolenaar  endtry
965f0b9f43cSBram Moolenaar  assert_equal(277, n)
966f0b9f43cSBram Moolenaar
967e859312eSBram Moolenaar  try
968e859312eSBram Moolenaar    &ts = g:astring
969e859312eSBram Moolenaar  catch /E1029:/
970e859312eSBram Moolenaar    n = 288
971e859312eSBram Moolenaar  endtry
972e859312eSBram Moolenaar  assert_equal(288, n)
973e859312eSBram Moolenaar
974e859312eSBram Moolenaar  try
975e859312eSBram Moolenaar    &backspace = 'asdf'
976e859312eSBram Moolenaar  catch /E474:/
977e859312eSBram Moolenaar    n = 299
978e859312eSBram Moolenaar  endtry
979e859312eSBram Moolenaar  assert_equal(299, n)
980e859312eSBram Moolenaar
981e859312eSBram Moolenaar  l = [1]
982e859312eSBram Moolenaar  try
983e859312eSBram Moolenaar    l[3] = 3
984e859312eSBram Moolenaar  catch /E684:/
985e859312eSBram Moolenaar    n = 300
986e859312eSBram Moolenaar  endtry
987e859312eSBram Moolenaar  assert_equal(300, n)
988e859312eSBram Moolenaar
989e859312eSBram Moolenaar  try
990e859312eSBram Moolenaar    unlet g:does_not_exist
991e859312eSBram Moolenaar  catch /E108:/
992e859312eSBram Moolenaar    n = 322
993e859312eSBram Moolenaar  endtry
994e859312eSBram Moolenaar  assert_equal(322, n)
995e859312eSBram Moolenaar
996e859312eSBram Moolenaar  try
997e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
998e859312eSBram Moolenaar  catch /E721:/
999e859312eSBram Moolenaar    n = 333
1000e859312eSBram Moolenaar  endtry
1001e859312eSBram Moolenaar  assert_equal(333, n)
1002e859312eSBram Moolenaar
1003e859312eSBram Moolenaar  try
1004e859312eSBram Moolenaar    l = DeletedFunc()
1005e859312eSBram Moolenaar  catch /E933:/
1006e859312eSBram Moolenaar    n = 344
1007e859312eSBram Moolenaar  endtry
1008e859312eSBram Moolenaar  assert_equal(344, n)
1009d032f34aSBram Moolenaar
1010d032f34aSBram Moolenaar  try
1011d032f34aSBram Moolenaar    echo len(v:true)
1012d032f34aSBram Moolenaar  catch /E701:/
1013d032f34aSBram Moolenaar    n = 355
1014d032f34aSBram Moolenaar  endtry
1015d032f34aSBram Moolenaar  assert_equal(355, n)
1016d032f34aSBram Moolenaar
1017d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
1018d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
1019d032f34aSBram Moolenaar  try
1020d032f34aSBram Moolenaar    echo P()
1021d032f34aSBram Moolenaar  catch /E117:/
1022d032f34aSBram Moolenaar    n = 366
1023d032f34aSBram Moolenaar  endtry
1024d032f34aSBram Moolenaar  assert_equal(366, n)
1025d032f34aSBram Moolenaar
1026d032f34aSBram Moolenaar  try
1027d032f34aSBram Moolenaar    echo g:NoSuchFunc()
1028d032f34aSBram Moolenaar  catch /E117:/
1029d032f34aSBram Moolenaar    n = 377
1030d032f34aSBram Moolenaar  endtry
1031d032f34aSBram Moolenaar  assert_equal(377, n)
1032d032f34aSBram Moolenaar
1033d032f34aSBram Moolenaar  try
1034d032f34aSBram Moolenaar    echo g:alist + 4
1035d032f34aSBram Moolenaar  catch /E745:/
1036d032f34aSBram Moolenaar    n = 388
1037d032f34aSBram Moolenaar  endtry
1038d032f34aSBram Moolenaar  assert_equal(388, n)
1039d032f34aSBram Moolenaar
1040d032f34aSBram Moolenaar  try
1041d032f34aSBram Moolenaar    echo 4 + g:alist
1042d032f34aSBram Moolenaar  catch /E745:/
1043d032f34aSBram Moolenaar    n = 399
1044d032f34aSBram Moolenaar  endtry
1045d032f34aSBram Moolenaar  assert_equal(399, n)
1046d032f34aSBram Moolenaar
1047d032f34aSBram Moolenaar  try
1048d032f34aSBram Moolenaar    echo g:alist.member
1049d032f34aSBram Moolenaar  catch /E715:/
1050d032f34aSBram Moolenaar    n = 400
1051d032f34aSBram Moolenaar  endtry
1052d032f34aSBram Moolenaar  assert_equal(400, n)
1053d032f34aSBram Moolenaar
1054d032f34aSBram Moolenaar  try
1055d032f34aSBram Moolenaar    echo d.member
1056d032f34aSBram Moolenaar  catch /E716:/
1057d032f34aSBram Moolenaar    n = 411
1058d032f34aSBram Moolenaar  endtry
1059d032f34aSBram Moolenaar  assert_equal(411, n)
10608a7d6542SBram Moolenaarenddef
10618a7d6542SBram Moolenaar
1062e859312eSBram Moolenaardef DeletedFunc(): list<any>
1063e859312eSBram Moolenaar  return ['delete me']
1064e859312eSBram Moolenaarenddef
1065e859312eSBram Moolenaardefcompile
1066e859312eSBram Moolenaardelfunc DeletedFunc
1067e859312eSBram Moolenaar
1068257cc5eeSBram Moolenaardef ThrowFromDef()
1069a72cfb80SBram Moolenaar  throw "getout" # comment
1070257cc5eeSBram Moolenaarenddef
1071257cc5eeSBram Moolenaar
1072257cc5eeSBram Moolenaarfunc CatchInFunc()
1073257cc5eeSBram Moolenaar  try
1074257cc5eeSBram Moolenaar    call ThrowFromDef()
1075257cc5eeSBram Moolenaar  catch
1076257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
1077257cc5eeSBram Moolenaar  endtry
1078257cc5eeSBram Moolenaarendfunc
1079257cc5eeSBram Moolenaar
1080257cc5eeSBram Moolenaardef CatchInDef()
1081257cc5eeSBram Moolenaar  try
1082257cc5eeSBram Moolenaar    ThrowFromDef()
1083257cc5eeSBram Moolenaar  catch
1084257cc5eeSBram Moolenaar    g:thrown_def = v:exception
1085257cc5eeSBram Moolenaar  endtry
1086257cc5eeSBram Moolenaarenddef
1087257cc5eeSBram Moolenaar
1088f575adffSBram Moolenaardef ReturnFinally(): string
1089f575adffSBram Moolenaar  try
1090f575adffSBram Moolenaar    return 'intry'
1091f575adffSBram Moolenaar  finally
1092f575adffSBram Moolenaar    g:in_finally = 'finally'
1093f575adffSBram Moolenaar  endtry
1094f575adffSBram Moolenaar  return 'end'
1095f575adffSBram Moolenaarenddef
1096f575adffSBram Moolenaar
1097257cc5eeSBram Moolenaardef Test_try_catch_nested()
1098257cc5eeSBram Moolenaar  CatchInFunc()
1099257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
1100257cc5eeSBram Moolenaar
1101257cc5eeSBram Moolenaar  CatchInDef()
1102257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
1103f575adffSBram Moolenaar
1104f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
1105f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
1106f575adffSBram Moolenaarenddef
1107f575adffSBram Moolenaar
1108f575adffSBram Moolenaardef Test_try_catch_match()
1109f575adffSBram Moolenaar  let seq = 'a'
1110f575adffSBram Moolenaar  try
1111f575adffSBram Moolenaar    throw 'something'
1112f575adffSBram Moolenaar  catch /nothing/
1113f575adffSBram Moolenaar    seq ..= 'x'
1114f575adffSBram Moolenaar  catch /some/
1115f575adffSBram Moolenaar    seq ..= 'b'
1116f575adffSBram Moolenaar  catch /asdf/
1117f575adffSBram Moolenaar    seq ..= 'x'
1118e8c4abbbSBram Moolenaar  catch ?a\?sdf?
1119e8c4abbbSBram Moolenaar    seq ..= 'y'
1120f575adffSBram Moolenaar  finally
1121f575adffSBram Moolenaar    seq ..= 'c'
1122f575adffSBram Moolenaar  endtry
1123f575adffSBram Moolenaar  assert_equal('abc', seq)
1124257cc5eeSBram Moolenaarenddef
1125257cc5eeSBram Moolenaar
1126e8c4abbbSBram Moolenaardef Test_try_catch_fails()
1127d2c61705SBram Moolenaar  CheckDefFailure(['catch'], 'E603:')
1128d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1129d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1130d2c61705SBram Moolenaar  CheckDefFailure(['finally'], 'E606:')
1131d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1132d2c61705SBram Moolenaar  CheckDefFailure(['endtry'], 'E602:')
1133d2c61705SBram Moolenaar  CheckDefFailure(['while 1', 'endtry'], 'E170:')
1134d2c61705SBram Moolenaar  CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1135d2c61705SBram Moolenaar  CheckDefFailure(['if 2', 'endtry'], 'E171:')
1136d2c61705SBram Moolenaar  CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
1137585fea7bSBram Moolenaar
1138d2c61705SBram Moolenaar  CheckDefFailure(['throw'], 'E1015:')
1139d2c61705SBram Moolenaar  CheckDefFailure(['throw xxx'], 'E1001:')
1140e8c4abbbSBram Moolenaarenddef
1141e8c4abbbSBram Moolenaar
1142006ad48bSBram Moolenaardef Test_throw_vimscript()
1143f5be8cdbSBram Moolenaar  # only checks line continuation
1144006ad48bSBram Moolenaar  let lines =<< trim END
1145006ad48bSBram Moolenaar      vim9script
1146006ad48bSBram Moolenaar      try
1147006ad48bSBram Moolenaar        throw 'one'
1148006ad48bSBram Moolenaar              .. 'two'
1149006ad48bSBram Moolenaar      catch
1150006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
1151006ad48bSBram Moolenaar      endtry
1152006ad48bSBram Moolenaar  END
1153006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
1154006ad48bSBram Moolenaarenddef
1155006ad48bSBram Moolenaar
1156ed677f55SBram Moolenaardef Test_error_in_nested_function()
1157ed677f55SBram Moolenaar  # an error in a nested :function aborts executin in the calling :def function
1158ed677f55SBram Moolenaar  let lines =<< trim END
1159ed677f55SBram Moolenaar      vim9script
1160ed677f55SBram Moolenaar      def Func()
1161ed677f55SBram Moolenaar        Error()
1162ed677f55SBram Moolenaar        g:test_var = 1
1163ed677f55SBram Moolenaar      enddef
1164ed677f55SBram Moolenaar      func Error() abort
1165ed677f55SBram Moolenaar        eval [][0]
1166ed677f55SBram Moolenaar      endfunc
1167ed677f55SBram Moolenaar      Func()
1168ed677f55SBram Moolenaar  END
1169ed677f55SBram Moolenaar  g:test_var = 0
1170ed677f55SBram Moolenaar  CheckScriptFailure(lines, 'E684:')
1171ed677f55SBram Moolenaar  assert_equal(0, g:test_var)
1172ed677f55SBram Moolenaarenddef
1173ed677f55SBram Moolenaar
117437c83711SBram Moolenaardef Test_cexpr_vimscript()
1175f5be8cdbSBram Moolenaar  # only checks line continuation
117637c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
117737c83711SBram Moolenaar  let lines =<< trim END
117837c83711SBram Moolenaar      vim9script
117937c83711SBram Moolenaar      cexpr 'File'
118037c83711SBram Moolenaar                .. ' someFile' ..
118137c83711SBram Moolenaar                   ' line 19'
118237c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
118337c83711SBram Moolenaar  END
118437c83711SBram Moolenaar  CheckScriptSuccess(lines)
118537c83711SBram Moolenaar  set errorformat&
118637c83711SBram Moolenaarenddef
118737c83711SBram Moolenaar
1188c9edd6b5SBram Moolenaardef Test_statusline_syntax()
1189c9edd6b5SBram Moolenaar  # legacy syntax is used for 'statusline'
1190c9edd6b5SBram Moolenaar  let lines =<< trim END
1191c9edd6b5SBram Moolenaar      vim9script
1192c9edd6b5SBram Moolenaar      func g:Status()
1193c9edd6b5SBram Moolenaar        return '%{"x" is# "x"}'
1194c9edd6b5SBram Moolenaar      endfunc
1195c9edd6b5SBram Moolenaar      set laststatus=2 statusline=%!Status()
1196c9edd6b5SBram Moolenaar      redrawstatus
1197c9edd6b5SBram Moolenaar      set laststatus statusline=
1198c9edd6b5SBram Moolenaar  END
1199c9edd6b5SBram Moolenaar  CheckScriptSuccess(lines)
1200c9edd6b5SBram Moolenaarenddef
1201c9edd6b5SBram Moolenaar
1202b209750bSBram Moolenaardef Test_list_vimscript()
1203b209750bSBram Moolenaar  # checks line continuation and comments
1204b209750bSBram Moolenaar  let lines =<< trim END
1205b209750bSBram Moolenaar      vim9script
1206b209750bSBram Moolenaar      let mylist = [
1207b209750bSBram Moolenaar            'one',
1208b209750bSBram Moolenaar            # comment
1209b209750bSBram Moolenaar            'two', # empty line follows
1210b209750bSBram Moolenaar
1211b209750bSBram Moolenaar            'three',
1212b209750bSBram Moolenaar            ]
1213b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
1214b209750bSBram Moolenaar  END
1215b209750bSBram Moolenaar  CheckScriptSuccess(lines)
121666250c93SBram Moolenaar
121766250c93SBram Moolenaar  # check all lines from heredoc are kept
121866250c93SBram Moolenaar  lines =<< trim END
121966250c93SBram Moolenaar      # comment 1
122066250c93SBram Moolenaar      two
122166250c93SBram Moolenaar      # comment 3
122266250c93SBram Moolenaar
122366250c93SBram Moolenaar      five
122466250c93SBram Moolenaar      # comment 6
122566250c93SBram Moolenaar  END
122666250c93SBram Moolenaar  assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
1227b209750bSBram Moolenaarenddef
1228b209750bSBram Moolenaar
12292a1381c3SBram Moolenaarif has('channel')
123040ee466cSBram Moolenaar  let someJob = test_null_job()
123140ee466cSBram Moolenaar
123240ee466cSBram Moolenaar  def FuncWithError()
123340ee466cSBram Moolenaar    echomsg g:someJob
123440ee466cSBram Moolenaar  enddef
123540ee466cSBram Moolenaar
123640ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
123740ee466cSBram Moolenaar    try
123840ee466cSBram Moolenaar      call FuncWithError()
123940ee466cSBram Moolenaar    catch
124040ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
124140ee466cSBram Moolenaar    endtry
124240ee466cSBram Moolenaar  endfunc
12432a1381c3SBram Moolenaarendif
124440ee466cSBram Moolenaar
12458a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
12468a7d6542SBram Moolenaar  vim9script
12478a7d6542SBram Moolenaar  let name: string = 'bob'
12488a7d6542SBram Moolenaar  def Concat(arg: string): string
12498a7d6542SBram Moolenaar    return name .. arg
12508a7d6542SBram Moolenaar  enddef
1251227a69deSBram Moolenaar  g:result = Concat('bie')
1252227a69deSBram Moolenaar  g:localname = name
12538a7d6542SBram Moolenaar
12548a7d6542SBram Moolenaar  export const CONST = 1234
12558a7d6542SBram Moolenaar  export let exported = 9876
12566e587dcbSBram Moolenaar  export let exp_name = 'John'
12578a7d6542SBram Moolenaar  export def Exported(): string
12588a7d6542SBram Moolenaar    return 'Exported'
12598a7d6542SBram Moolenaar  enddef
12608a7d6542SBram MoolenaarEND
12618a7d6542SBram Moolenaar
1262b3ca9824SBram Moolenaardef Undo_export_script_lines()
1263b3ca9824SBram Moolenaar  unlet g:result
1264b3ca9824SBram Moolenaar  unlet g:localname
1265b3ca9824SBram Moolenaarenddef
1266b3ca9824SBram Moolenaar
12675269bd2aSBram Moolenaardef Test_vim9_import_export()
12688a7d6542SBram Moolenaar  let import_script_lines =<< trim END
12698a7d6542SBram Moolenaar    vim9script
12708a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
12718a7d6542SBram Moolenaar    g:imported = exported
12726e587dcbSBram Moolenaar    exported += 3
12736e587dcbSBram Moolenaar    g:imported_added = exported
12748a7d6542SBram Moolenaar    g:imported_func = Exported()
12756e587dcbSBram Moolenaar
127640f4f7a4SBram Moolenaar    def GetExported(): string
127740f4f7a4SBram Moolenaar      let local_dict = #{ref: Exported}
127840f4f7a4SBram Moolenaar      return local_dict.ref()
127940f4f7a4SBram Moolenaar    enddef
128040f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
128140f4f7a4SBram Moolenaar
12826e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
12836e587dcbSBram Moolenaar    g:imported_name = exp_name
12846e587dcbSBram Moolenaar    exp_name ..= ' Doe'
12856e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
12865381c7a1SBram Moolenaar    g:imported_later = exported
12878a7d6542SBram Moolenaar  END
12888a7d6542SBram Moolenaar
12898a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
12908a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
12918a7d6542SBram Moolenaar
12928a7d6542SBram Moolenaar  source Ximport.vim
12938a7d6542SBram Moolenaar
12948a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
12958a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
12968a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
12976e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
12985381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
12998a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
130040f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
13016e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
13026e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
13038a7d6542SBram Moolenaar  assert_false(exists('g:name'))
13048a7d6542SBram Moolenaar
1305b3ca9824SBram Moolenaar  Undo_export_script_lines()
13068a7d6542SBram Moolenaar  unlet g:imported
13076e587dcbSBram Moolenaar  unlet g:imported_added
13085381c7a1SBram Moolenaar  unlet g:imported_later
13098a7d6542SBram Moolenaar  unlet g:imported_func
13106e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
13118a7d6542SBram Moolenaar  delete('Ximport.vim')
1312f2d5c240SBram Moolenaar
13131c991144SBram Moolenaar  # similar, with line breaks
13141c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
13151c991144SBram Moolenaar    vim9script
13161c991144SBram Moolenaar    import {
13171c991144SBram Moolenaar        exported,
13181c991144SBram Moolenaar        Exported,
13191c991144SBram Moolenaar        }
13201c991144SBram Moolenaar        from
13211c991144SBram Moolenaar        './Xexport.vim'
13221c991144SBram Moolenaar    g:imported = exported
13231c991144SBram Moolenaar    exported += 5
13241c991144SBram Moolenaar    g:imported_added = exported
13251c991144SBram Moolenaar    g:imported_func = Exported()
13261c991144SBram Moolenaar  END
13271c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
13281c991144SBram Moolenaar  source Ximport_lbr.vim
13291c991144SBram Moolenaar
13301c991144SBram Moolenaar  assert_equal(9876, g:imported)
13311c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
13321c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
13331c991144SBram Moolenaar
13341c991144SBram Moolenaar  # exported script not sourced again
13351c991144SBram Moolenaar  assert_false(exists('g:result'))
13361c991144SBram Moolenaar  unlet g:imported
13371c991144SBram Moolenaar  unlet g:imported_added
13381c991144SBram Moolenaar  unlet g:imported_func
13391c991144SBram Moolenaar  delete('Ximport_lbr.vim')
13401c991144SBram Moolenaar
13411c991144SBram Moolenaar  # import inside :def function
13425381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
13435381c7a1SBram Moolenaar    vim9script
13445381c7a1SBram Moolenaar    def ImportInDef()
13455381c7a1SBram Moolenaar      import exported from './Xexport.vim'
13465381c7a1SBram Moolenaar      g:imported = exported
13475381c7a1SBram Moolenaar      exported += 7
13485381c7a1SBram Moolenaar      g:imported_added = exported
13495381c7a1SBram Moolenaar    enddef
13505381c7a1SBram Moolenaar    ImportInDef()
13515381c7a1SBram Moolenaar  END
13525381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
13535381c7a1SBram Moolenaar  source Ximport2.vim
1354f5be8cdbSBram Moolenaar  # TODO: this should be 9879
13555381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
13565381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
13575381c7a1SBram Moolenaar  unlet g:imported
13585381c7a1SBram Moolenaar  unlet g:imported_added
13595381c7a1SBram Moolenaar  delete('Ximport2.vim')
13605381c7a1SBram Moolenaar
1361f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
1362f2d5c240SBram Moolenaar    vim9script
1363f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1364f2d5c240SBram Moolenaar    def UseExport()
1365f2d5c240SBram Moolenaar      g:imported = Export.exported
1366f2d5c240SBram Moolenaar    enddef
1367f2d5c240SBram Moolenaar    UseExport()
1368f2d5c240SBram Moolenaar  END
1369f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1370f2d5c240SBram Moolenaar  source Ximport.vim
13715381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1372f2d5c240SBram Moolenaar
1373599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
1374599c89c8SBram Moolenaar    vim9script
1375599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1376599c89c8SBram Moolenaar    def Func()
1377599c89c8SBram Moolenaar      let dummy = 1
1378599c89c8SBram Moolenaar      let imported = Export + dummy
1379599c89c8SBram Moolenaar    enddef
1380822ba247SBram Moolenaar    defcompile
1381599c89c8SBram Moolenaar  END
1382599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
138344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
1384599c89c8SBram Moolenaar
1385599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
1386599c89c8SBram Moolenaar    vim9script
1387599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1388599c89c8SBram Moolenaar    def Func()
1389599c89c8SBram Moolenaar      let imported = Export . exported
1390599c89c8SBram Moolenaar    enddef
1391822ba247SBram Moolenaar    defcompile
1392599c89c8SBram Moolenaar  END
1393599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
139444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
1395599c89c8SBram Moolenaar
1396599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
1397599c89c8SBram Moolenaar    vim9script
1398599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1399599c89c8SBram Moolenaar    def Func()
1400599c89c8SBram Moolenaar      let imported = Export.
1401599c89c8SBram Moolenaar    enddef
1402822ba247SBram Moolenaar    defcompile
1403599c89c8SBram Moolenaar  END
1404599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
140544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
1406599c89c8SBram Moolenaar
14071c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
14081c991144SBram Moolenaar    vim9script
14091c991144SBram Moolenaar    import *
14101c991144SBram Moolenaar        as Export
14111c991144SBram Moolenaar        from
14121c991144SBram Moolenaar        './Xexport.vim'
14131c991144SBram Moolenaar    def UseExport()
14141c991144SBram Moolenaar      g:imported = Export.exported
14151c991144SBram Moolenaar    enddef
14161c991144SBram Moolenaar    UseExport()
14171c991144SBram Moolenaar  END
14181c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
14191c991144SBram Moolenaar  source Ximport.vim
14201c991144SBram Moolenaar  assert_equal(9883, g:imported)
14211c991144SBram Moolenaar
1422f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1423f2d5c240SBram Moolenaar    vim9script
1424f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1425f2d5c240SBram Moolenaar  END
1426f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
142744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
1428f2d5c240SBram Moolenaar
1429f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1430fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1431fa29c8abSBram Moolenaar    vim9script
1432fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1433fa29c8abSBram Moolenaar  END
1434fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
143544d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
1436fa29c8abSBram Moolenaar
1437f5be8cdbSBram Moolenaar  # try to import something that is already defined
14385269bd2aSBram Moolenaar  let import_already_defined =<< trim END
14395269bd2aSBram Moolenaar    vim9script
14405269bd2aSBram Moolenaar    let exported = 'something'
14415269bd2aSBram Moolenaar    import exported from './Xexport.vim'
14425269bd2aSBram Moolenaar  END
14435269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
144444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
14455269bd2aSBram Moolenaar
1446f5be8cdbSBram Moolenaar  # try to import something that is already defined
14475269bd2aSBram Moolenaar  import_already_defined =<< trim END
14485269bd2aSBram Moolenaar    vim9script
14495269bd2aSBram Moolenaar    let exported = 'something'
14505269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
14515269bd2aSBram Moolenaar  END
14525269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
145344d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
14545269bd2aSBram Moolenaar
1455f5be8cdbSBram Moolenaar  # try to import something that is already defined
14565269bd2aSBram Moolenaar  import_already_defined =<< trim END
14575269bd2aSBram Moolenaar    vim9script
14585269bd2aSBram Moolenaar    let exported = 'something'
14595269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
14605269bd2aSBram Moolenaar  END
14615269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
146244d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
14635269bd2aSBram Moolenaar
1464f5be8cdbSBram Moolenaar  # import a very long name, requires making a copy
1465fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1466fa29c8abSBram Moolenaar    vim9script
1467fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1468fa29c8abSBram Moolenaar  END
1469fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
147044d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
1471fa29c8abSBram Moolenaar
1472fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1473fa29c8abSBram Moolenaar    vim9script
1474fa29c8abSBram Moolenaar    import name './Xexport.vim'
1475fa29c8abSBram Moolenaar  END
1476fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
147744d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
1478fa29c8abSBram Moolenaar
1479fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1480fa29c8abSBram Moolenaar    vim9script
1481fa29c8abSBram Moolenaar    import name from Xexport.vim
1482fa29c8abSBram Moolenaar  END
1483fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
148444d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
1485fa29c8abSBram Moolenaar
1486fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1487fa29c8abSBram Moolenaar    vim9script
1488fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1489fa29c8abSBram Moolenaar  END
1490fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
149144d6652dSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
1492fa29c8abSBram Moolenaar
1493fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1494fa29c8abSBram Moolenaar    vim9script
1495fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1496fa29c8abSBram Moolenaar  END
14975269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
149844d6652dSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
1499fa29c8abSBram Moolenaar
1500f2d5c240SBram Moolenaar  delete('Ximport.vim')
15015269bd2aSBram Moolenaar  delete('Ximport3.vim')
15028a7d6542SBram Moolenaar  delete('Xexport.vim')
15038a7d6542SBram Moolenaar
1504f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1505750802b5SBram Moolenaar  set cpo&vi
1506750802b5SBram Moolenaar  let cpo_before = &cpo
1507750802b5SBram Moolenaar  let lines =<< trim END
1508750802b5SBram Moolenaar    vim9script
1509750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1510750802b5SBram Moolenaar  END
1511750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1512750802b5SBram Moolenaar  source Xvim9_script
1513750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1514750802b5SBram Moolenaar  set cpo&vim
1515750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1516750802b5SBram Moolenaar  delete('Xvim9_script')
1517750802b5SBram Moolenaarenddef
1518750802b5SBram Moolenaar
1519803af686SBram Moolenaarfunc g:Trigger()
1520803af686SBram Moolenaar  source Ximport.vim
1521803af686SBram Moolenaar  return "echo 'yes'\<CR>"
1522803af686SBram Moolenaarendfunc
1523803af686SBram Moolenaar
1524803af686SBram Moolenaardef Test_import_export_expr_map()
1525803af686SBram Moolenaar  # check that :import and :export work when buffer is locked
1526803af686SBram Moolenaar  let export_lines =<< trim END
1527803af686SBram Moolenaar    vim9script
1528803af686SBram Moolenaar    export def That(): string
1529803af686SBram Moolenaar      return 'yes'
1530803af686SBram Moolenaar    enddef
1531803af686SBram Moolenaar  END
1532803af686SBram Moolenaar  writefile(export_lines, 'Xexport_that.vim')
1533803af686SBram Moolenaar
1534803af686SBram Moolenaar  let import_lines =<< trim END
1535803af686SBram Moolenaar    vim9script
1536803af686SBram Moolenaar    import That from './Xexport_that.vim'
1537803af686SBram Moolenaar    assert_equal('yes', That())
1538803af686SBram Moolenaar  END
1539803af686SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
1540803af686SBram Moolenaar
1541803af686SBram Moolenaar  nnoremap <expr> trigger g:Trigger()
1542803af686SBram Moolenaar  feedkeys('trigger', "xt")
1543803af686SBram Moolenaar
1544730b2483SBram Moolenaar  delete('Xexport_that.vim')
1545803af686SBram Moolenaar  delete('Ximport.vim')
1546803af686SBram Moolenaar  nunmap trigger
1547803af686SBram Moolenaarenddef
1548803af686SBram Moolenaar
15498e1986e3SBram Moolenaardef Test_import_in_filetype()
15508e1986e3SBram Moolenaar  # check that :import works when the buffer is locked
15518e1986e3SBram Moolenaar  mkdir('ftplugin', 'p')
15528e1986e3SBram Moolenaar  let export_lines =<< trim END
15538e1986e3SBram Moolenaar    vim9script
15548e1986e3SBram Moolenaar    export let That = 'yes'
15558e1986e3SBram Moolenaar  END
1556730b2483SBram Moolenaar  writefile(export_lines, 'ftplugin/Xexport_ft.vim')
15578e1986e3SBram Moolenaar
15588e1986e3SBram Moolenaar  let import_lines =<< trim END
15598e1986e3SBram Moolenaar    vim9script
1560730b2483SBram Moolenaar    import That from './Xexport_ft.vim'
15618e1986e3SBram Moolenaar    assert_equal('yes', That)
15628e1986e3SBram Moolenaar    g:did_load_mytpe = 1
15638e1986e3SBram Moolenaar  END
15648e1986e3SBram Moolenaar  writefile(import_lines, 'ftplugin/qf.vim')
15658e1986e3SBram Moolenaar
15668e1986e3SBram Moolenaar  let save_rtp = &rtp
15678e1986e3SBram Moolenaar  &rtp = getcwd() .. ',' .. &rtp
15688e1986e3SBram Moolenaar
15698e1986e3SBram Moolenaar  filetype plugin on
15708e1986e3SBram Moolenaar  copen
15718e1986e3SBram Moolenaar  assert_equal(1, g:did_load_mytpe)
15728e1986e3SBram Moolenaar
15738e1986e3SBram Moolenaar  quit!
1574730b2483SBram Moolenaar  delete('Xexport_ft.vim')
15758e1986e3SBram Moolenaar  delete('ftplugin', 'rf')
15768e1986e3SBram Moolenaar  &rtp = save_rtp
15778e1986e3SBram Moolenaarenddef
15788e1986e3SBram Moolenaar
1579efa94447SBram Moolenaardef Test_use_import_in_mapping()
1580efa94447SBram Moolenaar  let lines =<< trim END
1581efa94447SBram Moolenaar      vim9script
1582efa94447SBram Moolenaar      export def Funcx()
1583efa94447SBram Moolenaar        g:result = 42
1584efa94447SBram Moolenaar      enddef
1585efa94447SBram Moolenaar  END
1586efa94447SBram Moolenaar  writefile(lines, 'XsomeExport.vim')
1587efa94447SBram Moolenaar  lines =<< trim END
1588efa94447SBram Moolenaar      vim9script
1589efa94447SBram Moolenaar      import Funcx from './XsomeExport.vim'
1590b3ca9824SBram Moolenaar      nnoremap <F3> :call <sid>Funcx()<cr>
1591efa94447SBram Moolenaar  END
1592efa94447SBram Moolenaar  writefile(lines, 'Xmapscript.vim')
1593efa94447SBram Moolenaar
1594efa94447SBram Moolenaar  source Xmapscript.vim
1595b3ca9824SBram Moolenaar  feedkeys("\<F3>", "xt")
1596efa94447SBram Moolenaar  assert_equal(42, g:result)
1597efa94447SBram Moolenaar
1598efa94447SBram Moolenaar  unlet g:result
1599efa94447SBram Moolenaar  delete('XsomeExport.vim')
1600efa94447SBram Moolenaar  delete('Xmapscript.vim')
1601b3ca9824SBram Moolenaar  nunmap <F3>
1602efa94447SBram Moolenaarenddef
1603efa94447SBram Moolenaar
1604750802b5SBram Moolenaardef Test_vim9script_fails()
16058a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
16068a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1607750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
16089721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
16099b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1610750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1611750802b5SBram Moolenaar
1612451c2e35SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1012:')
1613c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1614c785b9a7SBram Moolenaar
1615e2e4075fSBram Moolenaar  assert_fails('vim9script', 'E1038:')
1616e2e4075fSBram Moolenaar  assert_fails('export something', 'E1043:')
16178a7d6542SBram Moolenaarenddef
16188a7d6542SBram Moolenaar
1619f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1620101f4810SBram Moolenaar  CheckRunVimInTerminal
1621101f4810SBram Moolenaar
16229bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1623c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
16249bb3eb3eSBram Moolenaarendfunc
16259bb3eb3eSBram Moolenaar
1626c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1627101f4810SBram Moolenaar  let export =<< trim END
1628101f4810SBram Moolenaar    vim9script
1629101f4810SBram Moolenaar    export def Foo(): number
1630101f4810SBram Moolenaar        return 0
1631101f4810SBram Moolenaar    enddef
1632101f4810SBram Moolenaar  END
1633730b2483SBram Moolenaar  writefile(export, 'XexportCmd.vim')
1634101f4810SBram Moolenaar
1635730b2483SBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{
16369bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
16379bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1638101f4810SBram Moolenaar
1639730b2483SBram Moolenaar  delete('XexportCmd.vim')
16409bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
16419bb3eb3eSBram Moolenaarenddef
1642101f4810SBram Moolenaar
16434c17ad94SBram Moolenaardef Test_vim9script_reload_import()
16448a7d6542SBram Moolenaar  let lines =<< trim END
16458a7d6542SBram Moolenaar    vim9script
16468a7d6542SBram Moolenaar    const var = ''
16478a7d6542SBram Moolenaar    let valone = 1234
16488a7d6542SBram Moolenaar    def MyFunc(arg: string)
16498a7d6542SBram Moolenaar       valone = 5678
16508a7d6542SBram Moolenaar    enddef
16518a7d6542SBram Moolenaar  END
16528a7d6542SBram Moolenaar  let morelines =<< trim END
16538a7d6542SBram Moolenaar    let valtwo = 222
16548a7d6542SBram Moolenaar    export def GetValtwo(): number
16558a7d6542SBram Moolenaar      return valtwo
16568a7d6542SBram Moolenaar    enddef
16578a7d6542SBram Moolenaar  END
165803afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
16598a7d6542SBram Moolenaar  source Xreload.vim
16608a7d6542SBram Moolenaar  source Xreload.vim
16618a7d6542SBram Moolenaar  source Xreload.vim
16628a7d6542SBram Moolenaar
16638a7d6542SBram Moolenaar  let testlines =<< trim END
16648a7d6542SBram Moolenaar    vim9script
16658a7d6542SBram Moolenaar    def TheFunc()
16668a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
16678a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
16688a7d6542SBram Moolenaar    enddef
16698a7d6542SBram Moolenaar    TheFunc()
16708a7d6542SBram Moolenaar  END
16718a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
16728a7d6542SBram Moolenaar  source Ximport.vim
16738a7d6542SBram Moolenaar
1674f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1675f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
16768a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
16778a7d6542SBram Moolenaar  source Ximport.vim
16788a7d6542SBram Moolenaar
1679f5be8cdbSBram Moolenaar  # cannot declare a var twice
16808a7d6542SBram Moolenaar  lines =<< trim END
16818a7d6542SBram Moolenaar    vim9script
16828a7d6542SBram Moolenaar    let valone = 1234
16838a7d6542SBram Moolenaar    let valone = 5678
16848a7d6542SBram Moolenaar  END
16858a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
168644d6652dSBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
16878a7d6542SBram Moolenaar
16888a7d6542SBram Moolenaar  delete('Xreload.vim')
16898a7d6542SBram Moolenaar  delete('Ximport.vim')
16908a7d6542SBram Moolenaarenddef
16918a7d6542SBram Moolenaar
169295006e3dSBram Moolenaardef s:RetSome(): string
169395006e3dSBram Moolenaar  return 'some'
169495006e3dSBram Moolenaarenddef
169595006e3dSBram Moolenaar
1696fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1697fe465a01SBram Moolenaar" script-local name.
1698fe465a01SBram Moolenaardef Test_vim9script_funcref()
1699fe465a01SBram Moolenaar  let sortlines =<< trim END
1700fe465a01SBram Moolenaar      vim9script
1701fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1702bed36b93SBram Moolenaar        return i2 - i1
1703fe465a01SBram Moolenaar      enddef
1704fe465a01SBram Moolenaar
1705fe465a01SBram Moolenaar      export def FastSort(): list<number>
1706fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1707fe465a01SBram Moolenaar      enddef
1708fe465a01SBram Moolenaar  END
1709fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1710fe465a01SBram Moolenaar
1711fe465a01SBram Moolenaar  let lines =<< trim END
1712fe465a01SBram Moolenaar    vim9script
1713fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1714fe465a01SBram Moolenaar    def Test()
1715fe465a01SBram Moolenaar      g:result = FastSort()
1716fe465a01SBram Moolenaar    enddef
1717fe465a01SBram Moolenaar    Test()
1718fe465a01SBram Moolenaar  END
1719fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1720fe465a01SBram Moolenaar
1721fe465a01SBram Moolenaar  source Xscript.vim
1722fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1723fe465a01SBram Moolenaar
1724fe465a01SBram Moolenaar  unlet g:result
1725fe465a01SBram Moolenaar  delete('Xsort.vim')
1726fe465a01SBram Moolenaar  delete('Xscript.vim')
172795006e3dSBram Moolenaar
172895006e3dSBram Moolenaar  let Funcref = function('s:RetSome')
172995006e3dSBram Moolenaar  assert_equal('some', Funcref())
1730fe465a01SBram Moolenaarenddef
1731fe465a01SBram Moolenaar
1732601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the
1733601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct
1734601e76acSBram Moolenaar" function reference.
1735c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1736c620c055SBram Moolenaar  let filterLines =<< trim END
1737c620c055SBram Moolenaar    vim9script
1738c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1739c620c055SBram Moolenaar      return idx % 2 == 1
1740c620c055SBram Moolenaar    enddef
1741c620c055SBram Moolenaar    export def FastFilter(): list<number>
1742c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1743c620c055SBram Moolenaar    enddef
1744601e76acSBram Moolenaar    export def FastFilterDirect(): list<number>
1745601e76acSBram Moolenaar      return range(10)->filter(FilterFunc)
1746601e76acSBram Moolenaar    enddef
1747c620c055SBram Moolenaar  END
1748c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1749c620c055SBram Moolenaar
1750c620c055SBram Moolenaar  let lines =<< trim END
1751c620c055SBram Moolenaar    vim9script
1752601e76acSBram Moolenaar    import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
1753c620c055SBram Moolenaar    def Test()
1754c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1755c620c055SBram Moolenaar    enddef
1756c620c055SBram Moolenaar    Test()
1757601e76acSBram Moolenaar    def TestDirect()
1758601e76acSBram Moolenaar      let x: list<number> = FastFilterDirect()
1759601e76acSBram Moolenaar    enddef
1760601e76acSBram Moolenaar    TestDirect()
1761c620c055SBram Moolenaar  END
1762601e76acSBram Moolenaar  CheckScriptSuccess(lines)
1763c620c055SBram Moolenaar  delete('Xfilter.vim')
1764c620c055SBram Moolenaarenddef
1765c620c055SBram Moolenaar
17664c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
17674c17ad94SBram Moolenaar  let first_lines =<< trim END
17684c17ad94SBram Moolenaar    vim9script
17694c17ad94SBram Moolenaar    def FuncYes(): string
17704c17ad94SBram Moolenaar      return 'yes'
17714c17ad94SBram Moolenaar    enddef
17724c17ad94SBram Moolenaar  END
177303afdcf1SBram Moolenaar  let withno_lines =<< trim END
17744c17ad94SBram Moolenaar    def FuncNo(): string
17754c17ad94SBram Moolenaar      return 'no'
17764c17ad94SBram Moolenaar    enddef
17774c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
17784c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
17794c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
178003afdcf1SBram Moolenaar    enddef
178103afdcf1SBram Moolenaar  END
178203afdcf1SBram Moolenaar  let nono_lines =<< trim END
178303afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
178403afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
178544d6652dSBram Moolenaar      assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
17864c17ad94SBram Moolenaar    enddef
17874c17ad94SBram Moolenaar  END
17884c17ad94SBram Moolenaar
17894c17ad94SBram Moolenaar  # FuncNo() is defined
179003afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
17914c17ad94SBram Moolenaar  source Xreloaded.vim
17924c17ad94SBram Moolenaar  g:DoCheck(true)
17934c17ad94SBram Moolenaar
17944c17ad94SBram Moolenaar  # FuncNo() is not redefined
179503afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
17964c17ad94SBram Moolenaar  source Xreloaded.vim
179703afdcf1SBram Moolenaar  g:DoCheck()
17984c17ad94SBram Moolenaar
17994c17ad94SBram Moolenaar  # FuncNo() is back
180003afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
18014c17ad94SBram Moolenaar  source Xreloaded.vim
180203afdcf1SBram Moolenaar  g:DoCheck()
18034c17ad94SBram Moolenaar
18044c17ad94SBram Moolenaar  delete('Xreloaded.vim')
18054c17ad94SBram Moolenaarenddef
18064c17ad94SBram Moolenaar
180789483d40SBram Moolenaardef Test_vim9script_reload_delvar()
180889483d40SBram Moolenaar  # write the script with a script-local variable
180989483d40SBram Moolenaar  let lines =<< trim END
181089483d40SBram Moolenaar    vim9script
181189483d40SBram Moolenaar    let var = 'string'
181289483d40SBram Moolenaar  END
181389483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
181489483d40SBram Moolenaar  source XreloadVar.vim
181589483d40SBram Moolenaar
181689483d40SBram Moolenaar  # now write the script using the same variable locally - works
181789483d40SBram Moolenaar  lines =<< trim END
181889483d40SBram Moolenaar    vim9script
181989483d40SBram Moolenaar    def Func()
182089483d40SBram Moolenaar      let var = 'string'
182189483d40SBram Moolenaar    enddef
182289483d40SBram Moolenaar  END
182389483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
182489483d40SBram Moolenaar  source XreloadVar.vim
182589483d40SBram Moolenaar
182689483d40SBram Moolenaar  delete('XreloadVar.vim')
182789483d40SBram Moolenaarenddef
182889483d40SBram Moolenaar
18298a7d6542SBram Moolenaardef Test_import_absolute()
18308a7d6542SBram Moolenaar  let import_lines = [
1831e6085c53SBram Moolenaar        'vim9script',
1832e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1833e6085c53SBram Moolenaar        'def UseExported()',
1834e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1835e6085c53SBram Moolenaar        '  exported = 8888',
1836e6085c53SBram Moolenaar        '  g:imported_after = exported',
1837e6085c53SBram Moolenaar        'enddef',
1838e6085c53SBram Moolenaar        'UseExported()',
1839e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1840e6085c53SBram Moolenaar        ]
18418a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
18428a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
18438a7d6542SBram Moolenaar
18448a7d6542SBram Moolenaar  source Ximport_abs.vim
18458a7d6542SBram Moolenaar
18468a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
18474e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1848675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1849675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1850675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1851675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1852675f716eSBram Moolenaar          'exported = 8888.*' ..
1853675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1854675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1855675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1856675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1857e6085c53SBram Moolenaar        g:import_disassembled)
1858b3ca9824SBram Moolenaar
1859b3ca9824SBram Moolenaar  Undo_export_script_lines()
18608a7d6542SBram Moolenaar  unlet g:imported_abs
18614e12a5dfSBram Moolenaar  unlet g:import_disassembled
18628a7d6542SBram Moolenaar
18638a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
18648a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
18658a7d6542SBram Moolenaarenddef
18668a7d6542SBram Moolenaar
18678a7d6542SBram Moolenaardef Test_import_rtp()
18688a7d6542SBram Moolenaar  let import_lines = [
1869e6085c53SBram Moolenaar        'vim9script',
1870e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1871e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1872e6085c53SBram Moolenaar        ]
18738a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
18748a7d6542SBram Moolenaar  mkdir('import')
18758a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
18768a7d6542SBram Moolenaar
18778a7d6542SBram Moolenaar  let save_rtp = &rtp
18788a7d6542SBram Moolenaar  &rtp = getcwd()
18798a7d6542SBram Moolenaar  source Ximport_rtp.vim
18808a7d6542SBram Moolenaar  &rtp = save_rtp
18818a7d6542SBram Moolenaar
18828a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
18838a7d6542SBram Moolenaar
1884b3ca9824SBram Moolenaar  Undo_export_script_lines()
1885b3ca9824SBram Moolenaar  unlet g:imported_rtp
18868a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
188789483d40SBram Moolenaar  delete('import', 'rf')
18888a7d6542SBram Moolenaarenddef
18898a7d6542SBram Moolenaar
189025e0f586SBram Moolenaardef Test_import_compile_error()
189125e0f586SBram Moolenaar  let export_lines = [
189225e0f586SBram Moolenaar        'vim9script',
189325e0f586SBram Moolenaar        'export def ExpFunc(): string',
189425e0f586SBram Moolenaar        '  return notDefined',
189525e0f586SBram Moolenaar        'enddef',
189625e0f586SBram Moolenaar        ]
189725e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
189825e0f586SBram Moolenaar
189925e0f586SBram Moolenaar  let import_lines = [
190025e0f586SBram Moolenaar        'vim9script',
190125e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
190225e0f586SBram Moolenaar        'def ImpFunc()',
190325e0f586SBram Moolenaar        '  echo ExpFunc()',
190425e0f586SBram Moolenaar        'enddef',
190525e0f586SBram Moolenaar        'defcompile',
190625e0f586SBram Moolenaar        ]
190725e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
190825e0f586SBram Moolenaar
190925e0f586SBram Moolenaar  try
191025e0f586SBram Moolenaar    source Ximport.vim
191125e0f586SBram Moolenaar  catch /E1001/
1912f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
191325e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
191425e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
191525e0f586SBram Moolenaar  endtry
191625e0f586SBram Moolenaar
191725e0f586SBram Moolenaar  delete('Xexported.vim')
191825e0f586SBram Moolenaar  delete('Ximport.vim')
191925e0f586SBram Moolenaarenddef
192025e0f586SBram Moolenaar
1921c4ce36d4SBram Moolenaardef Test_func_redefine_error()
1922c4ce36d4SBram Moolenaar  let lines = [
1923c4ce36d4SBram Moolenaar        'vim9script',
1924c4ce36d4SBram Moolenaar        'def Func()',
1925c4ce36d4SBram Moolenaar        '  eval [][0]',
1926c4ce36d4SBram Moolenaar        'enddef',
1927c4ce36d4SBram Moolenaar        'Func()',
1928c4ce36d4SBram Moolenaar        ]
1929c4ce36d4SBram Moolenaar  writefile(lines, 'Xtestscript.vim')
1930c4ce36d4SBram Moolenaar
1931c4ce36d4SBram Moolenaar  for count in range(3)
1932c4ce36d4SBram Moolenaar    try
1933c4ce36d4SBram Moolenaar      source Xtestscript.vim
1934c4ce36d4SBram Moolenaar    catch /E684/
1935c4ce36d4SBram Moolenaar      # function name should contain <SNR> every time
1936c4ce36d4SBram Moolenaar      assert_match('E684: list index out of range', v:exception)
1937c4ce36d4SBram Moolenaar      assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1938c4ce36d4SBram Moolenaar    endtry
1939c4ce36d4SBram Moolenaar  endfor
1940c4ce36d4SBram Moolenaar
1941c4ce36d4SBram Moolenaar  delete('Xtestscript.vim')
1942c4ce36d4SBram Moolenaarenddef
1943c4ce36d4SBram Moolenaar
1944eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1945eef2102eSBram Moolenaar  let export_lines =<< trim END
1946eef2102eSBram Moolenaar      vim9script
1947eef2102eSBram Moolenaar      export def Func()
1948eef2102eSBram Moolenaar        echo 'imported'
1949eef2102eSBram Moolenaar      enddef
1950eef2102eSBram Moolenaar  END
1951eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1952eef2102eSBram Moolenaar
1953eef2102eSBram Moolenaar  let lines =<< trim END
1954eef2102eSBram Moolenaar    vim9script
1955eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1956eef2102eSBram Moolenaar    def Func()
1957eef2102eSBram Moolenaar      echo 'local to function'
1958eef2102eSBram Moolenaar    enddef
1959eef2102eSBram Moolenaar  END
1960eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1961eef2102eSBram Moolenaar
1962eef2102eSBram Moolenaar  lines =<< trim END
1963eef2102eSBram Moolenaar    vim9script
1964eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1965eef2102eSBram Moolenaar    def Outer()
1966eef2102eSBram Moolenaar      def Func()
1967eef2102eSBram Moolenaar        echo 'local to function'
1968eef2102eSBram Moolenaar      enddef
1969eef2102eSBram Moolenaar    enddef
1970eef2102eSBram Moolenaar    defcompile
1971eef2102eSBram Moolenaar  END
1972eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1973eef2102eSBram Moolenaar
1974eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1975eef2102eSBram Moolenaarenddef
1976eef2102eSBram Moolenaar
1977b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1978b9a2cac3SBram Moolenaar  let lines =<< trim END
1979b9a2cac3SBram Moolenaar    vim9script
1980b9a2cac3SBram Moolenaar    def Func()
1981b9a2cac3SBram Moolenaar      echo 'one'
1982b9a2cac3SBram Moolenaar    enddef
1983b9a2cac3SBram Moolenaar    def Func()
1984b9a2cac3SBram Moolenaar      echo 'two'
1985b9a2cac3SBram Moolenaar    enddef
1986b9a2cac3SBram Moolenaar  END
1987b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1988fa211f3cSBram Moolenaar
1989fa211f3cSBram Moolenaar  lines =<< trim END
1990fa211f3cSBram Moolenaar    vim9script
1991fa211f3cSBram Moolenaar    def Foo(): string
1992fa211f3cSBram Moolenaar      return 'foo'
1993fa211f3cSBram Moolenaar      enddef
1994fa211f3cSBram Moolenaar    def Func()
1995fa211f3cSBram Moolenaar      let  Foo = {-> 'lambda'}
1996fa211f3cSBram Moolenaar    enddef
1997fa211f3cSBram Moolenaar    defcompile
1998fa211f3cSBram Moolenaar  END
1999fa211f3cSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
2000b9a2cac3SBram Moolenaarenddef
2001b9a2cac3SBram Moolenaar
20028a7d6542SBram Moolenaardef Test_fixed_size_list()
2003f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
20048a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
20058a7d6542SBram Moolenaar  l->remove(0)
20068a7d6542SBram Moolenaar  l->add(5)
20078a7d6542SBram Moolenaar  l->insert(99, 1)
20080f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
20098a7d6542SBram Moolenaarenddef
20108a7d6542SBram Moolenaar
2011ae616494SBram Moolenaardef Test_no_insert_xit()
2012d2c61705SBram Moolenaar  CheckDefExecFailure(['a = 1'], 'E1100:')
2013d2c61705SBram Moolenaar  CheckDefExecFailure(['c = 1'], 'E1100:')
2014d2c61705SBram Moolenaar  CheckDefExecFailure(['i = 1'], 'E1100:')
2015d2c61705SBram Moolenaar  CheckDefExecFailure(['t = 1'], 'E1100:')
2016d2c61705SBram Moolenaar  CheckDefExecFailure(['x = 1'], 'E1100:')
2017ae616494SBram Moolenaar
2018ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
2019ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
2020ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
2021ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
2022f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
2023f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
2024f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
2025f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
2026f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
2027ae616494SBram Moolenaarenddef
2028ae616494SBram Moolenaar
2029158906cfSBram Moolenaardef IfElse(what: number): string
2030158906cfSBram Moolenaar  let res = ''
2031158906cfSBram Moolenaar  if what == 1
2032158906cfSBram Moolenaar    res = "one"
2033158906cfSBram Moolenaar  elseif what == 2
2034158906cfSBram Moolenaar    res = "two"
2035a259d8d3SBram Moolenaar  else
2036158906cfSBram Moolenaar    res = "three"
2037a259d8d3SBram Moolenaar  endif
2038158906cfSBram Moolenaar  return res
2039a259d8d3SBram Moolenaarenddef
2040a259d8d3SBram Moolenaar
2041158906cfSBram Moolenaardef Test_if_elseif_else()
2042158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
2043158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
2044158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
20450f18b6d1SBram Moolenaarenddef
20460f18b6d1SBram Moolenaar
2047e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
2048d2c61705SBram Moolenaar  CheckDefFailure(['elseif true'], 'E582:')
2049d2c61705SBram Moolenaar  CheckDefFailure(['else'], 'E581:')
2050d2c61705SBram Moolenaar  CheckDefFailure(['endif'], 'E580:')
2051d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
2052d2c61705SBram Moolenaar  CheckDefFailure(['if true', 'echo 1'], 'E171:')
2053e8c4abbbSBram Moolenaarenddef
2054e8c4abbbSBram Moolenaar
20556d69bf60SBram Moolenaarlet g:bool_true = v:true
20566d69bf60SBram Moolenaarlet g:bool_false = v:false
20576d69bf60SBram Moolenaar
20586d69bf60SBram Moolenaardef Test_if_const_expr()
20596d69bf60SBram Moolenaar  let res = false
20606d69bf60SBram Moolenaar  if true ? true : false
20616d69bf60SBram Moolenaar    res = true
20626d69bf60SBram Moolenaar  endif
20636d69bf60SBram Moolenaar  assert_equal(true, res)
20646d69bf60SBram Moolenaar
2065585fea7bSBram Moolenaar  g:glob = 2
2066585fea7bSBram Moolenaar  if false
20676797966dSBram Moolenaar    execute('g:glob = 3')
2068585fea7bSBram Moolenaar  endif
2069585fea7bSBram Moolenaar  assert_equal(2, g:glob)
2070585fea7bSBram Moolenaar  if true
20716797966dSBram Moolenaar    execute('g:glob = 3')
2072585fea7bSBram Moolenaar  endif
2073585fea7bSBram Moolenaar  assert_equal(3, g:glob)
2074585fea7bSBram Moolenaar
20756d69bf60SBram Moolenaar  res = false
20766d69bf60SBram Moolenaar  if g:bool_true ? true : false
20776d69bf60SBram Moolenaar    res = true
20786d69bf60SBram Moolenaar  endif
20796d69bf60SBram Moolenaar  assert_equal(true, res)
20806d69bf60SBram Moolenaar
20816d69bf60SBram Moolenaar  res = false
20826d69bf60SBram Moolenaar  if true ? g:bool_true : false
20836d69bf60SBram Moolenaar    res = true
20846d69bf60SBram Moolenaar  endif
20856d69bf60SBram Moolenaar  assert_equal(true, res)
20866d69bf60SBram Moolenaar
20876d69bf60SBram Moolenaar  res = false
20886d69bf60SBram Moolenaar  if true ? true : g:bool_false
20896d69bf60SBram Moolenaar    res = true
20906d69bf60SBram Moolenaar  endif
20916d69bf60SBram Moolenaar  assert_equal(true, res)
20926d69bf60SBram Moolenaar
20936d69bf60SBram Moolenaar  res = false
20946d69bf60SBram Moolenaar  if true ? false : true
20956d69bf60SBram Moolenaar    res = true
20966d69bf60SBram Moolenaar  endif
20976d69bf60SBram Moolenaar  assert_equal(false, res)
20986d69bf60SBram Moolenaar
20996d69bf60SBram Moolenaar  res = false
21006d69bf60SBram Moolenaar  if false ? false : true
21016d69bf60SBram Moolenaar    res = true
21026d69bf60SBram Moolenaar  endif
21036d69bf60SBram Moolenaar  assert_equal(true, res)
21046d69bf60SBram Moolenaar
21056d69bf60SBram Moolenaar  res = false
21066d69bf60SBram Moolenaar  if false ? true : false
21076d69bf60SBram Moolenaar    res = true
21086d69bf60SBram Moolenaar  endif
21096d69bf60SBram Moolenaar  assert_equal(false, res)
21106d69bf60SBram Moolenaar
21116d69bf60SBram Moolenaar  res = false
2112e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
2113e8c4abbbSBram Moolenaar    res = true
2114e8c4abbbSBram Moolenaar  endif
2115e8c4abbbSBram Moolenaar  assert_equal(false, res)
2116e8c4abbbSBram Moolenaar
2117e8c4abbbSBram Moolenaar  res = false
21186d69bf60SBram Moolenaar  if true && true
21196d69bf60SBram Moolenaar    res = true
21206d69bf60SBram Moolenaar  endif
21216d69bf60SBram Moolenaar  assert_equal(true, res)
21226d69bf60SBram Moolenaar
21236d69bf60SBram Moolenaar  res = false
21246d69bf60SBram Moolenaar  if true && false
21256d69bf60SBram Moolenaar    res = true
21266d69bf60SBram Moolenaar  endif
21276d69bf60SBram Moolenaar  assert_equal(false, res)
21286d69bf60SBram Moolenaar
21296d69bf60SBram Moolenaar  res = false
21306d69bf60SBram Moolenaar  if g:bool_true && false
21316d69bf60SBram Moolenaar    res = true
21326d69bf60SBram Moolenaar  endif
21336d69bf60SBram Moolenaar  assert_equal(false, res)
21346d69bf60SBram Moolenaar
21356d69bf60SBram Moolenaar  res = false
21366d69bf60SBram Moolenaar  if true && g:bool_false
21376d69bf60SBram Moolenaar    res = true
21386d69bf60SBram Moolenaar  endif
21396d69bf60SBram Moolenaar  assert_equal(false, res)
21406d69bf60SBram Moolenaar
21416d69bf60SBram Moolenaar  res = false
21426d69bf60SBram Moolenaar  if false && false
21436d69bf60SBram Moolenaar    res = true
21446d69bf60SBram Moolenaar  endif
21456d69bf60SBram Moolenaar  assert_equal(false, res)
21466d69bf60SBram Moolenaar
21476d69bf60SBram Moolenaar  res = false
21486d69bf60SBram Moolenaar  if true || false
21496d69bf60SBram Moolenaar    res = true
21506d69bf60SBram Moolenaar  endif
21516d69bf60SBram Moolenaar  assert_equal(true, res)
21526d69bf60SBram Moolenaar
21536d69bf60SBram Moolenaar  res = false
21546d69bf60SBram Moolenaar  if g:bool_true || false
21556d69bf60SBram Moolenaar    res = true
21566d69bf60SBram Moolenaar  endif
21576d69bf60SBram Moolenaar  assert_equal(true, res)
21586d69bf60SBram Moolenaar
21596d69bf60SBram Moolenaar  res = false
21606d69bf60SBram Moolenaar  if true || g:bool_false
21616d69bf60SBram Moolenaar    res = true
21626d69bf60SBram Moolenaar  endif
21636d69bf60SBram Moolenaar  assert_equal(true, res)
21646d69bf60SBram Moolenaar
21656d69bf60SBram Moolenaar  res = false
21666d69bf60SBram Moolenaar  if false || false
21676d69bf60SBram Moolenaar    res = true
21686d69bf60SBram Moolenaar  endif
21696d69bf60SBram Moolenaar  assert_equal(false, res)
21703988f64fSBram Moolenaar
21713988f64fSBram Moolenaar  # with constant "false" expression may be invalid so long as the syntax is OK
21723988f64fSBram Moolenaar  if false | eval 0 | endif
21733988f64fSBram Moolenaar  if false | eval burp + 234 | endif
21743988f64fSBram Moolenaar  if false | echo burp 234 'asd' | endif
21753988f64fSBram Moolenaar  if false
21763988f64fSBram Moolenaar    burp
21773988f64fSBram Moolenaar  endif
217880c34ca3SBram Moolenaarenddef
21796d69bf60SBram Moolenaar
218080c34ca3SBram Moolenaardef Test_if_const_expr_fails()
2181d2c61705SBram Moolenaar  CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2182d2c61705SBram Moolenaar  CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2183d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa'"], 'E110:')
2184d2c61705SBram Moolenaar  CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
21856d69bf60SBram Moolenaarenddef
21866d69bf60SBram Moolenaar
218772abcf42SBram Moolenaardef RunNested(i: number): number
218872abcf42SBram Moolenaar  let x: number = 0
218972abcf42SBram Moolenaar  if i % 2
219072abcf42SBram Moolenaar    if 1
2191f5be8cdbSBram Moolenaar      # comment
219272abcf42SBram Moolenaar    else
2193f5be8cdbSBram Moolenaar      # comment
219472abcf42SBram Moolenaar    endif
219572abcf42SBram Moolenaar    x += 1
219672abcf42SBram Moolenaar  else
219772abcf42SBram Moolenaar    x += 1000
219872abcf42SBram Moolenaar  endif
219972abcf42SBram Moolenaar  return x
220072abcf42SBram Moolenaarenddef
220172abcf42SBram Moolenaar
220272abcf42SBram Moolenaardef Test_nested_if()
220372abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
220472abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
220572abcf42SBram Moolenaarenddef
220672abcf42SBram Moolenaar
2207ad39c094SBram Moolenaardef Test_execute_cmd()
2208ad39c094SBram Moolenaar  new
2209ad39c094SBram Moolenaar  setline(1, 'default')
2210d2c61705SBram Moolenaar  execute 'setline(1, "execute-string")'
2211ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
2212a72cfb80SBram Moolenaar
2213d2c61705SBram Moolenaar  execute "setline(1, 'execute-string')"
2214a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
2215a72cfb80SBram Moolenaar
2216d2c61705SBram Moolenaar  let cmd1 = 'setline(1,'
2217ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
2218a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
2219ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
2220a72cfb80SBram Moolenaar
2221d2c61705SBram Moolenaar  execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2222ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
2223a72cfb80SBram Moolenaar
2224ad39c094SBram Moolenaar  let cmd_first = 'call '
2225ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
2226ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
2227ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
2228ad39c094SBram Moolenaar  bwipe!
2229585fea7bSBram Moolenaar
22302d6b20d6SBram Moolenaar  let n = true
22312d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
22322d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
22332d6b20d6SBram Moolenaar
2234e5abf7afSBram Moolenaar  echomsg [1, 2, 3] #{a: 1, b: 2}
2235e5abf7afSBram Moolenaar  assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2236e5abf7afSBram Moolenaar
2237d2c61705SBram Moolenaar  CheckDefFailure(['execute xxx'], 'E1001:', 1)
2238d2c61705SBram Moolenaar  CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2239d2c61705SBram Moolenaar  CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
2240ad39c094SBram Moolenaarenddef
2241ad39c094SBram Moolenaar
224247e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
2243f5be8cdbSBram Moolenaar  # only checks line continuation
224447e880d6SBram Moolenaar  let lines =<< trim END
224547e880d6SBram Moolenaar      vim9script
224647e880d6SBram Moolenaar      execute 'g:someVar'
224747e880d6SBram Moolenaar                .. ' = ' ..
224847e880d6SBram Moolenaar                   '28'
224947e880d6SBram Moolenaar      assert_equal(28, g:someVar)
225047e880d6SBram Moolenaar      unlet g:someVar
225147e880d6SBram Moolenaar  END
225247e880d6SBram Moolenaar  CheckScriptSuccess(lines)
225347e880d6SBram Moolenaarenddef
225447e880d6SBram Moolenaar
2255ad39c094SBram Moolenaardef Test_echo_cmd()
2256a72cfb80SBram Moolenaar  echo 'some' # comment
2257585fea7bSBram Moolenaar  echon 'thing'
2258ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2259ad39c094SBram Moolenaar
2260a72cfb80SBram Moolenaar  echo "some" # comment
2261a72cfb80SBram Moolenaar  echon "thing"
2262a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
2263a72cfb80SBram Moolenaar
2264ad39c094SBram Moolenaar  let str1 = 'some'
2265ad39c094SBram Moolenaar  let str2 = 'more'
2266ad39c094SBram Moolenaar  echo str1 str2
2267ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2268a72cfb80SBram Moolenaar
2269d2c61705SBram Moolenaar  CheckDefFailure(['echo "xxx"# comment'], 'E488:')
2270ad39c094SBram Moolenaarenddef
2271ad39c094SBram Moolenaar
2272f93c7feaSBram Moolenaardef Test_echomsg_cmd()
2273f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
2274f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2275f93c7feaSBram Moolenaar  echo 'clear'
2276df069eecSBram Moolenaar  :1messages
2277f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
2278f93c7feaSBram Moolenaar
2279d2c61705SBram Moolenaar  CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
2280f93c7feaSBram Moolenaarenddef
2281f93c7feaSBram Moolenaar
228247e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
2283f5be8cdbSBram Moolenaar  # only checks line continuation
228447e880d6SBram Moolenaar  let lines =<< trim END
228547e880d6SBram Moolenaar      vim9script
228647e880d6SBram Moolenaar      echomsg 'here'
228747e880d6SBram Moolenaar                .. ' is ' ..
228847e880d6SBram Moolenaar                   'a message'
228947e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
229047e880d6SBram Moolenaar  END
229147e880d6SBram Moolenaar  CheckScriptSuccess(lines)
229247e880d6SBram Moolenaarenddef
229347e880d6SBram Moolenaar
2294f93c7feaSBram Moolenaardef Test_echoerr_cmd()
229540ee466cSBram Moolenaar  try
229640ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
229740ee466cSBram Moolenaar  catch
229840ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
229940ee466cSBram Moolenaar  endtry
2300f93c7feaSBram Moolenaarenddef
2301f93c7feaSBram Moolenaar
230247e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
2303f5be8cdbSBram Moolenaar  # only checks line continuation
230447e880d6SBram Moolenaar  let lines =<< trim END
230547e880d6SBram Moolenaar      vim9script
230647e880d6SBram Moolenaar      try
230747e880d6SBram Moolenaar        echoerr 'this'
230847e880d6SBram Moolenaar                .. ' is ' ..
230947e880d6SBram Moolenaar                   'wrong'
231047e880d6SBram Moolenaar      catch
231147e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
231247e880d6SBram Moolenaar      endtry
231347e880d6SBram Moolenaar  END
231447e880d6SBram Moolenaar  CheckScriptSuccess(lines)
231547e880d6SBram Moolenaarenddef
231647e880d6SBram Moolenaar
231741fe0617SBram Moolenaardef Test_for_outside_of_function()
231841fe0617SBram Moolenaar  let lines =<< trim END
231941fe0617SBram Moolenaar    vim9script
232041fe0617SBram Moolenaar    new
232141fe0617SBram Moolenaar    for var in range(0, 3)
232241fe0617SBram Moolenaar      append(line('$'), var)
232341fe0617SBram Moolenaar    endfor
232441fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
232541fe0617SBram Moolenaar    bwipe!
232641fe0617SBram Moolenaar  END
232741fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
232841fe0617SBram Moolenaar  source Xvim9for.vim
232941fe0617SBram Moolenaar  delete('Xvim9for.vim')
233041fe0617SBram Moolenaarenddef
23318a7d6542SBram Moolenaar
2332e8c4abbbSBram Moolenaardef Test_for_loop()
2333e8c4abbbSBram Moolenaar  let result = ''
2334e8c4abbbSBram Moolenaar  for cnt in range(7)
2335e8c4abbbSBram Moolenaar    if cnt == 4
2336e8c4abbbSBram Moolenaar      break
2337e8c4abbbSBram Moolenaar    endif
2338e8c4abbbSBram Moolenaar    if cnt == 2
2339e8c4abbbSBram Moolenaar      continue
2340e8c4abbbSBram Moolenaar    endif
2341e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
2342e8c4abbbSBram Moolenaar  endfor
2343e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
23440ad3e894SBram Moolenaar
23450ad3e894SBram Moolenaar  let concat = ''
23460ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
23470ad3e894SBram Moolenaar    concat ..= str
23480ad3e894SBram Moolenaar  endfor
23490ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
2350e8c4abbbSBram Moolenaarenddef
2351e8c4abbbSBram Moolenaar
2352e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2353675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2354675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2355451c2e35SBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1017:')
2356822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
2357451c2e35SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1012:')
2358675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2359675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2360675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2361e8c4abbbSBram Moolenaarenddef
2362e8c4abbbSBram Moolenaar
2363d0df1aacSBram Moolenaardef Test_while_loop()
2364d0df1aacSBram Moolenaar  let result = ''
2365d0df1aacSBram Moolenaar  let cnt = 0
2366d0df1aacSBram Moolenaar  while cnt < 555
2367d0df1aacSBram Moolenaar    if cnt == 3
2368d0df1aacSBram Moolenaar      break
2369d0df1aacSBram Moolenaar    endif
2370d0df1aacSBram Moolenaar    cnt += 1
2371d0df1aacSBram Moolenaar    if cnt == 2
2372d0df1aacSBram Moolenaar      continue
2373d0df1aacSBram Moolenaar    endif
2374d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2375d0df1aacSBram Moolenaar  endwhile
2376d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2377d0df1aacSBram Moolenaarenddef
2378d0df1aacSBram Moolenaar
2379e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2380675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2381675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2382675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2383675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2384675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2385675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2386675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
2387bd5da371SBram Moolenaarenddef
2388bd5da371SBram Moolenaar
23899645e2d9SBram Moolenaardef Test_interrupt_loop()
239097acfc78SBram Moolenaar  let caught = false
23919645e2d9SBram Moolenaar  let x = 0
239297acfc78SBram Moolenaar  try
23939645e2d9SBram Moolenaar    while 1
23949645e2d9SBram Moolenaar      x += 1
23959645e2d9SBram Moolenaar      if x == 100
23969645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
23979645e2d9SBram Moolenaar      endif
23989645e2d9SBram Moolenaar    endwhile
239997acfc78SBram Moolenaar  catch
240097acfc78SBram Moolenaar    caught = true
240197acfc78SBram Moolenaar    assert_equal(100, x)
240297acfc78SBram Moolenaar  endtry
240397acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
240425859dd7SBram Moolenaar  # consume the CTRL-C
240525859dd7SBram Moolenaar  getchar(0)
24069645e2d9SBram Moolenaarenddef
240720431c9dSBram Moolenaar
24084fdae999SBram Moolenaardef Test_automatic_line_continuation()
24094fdae999SBram Moolenaar  let mylist = [
24104fdae999SBram Moolenaar      'one',
24114fdae999SBram Moolenaar      'two',
24124fdae999SBram Moolenaar      'three',
2413f5be8cdbSBram Moolenaar      ] # comment
24144fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
24154fdae999SBram Moolenaar
24164fdae999SBram Moolenaar  let mydict = {
24174fdae999SBram Moolenaar      'one': 1,
24184fdae999SBram Moolenaar      'two': 2,
24194fdae999SBram Moolenaar      'three':
24204fdae999SBram Moolenaar          3,
2421f5be8cdbSBram Moolenaar      } # comment
24224fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
24234fdae999SBram Moolenaar  mydict = #{
24242c330432SBram Moolenaar      one: 1,  # comment
24252c330432SBram Moolenaar      two:     # comment
24262c330432SBram Moolenaar           2,  # comment
24272c330432SBram Moolenaar      three: 3 # comment
24282c330432SBram Moolenaar      }
24292c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
24302c330432SBram Moolenaar  mydict = #{
24312c330432SBram Moolenaar      one: 1,
24324fdae999SBram Moolenaar      two:
24334fdae999SBram Moolenaar           2,
24342c330432SBram Moolenaar      three: 3
24354fdae999SBram Moolenaar      }
24364fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
2437e6085c53SBram Moolenaar
2438e6085c53SBram Moolenaar  assert_equal(
2439e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2440e6085c53SBram Moolenaar        split('one two three')
2441e6085c53SBram Moolenaar        )
24424fdae999SBram Moolenaarenddef
24434fdae999SBram Moolenaar
24447a092245SBram Moolenaardef Test_vim9_comment()
24457a092245SBram Moolenaar  CheckScriptSuccess([
24467a092245SBram Moolenaar      'vim9script',
24477a092245SBram Moolenaar      '# something',
24487a092245SBram Moolenaar      ])
24497a092245SBram Moolenaar  CheckScriptFailure([
24507a092245SBram Moolenaar      'vim9script',
24517a092245SBram Moolenaar      ':# something',
24527a092245SBram Moolenaar      ], 'E488:')
24537a092245SBram Moolenaar  CheckScriptFailure([
24547a092245SBram Moolenaar      '# something',
24557a092245SBram Moolenaar      ], 'E488:')
24567a092245SBram Moolenaar  CheckScriptFailure([
24577a092245SBram Moolenaar      ':# something',
24587a092245SBram Moolenaar      ], 'E488:')
24597a092245SBram Moolenaar
24604a8d9f2eSBram Moolenaar  { # block start
24614a8d9f2eSBram Moolenaar  } # block end
24624a8d9f2eSBram Moolenaar  CheckDefFailure([
24634a8d9f2eSBram Moolenaar      '{# comment',
24644a8d9f2eSBram Moolenaar      ], 'E488:')
24654a8d9f2eSBram Moolenaar  CheckDefFailure([
24664a8d9f2eSBram Moolenaar      '{',
24674a8d9f2eSBram Moolenaar      '}# comment',
24684a8d9f2eSBram Moolenaar      ], 'E488:')
24694a8d9f2eSBram Moolenaar
24704a8d9f2eSBram Moolenaar  echo "yes" # comment
24714a8d9f2eSBram Moolenaar  CheckDefFailure([
24724a8d9f2eSBram Moolenaar      'echo "yes"# comment',
24734a8d9f2eSBram Moolenaar      ], 'E488:')
24747a092245SBram Moolenaar  CheckScriptSuccess([
24757a092245SBram Moolenaar      'vim9script',
24767a092245SBram Moolenaar      'echo "yes" # something',
24777a092245SBram Moolenaar      ])
24787a092245SBram Moolenaar  CheckScriptFailure([
24797a092245SBram Moolenaar      'vim9script',
24807a092245SBram Moolenaar      'echo "yes"# something',
24817a092245SBram Moolenaar      ], 'E121:')
24827a092245SBram Moolenaar  CheckScriptFailure([
24837a092245SBram Moolenaar      'vim9script',
24847a092245SBram Moolenaar      'echo# something',
24857a092245SBram Moolenaar      ], 'E121:')
24867a092245SBram Moolenaar  CheckScriptFailure([
24877a092245SBram Moolenaar      'echo "yes" # something',
24887a092245SBram Moolenaar      ], 'E121:')
24897a092245SBram Moolenaar
24904a8d9f2eSBram Moolenaar  exe "echo" # comment
24914a8d9f2eSBram Moolenaar  CheckDefFailure([
24924a8d9f2eSBram Moolenaar      'exe "echo"# comment',
24934a8d9f2eSBram Moolenaar      ], 'E488:')
24944a8d9f2eSBram Moolenaar  CheckScriptSuccess([
24954a8d9f2eSBram Moolenaar      'vim9script',
24964a8d9f2eSBram Moolenaar      'exe "echo" # something',
24974a8d9f2eSBram Moolenaar      ])
24984a8d9f2eSBram Moolenaar  CheckScriptFailure([
24994a8d9f2eSBram Moolenaar      'vim9script',
25004a8d9f2eSBram Moolenaar      'exe "echo"# something',
25014a8d9f2eSBram Moolenaar      ], 'E121:')
25024a8d9f2eSBram Moolenaar  CheckDefFailure([
25034a8d9f2eSBram Moolenaar      'exe # comment',
25044a8d9f2eSBram Moolenaar      ], 'E1015:')
25054a8d9f2eSBram Moolenaar  CheckScriptFailure([
25064a8d9f2eSBram Moolenaar      'vim9script',
25074a8d9f2eSBram Moolenaar      'exe# something',
25084a8d9f2eSBram Moolenaar      ], 'E121:')
25094a8d9f2eSBram Moolenaar  CheckScriptFailure([
25104a8d9f2eSBram Moolenaar      'exe "echo" # something',
25114a8d9f2eSBram Moolenaar      ], 'E121:')
25124a8d9f2eSBram Moolenaar
25137a092245SBram Moolenaar  CheckDefFailure([
25147a092245SBram Moolenaar      'try# comment',
25157a092245SBram Moolenaar      '  echo "yes"',
25167a092245SBram Moolenaar      'catch',
25177a092245SBram Moolenaar      'endtry',
25187a092245SBram Moolenaar      ], 'E488:')
25192c5ed4e3SBram Moolenaar  CheckScriptFailure([
25202c5ed4e3SBram Moolenaar      'vim9script',
25212c5ed4e3SBram Moolenaar      'try# comment',
25222c5ed4e3SBram Moolenaar      'echo "yes"',
25232c5ed4e3SBram Moolenaar      ], 'E488:')
25247a092245SBram Moolenaar  CheckDefFailure([
25257a092245SBram Moolenaar      'try',
2526a72cfb80SBram Moolenaar      '  throw#comment',
2527a72cfb80SBram Moolenaar      'catch',
2528a72cfb80SBram Moolenaar      'endtry',
2529a72cfb80SBram Moolenaar      ], 'E1015:')
2530a72cfb80SBram Moolenaar  CheckDefFailure([
2531a72cfb80SBram Moolenaar      'try',
2532a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2533a72cfb80SBram Moolenaar      'catch',
2534a72cfb80SBram Moolenaar      'endtry',
2535a72cfb80SBram Moolenaar      ], 'E488:')
2536a72cfb80SBram Moolenaar  CheckDefFailure([
2537a72cfb80SBram Moolenaar      'try',
25387a092245SBram Moolenaar      '  echo "yes"',
25397a092245SBram Moolenaar      'catch# comment',
25407a092245SBram Moolenaar      'endtry',
25417a092245SBram Moolenaar      ], 'E488:')
25422c5ed4e3SBram Moolenaar  CheckScriptFailure([
25432c5ed4e3SBram Moolenaar      'vim9script',
25442c5ed4e3SBram Moolenaar      'try',
25452c5ed4e3SBram Moolenaar      '  echo "yes"',
25462c5ed4e3SBram Moolenaar      'catch# comment',
25472c5ed4e3SBram Moolenaar      'endtry',
25482c5ed4e3SBram Moolenaar      ], 'E654:')
25492c5ed4e3SBram Moolenaar  CheckDefFailure([
25502c5ed4e3SBram Moolenaar      'try',
25512c5ed4e3SBram Moolenaar      '  echo "yes"',
25522c5ed4e3SBram Moolenaar      'catch /pat/# comment',
25532c5ed4e3SBram Moolenaar      'endtry',
25542c5ed4e3SBram Moolenaar      ], 'E488:')
25557a092245SBram Moolenaar  CheckDefFailure([
25567a092245SBram Moolenaar      'try',
25577a092245SBram Moolenaar      'echo "yes"',
25587a092245SBram Moolenaar      'catch',
25597a092245SBram Moolenaar      'endtry# comment',
25607a092245SBram Moolenaar      ], 'E488:')
25612c5ed4e3SBram Moolenaar  CheckScriptFailure([
25622c5ed4e3SBram Moolenaar      'vim9script',
25632c5ed4e3SBram Moolenaar      'try',
25642c5ed4e3SBram Moolenaar      '  echo "yes"',
25652c5ed4e3SBram Moolenaar      'catch',
25662c5ed4e3SBram Moolenaar      'endtry# comment',
25679b7bf9e9SBram Moolenaar      ], 'E488:')
25682c5ed4e3SBram Moolenaar
25692c5ed4e3SBram Moolenaar  CheckScriptSuccess([
25702c5ed4e3SBram Moolenaar      'vim9script',
25712c5ed4e3SBram Moolenaar      'hi # comment',
25722c5ed4e3SBram Moolenaar      ])
25732c5ed4e3SBram Moolenaar  CheckScriptFailure([
25742c5ed4e3SBram Moolenaar      'vim9script',
25752c5ed4e3SBram Moolenaar      'hi# comment',
25762c5ed4e3SBram Moolenaar      ], 'E416:')
25771966c248SBram Moolenaar  CheckScriptSuccess([
25781966c248SBram Moolenaar      'vim9script',
25791966c248SBram Moolenaar      'hi Search # comment',
25801966c248SBram Moolenaar      ])
25811966c248SBram Moolenaar  CheckScriptFailure([
25821966c248SBram Moolenaar      'vim9script',
25831966c248SBram Moolenaar      'hi Search# comment',
25841966c248SBram Moolenaar      ], 'E416:')
25851966c248SBram Moolenaar  CheckScriptSuccess([
25861966c248SBram Moolenaar      'vim9script',
25871966c248SBram Moolenaar      'hi link This Search # comment',
25881966c248SBram Moolenaar      ])
25891966c248SBram Moolenaar  CheckScriptFailure([
25901966c248SBram Moolenaar      'vim9script',
25911966c248SBram Moolenaar      'hi link This That# comment',
25921966c248SBram Moolenaar      ], 'E413:')
25931966c248SBram Moolenaar  CheckScriptSuccess([
25941966c248SBram Moolenaar      'vim9script',
25951966c248SBram Moolenaar      'hi clear This # comment',
25961966c248SBram Moolenaar      'hi clear # comment',
25971966c248SBram Moolenaar      ])
2598f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2599f5be8cdbSBram Moolenaar  # hi clear This# comment',
26001966c248SBram Moolenaar  CheckScriptFailure([
26011966c248SBram Moolenaar      'vim9script',
26021966c248SBram Moolenaar      'hi clear# comment',
26031966c248SBram Moolenaar      ], 'E416:')
26041966c248SBram Moolenaar
26051966c248SBram Moolenaar  CheckScriptSuccess([
26061966c248SBram Moolenaar      'vim9script',
26071966c248SBram Moolenaar      'hi Group term=bold',
26081966c248SBram Moolenaar      'match Group /todo/ # comment',
26091966c248SBram Moolenaar      ])
26101966c248SBram Moolenaar  CheckScriptFailure([
26111966c248SBram Moolenaar      'vim9script',
26121966c248SBram Moolenaar      'hi Group term=bold',
26131966c248SBram Moolenaar      'match Group /todo/# comment',
26141966c248SBram Moolenaar      ], 'E488:')
26151966c248SBram Moolenaar  CheckScriptSuccess([
26161966c248SBram Moolenaar      'vim9script',
26171966c248SBram Moolenaar      'match # comment',
26181966c248SBram Moolenaar      ])
26191966c248SBram Moolenaar  CheckScriptFailure([
26201966c248SBram Moolenaar      'vim9script',
26211966c248SBram Moolenaar      'match# comment',
26221966c248SBram Moolenaar      ], 'E475:')
26231966c248SBram Moolenaar  CheckScriptSuccess([
26241966c248SBram Moolenaar      'vim9script',
26251966c248SBram Moolenaar      'match none # comment',
26261966c248SBram Moolenaar      ])
26271966c248SBram Moolenaar  CheckScriptFailure([
26281966c248SBram Moolenaar      'vim9script',
26291966c248SBram Moolenaar      'match none# comment',
26301966c248SBram Moolenaar      ], 'E475:')
26311966c248SBram Moolenaar
26321966c248SBram Moolenaar  CheckScriptSuccess([
26331966c248SBram Moolenaar      'vim9script',
26341966c248SBram Moolenaar      'menutrans clear # comment',
26351966c248SBram Moolenaar      ])
26361966c248SBram Moolenaar  CheckScriptFailure([
26371966c248SBram Moolenaar      'vim9script',
26381966c248SBram Moolenaar      'menutrans clear# comment text',
26391966c248SBram Moolenaar      ], 'E474:')
26401966c248SBram Moolenaar
26411966c248SBram Moolenaar  CheckScriptSuccess([
26421966c248SBram Moolenaar      'vim9script',
26431966c248SBram Moolenaar      'syntax clear # comment',
26441966c248SBram Moolenaar      ])
26451966c248SBram Moolenaar  CheckScriptFailure([
26461966c248SBram Moolenaar      'vim9script',
26471966c248SBram Moolenaar      'syntax clear# comment text',
26481966c248SBram Moolenaar      ], 'E28:')
26491966c248SBram Moolenaar  CheckScriptSuccess([
26501966c248SBram Moolenaar      'vim9script',
26511966c248SBram Moolenaar      'syntax keyword Word some',
26521966c248SBram Moolenaar      'syntax clear Word # comment',
26531966c248SBram Moolenaar      ])
26541966c248SBram Moolenaar  CheckScriptFailure([
26551966c248SBram Moolenaar      'vim9script',
26561966c248SBram Moolenaar      'syntax keyword Word some',
26571966c248SBram Moolenaar      'syntax clear Word# comment text',
26581966c248SBram Moolenaar      ], 'E28:')
26591966c248SBram Moolenaar
26601966c248SBram Moolenaar  CheckScriptSuccess([
26611966c248SBram Moolenaar      'vim9script',
26621966c248SBram Moolenaar      'syntax list # comment',
26631966c248SBram Moolenaar      ])
26641966c248SBram Moolenaar  CheckScriptFailure([
26651966c248SBram Moolenaar      'vim9script',
26661966c248SBram Moolenaar      'syntax list# comment text',
26671966c248SBram Moolenaar      ], 'E28:')
26681966c248SBram Moolenaar
26691966c248SBram Moolenaar  CheckScriptSuccess([
26701966c248SBram Moolenaar      'vim9script',
26711966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
26721966c248SBram Moolenaar      ])
26731966c248SBram Moolenaar  CheckScriptFailure([
26741966c248SBram Moolenaar      'vim9script',
26751966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
26761966c248SBram Moolenaar      ], 'E475:')
26771966c248SBram Moolenaar
26781966c248SBram Moolenaar  CheckScriptSuccess([
26791966c248SBram Moolenaar      'vim9script',
26801966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
26811966c248SBram Moolenaar      ])
26821966c248SBram Moolenaar  CheckScriptFailure([
26831966c248SBram Moolenaar      'vim9script',
26841966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
26851966c248SBram Moolenaar      ], 'E789:')
26861966c248SBram Moolenaar
26871966c248SBram Moolenaar  CheckScriptSuccess([
26881966c248SBram Moolenaar      'vim9script',
26891966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
26901966c248SBram Moolenaar      ])
26911966c248SBram Moolenaar  CheckScriptFailure([
26921966c248SBram Moolenaar      'vim9script',
26931966c248SBram Moolenaar      'syntax match Word /pat/# comment',
26941966c248SBram Moolenaar      ], 'E402:')
26951966c248SBram Moolenaar
26961966c248SBram Moolenaar  CheckScriptSuccess([
26971966c248SBram Moolenaar      'vim9script',
26981966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
26991966c248SBram Moolenaar      ])
27001966c248SBram Moolenaar  CheckScriptFailure([
27011966c248SBram Moolenaar      'vim9script',
27021966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
27031966c248SBram Moolenaar      ], 'E475:')
27041966c248SBram Moolenaar  CheckScriptFailure([
27051966c248SBram Moolenaar      'vim9script',
27061966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
27071966c248SBram Moolenaar      ], 'E406:')
27081966c248SBram Moolenaar  CheckScriptFailure([
27091966c248SBram Moolenaar      'vim9script',
27101966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
27111966c248SBram Moolenaar      ], 'E475:')
27121966c248SBram Moolenaar
27131966c248SBram Moolenaar  CheckScriptSuccess([
27141966c248SBram Moolenaar      'vim9script',
27151966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
27161966c248SBram Moolenaar      ])
27171966c248SBram Moolenaar  CheckScriptFailure([
27181966c248SBram Moolenaar      'vim9script',
27191966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2720d032f34aSBram Moolenaar      ], 'E402:')
27211966c248SBram Moolenaar
27221966c248SBram Moolenaar  CheckScriptSuccess([
27231966c248SBram Moolenaar      'vim9script',
27241966c248SBram Moolenaar      'syntax sync # comment',
27251966c248SBram Moolenaar      ])
27261966c248SBram Moolenaar  CheckScriptFailure([
27271966c248SBram Moolenaar      'vim9script',
27281966c248SBram Moolenaar      'syntax sync# comment',
27291966c248SBram Moolenaar      ], 'E404:')
27301966c248SBram Moolenaar  CheckScriptSuccess([
27311966c248SBram Moolenaar      'vim9script',
27321966c248SBram Moolenaar      'syntax sync ccomment # comment',
27331966c248SBram Moolenaar      ])
27341966c248SBram Moolenaar  CheckScriptFailure([
27351966c248SBram Moolenaar      'vim9script',
27361966c248SBram Moolenaar      'syntax sync ccomment# comment',
27371966c248SBram Moolenaar      ], 'E404:')
27381966c248SBram Moolenaar
27391966c248SBram Moolenaar  CheckScriptSuccess([
27401966c248SBram Moolenaar      'vim9script',
27411966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
27421966c248SBram Moolenaar      ])
27431966c248SBram Moolenaar  CheckScriptFailure([
27441966c248SBram Moolenaar      'vim9script',
27451966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
27461966c248SBram Moolenaar      ], 'E475:')
2747a72cfb80SBram Moolenaar
2748a72cfb80SBram Moolenaar  CheckScriptSuccess([
2749a72cfb80SBram Moolenaar      'vim9script',
2750a72cfb80SBram Moolenaar      'command Echo echo # comment',
2751a72cfb80SBram Moolenaar      'command Echo # comment',
2752a72cfb80SBram Moolenaar      ])
2753a72cfb80SBram Moolenaar  CheckScriptFailure([
2754a72cfb80SBram Moolenaar      'vim9script',
2755a72cfb80SBram Moolenaar      'command Echo echo# comment',
2756a72cfb80SBram Moolenaar      'Echo',
2757a72cfb80SBram Moolenaar      ], 'E121:')
2758a72cfb80SBram Moolenaar  CheckScriptFailure([
2759a72cfb80SBram Moolenaar      'vim9script',
2760a72cfb80SBram Moolenaar      'command Echo# comment',
2761a72cfb80SBram Moolenaar      ], 'E182:')
2762a72cfb80SBram Moolenaar  CheckScriptFailure([
2763a72cfb80SBram Moolenaar      'vim9script',
2764a72cfb80SBram Moolenaar      'command Echo echo',
2765a72cfb80SBram Moolenaar      'command Echo# comment',
2766a72cfb80SBram Moolenaar      ], 'E182:')
2767a72cfb80SBram Moolenaar
2768a72cfb80SBram Moolenaar  CheckScriptSuccess([
2769a72cfb80SBram Moolenaar      'vim9script',
2770a72cfb80SBram Moolenaar      'function # comment',
2771a72cfb80SBram Moolenaar      ])
2772a72cfb80SBram Moolenaar  CheckScriptFailure([
2773a72cfb80SBram Moolenaar      'vim9script',
27749898107fSBram Moolenaar      'function " comment',
27759898107fSBram Moolenaar      ], 'E129:')
27769898107fSBram Moolenaar  CheckScriptFailure([
27779898107fSBram Moolenaar      'vim9script',
2778a72cfb80SBram Moolenaar      'function# comment',
2779a72cfb80SBram Moolenaar      ], 'E129:')
2780a72cfb80SBram Moolenaar  CheckScriptSuccess([
2781a72cfb80SBram Moolenaar      'vim9script',
2782a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2783a72cfb80SBram Moolenaar      ])
2784a72cfb80SBram Moolenaar  CheckScriptFailure([
2785a72cfb80SBram Moolenaar      'vim9script',
2786a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2787a72cfb80SBram Moolenaar      ], 'E488:')
2788a72cfb80SBram Moolenaar
2789a72cfb80SBram Moolenaar  CheckScriptSuccess([
2790a72cfb80SBram Moolenaar      'vim9script',
27914c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2792a72cfb80SBram Moolenaar      'endfunc',
27934c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2794a72cfb80SBram Moolenaar      ])
2795a72cfb80SBram Moolenaar  CheckScriptFailure([
2796a72cfb80SBram Moolenaar      'vim9script',
27974c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2798a72cfb80SBram Moolenaar      'endfunc',
27994c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2800a72cfb80SBram Moolenaar      ], 'E488:')
2801a72cfb80SBram Moolenaar
2802a72cfb80SBram Moolenaar  CheckScriptSuccess([
2803a72cfb80SBram Moolenaar      'vim9script',
2804a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2805a72cfb80SBram Moolenaar      ])
2806a72cfb80SBram Moolenaar  CheckScriptFailure([
2807a72cfb80SBram Moolenaar      'vim9script',
2808a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2809a72cfb80SBram Moolenaar      ], 'E488:')
2810e7e4838fSBram Moolenaar
2811e7e4838fSBram Moolenaar  CheckScriptFailure([
2812e7e4838fSBram Moolenaar      'def Test() " comment',
2813e7e4838fSBram Moolenaar      'enddef',
2814e7e4838fSBram Moolenaar      ], 'E488:')
2815e7e4838fSBram Moolenaar  CheckScriptFailure([
2816e7e4838fSBram Moolenaar      'vim9script',
2817e7e4838fSBram Moolenaar      'def Test() " comment',
2818e7e4838fSBram Moolenaar      'enddef',
2819e7e4838fSBram Moolenaar      ], 'E488:')
2820e7e4838fSBram Moolenaar
2821e7e4838fSBram Moolenaar  CheckScriptSuccess([
2822e7e4838fSBram Moolenaar      'func Test() " comment',
2823e7e4838fSBram Moolenaar      'endfunc',
2824e7e4838fSBram Moolenaar      ])
28259898107fSBram Moolenaar  CheckScriptSuccess([
2826e7e4838fSBram Moolenaar      'vim9script',
2827e7e4838fSBram Moolenaar      'func Test() " comment',
2828e7e4838fSBram Moolenaar      'endfunc',
28299898107fSBram Moolenaar      ])
2830e7e4838fSBram Moolenaar
2831e7e4838fSBram Moolenaar  CheckScriptSuccess([
2832e7e4838fSBram Moolenaar      'def Test() # comment',
2833e7e4838fSBram Moolenaar      'enddef',
2834e7e4838fSBram Moolenaar      ])
2835e7e4838fSBram Moolenaar  CheckScriptFailure([
2836e7e4838fSBram Moolenaar      'func Test() # comment',
2837e7e4838fSBram Moolenaar      'endfunc',
2838e7e4838fSBram Moolenaar      ], 'E488:')
28392c5ed4e3SBram Moolenaarenddef
28402c5ed4e3SBram Moolenaar
28412c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
28422c5ed4e3SBram Moolenaar  CheckCanRunGui
28432c5ed4e3SBram Moolenaar
28442c5ed4e3SBram Moolenaar  CheckScriptFailure([
28452c5ed4e3SBram Moolenaar      'vim9script',
28462c5ed4e3SBram Moolenaar      'gui#comment'
28472c5ed4e3SBram Moolenaar      ], 'E499:')
28482c5ed4e3SBram Moolenaar  CheckScriptFailure([
28492c5ed4e3SBram Moolenaar      'vim9script',
28502c5ed4e3SBram Moolenaar      'gui -f#comment'
28512c5ed4e3SBram Moolenaar      ], 'E499:')
28527a092245SBram Moolenaarenddef
28537a092245SBram Moolenaar
2854a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
28556797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
28566797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2857a26b9700SBram Moolenaar
2858a26b9700SBram Moolenaar  edit test.vim
2859a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2860a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2861a26b9700SBram Moolenaar
2862a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2863a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2864a26b9700SBram Moolenaar
2865a26b9700SBram Moolenaar  g:entered = 0
2866a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2867a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2868a26b9700SBram Moolenaar
2869a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2870a26b9700SBram Moolenaar
2871a26b9700SBram Moolenaar  au! TabEnter
2872a26b9700SBram Moolenaar  unlet g:entered
2873d72c1bf0SBram Moolenaar
2874d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2875d72c1bf0SBram Moolenaar      'vim9script',
28766797966dSBram Moolenaar      'g:var = 123',
2877e55b1c09SBram Moolenaar      'b:var = 456',
2878e55b1c09SBram Moolenaar      'w:var = 777',
2879e55b1c09SBram Moolenaar      't:var = 888',
2880d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2881d72c1bf0SBram Moolenaar      ])
2882d72c1bf0SBram Moolenaar
2883d72c1bf0SBram Moolenaar  CheckScriptFailure([
2884d72c1bf0SBram Moolenaar      'vim9script',
2885d72c1bf0SBram Moolenaar      'let g:var = 123',
2886e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2887e55b1c09SBram Moolenaar
2888e55b1c09SBram Moolenaar  CheckScriptFailure([
2889e55b1c09SBram Moolenaar      'vim9script',
2890e55b1c09SBram Moolenaar      'let b:var = 123',
2891e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2892e55b1c09SBram Moolenaar
2893e55b1c09SBram Moolenaar  CheckScriptFailure([
2894e55b1c09SBram Moolenaar      'vim9script',
2895e55b1c09SBram Moolenaar      'let w:var = 123',
2896e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2897e55b1c09SBram Moolenaar
2898e55b1c09SBram Moolenaar  CheckScriptFailure([
2899e55b1c09SBram Moolenaar      'vim9script',
2900e55b1c09SBram Moolenaar      'let t:var = 123',
2901e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2902e55b1c09SBram Moolenaar
2903e55b1c09SBram Moolenaar  CheckScriptFailure([
2904e55b1c09SBram Moolenaar      'vim9script',
2905e55b1c09SBram Moolenaar      'let v:version = 123',
2906e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2907e55b1c09SBram Moolenaar
2908e55b1c09SBram Moolenaar  CheckScriptFailure([
2909e55b1c09SBram Moolenaar      'vim9script',
2910e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2911e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
29126797966dSBram Moolenaar
29136797966dSBram Moolenaar  CheckScriptFailure([
29146797966dSBram Moolenaar      'vim9script',
29156797966dSBram Moolenaar      'g:var = 123',
291632e35117SBram Moolenaar      'unlet g:var# comment1',
2917d72c1bf0SBram Moolenaar      ], 'E108:')
2918d72c1bf0SBram Moolenaar
2919d72c1bf0SBram Moolenaar  CheckScriptFailure([
2920d72c1bf0SBram Moolenaar      'let g:var = 123',
2921d72c1bf0SBram Moolenaar      'unlet g:var # something',
2922d72c1bf0SBram Moolenaar      ], 'E488:')
2923faac4104SBram Moolenaar
2924faac4104SBram Moolenaar  CheckScriptSuccess([
2925faac4104SBram Moolenaar      'vim9script',
292632e35117SBram Moolenaar      'if 1 # comment2',
2927faac4104SBram Moolenaar      '  echo "yes"',
2928faac4104SBram Moolenaar      'elseif 2 #comment',
2929faac4104SBram Moolenaar      '  echo "no"',
2930faac4104SBram Moolenaar      'endif',
2931faac4104SBram Moolenaar      ])
2932faac4104SBram Moolenaar
2933faac4104SBram Moolenaar  CheckScriptFailure([
2934faac4104SBram Moolenaar      'vim9script',
293532e35117SBram Moolenaar      'if 1# comment3',
2936faac4104SBram Moolenaar      '  echo "yes"',
2937faac4104SBram Moolenaar      'endif',
2938faac4104SBram Moolenaar      ], 'E15:')
2939faac4104SBram Moolenaar
2940faac4104SBram Moolenaar  CheckScriptFailure([
2941faac4104SBram Moolenaar      'vim9script',
294232e35117SBram Moolenaar      'if 0 # comment4',
2943faac4104SBram Moolenaar      '  echo "yes"',
2944faac4104SBram Moolenaar      'elseif 2#comment',
2945faac4104SBram Moolenaar      '  echo "no"',
2946faac4104SBram Moolenaar      'endif',
2947faac4104SBram Moolenaar      ], 'E15:')
2948faac4104SBram Moolenaar
2949faac4104SBram Moolenaar  CheckScriptSuccess([
2950faac4104SBram Moolenaar      'vim9script',
295132e35117SBram Moolenaar      'let v = 1 # comment5',
2952faac4104SBram Moolenaar      ])
2953faac4104SBram Moolenaar
2954faac4104SBram Moolenaar  CheckScriptFailure([
2955faac4104SBram Moolenaar      'vim9script',
295632e35117SBram Moolenaar      'let v = 1# comment6',
295732e35117SBram Moolenaar      ], 'E15:')
2958faac4104SBram Moolenaar
2959faac4104SBram Moolenaar  CheckScriptSuccess([
2960faac4104SBram Moolenaar      'vim9script',
2961faac4104SBram Moolenaar      'new'
2962d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2963df069eecSBram Moolenaar      ':$',
2964faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2965faac4104SBram Moolenaar      'bwipe!',
2966faac4104SBram Moolenaar      ])
2967faac4104SBram Moolenaar
2968f5be8cdbSBram Moolenaar  CheckScriptFailure([
2969f5be8cdbSBram Moolenaar      'vim9script',
2970f5be8cdbSBram Moolenaar      'new'
2971d2c61705SBram Moolenaar      'setline(1, ["# define pat", "last"])',
2972f5be8cdbSBram Moolenaar      ':$',
2973f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2974f5be8cdbSBram Moolenaar      'bwipe!',
2975f5be8cdbSBram Moolenaar      ], 'E488:')
2976f5be8cdbSBram Moolenaar
2977f5be8cdbSBram Moolenaar  CheckScriptFailure([
2978f5be8cdbSBram Moolenaar      'vim9script',
2979f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2980f5be8cdbSBram Moolenaar      ], 'E477:')
2981a26b9700SBram Moolenaarenddef
2982a26b9700SBram Moolenaar
29837e5bd91dSBram Moolenaardef Test_finish()
29847e5bd91dSBram Moolenaar  let lines =<< trim END
29857e5bd91dSBram Moolenaar    vim9script
29866797966dSBram Moolenaar    g:res = 'one'
29877e5bd91dSBram Moolenaar    if v:false | finish | endif
29886797966dSBram Moolenaar    g:res = 'two'
29897e5bd91dSBram Moolenaar    finish
29906797966dSBram Moolenaar    g:res = 'three'
29917e5bd91dSBram Moolenaar  END
29927e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
29937e5bd91dSBram Moolenaar  source Xfinished
29947e5bd91dSBram Moolenaar  assert_equal('two', g:res)
29957e5bd91dSBram Moolenaar
29967e5bd91dSBram Moolenaar  unlet g:res
29977e5bd91dSBram Moolenaar  delete('Xfinished')
29987e5bd91dSBram Moolenaarenddef
29997e5bd91dSBram Moolenaar
300032e35117SBram Moolenaardef Test_let_func_call()
300132e35117SBram Moolenaar  let lines =<< trim END
300232e35117SBram Moolenaar    vim9script
300332e35117SBram Moolenaar    func GetValue()
300432e35117SBram Moolenaar      if exists('g:count')
300532e35117SBram Moolenaar        let g:count += 1
300632e35117SBram Moolenaar      else
300732e35117SBram Moolenaar        let g:count = 1
300832e35117SBram Moolenaar      endif
300932e35117SBram Moolenaar      return 'this'
301032e35117SBram Moolenaar    endfunc
301132e35117SBram Moolenaar    let val: string = GetValue()
3012f5be8cdbSBram Moolenaar    # env var is always a string
3013df671b46SBram Moolenaar    let env = $TERM
301432e35117SBram Moolenaar  END
301532e35117SBram Moolenaar  writefile(lines, 'Xfinished')
301632e35117SBram Moolenaar  source Xfinished
3017f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
301832e35117SBram Moolenaar  assert_equal(1, g:count)
301932e35117SBram Moolenaar
302032e35117SBram Moolenaar  unlet g:count
302132e35117SBram Moolenaar  delete('Xfinished')
302232e35117SBram Moolenaarenddef
302332e35117SBram Moolenaar
302432e35117SBram Moolenaardef Test_let_missing_type()
302532e35117SBram Moolenaar  let lines =<< trim END
302632e35117SBram Moolenaar    vim9script
3027df671b46SBram Moolenaar    let var = g:unknown
3028227a69deSBram Moolenaar  END
3029822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
3030227a69deSBram Moolenaar
3031227a69deSBram Moolenaar  lines =<< trim END
3032227a69deSBram Moolenaar    vim9script
3033227a69deSBram Moolenaar    let nr: number = 123
3034227a69deSBram Moolenaar    let var = nr
3035227a69deSBram Moolenaar  END
3036822ba247SBram Moolenaar  CheckScriptSuccess(lines)
303732e35117SBram Moolenaarenddef
303832e35117SBram Moolenaar
3039c82a5b5dSBram Moolenaardef Test_let_declaration()
3040c82a5b5dSBram Moolenaar  let lines =<< trim END
3041c82a5b5dSBram Moolenaar    vim9script
3042c82a5b5dSBram Moolenaar    let var: string
3043c82a5b5dSBram Moolenaar    g:var_uninit = var
3044c82a5b5dSBram Moolenaar    var = 'text'
3045c82a5b5dSBram Moolenaar    g:var_test = var
3046f5be8cdbSBram Moolenaar    # prefixing s: is optional
3047984dddbeSBram Moolenaar    s:var = 'prefixed'
3048984dddbeSBram Moolenaar    g:var_prefixed = s:var
3049984dddbeSBram Moolenaar
3050984dddbeSBram Moolenaar    let s:other: number
3051984dddbeSBram Moolenaar    other = 1234
3052984dddbeSBram Moolenaar    g:other_var = other
305353b29e48SBram Moolenaar
305453b29e48SBram Moolenaar    # type is inferred
305553b29e48SBram Moolenaar    s:dict = {'a': 222}
305653b29e48SBram Moolenaar    def GetDictVal(key: any)
305753b29e48SBram Moolenaar      g:dict_val = s:dict[key]
305853b29e48SBram Moolenaar    enddef
305953b29e48SBram Moolenaar    GetDictVal('a')
3060c82a5b5dSBram Moolenaar  END
3061c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
3062c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
3063c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
3064984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
3065984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
306653b29e48SBram Moolenaar  assert_equal(222, g:dict_val)
3067c82a5b5dSBram Moolenaar
3068c82a5b5dSBram Moolenaar  unlet g:var_uninit
3069c82a5b5dSBram Moolenaar  unlet g:var_test
3070984dddbeSBram Moolenaar  unlet g:var_prefixed
3071984dddbeSBram Moolenaar  unlet g:other_var
3072c82a5b5dSBram Moolenaarenddef
3073c82a5b5dSBram Moolenaar
3074c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
3075c5b1c20bSBram Moolenaar  let lines =<< trim END
3076c5b1c20bSBram Moolenaar    vim9script
3077c5b1c20bSBram Moolenaar    const var: string
3078c5b1c20bSBram Moolenaar  END
3079c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
3080c5b1c20bSBram Moolenaar
3081c5b1c20bSBram Moolenaar  lines =<< trim END
3082c5b1c20bSBram Moolenaar    vim9script
3083c5b1c20bSBram Moolenaar    let 9var: string
3084c5b1c20bSBram Moolenaar  END
3085c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
3086c5b1c20bSBram Moolenaarenddef
3087c5b1c20bSBram Moolenaar
308834db91f7SBram Moolenaardef Test_let_type_check()
308934db91f7SBram Moolenaar  let lines =<< trim END
309034db91f7SBram Moolenaar    vim9script
309134db91f7SBram Moolenaar    let var: string
309234db91f7SBram Moolenaar    var = 1234
309334db91f7SBram Moolenaar  END
3094451c2e35SBram Moolenaar  CheckScriptFailure(lines, 'E1012:')
3095984dddbeSBram Moolenaar
3096984dddbeSBram Moolenaar  lines =<< trim END
3097984dddbeSBram Moolenaar    vim9script
3098984dddbeSBram Moolenaar    let var:string
3099984dddbeSBram Moolenaar  END
3100984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
3101c5b1c20bSBram Moolenaar
3102c5b1c20bSBram Moolenaar  lines =<< trim END
3103c5b1c20bSBram Moolenaar    vim9script
3104c5b1c20bSBram Moolenaar    let var: asdf
3105c5b1c20bSBram Moolenaar  END
3106c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
3107a71e2633SBram Moolenaar
3108a71e2633SBram Moolenaar  lines =<< trim END
3109a71e2633SBram Moolenaar    vim9script
3110a71e2633SBram Moolenaar    let s:l: list<number>
3111a71e2633SBram Moolenaar    s:l = []
3112a71e2633SBram Moolenaar  END
3113a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
3114a71e2633SBram Moolenaar
3115a71e2633SBram Moolenaar  lines =<< trim END
3116a71e2633SBram Moolenaar    vim9script
3117a71e2633SBram Moolenaar    let s:d: dict<number>
3118a71e2633SBram Moolenaar    s:d = {}
3119a71e2633SBram Moolenaar  END
3120a71e2633SBram Moolenaar  CheckScriptSuccess(lines)
312134db91f7SBram Moolenaarenddef
312234db91f7SBram Moolenaar
3123a5d0077eSBram Moolenaardef Test_forward_declaration()
3124a5d0077eSBram Moolenaar  let lines =<< trim END
3125a5d0077eSBram Moolenaar    vim9script
3126a5d0077eSBram Moolenaar    def GetValue(): string
3127a5d0077eSBram Moolenaar      return theVal
3128a5d0077eSBram Moolenaar    enddef
3129a5d0077eSBram Moolenaar    let theVal = 'something'
3130822ba247SBram Moolenaar    g:initVal = GetValue()
3131a5d0077eSBram Moolenaar    theVal = 'else'
3132a5d0077eSBram Moolenaar    g:laterVal = GetValue()
3133a5d0077eSBram Moolenaar  END
3134a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
3135a5d0077eSBram Moolenaar  source Xforward
3136a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
3137a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
3138a5d0077eSBram Moolenaar
3139a5d0077eSBram Moolenaar  unlet g:initVal
3140a5d0077eSBram Moolenaar  unlet g:laterVal
3141a5d0077eSBram Moolenaar  delete('Xforward')
3142a5d0077eSBram Moolenaarenddef
3143a5d0077eSBram Moolenaar
31449721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
31459721fb4eSBram Moolenaar  let legacy_lines =<< trim END
31469721fb4eSBram Moolenaar    source Xvim9_script.vim
31479721fb4eSBram Moolenaar
31489721fb4eSBram Moolenaar    call assert_false(exists('local'))
31499721fb4eSBram Moolenaar    call assert_false(exists('exported'))
31509721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
31519721fb4eSBram Moolenaar    call assert_equal('global', global)
31529721fb4eSBram Moolenaar    call assert_equal('global', g:global)
31539721fb4eSBram Moolenaar
31549721fb4eSBram Moolenaar    " imported variable becomes script-local
31559721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
31569721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
31579721fb4eSBram Moolenaar    call assert_false(exists('exported'))
31589721fb4eSBram Moolenaar
31599721fb4eSBram Moolenaar    " imported function becomes script-local
31609721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
31619721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
31629721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
31639721fb4eSBram Moolenaar  END
31649721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
31659721fb4eSBram Moolenaar
31669721fb4eSBram Moolenaar  let vim9_lines =<< trim END
31679721fb4eSBram Moolenaar    vim9script
31689721fb4eSBram Moolenaar    let local = 'local'
31699721fb4eSBram Moolenaar    g:global = 'global'
31709721fb4eSBram Moolenaar    export let exported = 'exported'
31719721fb4eSBram Moolenaar    export def GetText(): string
31729721fb4eSBram Moolenaar       return 'text'
31739721fb4eSBram Moolenaar    enddef
31749721fb4eSBram Moolenaar  END
31759721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
31769721fb4eSBram Moolenaar
31779721fb4eSBram Moolenaar  source Xlegacy_script.vim
31789721fb4eSBram Moolenaar
31799721fb4eSBram Moolenaar  assert_equal('global', g:global)
3180f5be8cdbSBram Moolenaar  unlet g:global
31819721fb4eSBram Moolenaar
31829721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
31839721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
31849721fb4eSBram Moolenaarenddef
3185a5d0077eSBram Moolenaar
31867d699701SBram Moolenaarfunc Test_vim9script_not_global()
31877d699701SBram Moolenaar  " check that items defined in Vim9 script are script-local, not global
31887d699701SBram Moolenaar  let vim9lines =<< trim END
31897d699701SBram Moolenaar    vim9script
31907d699701SBram Moolenaar    let var = 'local'
31917d699701SBram Moolenaar    func TheFunc()
31927d699701SBram Moolenaar      echo 'local'
31937d699701SBram Moolenaar    endfunc
31947d699701SBram Moolenaar    def DefFunc()
31957d699701SBram Moolenaar      echo 'local'
31967d699701SBram Moolenaar    enddef
31977d699701SBram Moolenaar  END
31987d699701SBram Moolenaar  call writefile(vim9lines, 'Xvim9script.vim')
31997d699701SBram Moolenaar  source Xvim9script.vim
32007d699701SBram Moolenaar  try
32017d699701SBram Moolenaar    echo g:var
32027d699701SBram Moolenaar    assert_report('did not fail')
32037d699701SBram Moolenaar  catch /E121:/
32047d699701SBram Moolenaar    " caught
32057d699701SBram Moolenaar  endtry
32067d699701SBram Moolenaar  try
32077d699701SBram Moolenaar    call TheFunc()
32087d699701SBram Moolenaar    assert_report('did not fail')
32097d699701SBram Moolenaar  catch /E117:/
32107d699701SBram Moolenaar    " caught
32117d699701SBram Moolenaar  endtry
32127d699701SBram Moolenaar  try
32137d699701SBram Moolenaar    call DefFunc()
32147d699701SBram Moolenaar    assert_report('did not fail')
32157d699701SBram Moolenaar  catch /E117:/
32167d699701SBram Moolenaar    " caught
32177d699701SBram Moolenaar  endtry
32187d699701SBram Moolenaar
321925859dd7SBram Moolenaar  call delete('Xvim9script.vim')
32207d699701SBram Moolenaarendfunc
32217d699701SBram Moolenaar
3222eeb27bfeSBram Moolenaardef Test_vim9_copen()
3223eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
3224eeb27bfeSBram Moolenaar  copen
3225eeb27bfeSBram Moolenaar  quit
3226eeb27bfeSBram Moolenaarenddef
3227eeb27bfeSBram Moolenaar
32282d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
32292d6b20d6SBram Moolenaardef Test_vim9_autoload()
32302d6b20d6SBram Moolenaar  let lines =<< trim END
32312d6b20d6SBram Moolenaar     vim9script
32322d6b20d6SBram Moolenaar     def foo#test()
32332d6b20d6SBram Moolenaar         echomsg getreg('"')
32342d6b20d6SBram Moolenaar     enddef
32352d6b20d6SBram Moolenaar  END
32362d6b20d6SBram Moolenaar
32372d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
32382d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
32392d6b20d6SBram Moolenaar  let save_rtp = &rtp
32402d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
32412d6b20d6SBram Moolenaar  augroup test
32422d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
32432d6b20d6SBram Moolenaar  augroup END
32442d6b20d6SBram Moolenaar
32452d6b20d6SBram Moolenaar  normal Y
32462d6b20d6SBram Moolenaar
32472d6b20d6SBram Moolenaar  augroup test
32482d6b20d6SBram Moolenaar    autocmd!
32492d6b20d6SBram Moolenaar  augroup END
32502d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
32512d6b20d6SBram Moolenaar  &rtp = save_rtp
32522d6b20d6SBram Moolenaarenddef
32532d6b20d6SBram Moolenaar
325481e17fbeSBram Moolenaardef Test_script_var_in_autocmd()
325581e17fbeSBram Moolenaar  # using a script variable from an autocommand, defined in a :def function in a
325681e17fbeSBram Moolenaar  # legacy Vim script, cannot check the variable type.
325781e17fbeSBram Moolenaar  let lines =<< trim END
325881e17fbeSBram Moolenaar    let s:counter = 1
325981e17fbeSBram Moolenaar    def s:Func()
326081e17fbeSBram Moolenaar      au! CursorHold
326181e17fbeSBram Moolenaar      au CursorHold * s:counter += 1
326281e17fbeSBram Moolenaar    enddef
326381e17fbeSBram Moolenaar    call s:Func()
326481e17fbeSBram Moolenaar    doau CursorHold
326581e17fbeSBram Moolenaar    call assert_equal(2, s:counter)
326681e17fbeSBram Moolenaar    au! CursorHold
326781e17fbeSBram Moolenaar  END
326881e17fbeSBram Moolenaar  CheckScriptSuccess(lines)
326981e17fbeSBram Moolenaarenddef
327081e17fbeSBram Moolenaar
32713896a105SBram Moolenaardef Test_cmdline_win()
32723896a105SBram Moolenaar  # if the Vim syntax highlighting uses Vim9 constructs they can be used from
32733896a105SBram Moolenaar  # the command line window.
32743896a105SBram Moolenaar  mkdir('rtp/syntax', 'p')
32753896a105SBram Moolenaar  let export_lines =<< trim END
32763896a105SBram Moolenaar    vim9script
32773896a105SBram Moolenaar    export let That = 'yes'
32783896a105SBram Moolenaar  END
32793896a105SBram Moolenaar  writefile(export_lines, 'rtp/syntax/Xexport.vim')
32803896a105SBram Moolenaar  let import_lines =<< trim END
32813896a105SBram Moolenaar    vim9script
32823896a105SBram Moolenaar    import That from './Xexport.vim'
32833896a105SBram Moolenaar  END
32843896a105SBram Moolenaar  writefile(import_lines, 'rtp/syntax/vim.vim')
32853896a105SBram Moolenaar  let save_rtp = &rtp
32863896a105SBram Moolenaar  &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
32873896a105SBram Moolenaar  syntax on
32883896a105SBram Moolenaar  augroup CmdWin
32893896a105SBram Moolenaar    autocmd CmdwinEnter * g:got_there = 'yes'
32903896a105SBram Moolenaar  augroup END
32913896a105SBram Moolenaar  # this will open and also close the cmdline window
32923896a105SBram Moolenaar  feedkeys('q:', 'xt')
32933896a105SBram Moolenaar  assert_equal('yes', g:got_there)
32943896a105SBram Moolenaar
32953896a105SBram Moolenaar  augroup CmdWin
32963896a105SBram Moolenaar    au!
32973896a105SBram Moolenaar  augroup END
32983896a105SBram Moolenaar  &rtp = save_rtp
32993896a105SBram Moolenaar  delete('rtp', 'rf')
33003896a105SBram Moolenaarenddef
33013896a105SBram Moolenaar
3302e3d4685fSBram Moolenaardef Test_invalid_sid()
3303e3d4685fSBram Moolenaar  assert_fails('func <SNR>1234_func', 'E123:')
330425859dd7SBram Moolenaar
3305e3d4685fSBram Moolenaar  if RunVim([], ['wq Xdidit'], '+"func <SNR>1_func"')
3306d2c61705SBram Moolenaar    assert_equal([], readfile('Xdidit'))
3307e3d4685fSBram Moolenaar  endif
3308e3d4685fSBram Moolenaar  delete('Xdidit')
3309e3d4685fSBram Moolenaarenddef
3310e3d4685fSBram Moolenaar
3311585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
3312585fea7bSBram Moolenaardef Test_substitute_cmd()
3313585fea7bSBram Moolenaar  new
3314585fea7bSBram Moolenaar  setline(1, 'something')
3315585fea7bSBram Moolenaar  :substitute(some(other(
3316585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
3317585fea7bSBram Moolenaar  bwipe!
3318585fea7bSBram Moolenaar
3319f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
3320585fea7bSBram Moolenaar  let lines =<< trim END
3321585fea7bSBram Moolenaar    vim9script
3322585fea7bSBram Moolenaar    new
3323585fea7bSBram Moolenaar    setline(1, 'something')
3324585fea7bSBram Moolenaar    :substitute(some(other(
3325585fea7bSBram Moolenaar    assert_equal('otherthing', getline(1))
3326585fea7bSBram Moolenaar    bwipe!
3327585fea7bSBram Moolenaar  END
3328585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
3329585fea7bSBram Moolenaar  source Xvim9lines
3330585fea7bSBram Moolenaar
3331585fea7bSBram Moolenaar  delete('Xvim9lines')
3332585fea7bSBram Moolenaarenddef
3333585fea7bSBram Moolenaar
33348a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3335