1971caf53SBram Moolenaar" Test Vim9 assignments
2971caf53SBram Moolenaar
3971caf53SBram Moolenaarsource check.vim
4971caf53SBram Moolenaarsource vim9.vim
5971caf53SBram Moolenaar
6971caf53SBram Moolenaarlet s:appendToMe = 'xxx'
7971caf53SBram Moolenaarlet s:addToMe = 111
8971caf53SBram Moolenaarlet g:existing = 'yes'
9971caf53SBram Moolenaarlet g:inc_counter = 1
10971caf53SBram Moolenaarlet $SOME_ENV_VAR = 'some'
11971caf53SBram Moolenaarlet g:alist = [7]
125b5ae29bSBram Moolenaarlet g:adict = #{a: 1}
13971caf53SBram Moolenaarlet g:astring = 'text'
14971caf53SBram Moolenaar
15971caf53SBram Moolenaardef Test_assignment_bool()
1630fd8204SBram Moolenaar  var bool1: bool = true
17971caf53SBram Moolenaar  assert_equal(v:true, bool1)
1830fd8204SBram Moolenaar  var bool2: bool = false
19971caf53SBram Moolenaar  assert_equal(v:false, bool2)
20971caf53SBram Moolenaar
2130fd8204SBram Moolenaar  var bool3: bool = 0
22971caf53SBram Moolenaar  assert_equal(false, bool3)
2330fd8204SBram Moolenaar  var bool4: bool = 1
24971caf53SBram Moolenaar  assert_equal(true, bool4)
25971caf53SBram Moolenaar
262bb2658bSBram Moolenaar  var bool5: bool = 1 && true
27971caf53SBram Moolenaar  assert_equal(true, bool5)
282bb2658bSBram Moolenaar  var bool6: bool = 0 && 1
29971caf53SBram Moolenaar  assert_equal(false, bool6)
302bb2658bSBram Moolenaar  var bool7: bool = 0 || 1 && true
31971caf53SBram Moolenaar  assert_equal(true, bool7)
32971caf53SBram Moolenaar
3330fd8204SBram Moolenaar  var lines =<< trim END
34971caf53SBram Moolenaar    vim9script
35971caf53SBram Moolenaar    def GetFlag(): bool
3630fd8204SBram Moolenaar      var flag: bool = 1
37971caf53SBram Moolenaar      return flag
38971caf53SBram Moolenaar    enddef
3930fd8204SBram Moolenaar    var flag: bool = GetFlag()
40971caf53SBram Moolenaar    assert_equal(true, flag)
41971caf53SBram Moolenaar    flag = 0
42971caf53SBram Moolenaar    assert_equal(false, flag)
43971caf53SBram Moolenaar    flag = 1
44971caf53SBram Moolenaar    assert_equal(true, flag)
452bb2658bSBram Moolenaar    flag = 1 || true
46971caf53SBram Moolenaar    assert_equal(true, flag)
472bb2658bSBram Moolenaar    flag = 1 && false
48971caf53SBram Moolenaar    assert_equal(false, flag)
49dd1f426bSBram Moolenaar
50dd1f426bSBram Moolenaar    var cp: bool = &cp
51dd1f426bSBram Moolenaar    var fen: bool = &l:fen
52971caf53SBram Moolenaar  END
53971caf53SBram Moolenaar  CheckScriptSuccess(lines)
5430fd8204SBram Moolenaar  CheckDefAndScriptFailure(['var x: bool = 2'], 'E1012:')
5530fd8204SBram Moolenaar  CheckDefAndScriptFailure(['var x: bool = -1'], 'E1012:')
5630fd8204SBram Moolenaar  CheckDefAndScriptFailure(['var x: bool = [1]'], 'E1012:')
5730fd8204SBram Moolenaar  CheckDefAndScriptFailure(['var x: bool = {}'], 'E1012:')
5830fd8204SBram Moolenaar  CheckDefAndScriptFailure(['var x: bool = "x"'], 'E1012:')
599a562c18SBram Moolenaar
609a562c18SBram Moolenaar  CheckDefAndScriptFailure(['var x: bool = "x"', '', 'eval 0'], 'E1012:', 1)
61971caf53SBram Moolenaarenddef
62971caf53SBram Moolenaar
63971caf53SBram Moolenaardef Test_syntax()
649830938eSBram Moolenaar  var name = 234
6530fd8204SBram Moolenaar  var other: list<string> = ['asdf']
66971caf53SBram Moolenaarenddef
67971caf53SBram Moolenaar
68971caf53SBram Moolenaardef Test_assignment()
6930fd8204SBram Moolenaar  CheckDefFailure(['var x:string'], 'E1069:')
7030fd8204SBram Moolenaar  CheckDefFailure(['var x:string = "x"'], 'E1069:')
7130fd8204SBram Moolenaar  CheckDefFailure(['var a:string = "x"'], 'E1069:')
722949cfdbSBram Moolenaar  CheckDefFailure(['var lambda = () => "lambda"'], 'E704:')
7330fd8204SBram Moolenaar  CheckScriptFailure(['var x = "x"'], 'E1124:')
74971caf53SBram Moolenaar
753f327880SBram Moolenaar  # lower case name is OK for a list
763f327880SBram Moolenaar  var lambdaLines =<< trim END
773f327880SBram Moolenaar      var lambdaList: list<func> = [Test_syntax]
783f327880SBram Moolenaar      lambdaList[0] = () => "lambda"
793f327880SBram Moolenaar  END
803f327880SBram Moolenaar  CheckDefAndScriptSuccess(lambdaLines)
813f327880SBram Moolenaar
8230fd8204SBram Moolenaar  var nr: number = 1234
8330fd8204SBram Moolenaar  CheckDefFailure(['var nr: number = "asdf"'], 'E1012:')
84971caf53SBram Moolenaar
8530fd8204SBram Moolenaar  var a: number = 6 #comment
86971caf53SBram Moolenaar  assert_equal(6, a)
87971caf53SBram Moolenaar
88971caf53SBram Moolenaar  if has('channel')
8930fd8204SBram Moolenaar    var chan1: channel
90218450adSBram Moolenaar    assert_equal('fail', ch_status(chan1))
91218450adSBram Moolenaar
9230fd8204SBram Moolenaar    var job1: job
93218450adSBram Moolenaar    assert_equal('fail', job_status(job1))
94218450adSBram Moolenaar
95fc8aa6d0SBram Moolenaar    # calling job_start() is in test_vim9_fails.vim, it causes leak reports
96971caf53SBram Moolenaar  endif
97971caf53SBram Moolenaar  if has('float')
9830fd8204SBram Moolenaar    var float1: float = 3.4
99971caf53SBram Moolenaar  endif
10030fd8204SBram Moolenaar  var Funky1: func
10130fd8204SBram Moolenaar  var Funky2: func = function('len')
10230fd8204SBram Moolenaar  var Party2: func = funcref('g:Test_syntax')
103971caf53SBram Moolenaar
104971caf53SBram Moolenaar  g:newvar = 'new'  #comment
105971caf53SBram Moolenaar  assert_equal('new', g:newvar)
106971caf53SBram Moolenaar
107971caf53SBram Moolenaar  assert_equal('yes', g:existing)
108971caf53SBram Moolenaar  g:existing = 'no'
109971caf53SBram Moolenaar  assert_equal('no', g:existing)
110971caf53SBram Moolenaar
111971caf53SBram Moolenaar  v:char = 'abc'
112971caf53SBram Moolenaar  assert_equal('abc', v:char)
113971caf53SBram Moolenaar
114971caf53SBram Moolenaar  $ENVVAR = 'foobar'
115971caf53SBram Moolenaar  assert_equal('foobar', $ENVVAR)
116971caf53SBram Moolenaar  $ENVVAR = ''
117971caf53SBram Moolenaar
11830fd8204SBram Moolenaar  var lines =<< trim END
119971caf53SBram Moolenaar    vim9script
120971caf53SBram Moolenaar    $ENVVAR = 'barfoo'
121971caf53SBram Moolenaar    assert_equal('barfoo', $ENVVAR)
122971caf53SBram Moolenaar    $ENVVAR = ''
123971caf53SBram Moolenaar  END
124971caf53SBram Moolenaar  CheckScriptSuccess(lines)
125971caf53SBram Moolenaar
126971caf53SBram Moolenaar  s:appendToMe ..= 'yyy'
127971caf53SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
128971caf53SBram Moolenaar  s:addToMe += 222
129971caf53SBram Moolenaar  assert_equal(333, s:addToMe)
130971caf53SBram Moolenaar  s:newVar = 'new'
131971caf53SBram Moolenaar  assert_equal('new', s:newVar)
132971caf53SBram Moolenaar
133971caf53SBram Moolenaar  set ts=7
134dd1f426bSBram Moolenaar  var ts: number = &ts
135dd1f426bSBram Moolenaar  assert_equal(7, ts)
136971caf53SBram Moolenaar  &ts += 1
137971caf53SBram Moolenaar  assert_equal(8, &ts)
138971caf53SBram Moolenaar  &ts -= 3
139971caf53SBram Moolenaar  assert_equal(5, &ts)
140971caf53SBram Moolenaar  &ts *= 2
141971caf53SBram Moolenaar  assert_equal(10, &ts)
142971caf53SBram Moolenaar  &ts /= 3
143971caf53SBram Moolenaar  assert_equal(3, &ts)
144971caf53SBram Moolenaar  set ts=10
145971caf53SBram Moolenaar  &ts %= 4
146971caf53SBram Moolenaar  assert_equal(2, &ts)
147971caf53SBram Moolenaar
148971caf53SBram Moolenaar  if has('float')
14930fd8204SBram Moolenaar    var f100: float = 100.0
150971caf53SBram Moolenaar    f100 /= 5
151971caf53SBram Moolenaar    assert_equal(20.0, f100)
152971caf53SBram Moolenaar
15330fd8204SBram Moolenaar    var f200: float = 200.0
154971caf53SBram Moolenaar    f200 /= 5.0
155971caf53SBram Moolenaar    assert_equal(40.0, f200)
156971caf53SBram Moolenaar
15730fd8204SBram Moolenaar    CheckDefFailure(['var nr: number = 200', 'nr /= 5.0'], 'E1012:')
158971caf53SBram Moolenaar  endif
159971caf53SBram Moolenaar
160971caf53SBram Moolenaar  lines =<< trim END
161971caf53SBram Moolenaar    &ts = 6
162971caf53SBram Moolenaar    &ts += 3
163971caf53SBram Moolenaar    assert_equal(9, &ts)
164971caf53SBram Moolenaar
165971caf53SBram Moolenaar    &l:ts = 6
166971caf53SBram Moolenaar    assert_equal(6, &ts)
167971caf53SBram Moolenaar    &l:ts += 2
168971caf53SBram Moolenaar    assert_equal(8, &ts)
169971caf53SBram Moolenaar
170971caf53SBram Moolenaar    &g:ts = 6
171971caf53SBram Moolenaar    assert_equal(6, &g:ts)
172971caf53SBram Moolenaar    &g:ts += 2
173971caf53SBram Moolenaar    assert_equal(8, &g:ts)
1740ea04408SBram Moolenaar
1750ea04408SBram Moolenaar    &number = true
1760ea04408SBram Moolenaar    assert_equal(true, &number)
1770ea04408SBram Moolenaar    &number = 0
1780ea04408SBram Moolenaar    assert_equal(false, &number)
1790ea04408SBram Moolenaar    &number = 1
1800ea04408SBram Moolenaar    assert_equal(true, &number)
1810ea04408SBram Moolenaar    &number = false
1820ea04408SBram Moolenaar    assert_equal(false, &number)
183971caf53SBram Moolenaar  END
184971caf53SBram Moolenaar  CheckDefAndScriptSuccess(lines)
185971caf53SBram Moolenaar
186971caf53SBram Moolenaar  CheckDefFailure(['&notex += 3'], 'E113:')
187971caf53SBram Moolenaar  CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
188971caf53SBram Moolenaar  CheckDefFailure(['&ts = [7]'], 'E1012:')
189971caf53SBram Moolenaar  CheckDefExecFailure(['&ts = g:alist'], 'E1012: Type mismatch; expected number but got list<number>')
190971caf53SBram Moolenaar  CheckDefFailure(['&ts = "xx"'], 'E1012:')
191971caf53SBram Moolenaar  CheckDefExecFailure(['&ts = g:astring'], 'E1012: Type mismatch; expected number but got string')
192971caf53SBram Moolenaar  CheckDefFailure(['&path += 3'], 'E1012:')
193971caf53SBram Moolenaar  CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
194971caf53SBram Moolenaar  # test freeing ISN_STOREOPT
19530fd8204SBram Moolenaar  CheckDefFailure(['&ts = 3', 'var asdf'], 'E1022:')
196971caf53SBram Moolenaar  &ts = 8
197971caf53SBram Moolenaar
198971caf53SBram Moolenaar  lines =<< trim END
19930fd8204SBram Moolenaar    var save_TI = &t_TI
200971caf53SBram Moolenaar    &t_TI = ''
201971caf53SBram Moolenaar    assert_equal('', &t_TI)
202971caf53SBram Moolenaar    &t_TI = 'xxx'
203971caf53SBram Moolenaar    assert_equal('xxx', &t_TI)
204971caf53SBram Moolenaar    &t_TI = save_TI
205971caf53SBram Moolenaar  END
206971caf53SBram Moolenaar  CheckDefAndScriptSuccess(lines)
207971caf53SBram Moolenaar
208971caf53SBram Moolenaar  CheckDefFailure(['&t_TI = 123'], 'E1012:')
209971caf53SBram Moolenaar  CheckScriptFailure(['vim9script', '&t_TI = 123'], 'E928:')
210971caf53SBram Moolenaar
21130fd8204SBram Moolenaar  CheckDefFailure(['var s:var = 123'], 'E1101:')
21230fd8204SBram Moolenaar  CheckDefFailure(['var s:var: number'], 'E1101:')
213971caf53SBram Moolenaar
214971caf53SBram Moolenaar  lines =<< trim END
215971caf53SBram Moolenaar    vim9script
216971caf53SBram Moolenaar    def SomeFunc()
217971caf53SBram Moolenaar      s:var = 123
218971caf53SBram Moolenaar    enddef
219971caf53SBram Moolenaar    defcompile
220971caf53SBram Moolenaar  END
221971caf53SBram Moolenaar  CheckScriptFailure(lines, 'E1089:')
222971caf53SBram Moolenaar
223971caf53SBram Moolenaar  g:inc_counter += 1
224971caf53SBram Moolenaar  assert_equal(2, g:inc_counter)
225971caf53SBram Moolenaar
2267bf9a07bSBram Moolenaar  if has('float')
2277bf9a07bSBram Moolenaar    var f: float
2287bf9a07bSBram Moolenaar    f += 1
2297bf9a07bSBram Moolenaar    assert_equal(1.0, f)
2307bf9a07bSBram Moolenaar  endif
2317bf9a07bSBram Moolenaar
232971caf53SBram Moolenaar  $SOME_ENV_VAR ..= 'more'
233971caf53SBram Moolenaar  assert_equal('somemore', $SOME_ENV_VAR)
234971caf53SBram Moolenaar  CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1051:')
235971caf53SBram Moolenaar  CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1012:')
236971caf53SBram Moolenaar
237971caf53SBram Moolenaar  v:errmsg = 'none'
238971caf53SBram Moolenaar  v:errmsg ..= 'again'
239971caf53SBram Moolenaar  assert_equal('noneagain', v:errmsg)
240971caf53SBram Moolenaar  CheckDefFailure(['v:errmsg += "more"'], 'E1051:')
241971caf53SBram Moolenaar  CheckDefFailure(['v:errmsg += 123'], 'E1012:')
242971caf53SBram Moolenaar
24330fd8204SBram Moolenaar  var text =<< trim END
244971caf53SBram Moolenaar    some text
245971caf53SBram Moolenaar  END
246971caf53SBram Moolenaarenddef
247971caf53SBram Moolenaar
248af647e76SBram Moolenaardef Test_float_and_number()
249af647e76SBram Moolenaar  if !has('float')
250af647e76SBram Moolenaar    MissingFeature float
251af647e76SBram Moolenaar  else
252af647e76SBram Moolenaar    var lines =<< trim END
253af647e76SBram Moolenaar         var f: float
254af647e76SBram Moolenaar         f += 2
255af647e76SBram Moolenaar         f -= 1
256af647e76SBram Moolenaar         assert_equal(1.0, f)
257af647e76SBram Moolenaar         ++f
258af647e76SBram Moolenaar         --f
259af647e76SBram Moolenaar         assert_equal(1.0, f)
260af647e76SBram Moolenaar    END
261af647e76SBram Moolenaar    CheckDefAndScriptSuccess(lines)
262af647e76SBram Moolenaar  endif
263af647e76SBram Moolenaarenddef
264af647e76SBram Moolenaar
265f5d52c90SBram Moolenaarlet g:someNumber = 43
266f5d52c90SBram Moolenaar
267f5d52c90SBram Moolenaardef Test_assign_concat()
268f5d52c90SBram Moolenaar  var lines =<< trim END
269f5d52c90SBram Moolenaar    var s = '-'
270f5d52c90SBram Moolenaar    s ..= 99
271f5d52c90SBram Moolenaar    s ..= true
272f5d52c90SBram Moolenaar    s ..= '-'
273f5d52c90SBram Moolenaar    s ..= v:null
274f5d52c90SBram Moolenaar    s ..= g:someNumber
275f5d52c90SBram Moolenaar    assert_equal('-99true-null43', s)
276f5d52c90SBram Moolenaar  END
277f5d52c90SBram Moolenaar  CheckDefAndScriptSuccess(lines)
278f5d52c90SBram Moolenaar
279f5d52c90SBram Moolenaar  lines =<< trim END
280f5d52c90SBram Moolenaar    var s = '-'
281f5d52c90SBram Moolenaar    s ..= [1, 2]
282f5d52c90SBram Moolenaar  END
283f5d52c90SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1105: Cannot convert list to string', 'E734: Wrong variable type for .=', 2)
284f5d52c90SBram Moolenaar  lines =<< trim END
285f5d52c90SBram Moolenaar    var s = '-'
286f5d52c90SBram Moolenaar    s ..= {a: 2}
287f5d52c90SBram Moolenaar  END
288f5d52c90SBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1105: Cannot convert dict to string', 'E734: Wrong variable type for .=', 2)
289f5d52c90SBram Moolenaarenddef
290f5d52c90SBram Moolenaar
29113e45d14SBram Moolenaardef Test_assign_register()
29213e45d14SBram Moolenaar  var lines =<< trim END
29313e45d14SBram Moolenaar    @c = 'areg'
29413e45d14SBram Moolenaar    @c ..= 'add'
29513e45d14SBram Moolenaar    assert_equal('aregadd', @c)
29613e45d14SBram Moolenaar
29713e45d14SBram Moolenaar    @@ = 'some text'
29813e45d14SBram Moolenaar    assert_equal('some text', getreg('"'))
29913e45d14SBram Moolenaar  END
30013e45d14SBram Moolenaar  CheckDefAndScriptSuccess(lines)
30113e45d14SBram Moolenaar
30213e45d14SBram Moolenaar  CheckDefFailure(['@a += "more"'], 'E1051:')
30313e45d14SBram Moolenaar  CheckDefFailure(['@a += 123'], 'E1012:')
30413e45d14SBram Moolenaarenddef
30513e45d14SBram Moolenaar
306d0edaf9dSBram Moolenaardef Test_reserved_name()
307d0edaf9dSBram Moolenaar  for name in ['true', 'false', 'null']
308d0edaf9dSBram Moolenaar    CheckDefExecAndScriptFailure(['var ' .. name .. ' =  0'], 'E1034:')
309d0edaf9dSBram Moolenaar    CheckDefExecAndScriptFailure(['var ' .. name .. ': bool'], 'E1034:')
310d0edaf9dSBram Moolenaar  endfor
311d0edaf9dSBram Moolenaarenddef
312d0edaf9dSBram Moolenaar
313aa1959bdSBram Moolenaardef Test_skipped_assignment()
314aa1959bdSBram Moolenaar  var lines =<< trim END
315aa1959bdSBram Moolenaar      for x in []
316aa1959bdSBram Moolenaar        var i: number = 1
317aa1959bdSBram Moolenaar        while false
318aa1959bdSBram Moolenaar          i += 1
319aa1959bdSBram Moolenaar        endwhile
320aa1959bdSBram Moolenaar      endfor
321aa1959bdSBram Moolenaar  END
322aa1959bdSBram Moolenaar  CheckDefAndScriptSuccess(lines)
323aa1959bdSBram Moolenaarenddef
324aa1959bdSBram Moolenaar
3258ff16e01SBram Moolenaardef Test_assign_unpack()
3268ff16e01SBram Moolenaar  var lines =<< trim END
3278ff16e01SBram Moolenaar    var v1: number
3288ff16e01SBram Moolenaar    var v2: number
3298ff16e01SBram Moolenaar    [v1, v2] = [1, 2]
3308ff16e01SBram Moolenaar    assert_equal(1, v1)
3318ff16e01SBram Moolenaar    assert_equal(2, v2)
332f93bbd02SBram Moolenaar
333f93bbd02SBram Moolenaar    [v1, _, v2, _] = [1, 99, 2, 77]
334f93bbd02SBram Moolenaar    assert_equal(1, v1)
335f93bbd02SBram Moolenaar    assert_equal(2, v2)
336f93bbd02SBram Moolenaar
337f93bbd02SBram Moolenaar    [v1, v2; _] = [1, 2, 3, 4, 5]
338f93bbd02SBram Moolenaar    assert_equal(1, v1)
339f93bbd02SBram Moolenaar    assert_equal(2, v2)
340035bd1c9SBram Moolenaar
3414d5dfe20SBram Moolenaar    var reslist = []
3424d5dfe20SBram Moolenaar    for text in ['aaa {bbb} ccc', 'ddd {eee} fff']
3434d5dfe20SBram Moolenaar      var before: string
3444d5dfe20SBram Moolenaar      var middle: string
3454d5dfe20SBram Moolenaar      var after: string
3464d5dfe20SBram Moolenaar      [_, before, middle, after; _] = text->matchlist('\(.\{-\}\){\(.\{-\}\)}\(.*\)')
3474d5dfe20SBram Moolenaar      reslist->add(before)->add(middle)->add(after)
3484d5dfe20SBram Moolenaar    endfor
3494d5dfe20SBram Moolenaar    assert_equal(['aaa ', 'bbb', ' ccc', 'ddd ', 'eee', ' fff'], reslist)
3504d5dfe20SBram Moolenaar
351035bd1c9SBram Moolenaar    var a = 1
352035bd1c9SBram Moolenaar    var b = 3
353035bd1c9SBram Moolenaar    [a, b] += [2, 4]
354035bd1c9SBram Moolenaar    assert_equal(3, a)
355035bd1c9SBram Moolenaar    assert_equal(7, b)
356035bd1c9SBram Moolenaar
357035bd1c9SBram Moolenaar    [a, b] -= [1, 2]
358035bd1c9SBram Moolenaar    assert_equal(2, a)
359035bd1c9SBram Moolenaar    assert_equal(5, b)
360035bd1c9SBram Moolenaar
361035bd1c9SBram Moolenaar    [a, b] *= [3, 2]
362035bd1c9SBram Moolenaar    assert_equal(6, a)
363035bd1c9SBram Moolenaar    assert_equal(10, b)
364035bd1c9SBram Moolenaar
365035bd1c9SBram Moolenaar    [a, b] /= [2, 4]
366035bd1c9SBram Moolenaar    assert_equal(3, a)
367035bd1c9SBram Moolenaar    assert_equal(2, b)
368035bd1c9SBram Moolenaar
369035bd1c9SBram Moolenaar    [a, b] = [17, 15]
370035bd1c9SBram Moolenaar    [a, b] %= [5, 3]
371035bd1c9SBram Moolenaar    assert_equal(2, a)
372035bd1c9SBram Moolenaar    assert_equal(0, b)
3738ff16e01SBram Moolenaar  END
3748ff16e01SBram Moolenaar  CheckDefAndScriptSuccess(lines)
3758ff16e01SBram Moolenaar
3768ff16e01SBram Moolenaar  lines =<< trim END
3778ff16e01SBram Moolenaar      var v1: number
3788ff16e01SBram Moolenaar      var v2: number
3798ff16e01SBram Moolenaar      [v1, v2] =
3808ff16e01SBram Moolenaar  END
3818ff16e01SBram Moolenaar  CheckDefFailure(lines, 'E1097:', 5)
3828ff16e01SBram Moolenaar
3838ff16e01SBram Moolenaar  lines =<< trim END
3848ff16e01SBram Moolenaar      var v1: number
3858ff16e01SBram Moolenaar      var v2: number
3868ff16e01SBram Moolenaar      [v1, v2] = xxx
3878ff16e01SBram Moolenaar  END
3888ff16e01SBram Moolenaar  CheckDefFailure(lines, 'E1001:', 3)
3898ff16e01SBram Moolenaar
3908ff16e01SBram Moolenaar  lines =<< trim END
3918ff16e01SBram Moolenaar      var v1: number
3928ff16e01SBram Moolenaar      var v2: number
3938ff16e01SBram Moolenaar      [v1, v2] = popup_clear()
3948ff16e01SBram Moolenaar  END
3958ff16e01SBram Moolenaar  CheckDefFailure(lines, 'E1031:', 3)
3968ff16e01SBram Moolenaar
3978ff16e01SBram Moolenaar  lines =<< trim END
3983862ea3fSBram Moolenaar      [v1, v2] = [1, 2]
3993862ea3fSBram Moolenaar  END
4003862ea3fSBram Moolenaar  CheckDefFailure(lines, 'E1089', 1)
4013862ea3fSBram Moolenaar  CheckScriptFailure(['vim9script'] + lines, 'E1089', 2)
4023862ea3fSBram Moolenaar
4033862ea3fSBram Moolenaar  lines =<< trim END
4048ff16e01SBram Moolenaar      var v1: number
4058ff16e01SBram Moolenaar      var v2: number
4068ff16e01SBram Moolenaar      [v1, v2] = ''
4078ff16e01SBram Moolenaar  END
4088ff16e01SBram Moolenaar  CheckDefFailure(lines, 'E1012: Type mismatch; expected list<any> but got string', 3)
409f785aa13SBram Moolenaar
410f785aa13SBram Moolenaar  lines =<< trim END
411f785aa13SBram Moolenaar    g:values = [false, 0]
412f785aa13SBram Moolenaar    var x: bool
413f785aa13SBram Moolenaar    var y: string
414f785aa13SBram Moolenaar    [x, y] = g:values
415f785aa13SBram Moolenaar  END
416f785aa13SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1163: Variable 2: type mismatch, expected string but got number')
4174270d8b7SBram Moolenaar
4184270d8b7SBram Moolenaar  lines =<< trim END
4194270d8b7SBram Moolenaar    var x: number
4204270d8b7SBram Moolenaar    var y: number
4214270d8b7SBram Moolenaar    var z: string
4224270d8b7SBram Moolenaar    [x, y, z] = [1, 2, 3]
4234270d8b7SBram Moolenaar  END
4244270d8b7SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1163: Variable 3: type mismatch, expected string but got number')
4254270d8b7SBram Moolenaar
4264270d8b7SBram Moolenaar  lines =<< trim END
4274270d8b7SBram Moolenaar    var x: number
4284270d8b7SBram Moolenaar    var y: string
4294270d8b7SBram Moolenaar    var z: string
4304270d8b7SBram Moolenaar    [x, y, z] = [1, '2', 3]
4314270d8b7SBram Moolenaar  END
4324270d8b7SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1163: Variable 3: type mismatch, expected string but got number')
4338ff16e01SBram Moolenaarenddef
4348ff16e01SBram Moolenaar
4357f76494aSBram Moolenaardef Test_assign_linebreak()
4367f76494aSBram Moolenaar  var nr: number
4377f76494aSBram Moolenaar  nr =
4387f76494aSBram Moolenaar      123
4397f76494aSBram Moolenaar  assert_equal(123, nr)
4407f76494aSBram Moolenaar
4417f76494aSBram Moolenaar  var n2: number
4427f76494aSBram Moolenaar  [nr, n2] =
4437f76494aSBram Moolenaar     [12, 34]
4447f76494aSBram Moolenaar  assert_equal(12, nr)
4457f76494aSBram Moolenaar  assert_equal(34, n2)
4467f76494aSBram Moolenaar
4478ff16e01SBram Moolenaar  CheckDefFailure(["var x = #"], 'E1097:', 3)
44877709b19SBram Moolenaar
44977709b19SBram Moolenaar  var lines =<< trim END
45077709b19SBram Moolenaar      var x: list<string> = ['a']
45177709b19SBram Moolenaar      var y: list<number> = x
45277709b19SBram Moolenaar          ->copy()
45377709b19SBram Moolenaar          ->copy()
45477709b19SBram Moolenaar  END
45577709b19SBram Moolenaar  CheckDefFailure(lines, 'E1012:', 2)
4566977dba0SBram Moolenaar
4576977dba0SBram Moolenaar  lines =<< trim END
4586977dba0SBram Moolenaar      var x: any
4596977dba0SBram Moolenaar      x.key = 1
4606977dba0SBram Moolenaar          + 2
4616977dba0SBram Moolenaar          + 3
4626977dba0SBram Moolenaar          + 4
4636977dba0SBram Moolenaar          + 5
4646977dba0SBram Moolenaar  END
4656977dba0SBram Moolenaar  CheckDefExecAndScriptFailure2(lines, 'E1148:', 'E1203:', 2)
4667f76494aSBram Moolenaarenddef
4677f76494aSBram Moolenaar
468dc234cafSBram Moolenaardef Test_assign_index()
469dc234cafSBram Moolenaar  # list of list
470dc234cafSBram Moolenaar  var l1: list<number>
471dc234cafSBram Moolenaar  l1[0] = 123
472dc234cafSBram Moolenaar  assert_equal([123], l1)
473dc234cafSBram Moolenaar
474dc234cafSBram Moolenaar  var l2: list<list<number>>
475dc234cafSBram Moolenaar  l2[0] = []
476dc234cafSBram Moolenaar  l2[0][0] = 123
477dc234cafSBram Moolenaar  assert_equal([[123]], l2)
478dc234cafSBram Moolenaar
479dc234cafSBram Moolenaar  var l3: list<list<list<number>>>
480dc234cafSBram Moolenaar  l3[0] = []
481dc234cafSBram Moolenaar  l3[0][0] = []
482dc234cafSBram Moolenaar  l3[0][0][0] = 123
483dc234cafSBram Moolenaar  assert_equal([[[123]]], l3)
484dc234cafSBram Moolenaar
485dc234cafSBram Moolenaar  var lines =<< trim END
486dc234cafSBram Moolenaar      var l3: list<list<number>>
487dc234cafSBram Moolenaar      l3[0] = []
488dc234cafSBram Moolenaar      l3[0][0] = []
489dc234cafSBram Moolenaar  END
490dc234cafSBram Moolenaar  CheckDefFailure(lines, 'E1012: Type mismatch; expected number but got list<unknown>', 3)
491dc234cafSBram Moolenaar
492dc234cafSBram Moolenaar  # dict of dict
493dc234cafSBram Moolenaar  var d1: dict<number>
494dc234cafSBram Moolenaar  d1.one = 1
495dc234cafSBram Moolenaar  assert_equal({one: 1}, d1)
496dc234cafSBram Moolenaar
497dc234cafSBram Moolenaar  var d2: dict<dict<number>>
498dc234cafSBram Moolenaar  d2.one = {}
499dc234cafSBram Moolenaar  d2.one.two = 123
500dc234cafSBram Moolenaar  assert_equal({one: {two: 123}}, d2)
501dc234cafSBram Moolenaar
502dc234cafSBram Moolenaar  var d3: dict<dict<dict<number>>>
503dc234cafSBram Moolenaar  d3.one = {}
504dc234cafSBram Moolenaar  d3.one.two = {}
505dc234cafSBram Moolenaar  d3.one.two.three = 123
506dc234cafSBram Moolenaar  assert_equal({one: {two: {three: 123}}}, d3)
507dc234cafSBram Moolenaar
508e97976baSBram Moolenaar  # should not read the next line when generating "a.b"
509e97976baSBram Moolenaar  var a = {}
510e97976baSBram Moolenaar  a.b = {}
511e97976baSBram Moolenaar  a.b.c = {}
512e97976baSBram Moolenaar          ->copy()
513e97976baSBram Moolenaar
514dc234cafSBram Moolenaar  lines =<< trim END
515dc234cafSBram Moolenaar      var d3: dict<dict<number>>
516dc234cafSBram Moolenaar      d3.one = {}
517dc234cafSBram Moolenaar      d3.one.two = {}
518dc234cafSBram Moolenaar  END
519dc234cafSBram Moolenaar  CheckDefFailure(lines, 'E1012: Type mismatch; expected number but got dict<unknown>', 3)
520dc234cafSBram Moolenaar
521acbae18dSBram Moolenaar  lines =<< trim END
522acbae18dSBram Moolenaar    var lines: list<string>
523acbae18dSBram Moolenaar    lines['a'] = 'asdf'
524acbae18dSBram Moolenaar  END
525f30a14dbSBram Moolenaar  CheckDefFailure(lines, 'E1012:', 2)
526acbae18dSBram Moolenaar
527acbae18dSBram Moolenaar  lines =<< trim END
528acbae18dSBram Moolenaar    var lines: string
529acbae18dSBram Moolenaar    lines[9] = 'asdf'
530acbae18dSBram Moolenaar  END
531acbae18dSBram Moolenaar  CheckDefFailure(lines, 'E1141:', 2)
532acbae18dSBram Moolenaar
533dc234cafSBram Moolenaar  # list of dict
534dc234cafSBram Moolenaar  var ld: list<dict<number>>
535dc234cafSBram Moolenaar  ld[0] = {}
536dc234cafSBram Moolenaar  ld[0].one = 123
537dc234cafSBram Moolenaar  assert_equal([{one: 123}], ld)
538dc234cafSBram Moolenaar
539dc234cafSBram Moolenaar  lines =<< trim END
540dc234cafSBram Moolenaar      var ld: list<dict<number>>
541dc234cafSBram Moolenaar      ld[0] = []
542dc234cafSBram Moolenaar  END
543dc234cafSBram Moolenaar  CheckDefFailure(lines, 'E1012: Type mismatch; expected dict<number> but got list<unknown>', 2)
544dc234cafSBram Moolenaar
545dc234cafSBram Moolenaar  # dict of list
546dc234cafSBram Moolenaar  var dl: dict<list<number>>
547dc234cafSBram Moolenaar  dl.one = []
548dc234cafSBram Moolenaar  dl.one[0] = 123
549dc234cafSBram Moolenaar  assert_equal({one: [123]}, dl)
550dc234cafSBram Moolenaar
551dc234cafSBram Moolenaar  lines =<< trim END
552dc234cafSBram Moolenaar      var dl: dict<list<number>>
553dc234cafSBram Moolenaar      dl.one = {}
554dc234cafSBram Moolenaar  END
555dc234cafSBram Moolenaar  CheckDefFailure(lines, 'E1012: Type mismatch; expected list<number> but got dict<unknown>', 2)
556dc234cafSBram Moolenaarenddef
557dc234cafSBram Moolenaar
55881ed4960SBram Moolenaardef Test_extend_list()
55930fd8204SBram Moolenaar  var lines =<< trim END
560*07802044SBram Moolenaar      var l1: list<number>
561*07802044SBram Moolenaar      var l2 = l1
562*07802044SBram Moolenaar      assert_true(l1 is l2)
563*07802044SBram Moolenaar      l1 += [123]
564*07802044SBram Moolenaar      assert_equal([123], l1)
565*07802044SBram Moolenaar      assert_true(l1 is l2)
566348be7edSBram Moolenaar  END
567*07802044SBram Moolenaar  CheckDefAndScriptSuccess(lines)
56881ed4960SBram Moolenaar
569348be7edSBram Moolenaar  lines =<< trim END
570348be7edSBram Moolenaar      var list: list<string>
571348be7edSBram Moolenaar      extend(list, ['x'])
572348be7edSBram Moolenaar      assert_equal(['x'], list)
57381ed4960SBram Moolenaar  END
574*07802044SBram Moolenaar  CheckDefAndScriptSuccess(lines)
5751a739237SBram Moolenaar
5761a739237SBram Moolenaar  # appending to NULL list from a function
5771a739237SBram Moolenaar  lines =<< trim END
5781a739237SBram Moolenaar      vim9script
5791a739237SBram Moolenaar      var list: list<string>
5801a739237SBram Moolenaar      def Func()
5811a739237SBram Moolenaar        list += ['a', 'b']
5821a739237SBram Moolenaar      enddef
5831a739237SBram Moolenaar      Func()
5841a739237SBram Moolenaar      assert_equal(['a', 'b'], list)
5851a739237SBram Moolenaar  END
5861a739237SBram Moolenaar  CheckScriptSuccess(lines)
5873beaf9cdSBram Moolenaar  lines =<< trim END
5883beaf9cdSBram Moolenaar      vim9script
5893beaf9cdSBram Moolenaar      var list: list<string>
5903beaf9cdSBram Moolenaar      def Func()
5913beaf9cdSBram Moolenaar        extend(list, ['x', 'b'])
5923beaf9cdSBram Moolenaar      enddef
5933beaf9cdSBram Moolenaar      Func()
5943beaf9cdSBram Moolenaar      assert_equal(['x', 'b'], list)
5953beaf9cdSBram Moolenaar  END
5963beaf9cdSBram Moolenaar  CheckScriptSuccess(lines)
597348be7edSBram Moolenaar
598348be7edSBram Moolenaar  lines =<< trim END
599348be7edSBram Moolenaar      vim9script
600348be7edSBram Moolenaar      var l: list<string> = test_null_list()
601348be7edSBram Moolenaar      extend(l, ['x'])
602348be7edSBram Moolenaar      assert_equal(['x'], l)
603348be7edSBram Moolenaar  END
604348be7edSBram Moolenaar  CheckScriptSuccess(lines)
605348be7edSBram Moolenaar
606348be7edSBram Moolenaar  lines =<< trim END
607348be7edSBram Moolenaar      vim9script
608348be7edSBram Moolenaar      extend(test_null_list(), ['x'])
609348be7edSBram Moolenaar  END
610348be7edSBram Moolenaar  CheckScriptFailure(lines, 'E1134:', 2)
611348be7edSBram Moolenaarenddef
612348be7edSBram Moolenaar
613348be7edSBram Moolenaardef Test_extend_dict()
614348be7edSBram Moolenaar  var lines =<< trim END
615348be7edSBram Moolenaar      vim9script
616348be7edSBram Moolenaar      var d: dict<number>
617e0de171eSBram Moolenaar      extend(d, {a: 1})
618e0de171eSBram Moolenaar      assert_equal({a: 1}, d)
619348be7edSBram Moolenaar
620348be7edSBram Moolenaar      var d2: dict<number>
621348be7edSBram Moolenaar      d2['one'] = 1
622e0de171eSBram Moolenaar      assert_equal({one: 1}, d2)
623348be7edSBram Moolenaar  END
624348be7edSBram Moolenaar  CheckScriptSuccess(lines)
625348be7edSBram Moolenaar
626348be7edSBram Moolenaar  lines =<< trim END
627348be7edSBram Moolenaar      vim9script
628348be7edSBram Moolenaar      var d: dict<string> = test_null_dict()
629e0de171eSBram Moolenaar      extend(d, {a: 'x'})
630e0de171eSBram Moolenaar      assert_equal({a: 'x'}, d)
631348be7edSBram Moolenaar  END
632348be7edSBram Moolenaar  CheckScriptSuccess(lines)
633348be7edSBram Moolenaar
634348be7edSBram Moolenaar  lines =<< trim END
635348be7edSBram Moolenaar      vim9script
636e0de171eSBram Moolenaar      extend(test_null_dict(), {a: 'x'})
637348be7edSBram Moolenaar  END
638348be7edSBram Moolenaar  CheckScriptFailure(lines, 'E1133:', 2)
63981ed4960SBram Moolenaarenddef
64081ed4960SBram Moolenaar
641971caf53SBram Moolenaardef Test_single_letter_vars()
642971caf53SBram Moolenaar  # single letter variables
64330fd8204SBram Moolenaar  var a: number = 123
644971caf53SBram Moolenaar  a = 123
645971caf53SBram Moolenaar  assert_equal(123, a)
64630fd8204SBram Moolenaar  var b: number
647971caf53SBram Moolenaar  b = 123
648971caf53SBram Moolenaar  assert_equal(123, b)
64930fd8204SBram Moolenaar  var g: number
650971caf53SBram Moolenaar  g = 123
651971caf53SBram Moolenaar  assert_equal(123, g)
65230fd8204SBram Moolenaar  var s: number
653971caf53SBram Moolenaar  s = 123
654971caf53SBram Moolenaar  assert_equal(123, s)
65530fd8204SBram Moolenaar  var t: number
656971caf53SBram Moolenaar  t = 123
657971caf53SBram Moolenaar  assert_equal(123, t)
65830fd8204SBram Moolenaar  var v: number
659971caf53SBram Moolenaar  v = 123
660971caf53SBram Moolenaar  assert_equal(123, v)
66130fd8204SBram Moolenaar  var w: number
662971caf53SBram Moolenaar  w = 123
663971caf53SBram Moolenaar  assert_equal(123, w)
664971caf53SBram Moolenaarenddef
665971caf53SBram Moolenaar
666971caf53SBram Moolenaardef Test_vim9_single_char_vars()
66730fd8204SBram Moolenaar  var lines =<< trim END
668971caf53SBram Moolenaar      vim9script
669971caf53SBram Moolenaar
670971caf53SBram Moolenaar      # single character variable declarations work
67130fd8204SBram Moolenaar      var a: string
67230fd8204SBram Moolenaar      var b: number
67330fd8204SBram Moolenaar      var l: list<any>
67430fd8204SBram Moolenaar      var s: string
67530fd8204SBram Moolenaar      var t: number
67630fd8204SBram Moolenaar      var v: number
67730fd8204SBram Moolenaar      var w: number
678971caf53SBram Moolenaar
679971caf53SBram Moolenaar      # script-local variables can be used without s: prefix
680971caf53SBram Moolenaar      a = 'script-a'
681971caf53SBram Moolenaar      b = 111
682971caf53SBram Moolenaar      l = [1, 2, 3]
683971caf53SBram Moolenaar      s = 'script-s'
684971caf53SBram Moolenaar      t = 222
685971caf53SBram Moolenaar      v = 333
686971caf53SBram Moolenaar      w = 444
687971caf53SBram Moolenaar
688971caf53SBram Moolenaar      assert_equal('script-a', a)
689971caf53SBram Moolenaar      assert_equal(111, b)
690971caf53SBram Moolenaar      assert_equal([1, 2, 3], l)
691971caf53SBram Moolenaar      assert_equal('script-s', s)
692971caf53SBram Moolenaar      assert_equal(222, t)
693971caf53SBram Moolenaar      assert_equal(333, v)
694971caf53SBram Moolenaar      assert_equal(444, w)
695971caf53SBram Moolenaar  END
696971caf53SBram Moolenaar  writefile(lines, 'Xsinglechar')
697971caf53SBram Moolenaar  source Xsinglechar
698971caf53SBram Moolenaar  delete('Xsinglechar')
699971caf53SBram Moolenaarenddef
700971caf53SBram Moolenaar
701971caf53SBram Moolenaardef Test_assignment_list()
70230fd8204SBram Moolenaar  var list1: list<bool> = [false, true, false]
70330fd8204SBram Moolenaar  var list2: list<number> = [1, 2, 3]
70430fd8204SBram Moolenaar  var list3: list<string> = ['sdf', 'asdf']
70530fd8204SBram Moolenaar  var list4: list<any> = ['yes', true, 1234]
70630fd8204SBram Moolenaar  var list5: list<blob> = [0z01, 0z02]
707971caf53SBram Moolenaar
70830fd8204SBram Moolenaar  var listS: list<string> = []
70930fd8204SBram Moolenaar  var listN: list<number> = []
710971caf53SBram Moolenaar
711971caf53SBram Moolenaar  assert_equal([1, 2, 3], list2)
712971caf53SBram Moolenaar  list2[-1] = 99
713971caf53SBram Moolenaar  assert_equal([1, 2, 99], list2)
714971caf53SBram Moolenaar  list2[-2] = 88
715971caf53SBram Moolenaar  assert_equal([1, 88, 99], list2)
716971caf53SBram Moolenaar  list2[-3] = 77
717971caf53SBram Moolenaar  assert_equal([77, 88, 99], list2)
718971caf53SBram Moolenaar  list2 += [100]
719971caf53SBram Moolenaar  assert_equal([77, 88, 99, 100], list2)
720971caf53SBram Moolenaar
721971caf53SBram Moolenaar  list3 += ['end']
722971caf53SBram Moolenaar  assert_equal(['sdf', 'asdf', 'end'], list3)
723971caf53SBram Moolenaar
72430fd8204SBram Moolenaar  CheckDefExecFailure(['var ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
72530fd8204SBram Moolenaar  CheckDefExecFailure(['var [v1, v2] = [1, 2]'], 'E1092:')
726971caf53SBram Moolenaar
727971caf53SBram Moolenaar  # type becomes list<any>
72830fd8204SBram Moolenaar  var somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
7294f5e3977SBram Moolenaar
7304f5e3977SBram Moolenaar  var lines =<< trim END
7314f5e3977SBram Moolenaar    var d = {dd: test_null_list()}
7324f5e3977SBram Moolenaar    d.dd[0] = 0
7334f5e3977SBram Moolenaar  END
7344f5e3977SBram Moolenaar  CheckDefExecFailure(lines, 'E1147:', 2)
7357a40ff00SBram Moolenaar
7367a40ff00SBram Moolenaar  lines =<< trim END
7377a40ff00SBram Moolenaar      def OneArg(x: bool)
7387a40ff00SBram Moolenaar      enddef
7397a40ff00SBram Moolenaar      def TwoArgs(x: bool, y: bool)
7407a40ff00SBram Moolenaar      enddef
7417a40ff00SBram Moolenaar      var fl: list<func(bool, bool, bool)> = [OneArg, TwoArgs]
7427a40ff00SBram Moolenaar  END
7437a40ff00SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E1012:', 5)
744971caf53SBram Moolenaarenddef
745971caf53SBram Moolenaar
74697f227d9SBram Moolenaardef PartFuncBool(b: bool): string
747b7480cd8SBram Moolenaar  return 'done'
748b7480cd8SBram Moolenaarenddef
749b7480cd8SBram Moolenaar
750b7480cd8SBram Moolenaardef Test_assignment_partial()
75197f227d9SBram Moolenaar  var lines =<< trim END
75297f227d9SBram Moolenaar      var Partial: func(): string = function(PartFuncBool, [true])
753b7480cd8SBram Moolenaar      assert_equal('done', Partial())
75497f227d9SBram Moolenaar  END
75597f227d9SBram Moolenaar  CheckDefAndScriptSuccess(lines)
75622f85d04SBram Moolenaar
75722f85d04SBram Moolenaar  lines =<< trim END
75822f85d04SBram Moolenaar      vim9script
75922f85d04SBram Moolenaar      def Func(b: bool)
76022f85d04SBram Moolenaar      enddef
76122f85d04SBram Moolenaar      var Ref: func = function(Func, [true])
76222f85d04SBram Moolenaar      assert_equal('func()', typename(Ref))
76322f85d04SBram Moolenaar      Ref()
76422f85d04SBram Moolenaar  END
76522f85d04SBram Moolenaar  CheckScriptSuccess(lines)
766b7480cd8SBram Moolenaarenddef
767b7480cd8SBram Moolenaar
768f30a14dbSBram Moolenaardef Test_assignment_list_any_index()
769f30a14dbSBram Moolenaar   var l: list<number> = [1, 2]
770f30a14dbSBram Moolenaar  for  [x, y, _]
771f30a14dbSBram Moolenaar  in  [[0, 1, ''], [1, 3, '']]
772f30a14dbSBram Moolenaar      l[x] = l[x] + y
773f30a14dbSBram Moolenaar  endfor
774f30a14dbSBram Moolenaar  assert_equal([2, 5], l)
775f30a14dbSBram Moolenaarenddef
776f30a14dbSBram Moolenaar
777971caf53SBram Moolenaardef Test_assignment_list_vim9script()
77830fd8204SBram Moolenaar  var lines =<< trim END
779971caf53SBram Moolenaar    vim9script
78030fd8204SBram Moolenaar    var v1: number
78130fd8204SBram Moolenaar    var v2: number
78230fd8204SBram Moolenaar    var v3: number
783971caf53SBram Moolenaar    [v1, v2, v3] = [1, 2, 3]
784971caf53SBram Moolenaar    assert_equal([1, 2, 3], [v1, v2, v3])
785971caf53SBram Moolenaar  END
786971caf53SBram Moolenaar  CheckScriptSuccess(lines)
787971caf53SBram Moolenaarenddef
788971caf53SBram Moolenaar
789971caf53SBram Moolenaardef Test_assignment_dict()
790e0de171eSBram Moolenaar  var dict1: dict<bool> = {one: false, two: true}
791e0de171eSBram Moolenaar  var dict2: dict<number> = {one: 1, two: 2}
792e0de171eSBram Moolenaar  var dict3: dict<string> = {key: 'value'}
793e0de171eSBram Moolenaar  var dict4: dict<any> = {one: 1, two: '2'}
794e0de171eSBram Moolenaar  var dict5: dict<blob> = {one: 0z01, two: 0z02}
795971caf53SBram Moolenaar
796971caf53SBram Moolenaar  # overwrite
797971caf53SBram Moolenaar  dict3['key'] = 'another'
798e0de171eSBram Moolenaar  assert_equal(dict3, {key: 'another'})
799fc74d03eSBram Moolenaar  dict3.key = 'yet another'
800e0de171eSBram Moolenaar  assert_equal(dict3, {key: 'yet another'})
801fc74d03eSBram Moolenaar
802d24602f4SBram Moolenaar  # member "any" can also be a dict and assigned to
803d24602f4SBram Moolenaar  var anydict: dict<any> = {nest: {}, nr: 0}
804d24602f4SBram Moolenaar  anydict.nest['this'] = 123
805d24602f4SBram Moolenaar  anydict.nest.that = 456
806d24602f4SBram Moolenaar  assert_equal({nest: {this: 123, that: 456}, nr: 0}, anydict)
807d24602f4SBram Moolenaar
808fc74d03eSBram Moolenaar  var lines =<< trim END
809d88dc4d4SBram Moolenaar    var dd = {}
810d88dc4d4SBram Moolenaar    dd.two = 2
811d88dc4d4SBram Moolenaar    assert_equal({two: 2}, dd)
812d88dc4d4SBram Moolenaar  END
8134f5e3977SBram Moolenaar  CheckDefAndScriptSuccess(lines)
8144f5e3977SBram Moolenaar
8154f5e3977SBram Moolenaar  lines =<< trim END
8164f5e3977SBram Moolenaar    var d = {dd: {}}
8174f5e3977SBram Moolenaar    d.dd[0] = 2
8184f5e3977SBram Moolenaar    d.dd['x'] = 3
8194f5e3977SBram Moolenaar    d.dd.y = 4
8204f5e3977SBram Moolenaar    assert_equal({dd: {0: 2, x: 3, y: 4}}, d)
8214f5e3977SBram Moolenaar  END
8224f5e3977SBram Moolenaar  CheckDefAndScriptSuccess(lines)
823d88dc4d4SBram Moolenaar
824d88dc4d4SBram Moolenaar  lines =<< trim END
825e0de171eSBram Moolenaar    var dd = {one: 1}
826fc74d03eSBram Moolenaar    dd.one) = 2
827fc74d03eSBram Moolenaar  END
828d88dc4d4SBram Moolenaar  CheckDefFailure(lines, 'E488:', 2)
829d88dc4d4SBram Moolenaar
830d88dc4d4SBram Moolenaar  lines =<< trim END
831d88dc4d4SBram Moolenaar    var dd = {one: 1}
832d88dc4d4SBram Moolenaar    var dd.one = 2
833d88dc4d4SBram Moolenaar  END
834d88dc4d4SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1017:', 2)
835971caf53SBram Moolenaar
836971caf53SBram Moolenaar  # empty key can be used
83730fd8204SBram Moolenaar  var dd = {}
838971caf53SBram Moolenaar  dd[""] = 6
839e0de171eSBram Moolenaar  assert_equal({['']: 6}, dd)
840971caf53SBram Moolenaar
841971caf53SBram Moolenaar  # type becomes dict<any>
842e0de171eSBram Moolenaar  var somedict = rand() > 0 ? {a: 1, b: 2} : {a: 'a', b: 'b'}
843971caf53SBram Moolenaar
844971caf53SBram Moolenaar  # assignment to script-local dict
845fc74d03eSBram Moolenaar  lines =<< trim END
846971caf53SBram Moolenaar    vim9script
84730fd8204SBram Moolenaar    var test: dict<any> = {}
848971caf53SBram Moolenaar    def FillDict(): dict<any>
849971caf53SBram Moolenaar      test['a'] = 43
850971caf53SBram Moolenaar      return test
851971caf53SBram Moolenaar    enddef
852e0de171eSBram Moolenaar    assert_equal({a: 43}, FillDict())
853971caf53SBram Moolenaar  END
854971caf53SBram Moolenaar  CheckScriptSuccess(lines)
855971caf53SBram Moolenaar
856971caf53SBram Moolenaar  lines =<< trim END
857971caf53SBram Moolenaar    vim9script
85830fd8204SBram Moolenaar    var test: dict<any>
859971caf53SBram Moolenaar    def FillDict(): dict<any>
860971caf53SBram Moolenaar      test['a'] = 43
861971caf53SBram Moolenaar      return test
862971caf53SBram Moolenaar    enddef
863971caf53SBram Moolenaar    FillDict()
8643beaf9cdSBram Moolenaar    assert_equal({a: 43}, test)
865971caf53SBram Moolenaar  END
8663beaf9cdSBram Moolenaar  CheckScriptSuccess(lines)
867971caf53SBram Moolenaar
868971caf53SBram Moolenaar  # assignment to global dict
869971caf53SBram Moolenaar  lines =<< trim END
870971caf53SBram Moolenaar    vim9script
871971caf53SBram Moolenaar    g:test = {}
872971caf53SBram Moolenaar    def FillDict(): dict<any>
873971caf53SBram Moolenaar      g:test['a'] = 43
874971caf53SBram Moolenaar      return g:test
875971caf53SBram Moolenaar    enddef
876e0de171eSBram Moolenaar    assert_equal({a: 43}, FillDict())
877971caf53SBram Moolenaar  END
878971caf53SBram Moolenaar  CheckScriptSuccess(lines)
879971caf53SBram Moolenaar
880971caf53SBram Moolenaar  # assignment to buffer dict
881971caf53SBram Moolenaar  lines =<< trim END
882971caf53SBram Moolenaar    vim9script
883971caf53SBram Moolenaar    b:test = {}
884971caf53SBram Moolenaar    def FillDict(): dict<any>
885971caf53SBram Moolenaar      b:test['a'] = 43
886971caf53SBram Moolenaar      return b:test
887971caf53SBram Moolenaar    enddef
888e0de171eSBram Moolenaar    assert_equal({a: 43}, FillDict())
889971caf53SBram Moolenaar  END
890971caf53SBram Moolenaar  CheckScriptSuccess(lines)
8914f5e3977SBram Moolenaar
8924f5e3977SBram Moolenaar  lines =<< trim END
8934f5e3977SBram Moolenaar    var d = {dd: test_null_dict()}
8944f5e3977SBram Moolenaar    d.dd[0] = 0
8954f5e3977SBram Moolenaar  END
8964f5e3977SBram Moolenaar  CheckDefExecFailure(lines, 'E1103:', 2)
8974f5e3977SBram Moolenaar
8984f5e3977SBram Moolenaar  lines =<< trim END
8994f5e3977SBram Moolenaar    var d = {dd: 'string'}
9004f5e3977SBram Moolenaar    d.dd[0] = 0
9014f5e3977SBram Moolenaar  END
9024f5e3977SBram Moolenaar  CheckDefExecFailure(lines, 'E1148:', 2)
9033a3b10e8SBram Moolenaar
9043a3b10e8SBram Moolenaar  lines =<< trim END
9053a3b10e8SBram Moolenaar    var n: any
9063a3b10e8SBram Moolenaar    n.key = 5
9073a3b10e8SBram Moolenaar  END
9083a3b10e8SBram Moolenaar  CheckDefExecAndScriptFailure2(lines, 'E1148:', 'E1203: Dot can only be used on a dictionary: n.key = 5', 2)
909971caf53SBram Moolenaarenddef
910971caf53SBram Moolenaar
911971caf53SBram Moolenaardef Test_assignment_local()
912971caf53SBram Moolenaar  # Test in a separated file in order not to the current buffer/window/tab is
913971caf53SBram Moolenaar  # changed.
91430fd8204SBram Moolenaar  var script_lines: list<string> =<< trim END
915971caf53SBram Moolenaar    let b:existing = 'yes'
916971caf53SBram Moolenaar    let w:existing = 'yes'
917971caf53SBram Moolenaar    let t:existing = 'yes'
918971caf53SBram Moolenaar
919971caf53SBram Moolenaar    def Test_assignment_local_internal()
920971caf53SBram Moolenaar      b:newvar = 'new'
921971caf53SBram Moolenaar      assert_equal('new', b:newvar)
922971caf53SBram Moolenaar      assert_equal('yes', b:existing)
923971caf53SBram Moolenaar      b:existing = 'no'
924971caf53SBram Moolenaar      assert_equal('no', b:existing)
925971caf53SBram Moolenaar      b:existing ..= 'NO'
926971caf53SBram Moolenaar      assert_equal('noNO', b:existing)
927971caf53SBram Moolenaar
928971caf53SBram Moolenaar      w:newvar = 'new'
929971caf53SBram Moolenaar      assert_equal('new', w:newvar)
930971caf53SBram Moolenaar      assert_equal('yes', w:existing)
931971caf53SBram Moolenaar      w:existing = 'no'
932971caf53SBram Moolenaar      assert_equal('no', w:existing)
933971caf53SBram Moolenaar      w:existing ..= 'NO'
934971caf53SBram Moolenaar      assert_equal('noNO', w:existing)
935971caf53SBram Moolenaar
936971caf53SBram Moolenaar      t:newvar = 'new'
937971caf53SBram Moolenaar      assert_equal('new', t:newvar)
938971caf53SBram Moolenaar      assert_equal('yes', t:existing)
939971caf53SBram Moolenaar      t:existing = 'no'
940971caf53SBram Moolenaar      assert_equal('no', t:existing)
941971caf53SBram Moolenaar      t:existing ..= 'NO'
942971caf53SBram Moolenaar      assert_equal('noNO', t:existing)
943971caf53SBram Moolenaar    enddef
944971caf53SBram Moolenaar    call Test_assignment_local_internal()
945971caf53SBram Moolenaar  END
946971caf53SBram Moolenaar  CheckScriptSuccess(script_lines)
947971caf53SBram Moolenaarenddef
948971caf53SBram Moolenaar
949971caf53SBram Moolenaardef Test_assignment_default()
950971caf53SBram Moolenaar  # Test default values.
95130fd8204SBram Moolenaar  var thebool: bool
952971caf53SBram Moolenaar  assert_equal(v:false, thebool)
953971caf53SBram Moolenaar
95430fd8204SBram Moolenaar  var thenumber: number
955971caf53SBram Moolenaar  assert_equal(0, thenumber)
956971caf53SBram Moolenaar
957971caf53SBram Moolenaar  if has('float')
95830fd8204SBram Moolenaar    var thefloat: float
959971caf53SBram Moolenaar    assert_equal(0.0, thefloat)
960971caf53SBram Moolenaar  endif
961971caf53SBram Moolenaar
96230fd8204SBram Moolenaar  var thestring: string
963971caf53SBram Moolenaar  assert_equal('', thestring)
964971caf53SBram Moolenaar
96530fd8204SBram Moolenaar  var theblob: blob
966971caf53SBram Moolenaar  assert_equal(0z, theblob)
967971caf53SBram Moolenaar
96830fd8204SBram Moolenaar  var Thefunc: func
969971caf53SBram Moolenaar  assert_equal(test_null_function(), Thefunc)
970971caf53SBram Moolenaar
97130fd8204SBram Moolenaar  var thelist: list<any>
972971caf53SBram Moolenaar  assert_equal([], thelist)
973971caf53SBram Moolenaar
97430fd8204SBram Moolenaar  var thedict: dict<any>
975971caf53SBram Moolenaar  assert_equal({}, thedict)
976971caf53SBram Moolenaar
977971caf53SBram Moolenaar  if has('channel')
97830fd8204SBram Moolenaar    var thejob: job
979971caf53SBram Moolenaar    assert_equal(test_null_job(), thejob)
980971caf53SBram Moolenaar
98130fd8204SBram Moolenaar    var thechannel: channel
982971caf53SBram Moolenaar    assert_equal(test_null_channel(), thechannel)
983971caf53SBram Moolenaar
984971caf53SBram Moolenaar    if has('unix') && executable('cat')
985971caf53SBram Moolenaar      # check with non-null job and channel, types must match
986e0de171eSBram Moolenaar      thejob = job_start("cat ", {})
987971caf53SBram Moolenaar      thechannel = job_getchannel(thejob)
988971caf53SBram Moolenaar      job_stop(thejob, 'kill')
989971caf53SBram Moolenaar    endif
990971caf53SBram Moolenaar  endif
991971caf53SBram Moolenaar
99230fd8204SBram Moolenaar  var nr = 1234 | nr = 5678
993971caf53SBram Moolenaar  assert_equal(5678, nr)
994971caf53SBram Moolenaarenddef
995971caf53SBram Moolenaar
9963862ea3fSBram Moolenaarlet scriptvar = 'init'
9973862ea3fSBram Moolenaar
998971caf53SBram Moolenaardef Test_assignment_var_list()
999da7c20c9SBram Moolenaar  var lines =<< trim END
100030fd8204SBram Moolenaar      var v1: string
100130fd8204SBram Moolenaar      var v2: string
100230fd8204SBram Moolenaar      var vrem: list<string>
1003971caf53SBram Moolenaar      [v1] = ['aaa']
1004971caf53SBram Moolenaar      assert_equal('aaa', v1)
1005971caf53SBram Moolenaar
1006971caf53SBram Moolenaar      [v1, v2] = ['one', 'two']
1007971caf53SBram Moolenaar      assert_equal('one', v1)
1008971caf53SBram Moolenaar      assert_equal('two', v2)
1009971caf53SBram Moolenaar
1010971caf53SBram Moolenaar      [v1, v2; vrem] = ['one', 'two']
1011971caf53SBram Moolenaar      assert_equal('one', v1)
1012971caf53SBram Moolenaar      assert_equal('two', v2)
1013971caf53SBram Moolenaar      assert_equal([], vrem)
1014971caf53SBram Moolenaar
1015971caf53SBram Moolenaar      [v1, v2; vrem] = ['one', 'two', 'three']
1016971caf53SBram Moolenaar      assert_equal('one', v1)
1017971caf53SBram Moolenaar      assert_equal('two', v2)
1018971caf53SBram Moolenaar      assert_equal(['three'], vrem)
1019971caf53SBram Moolenaar
1020971caf53SBram Moolenaar      [&ts, &sw] = [3, 4]
1021971caf53SBram Moolenaar      assert_equal(3, &ts)
1022971caf53SBram Moolenaar      assert_equal(4, &sw)
1023971caf53SBram Moolenaar      set ts=8 sw=4
1024004d9b00SBram Moolenaar
1025004d9b00SBram Moolenaar      [@a, @z] = ['aa', 'zz']
1026004d9b00SBram Moolenaar      assert_equal('aa', @a)
1027004d9b00SBram Moolenaar      assert_equal('zz', @z)
1028004d9b00SBram Moolenaar
1029004d9b00SBram Moolenaar      [$SOME_VAR, $OTHER_VAR] = ['some', 'other']
1030004d9b00SBram Moolenaar      assert_equal('some', $SOME_VAR)
1031004d9b00SBram Moolenaar      assert_equal('other', $OTHER_VAR)
1032004d9b00SBram Moolenaar
10333862ea3fSBram Moolenaar      [g:globalvar, b:bufvar, w:winvar, t:tabvar, v:errmsg] =
10343862ea3fSBram Moolenaar            ['global', 'buf', 'win', 'tab', 'error']
1035004d9b00SBram Moolenaar      assert_equal('global', g:globalvar)
1036004d9b00SBram Moolenaar      assert_equal('buf', b:bufvar)
1037004d9b00SBram Moolenaar      assert_equal('win', w:winvar)
1038004d9b00SBram Moolenaar      assert_equal('tab', t:tabvar)
1039004d9b00SBram Moolenaar      assert_equal('error', v:errmsg)
1040004d9b00SBram Moolenaar      unlet g:globalvar
1041da7c20c9SBram Moolenaar  END
1042da7c20c9SBram Moolenaar  CheckDefAndScriptSuccess(lines)
10433862ea3fSBram Moolenaar
10443862ea3fSBram Moolenaar  [g:globalvar, s:scriptvar, b:bufvar] = ['global', 'script', 'buf']
10453862ea3fSBram Moolenaar  assert_equal('global', g:globalvar)
10463862ea3fSBram Moolenaar  assert_equal('script', s:scriptvar)
10473862ea3fSBram Moolenaar  assert_equal('buf', b:bufvar)
10483862ea3fSBram Moolenaar
10493862ea3fSBram Moolenaar  lines =<< trim END
10503862ea3fSBram Moolenaar      vim9script
10513862ea3fSBram Moolenaar      var s:scriptvar = 'init'
10523862ea3fSBram Moolenaar      [g:globalvar, s:scriptvar, w:winvar] = ['global', 'script', 'win']
10533862ea3fSBram Moolenaar      assert_equal('global', g:globalvar)
10543862ea3fSBram Moolenaar      assert_equal('script', s:scriptvar)
10553862ea3fSBram Moolenaar      assert_equal('win', w:winvar)
10563862ea3fSBram Moolenaar  END
10573862ea3fSBram Moolenaar  CheckScriptSuccess(lines)
1058971caf53SBram Moolenaarenddef
1059971caf53SBram Moolenaar
1060971caf53SBram Moolenaardef Test_assignment_vim9script()
106130fd8204SBram Moolenaar  var lines =<< trim END
1062971caf53SBram Moolenaar    vim9script
1063971caf53SBram Moolenaar    def Func(): list<number>
1064971caf53SBram Moolenaar      return [1, 2]
1065971caf53SBram Moolenaar    enddef
10669830938eSBram Moolenaar    var name1: number
10679830938eSBram Moolenaar    var name2: number
10689830938eSBram Moolenaar    [name1, name2] =
1069971caf53SBram Moolenaar          Func()
10709830938eSBram Moolenaar    assert_equal(1, name1)
10719830938eSBram Moolenaar    assert_equal(2, name2)
107230fd8204SBram Moolenaar    var ll =
1073971caf53SBram Moolenaar          Func()
1074971caf53SBram Moolenaar    assert_equal([1, 2], ll)
1075971caf53SBram Moolenaar
1076971caf53SBram Moolenaar    @/ = 'text'
1077971caf53SBram Moolenaar    assert_equal('text', @/)
1078971caf53SBram Moolenaar    @0 = 'zero'
1079971caf53SBram Moolenaar    assert_equal('zero', @0)
1080971caf53SBram Moolenaar    @1 = 'one'
1081971caf53SBram Moolenaar    assert_equal('one', @1)
1082971caf53SBram Moolenaar    @9 = 'nine'
1083971caf53SBram Moolenaar    assert_equal('nine', @9)
1084971caf53SBram Moolenaar    @- = 'minus'
1085971caf53SBram Moolenaar    assert_equal('minus', @-)
1086971caf53SBram Moolenaar    if has('clipboard_working')
1087971caf53SBram Moolenaar      @* = 'star'
1088971caf53SBram Moolenaar      assert_equal('star', @*)
1089971caf53SBram Moolenaar      @+ = 'plus'
1090971caf53SBram Moolenaar      assert_equal('plus', @+)
1091971caf53SBram Moolenaar    endif
1092971caf53SBram Moolenaar
109330fd8204SBram Moolenaar    var a: number = 123
1094971caf53SBram Moolenaar    assert_equal(123, a)
109530fd8204SBram Moolenaar    var s: string = 'yes'
1096971caf53SBram Moolenaar    assert_equal('yes', s)
109730fd8204SBram Moolenaar    var b: number = 42
1098971caf53SBram Moolenaar    assert_equal(42, b)
109930fd8204SBram Moolenaar    var w: number = 43
1100971caf53SBram Moolenaar    assert_equal(43, w)
110130fd8204SBram Moolenaar    var t: number = 44
1102971caf53SBram Moolenaar    assert_equal(44, t)
11037a66a171SBram Moolenaar
11047a66a171SBram Moolenaar    var to_var = 0
11057a66a171SBram Moolenaar    to_var = 3
11067a66a171SBram Moolenaar    assert_equal(3, to_var)
1107971caf53SBram Moolenaar  END
1108971caf53SBram Moolenaar  CheckScriptSuccess(lines)
110906f9c694SBram Moolenaar
111006f9c694SBram Moolenaar  lines =<< trim END
111106f9c694SBram Moolenaar      vim9script
111206f9c694SBram Moolenaar      var n: number
111306f9c694SBram Moolenaar      def Func()
111406f9c694SBram Moolenaar        n = 'string'
111506f9c694SBram Moolenaar      enddef
111606f9c694SBram Moolenaar      defcompile
111706f9c694SBram Moolenaar  END
111806f9c694SBram Moolenaar  CheckScriptFailure(lines, 'E1012: Type mismatch; expected number but got string')
1119971caf53SBram Moolenaarenddef
1120971caf53SBram Moolenaar
1121971caf53SBram Moolenaardef Mess(): string
1122971caf53SBram Moolenaar  v:foldstart = 123
1123971caf53SBram Moolenaar  return 'xxx'
1124971caf53SBram Moolenaarenddef
1125971caf53SBram Moolenaar
1126971caf53SBram Moolenaardef Test_assignment_failure()
11279830938eSBram Moolenaar  CheckDefFailure(['var name=234'], 'E1004:')
11289830938eSBram Moolenaar  CheckDefFailure(['var name =234'], 'E1004:')
11299830938eSBram Moolenaar  CheckDefFailure(['var name= 234'], 'E1004:')
1130971caf53SBram Moolenaar
11319830938eSBram Moolenaar  CheckScriptFailure(['vim9script', 'var name=234'], 'E1004:')
11329830938eSBram Moolenaar  CheckScriptFailure(['vim9script', 'var name=234'], "before and after '='")
11339830938eSBram Moolenaar  CheckScriptFailure(['vim9script', 'var name =234'], 'E1004:')
11349830938eSBram Moolenaar  CheckScriptFailure(['vim9script', 'var name= 234'], 'E1004:')
11359830938eSBram Moolenaar  CheckScriptFailure(['vim9script', 'var name = 234', 'name+=234'], 'E1004:')
11369830938eSBram Moolenaar  CheckScriptFailure(['vim9script', 'var name = 234', 'name+=234'], "before and after '+='")
11379830938eSBram Moolenaar  CheckScriptFailure(['vim9script', 'var name = "x"', 'name..="y"'], 'E1004:')
11389830938eSBram Moolenaar  CheckScriptFailure(['vim9script', 'var name = "x"', 'name..="y"'], "before and after '..='")
1139971caf53SBram Moolenaar
114030fd8204SBram Moolenaar  CheckDefFailure(['var true = 1'], 'E1034:')
114130fd8204SBram Moolenaar  CheckDefFailure(['var false = 1'], 'E1034:')
114274235771SBram Moolenaar  CheckDefFailure(['var null = 1'], 'E1034:')
114374235771SBram Moolenaar  CheckDefFailure(['var this = 1'], 'E1034:')
1144971caf53SBram Moolenaar
1145971caf53SBram Moolenaar  CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
114630fd8204SBram Moolenaar  CheckDefExecFailure(['var a: number',
1147971caf53SBram Moolenaar                       '[a] = test_null_list()'], 'E1093:')
114830fd8204SBram Moolenaar  CheckDefExecFailure(['var a: number',
1149971caf53SBram Moolenaar                       '[a] = []'], 'E1093:')
115030fd8204SBram Moolenaar  CheckDefExecFailure(['var x: number',
115130fd8204SBram Moolenaar                       'var y: number',
1152971caf53SBram Moolenaar                       '[x, y] = [1]'], 'E1093:')
1153352134bbSBram Moolenaar  CheckDefExecFailure(['var x: string',
1154352134bbSBram Moolenaar                       'var y: string',
1155352134bbSBram Moolenaar                       '[x, y] = ["x"]'], 'E1093:')
115630fd8204SBram Moolenaar  CheckDefExecFailure(['var x: number',
115730fd8204SBram Moolenaar                       'var y: number',
115830fd8204SBram Moolenaar                       'var z: list<number>',
1159971caf53SBram Moolenaar                       '[x, y; z] = [1]'], 'E1093:')
1160971caf53SBram Moolenaar
116130fd8204SBram Moolenaar  CheckDefFailure(['var somevar'], "E1022:")
116230fd8204SBram Moolenaar  CheckDefFailure(['var &tabstop = 4'], 'E1052:')
1163971caf53SBram Moolenaar  CheckDefFailure(['&g:option = 5'], 'E113:')
116430fd8204SBram Moolenaar  CheckScriptFailure(['vim9script', 'var &tabstop = 4'], 'E1052:')
1165971caf53SBram Moolenaar
116630fd8204SBram Moolenaar  CheckDefFailure(['var $VAR = 5'], 'E1016: Cannot declare an environment variable:')
116730fd8204SBram Moolenaar  CheckScriptFailure(['vim9script', 'var $ENV = "xxx"'], 'E1016:')
1168971caf53SBram Moolenaar
1169971caf53SBram Moolenaar  if has('dnd')
117030fd8204SBram Moolenaar    CheckDefFailure(['var @~ = 5'], 'E1066:')
1171971caf53SBram Moolenaar  else
117230fd8204SBram Moolenaar    CheckDefFailure(['var @~ = 5'], 'E354:')
1173971caf53SBram Moolenaar    CheckDefFailure(['@~ = 5'], 'E354:')
1174971caf53SBram Moolenaar  endif
117530fd8204SBram Moolenaar  CheckDefFailure(['var @a = 5'], 'E1066:')
117630fd8204SBram Moolenaar  CheckDefFailure(['var @/ = "x"'], 'E1066:')
117730fd8204SBram Moolenaar  CheckScriptFailure(['vim9script', 'var @a = "abc"'], 'E1066:')
1178971caf53SBram Moolenaar
117930fd8204SBram Moolenaar  CheckDefFailure(['var g:var = 5'], 'E1016: Cannot declare a global variable:')
118030fd8204SBram Moolenaar  CheckDefFailure(['var w:var = 5'], 'E1016: Cannot declare a window variable:')
118130fd8204SBram Moolenaar  CheckDefFailure(['var b:var = 5'], 'E1016: Cannot declare a buffer variable:')
118230fd8204SBram Moolenaar  CheckDefFailure(['var t:var = 5'], 'E1016: Cannot declare a tab variable:')
1183971caf53SBram Moolenaar
118430fd8204SBram Moolenaar  CheckDefFailure(['var anr = 4', 'anr ..= "text"'], 'E1019:')
118530fd8204SBram Moolenaar  CheckDefFailure(['var xnr += 4'], 'E1020:', 1)
118630fd8204SBram Moolenaar  CheckScriptFailure(['vim9script', 'var xnr += 4'], 'E1020:')
118730fd8204SBram Moolenaar  CheckDefFailure(["var xnr = xnr + 1"], 'E1001:', 1)
118830fd8204SBram Moolenaar  CheckScriptFailure(['vim9script', 'var xnr = xnr + 4'], 'E121:')
1189971caf53SBram Moolenaar
119030fd8204SBram Moolenaar  CheckScriptFailure(['vim9script', 'def Func()', 'var dummy = s:notfound', 'enddef', 'defcompile'], 'E1108:')
1191971caf53SBram Moolenaar
11929830938eSBram Moolenaar  CheckDefFailure(['var name: list<string> = [123]'], 'expected list<string> but got list<number>')
11939830938eSBram Moolenaar  CheckDefFailure(['var name: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
1194971caf53SBram Moolenaar
1195e0de171eSBram Moolenaar  CheckDefFailure(['var name: dict<string> = {key: 123}'], 'expected dict<string> but got dict<number>')
1196e0de171eSBram Moolenaar  CheckDefFailure(['var name: dict<number> = {key: "xx"}'], 'expected dict<number> but got dict<string>')
1197971caf53SBram Moolenaar
11989830938eSBram Moolenaar  CheckDefFailure(['var name = feedkeys("0")'], 'E1031:')
11999830938eSBram Moolenaar  CheckDefFailure(['var name: number = feedkeys("0")'], 'expected number but got void')
1200971caf53SBram Moolenaar
12019830938eSBram Moolenaar  CheckDefFailure(['var name: dict <number>'], 'E1068:')
12029830938eSBram Moolenaar  CheckDefFailure(['var name: dict<number'], 'E1009:')
1203971caf53SBram Moolenaar
1204971caf53SBram Moolenaar  assert_fails('s/^/\=Mess()/n', 'E794:')
12059830938eSBram Moolenaar  CheckDefFailure(['var name: dict<number'], 'E1009:')
1206971caf53SBram Moolenaar
1207971caf53SBram Moolenaar  CheckDefFailure(['w:foo: number = 10'],
1208971caf53SBram Moolenaar                  'E488: Trailing characters: : number = 1')
1209971caf53SBram Moolenaar  CheckDefFailure(['t:foo: bool = true'],
1210971caf53SBram Moolenaar                  'E488: Trailing characters: : bool = true')
1211971caf53SBram Moolenaar  CheckDefFailure(['b:foo: string = "x"'],
1212971caf53SBram Moolenaar                  'E488: Trailing characters: : string = "x"')
1213971caf53SBram Moolenaar  CheckDefFailure(['g:foo: number = 123'],
1214971caf53SBram Moolenaar                  'E488: Trailing characters: : number = 123')
1215971caf53SBram Moolenaarenddef
1216971caf53SBram Moolenaar
1217971caf53SBram Moolenaardef Test_assign_list()
1218e65081d1SBram Moolenaar  var lines =<< trim END
121930fd8204SBram Moolenaar      var l: list<string> = []
1220971caf53SBram Moolenaar      l[0] = 'value'
1221971caf53SBram Moolenaar      assert_equal('value', l[0])
1222971caf53SBram Moolenaar
1223971caf53SBram Moolenaar      l[1] = 'asdf'
1224971caf53SBram Moolenaar      assert_equal('value', l[0])
1225971caf53SBram Moolenaar      assert_equal('asdf', l[1])
1226971caf53SBram Moolenaar      assert_equal('asdf', l[-1])
1227971caf53SBram Moolenaar      assert_equal('value', l[-2])
1228971caf53SBram Moolenaar
122930fd8204SBram Moolenaar      var nrl: list<number> = []
1230971caf53SBram Moolenaar      for i in range(5)
1231971caf53SBram Moolenaar        nrl[i] = i
1232971caf53SBram Moolenaar      endfor
1233971caf53SBram Moolenaar      assert_equal([0, 1, 2, 3, 4], nrl)
1234334a8b4bSBram Moolenaar
1235e65081d1SBram Moolenaar      var ul: list<any>
1236e65081d1SBram Moolenaar      ul[0] = 1
1237e65081d1SBram Moolenaar      ul[1] = 2
1238e65081d1SBram Moolenaar      ul[2] = 3
1239e65081d1SBram Moolenaar      assert_equal([1, 2, 3], ul)
1240e65081d1SBram Moolenaar  END
1241e65081d1SBram Moolenaar  CheckDefAndScriptSuccess(lines)
1242e65081d1SBram Moolenaar
1243334a8b4bSBram Moolenaar  CheckDefFailure(["var l: list<number> = ['', true]"], 'E1012: Type mismatch; expected list<number> but got list<any>', 1)
1244334a8b4bSBram Moolenaar  CheckDefFailure(["var l: list<list<number>> = [['', true]]"], 'E1012: Type mismatch; expected list<list<number>> but got list<list<any>>', 1)
1245971caf53SBram Moolenaarenddef
1246971caf53SBram Moolenaar
1247971caf53SBram Moolenaardef Test_assign_dict()
1248c368957bSBram Moolenaar  var lines =<< trim END
124930fd8204SBram Moolenaar      var d: dict<string> = {}
1250971caf53SBram Moolenaar      d['key'] = 'value'
1251971caf53SBram Moolenaar      assert_equal('value', d['key'])
1252971caf53SBram Moolenaar
1253971caf53SBram Moolenaar      d[123] = 'qwerty'
1254971caf53SBram Moolenaar      assert_equal('qwerty', d[123])
1255971caf53SBram Moolenaar      assert_equal('qwerty', d['123'])
1256971caf53SBram Moolenaar
125730fd8204SBram Moolenaar      var nrd: dict<number> = {}
1258971caf53SBram Moolenaar      for i in range(3)
1259971caf53SBram Moolenaar        nrd[i] = i
1260971caf53SBram Moolenaar      endfor
1261e0de171eSBram Moolenaar      assert_equal({0: 0, 1: 1, 2: 2}, nrd)
1262334a8b4bSBram Moolenaar
1263c368957bSBram Moolenaar      d.somekey = 'someval'
1264c368957bSBram Moolenaar      assert_equal({key: 'value', '123': 'qwerty', somekey: 'someval'}, d)
126523e2e115SBram Moolenaar      unlet d.somekey
126623e2e115SBram Moolenaar      assert_equal({key: 'value', '123': 'qwerty'}, d)
1267c368957bSBram Moolenaar  END
1268c368957bSBram Moolenaar  CheckDefAndScriptSuccess(lines)
1269c368957bSBram Moolenaar
1270e0de171eSBram Moolenaar  CheckDefFailure(["var d: dict<number> = {a: '', b: true}"], 'E1012: Type mismatch; expected dict<number> but got dict<any>', 1)
1271e0de171eSBram Moolenaar  CheckDefFailure(["var d: dict<dict<number>> = {x: {a: '', b: true}}"], 'E1012: Type mismatch; expected dict<dict<number>> but got dict<dict<any>>', 1)
1272971caf53SBram Moolenaarenddef
1273971caf53SBram Moolenaar
127404bdd573SBram Moolenaardef Test_assign_dict_unknown_type()
127530fd8204SBram Moolenaar  var lines =<< trim END
127604bdd573SBram Moolenaar      vim9script
127730fd8204SBram Moolenaar      var mylist = []
1278e0de171eSBram Moolenaar      mylist += [{one: 'one'}]
127904bdd573SBram Moolenaar      def Func()
128030fd8204SBram Moolenaar        var dd = mylist[0]
128104bdd573SBram Moolenaar        assert_equal('one', dd.one)
128204bdd573SBram Moolenaar      enddef
128304bdd573SBram Moolenaar      Func()
128404bdd573SBram Moolenaar  END
128504bdd573SBram Moolenaar  CheckScriptSuccess(lines)
128604bdd573SBram Moolenaar
1287ce2c5444SBram Moolenaar  lines =<< trim END
1288ce2c5444SBram Moolenaar      vim9script
1289ce2c5444SBram Moolenaar      var mylist = [[]]
1290e0de171eSBram Moolenaar      mylist[0] += [{one: 'one'}]
1291ce2c5444SBram Moolenaar      def Func()
1292ce2c5444SBram Moolenaar        var dd = mylist[0][0]
1293ce2c5444SBram Moolenaar        assert_equal('one', dd.one)
1294ce2c5444SBram Moolenaar      enddef
1295ce2c5444SBram Moolenaar      Func()
1296ce2c5444SBram Moolenaar  END
1297ce2c5444SBram Moolenaar  CheckScriptSuccess(lines)
129804bdd573SBram Moolenaarenddef
129904bdd573SBram Moolenaar
1300f76ec1eeSBram Moolenaardef Test_assign_dict_with_op()
1301f76ec1eeSBram Moolenaar  var lines =<< trim END
1302f76ec1eeSBram Moolenaar    var ds: dict<string> = {a: 'x'}
1303f76ec1eeSBram Moolenaar    ds['a'] ..= 'y'
1304f76ec1eeSBram Moolenaar    ds.a ..= 'z'
1305f76ec1eeSBram Moolenaar    assert_equal('xyz', ds.a)
1306f76ec1eeSBram Moolenaar
1307f76ec1eeSBram Moolenaar    var dn: dict<number> = {a: 9}
1308f76ec1eeSBram Moolenaar    dn['a'] += 2
1309f76ec1eeSBram Moolenaar    assert_equal(11, dn.a)
1310f76ec1eeSBram Moolenaar    dn.a += 2
1311f76ec1eeSBram Moolenaar    assert_equal(13, dn.a)
1312f76ec1eeSBram Moolenaar
1313f76ec1eeSBram Moolenaar    dn['a'] -= 3
1314f76ec1eeSBram Moolenaar    assert_equal(10, dn.a)
1315f76ec1eeSBram Moolenaar    dn.a -= 2
1316f76ec1eeSBram Moolenaar    assert_equal(8, dn.a)
1317f76ec1eeSBram Moolenaar
1318f76ec1eeSBram Moolenaar    dn['a'] *= 2
1319f76ec1eeSBram Moolenaar    assert_equal(16, dn.a)
1320f76ec1eeSBram Moolenaar    dn.a *= 2
1321f76ec1eeSBram Moolenaar    assert_equal(32, dn.a)
1322f76ec1eeSBram Moolenaar
1323f76ec1eeSBram Moolenaar    dn['a'] /= 3
1324f76ec1eeSBram Moolenaar    assert_equal(10, dn.a)
1325f76ec1eeSBram Moolenaar    dn.a /= 2
1326f76ec1eeSBram Moolenaar    assert_equal(5, dn.a)
1327f76ec1eeSBram Moolenaar
1328f76ec1eeSBram Moolenaar    dn['a'] %= 3
1329f76ec1eeSBram Moolenaar    assert_equal(2, dn.a)
1330f76ec1eeSBram Moolenaar    dn.a %= 6
1331f76ec1eeSBram Moolenaar    assert_equal(2, dn.a)
1332b9c0cd89SBram Moolenaar
1333b9c0cd89SBram Moolenaar    var dd: dict<dict<list<any>>>
1334b9c0cd89SBram Moolenaar    dd.a = {}
1335b9c0cd89SBram Moolenaar    dd.a.b = [0]
1336b9c0cd89SBram Moolenaar    dd.a.b += [1]
1337b9c0cd89SBram Moolenaar    assert_equal({a: {b: [0, 1]}}, dd)
13380d351a04SBram Moolenaar
13390d351a04SBram Moolenaar    var dab = {a: ['b']}
13400d351a04SBram Moolenaar    dab.a[0] ..= 'c'
13410d351a04SBram Moolenaar    assert_equal({a: ['bc']}, dab)
1342f76ec1eeSBram Moolenaar  END
1343e42939afSBram Moolenaar  CheckDefAndScriptSuccess(lines)
1344e42939afSBram Moolenaarenddef
1345e42939afSBram Moolenaar
1346e42939afSBram Moolenaardef Test_assign_list_with_op()
1347e42939afSBram Moolenaar  var lines =<< trim END
1348e42939afSBram Moolenaar    var ls: list<string> = ['x']
1349e42939afSBram Moolenaar    ls[0] ..= 'y'
1350e42939afSBram Moolenaar    assert_equal('xy', ls[0])
1351e42939afSBram Moolenaar
1352e42939afSBram Moolenaar    var ln: list<number> = [9]
1353e42939afSBram Moolenaar    ln[0] += 2
1354e42939afSBram Moolenaar    assert_equal(11, ln[0])
1355e42939afSBram Moolenaar
1356e42939afSBram Moolenaar    ln[0] -= 3
1357e42939afSBram Moolenaar    assert_equal(8, ln[0])
1358e42939afSBram Moolenaar
1359e42939afSBram Moolenaar    ln[0] *= 2
1360e42939afSBram Moolenaar    assert_equal(16, ln[0])
1361e42939afSBram Moolenaar
1362e42939afSBram Moolenaar    ln[0] /= 3
1363e42939afSBram Moolenaar    assert_equal(5, ln[0])
1364e42939afSBram Moolenaar
1365e42939afSBram Moolenaar    ln[0] %= 3
1366e42939afSBram Moolenaar    assert_equal(2, ln[0])
1367e42939afSBram Moolenaar  END
1368e42939afSBram Moolenaar  CheckDefAndScriptSuccess(lines)
1369e42939afSBram Moolenaarenddef
1370e42939afSBram Moolenaar
1371e42939afSBram Moolenaardef Test_assign_with_op_fails()
1372e42939afSBram Moolenaar  var lines =<< trim END
1373e42939afSBram Moolenaar      var s = 'abc'
1374e42939afSBram Moolenaar      s[1] += 'x'
1375e42939afSBram Moolenaar  END
1376e42939afSBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1141:', 'E689:', 2)
1377e42939afSBram Moolenaar
1378e42939afSBram Moolenaar  lines =<< trim END
1379e42939afSBram Moolenaar      var s = 'abc'
1380e42939afSBram Moolenaar      s[1] ..= 'x'
1381e42939afSBram Moolenaar  END
1382e42939afSBram Moolenaar  CheckDefAndScriptFailure2(lines, 'E1141:', 'E689:', 2)
1383b9c0cd89SBram Moolenaar
1384b9c0cd89SBram Moolenaar  lines =<< trim END
1385b9c0cd89SBram Moolenaar      var dd: dict<dict<list<any>>>
1386b9c0cd89SBram Moolenaar      dd.a = {}
1387b9c0cd89SBram Moolenaar      dd.a.b += [1]
1388b9c0cd89SBram Moolenaar  END
1389b9c0cd89SBram Moolenaar  CheckDefExecAndScriptFailure(lines, 'E716:', 3)
1390f76ec1eeSBram Moolenaarenddef
1391f76ec1eeSBram Moolenaar
1392971caf53SBram Moolenaardef Test_assign_lambda()
1393971caf53SBram Moolenaar  # check if assign a lambda to a variable which type is func or any.
139430fd8204SBram Moolenaar  var lines =<< trim END
1395971caf53SBram Moolenaar      vim9script
13962949cfdbSBram Moolenaar      var FuncRef = () => 123
1397971caf53SBram Moolenaar      assert_equal(123, FuncRef())
13982949cfdbSBram Moolenaar      var FuncRef_Func: func = () => 123
1399971caf53SBram Moolenaar      assert_equal(123, FuncRef_Func())
14002949cfdbSBram Moolenaar      var FuncRef_Any: any = () => 123
1401971caf53SBram Moolenaar      assert_equal(123, FuncRef_Any())
140206409501SBram Moolenaar      var FuncRef_Number: func(): number = () => 321
140306409501SBram Moolenaar      assert_equal(321, FuncRef_Number())
1404971caf53SBram Moolenaar  END
1405971caf53SBram Moolenaar  CheckScriptSuccess(lines)
1406328eac2bSBram Moolenaar
1407328eac2bSBram Moolenaar  lines =<< trim END
1408328eac2bSBram Moolenaar      var Ref: func(number)
1409328eac2bSBram Moolenaar      Ref = (j) => !j
1410328eac2bSBram Moolenaar  END
141106409501SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected func(number) but got func(any): bool')
1412c7dac853SBram Moolenaar
1413c7dac853SBram Moolenaar  lines =<< trim END
1414c7dac853SBram Moolenaar      echo filter([1, 2, 3], (_, v: string) => v + 1)
1415c7dac853SBram Moolenaar  END
1416c7dac853SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1051:')
1417971caf53SBram Moolenaarenddef
1418971caf53SBram Moolenaar
1419c0e29010SBram Moolenaardef Test_heredoc()
1420c0e29010SBram Moolenaar  var lines =<< trim END # comment
1421c0e29010SBram Moolenaar    text
1422c0e29010SBram Moolenaar  END
1423c0e29010SBram Moolenaar  assert_equal(['text'], lines)
1424c0e29010SBram Moolenaar
1425c0e29010SBram Moolenaar  CheckDefFailure(['var lines =<< trim END X', 'END'], 'E488:')
1426c0e29010SBram Moolenaar  CheckDefFailure(['var lines =<< trim END " comment', 'END'], 'E488:')
14272914a20aSBram Moolenaar
14282914a20aSBram Moolenaar  lines =<< trim [END]
14292914a20aSBram Moolenaar      def Func()
14302914a20aSBram Moolenaar        var&lines =<< trim END
14312914a20aSBram Moolenaar        x
14322914a20aSBram Moolenaar        x
1433b5b9480eSBram Moolenaar      enddef
1434b5b9480eSBram Moolenaar      defcompile
1435b5b9480eSBram Moolenaar  [END]
1436b5b9480eSBram Moolenaar  CheckScriptFailure(lines, 'E1145: Missing heredoc end marker: END')
1437b5b9480eSBram Moolenaar  delfunc! g:Func
1438b5b9480eSBram Moolenaar
1439b5b9480eSBram Moolenaar  lines =<< trim [END]
1440b5b9480eSBram Moolenaar      def Func()
1441b5b9480eSBram Moolenaar        var lines =<< trim END
1442b5b9480eSBram Moolenaar        x
1443b5b9480eSBram Moolenaar        x
14442914a20aSBram Moolenaar        x
14452914a20aSBram Moolenaar        x
14462914a20aSBram Moolenaar        x
14472914a20aSBram Moolenaar        x
14482914a20aSBram Moolenaar        x
14492914a20aSBram Moolenaar        x
14502914a20aSBram Moolenaar      enddef
14512914a20aSBram Moolenaar      call Func()
14522914a20aSBram Moolenaar  [END]
1453b5b9480eSBram Moolenaar  CheckScriptFailure(lines, 'E1145: Missing heredoc end marker: END')
14542d870f8dSBram Moolenaar  delfunc! g:Func
145581530e36SBram Moolenaar
145681530e36SBram Moolenaar  lines =<< trim END
145781530e36SBram Moolenaar      var lines: number =<< trim STOP
145881530e36SBram Moolenaar        aaa
145981530e36SBram Moolenaar        bbb
146081530e36SBram Moolenaar      STOP
146181530e36SBram Moolenaar  END
146281530e36SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got list<string>', 1)
1463c0e29010SBram Moolenaarenddef
1464c0e29010SBram Moolenaar
1465083966f6SBram Moolenaardef Test_var_func_call()
146655759b52SBram Moolenaar  var lines =<< trim END
146755759b52SBram Moolenaar    vim9script
146855759b52SBram Moolenaar    func GetValue()
146955759b52SBram Moolenaar      if exists('g:count')
147055759b52SBram Moolenaar        let g:count += 1
147155759b52SBram Moolenaar      else
147255759b52SBram Moolenaar        let g:count = 1
147355759b52SBram Moolenaar      endif
147455759b52SBram Moolenaar      return 'this'
147555759b52SBram Moolenaar    endfunc
147655759b52SBram Moolenaar    var val: string = GetValue()
147755759b52SBram Moolenaar    # env var is always a string
147855759b52SBram Moolenaar    var env = $TERM
147955759b52SBram Moolenaar  END
148055759b52SBram Moolenaar  writefile(lines, 'Xfinished')
148155759b52SBram Moolenaar  source Xfinished
148255759b52SBram Moolenaar  # GetValue() is not called during discovery phase
148355759b52SBram Moolenaar  assert_equal(1, g:count)
148455759b52SBram Moolenaar
148555759b52SBram Moolenaar  unlet g:count
148655759b52SBram Moolenaar  delete('Xfinished')
148755759b52SBram Moolenaarenddef
148855759b52SBram Moolenaar
1489083966f6SBram Moolenaardef Test_var_missing_type()
149055759b52SBram Moolenaar  var lines =<< trim END
149155759b52SBram Moolenaar    vim9script
149255759b52SBram Moolenaar    var name = g:unknown
149355759b52SBram Moolenaar  END
149455759b52SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
149555759b52SBram Moolenaar
149655759b52SBram Moolenaar  lines =<< trim END
149755759b52SBram Moolenaar    vim9script
149855759b52SBram Moolenaar    var nr: number = 123
149955759b52SBram Moolenaar    var name = nr
150055759b52SBram Moolenaar  END
150155759b52SBram Moolenaar  CheckScriptSuccess(lines)
150255759b52SBram Moolenaarenddef
150355759b52SBram Moolenaar
1504083966f6SBram Moolenaardef Test_var_declaration()
150555759b52SBram Moolenaar  var lines =<< trim END
150655759b52SBram Moolenaar    vim9script
150755759b52SBram Moolenaar    var name: string
150855759b52SBram Moolenaar    g:var_uninit = name
150955759b52SBram Moolenaar    name = 'text'
151055759b52SBram Moolenaar    g:var_test = name
151155759b52SBram Moolenaar    # prefixing s: is optional
151255759b52SBram Moolenaar    s:name = 'prefixed'
151355759b52SBram Moolenaar    g:var_prefixed = s:name
151455759b52SBram Moolenaar
15157257af47SBram Moolenaar    const FOO: number = 123
15167257af47SBram Moolenaar    assert_equal(123, FOO)
151789b474ddSBram Moolenaar    const FOOS = 'foos'
151889b474ddSBram Moolenaar    assert_equal('foos', FOOS)
151989b474ddSBram Moolenaar    final FLIST = [1]
152089b474ddSBram Moolenaar    assert_equal([1], FLIST)
152189b474ddSBram Moolenaar    FLIST[0] = 11
152289b474ddSBram Moolenaar    assert_equal([11], FLIST)
152389b474ddSBram Moolenaar
152489b474ddSBram Moolenaar    const g:FOO: number = 321
152589b474ddSBram Moolenaar    assert_equal(321, g:FOO)
152689b474ddSBram Moolenaar    const g:FOOS = 'gfoos'
152789b474ddSBram Moolenaar    assert_equal('gfoos', g:FOOS)
152889b474ddSBram Moolenaar    final g:FLIST = [2]
152989b474ddSBram Moolenaar    assert_equal([2], g:FLIST)
153089b474ddSBram Moolenaar    g:FLIST[0] = 22
153189b474ddSBram Moolenaar    assert_equal([22], g:FLIST)
153289b474ddSBram Moolenaar
1533d877a570SBram Moolenaar    def SetGlobalConst()
1534d877a570SBram Moolenaar      const g:globConst = 123
1535d877a570SBram Moolenaar    enddef
1536d877a570SBram Moolenaar    SetGlobalConst()
1537d877a570SBram Moolenaar    assert_equal(123, g:globConst)
1538d877a570SBram Moolenaar    assert_true(islocked('g:globConst'))
1539d877a570SBram Moolenaar
154089b474ddSBram Moolenaar    const w:FOO: number = 46
154189b474ddSBram Moolenaar    assert_equal(46, w:FOO)
154289b474ddSBram Moolenaar    const w:FOOS = 'wfoos'
154389b474ddSBram Moolenaar    assert_equal('wfoos', w:FOOS)
154489b474ddSBram Moolenaar    final w:FLIST = [3]
154589b474ddSBram Moolenaar    assert_equal([3], w:FLIST)
154689b474ddSBram Moolenaar    w:FLIST[0] = 33
154789b474ddSBram Moolenaar    assert_equal([33], w:FLIST)
15487257af47SBram Moolenaar
154955759b52SBram Moolenaar    var s:other: number
155055759b52SBram Moolenaar    other = 1234
155155759b52SBram Moolenaar    g:other_var = other
155255759b52SBram Moolenaar
1553ccc25aa2SBram Moolenaar    var xyz: string  # comment
1554ccc25aa2SBram Moolenaar
155555759b52SBram Moolenaar    # type is inferred
15563862ea3fSBram Moolenaar    var s:dict = {['a']: 222}
155755759b52SBram Moolenaar    def GetDictVal(key: any)
155855759b52SBram Moolenaar      g:dict_val = s:dict[key]
155955759b52SBram Moolenaar    enddef
156055759b52SBram Moolenaar    GetDictVal('a')
156108251757SBram Moolenaar
156208251757SBram Moolenaar    final adict: dict<string> = {}
156308251757SBram Moolenaar    def ChangeAdict()
156408251757SBram Moolenaar      adict.foo = 'foo'
156508251757SBram Moolenaar    enddef
156608251757SBram Moolenaar    ChangeAdict()
156755759b52SBram Moolenaar  END
156855759b52SBram Moolenaar  CheckScriptSuccess(lines)
156955759b52SBram Moolenaar  assert_equal('', g:var_uninit)
157055759b52SBram Moolenaar  assert_equal('text', g:var_test)
157155759b52SBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
157255759b52SBram Moolenaar  assert_equal(1234, g:other_var)
157355759b52SBram Moolenaar  assert_equal(222, g:dict_val)
157455759b52SBram Moolenaar
157555759b52SBram Moolenaar  unlet g:var_uninit
157655759b52SBram Moolenaar  unlet g:var_test
157755759b52SBram Moolenaar  unlet g:var_prefixed
157855759b52SBram Moolenaar  unlet g:other_var
15796e50ec2fSBram Moolenaar  unlet g:globConst
158089b474ddSBram Moolenaar  unlet g:FOO
158189b474ddSBram Moolenaar  unlet g:FOOS
158289b474ddSBram Moolenaar  unlet g:FLIST
158389b474ddSBram Moolenaar  unlet w:FOO
158489b474ddSBram Moolenaar  unlet w:FOOS
158589b474ddSBram Moolenaar  unlet w:FLIST
158655759b52SBram Moolenaarenddef
158755759b52SBram Moolenaar
1588083966f6SBram Moolenaardef Test_var_declaration_fails()
158955759b52SBram Moolenaar  var lines =<< trim END
159055759b52SBram Moolenaar    vim9script
159155759b52SBram Moolenaar    final var: string
159255759b52SBram Moolenaar  END
159355759b52SBram Moolenaar  CheckScriptFailure(lines, 'E1125:')
159455759b52SBram Moolenaar
159555759b52SBram Moolenaar  lines =<< trim END
159655759b52SBram Moolenaar    vim9script
159789b474ddSBram Moolenaar    const g:constvar = 'string'
159889b474ddSBram Moolenaar    g:constvar = 'xx'
159989b474ddSBram Moolenaar  END
160089b474ddSBram Moolenaar  CheckScriptFailure(lines, 'E741:')
160189b474ddSBram Moolenaar  unlet g:constvar
160289b474ddSBram Moolenaar
160389b474ddSBram Moolenaar  lines =<< trim END
160489b474ddSBram Moolenaar    vim9script
1605f5906aa7SBram Moolenaar    var name = 'one'
1606f5906aa7SBram Moolenaar    lockvar name
1607f5906aa7SBram Moolenaar    def SetLocked()
1608f5906aa7SBram Moolenaar      name = 'two'
1609f5906aa7SBram Moolenaar    enddef
1610f5906aa7SBram Moolenaar    SetLocked()
1611f5906aa7SBram Moolenaar  END
1612dcf29ac8SBram Moolenaar  CheckScriptFailure(lines, 'E741: Value is locked: name', 1)
1613dcf29ac8SBram Moolenaar
1614dcf29ac8SBram Moolenaar  lines =<< trim END
1615dcf29ac8SBram Moolenaar    let s:legacy = 'one'
1616dcf29ac8SBram Moolenaar    lockvar s:legacy
1617dcf29ac8SBram Moolenaar    def SetLocked()
1618dcf29ac8SBram Moolenaar      s:legacy = 'two'
1619dcf29ac8SBram Moolenaar    enddef
1620dcf29ac8SBram Moolenaar    call SetLocked()
1621dcf29ac8SBram Moolenaar  END
1622dcf29ac8SBram Moolenaar  CheckScriptFailure(lines, 'E741: Value is locked: s:legacy', 1)
1623f5906aa7SBram Moolenaar
1624f5906aa7SBram Moolenaar  lines =<< trim END
1625f5906aa7SBram Moolenaar    vim9script
1626d877a570SBram Moolenaar    def SetGlobalConst()
1627d877a570SBram Moolenaar      const g:globConst = 123
1628d877a570SBram Moolenaar    enddef
1629d877a570SBram Moolenaar    SetGlobalConst()
1630d877a570SBram Moolenaar    g:globConst = 234
1631d877a570SBram Moolenaar  END
16326e50ec2fSBram Moolenaar  CheckScriptFailure(lines, 'E741: Value is locked: g:globConst', 6)
1633d877a570SBram Moolenaar  unlet g:globConst
1634d877a570SBram Moolenaar
1635d877a570SBram Moolenaar  lines =<< trim END
1636d877a570SBram Moolenaar    vim9script
163708251757SBram Moolenaar    const cdict: dict<string> = {}
163808251757SBram Moolenaar    def Change()
163908251757SBram Moolenaar      cdict.foo = 'foo'
164008251757SBram Moolenaar    enddef
164108251757SBram Moolenaar    defcompile
164208251757SBram Moolenaar  END
164308251757SBram Moolenaar  CheckScriptFailure(lines, 'E46:')
164408251757SBram Moolenaar
164508251757SBram Moolenaar  lines =<< trim END
164608251757SBram Moolenaar    vim9script
164789b474ddSBram Moolenaar    final w:finalvar = [9]
164889b474ddSBram Moolenaar    w:finalvar = [8]
164989b474ddSBram Moolenaar  END
165089b474ddSBram Moolenaar  CheckScriptFailure(lines, 'E1122:')
165189b474ddSBram Moolenaar  unlet w:finalvar
165289b474ddSBram Moolenaar
165389b474ddSBram Moolenaar  lines =<< trim END
165489b474ddSBram Moolenaar    vim9script
165555759b52SBram Moolenaar    const var: string
165655759b52SBram Moolenaar  END
165755759b52SBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
165855759b52SBram Moolenaar
165955759b52SBram Moolenaar  lines =<< trim END
166055759b52SBram Moolenaar    vim9script
166155759b52SBram Moolenaar    var 9var: string
166255759b52SBram Moolenaar  END
1663ccc25aa2SBram Moolenaar  CheckScriptFailure(lines, 'E488:')
16647257af47SBram Moolenaar
16657257af47SBram Moolenaar  CheckDefFailure(['var foo.bar = 2'], 'E1087:')
16667257af47SBram Moolenaar  CheckDefFailure(['var foo[3] = 2'], 'E1087:')
16677257af47SBram Moolenaar  CheckDefFailure(['const foo: number'], 'E1021:')
166855759b52SBram Moolenaarenddef
166955759b52SBram Moolenaar
1670643ce6c0SBram Moolenaardef Test_script_local_in_legacy()
1671643ce6c0SBram Moolenaar  # OK to define script-local later when prefixed with s:
1672643ce6c0SBram Moolenaar  var lines =<< trim END
1673643ce6c0SBram Moolenaar    def SetLater()
167496cf4ba8SBram Moolenaar      s:legvar = 'two'
1675643ce6c0SBram Moolenaar    enddef
1676643ce6c0SBram Moolenaar    defcompile
167796cf4ba8SBram Moolenaar    let s:legvar = 'one'
1678643ce6c0SBram Moolenaar    call SetLater()
167996cf4ba8SBram Moolenaar    call assert_equal('two', s:legvar)
1680643ce6c0SBram Moolenaar  END
1681643ce6c0SBram Moolenaar  CheckScriptSuccess(lines)
1682643ce6c0SBram Moolenaar
1683643ce6c0SBram Moolenaar  # OK to leave out s: prefix when script-local already defined
1684643ce6c0SBram Moolenaar  lines =<< trim END
168596cf4ba8SBram Moolenaar    let s:legvar = 'one'
1686643ce6c0SBram Moolenaar    def SetNoPrefix()
168796cf4ba8SBram Moolenaar      legvar = 'two'
1688643ce6c0SBram Moolenaar    enddef
1689643ce6c0SBram Moolenaar    call SetNoPrefix()
169096cf4ba8SBram Moolenaar    call assert_equal('two', s:legvar)
1691643ce6c0SBram Moolenaar  END
1692643ce6c0SBram Moolenaar  CheckScriptSuccess(lines)
1693643ce6c0SBram Moolenaar
1694643ce6c0SBram Moolenaar  # Not OK to leave out s: prefix when script-local defined later
1695643ce6c0SBram Moolenaar  lines =<< trim END
1696643ce6c0SBram Moolenaar    def SetLaterNoPrefix()
169796cf4ba8SBram Moolenaar      legvar = 'two'
1698643ce6c0SBram Moolenaar    enddef
1699643ce6c0SBram Moolenaar    defcompile
170096cf4ba8SBram Moolenaar    let s:legvar = 'one'
1701643ce6c0SBram Moolenaar  END
1702643ce6c0SBram Moolenaar  CheckScriptFailure(lines, 'E476:', 1)
170347bc9c33SBram Moolenaar
170447bc9c33SBram Moolenaar  edit! Xfile
170547bc9c33SBram Moolenaar  lines =<< trim END
170647bc9c33SBram Moolenaar      var edit: bool
170747bc9c33SBram Moolenaar      legacy edit
170847bc9c33SBram Moolenaar  END
170947bc9c33SBram Moolenaar  CheckDefAndScriptSuccess(lines)
1710643ce6c0SBram Moolenaarenddef
1711643ce6c0SBram Moolenaar
1712083966f6SBram Moolenaardef Test_var_type_check()
171355759b52SBram Moolenaar  var lines =<< trim END
171455759b52SBram Moolenaar    vim9script
171555759b52SBram Moolenaar    var name: string
171655759b52SBram Moolenaar    name = 1234
171755759b52SBram Moolenaar  END
171855759b52SBram Moolenaar  CheckScriptFailure(lines, 'E1012:')
171955759b52SBram Moolenaar
172055759b52SBram Moolenaar  lines =<< trim END
172155759b52SBram Moolenaar    vim9script
172255759b52SBram Moolenaar    var name:string
172355759b52SBram Moolenaar  END
172455759b52SBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
172555759b52SBram Moolenaar
172660faf865SBram Moolenaar  CheckDefAndScriptFailure(['var n:number = 42'], 'E1069:')
172760faf865SBram Moolenaar
172855759b52SBram Moolenaar  lines =<< trim END
172955759b52SBram Moolenaar    vim9script
173055759b52SBram Moolenaar    var name: asdf
173155759b52SBram Moolenaar  END
173255759b52SBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
173355759b52SBram Moolenaar
173455759b52SBram Moolenaar  lines =<< trim END
173555759b52SBram Moolenaar    vim9script
173655759b52SBram Moolenaar    var s:l: list<number>
173755759b52SBram Moolenaar    s:l = []
173855759b52SBram Moolenaar  END
173955759b52SBram Moolenaar  CheckScriptSuccess(lines)
174055759b52SBram Moolenaar
174155759b52SBram Moolenaar  lines =<< trim END
174255759b52SBram Moolenaar    vim9script
174355759b52SBram Moolenaar    var s:d: dict<number>
174455759b52SBram Moolenaar    s:d = {}
174555759b52SBram Moolenaar  END
174655759b52SBram Moolenaar  CheckScriptSuccess(lines)
1747378697acSBram Moolenaar
1748378697acSBram Moolenaar  lines =<< trim END
1749378697acSBram Moolenaar    vim9script
1750378697acSBram Moolenaar    var d = {a: 1, b: [2]}
1751378697acSBram Moolenaar    def Func(b: bool)
1752378697acSBram Moolenaar      var l: list<number> = b ? d.b : [3]
1753378697acSBram Moolenaar    enddef
1754378697acSBram Moolenaar    defcompile
1755378697acSBram Moolenaar  END
1756378697acSBram Moolenaar  CheckScriptSuccess(lines)
175755759b52SBram Moolenaarenddef
175855759b52SBram Moolenaar
175955759b52SBram Moolenaarlet g:dict_number = #{one: 1, two: 2}
176055759b52SBram Moolenaar
1761083966f6SBram Moolenaardef Test_var_list_dict_type()
176255759b52SBram Moolenaar  var ll: list<number>
176355759b52SBram Moolenaar  ll = [1, 2, 2, 3, 3, 3]->uniq()
176455759b52SBram Moolenaar  ll->assert_equal([1, 2, 3])
176555759b52SBram Moolenaar
176655759b52SBram Moolenaar  var dd: dict<number>
176755759b52SBram Moolenaar  dd = g:dict_number
176855759b52SBram Moolenaar  dd->assert_equal(g:dict_number)
176955759b52SBram Moolenaar
177055759b52SBram Moolenaar  var lines =<< trim END
177155759b52SBram Moolenaar      var ll: list<number>
177255759b52SBram Moolenaar      ll = [1, 2, 3]->map('"one"')
177355759b52SBram Moolenaar  END
177470250fb4SBram Moolenaar  CheckDefExecFailure(lines, 'E1012: Type mismatch; expected number but got string')
177555759b52SBram Moolenaarenddef
177655759b52SBram Moolenaar
1777083966f6SBram Moolenaardef Test_cannot_use_let()
1778083966f6SBram Moolenaar  CheckDefAndScriptFailure(['let a = 34'], 'E1126:', 1)
1779083966f6SBram Moolenaarenddef
1780083966f6SBram Moolenaar
178155759b52SBram Moolenaardef Test_unlet()
178255759b52SBram Moolenaar  g:somevar = 'yes'
178355759b52SBram Moolenaar  assert_true(exists('g:somevar'))
178455759b52SBram Moolenaar  unlet g:somevar
178555759b52SBram Moolenaar  assert_false(exists('g:somevar'))
178655759b52SBram Moolenaar  unlet! g:somevar
178755759b52SBram Moolenaar
178855759b52SBram Moolenaar  # also works for script-local variable in legacy Vim script
178955759b52SBram Moolenaar  s:somevar = 'legacy'
179055759b52SBram Moolenaar  assert_true(exists('s:somevar'))
179155759b52SBram Moolenaar  unlet s:somevar
179255759b52SBram Moolenaar  assert_false(exists('s:somevar'))
179355759b52SBram Moolenaar  unlet! s:somevar
179455759b52SBram Moolenaar
17950acbf5aeSBram Moolenaar  CheckDefExecFailure([
17960acbf5aeSBram Moolenaar    'var dd = 111',
17970acbf5aeSBram Moolenaar    'unlet dd',
17980acbf5aeSBram Moolenaar    ], 'E1081:', 2)
17990acbf5aeSBram Moolenaar
1800752fc692SBram Moolenaar  # dict unlet
1801752fc692SBram Moolenaar  var dd = {a: 1, b: 2, c: 3}
1802752fc692SBram Moolenaar  unlet dd['a']
1803752fc692SBram Moolenaar  unlet dd.c
1804752fc692SBram Moolenaar  assert_equal({b: 2}, dd)
1805752fc692SBram Moolenaar
1806752fc692SBram Moolenaar  # list unlet
1807752fc692SBram Moolenaar  var ll = [1, 2, 3, 4]
1808752fc692SBram Moolenaar  unlet ll[1]
1809752fc692SBram Moolenaar  unlet ll[-1]
1810752fc692SBram Moolenaar  assert_equal([1, 3], ll)
1811752fc692SBram Moolenaar
18125b5ae29bSBram Moolenaar  ll = [1, 2, 3, 4]
18135b5ae29bSBram Moolenaar  unlet ll[0 : 1]
18145b5ae29bSBram Moolenaar  assert_equal([3, 4], ll)
18155b5ae29bSBram Moolenaar
18165b5ae29bSBram Moolenaar  ll = [1, 2, 3, 4]
18175b5ae29bSBram Moolenaar  unlet ll[2 : 8]
18185b5ae29bSBram Moolenaar  assert_equal([1, 2], ll)
18195b5ae29bSBram Moolenaar
18205b5ae29bSBram Moolenaar  ll = [1, 2, 3, 4]
18215b5ae29bSBram Moolenaar  unlet ll[-2 : -1]
18225b5ae29bSBram Moolenaar  assert_equal([1, 2], ll)
18235b5ae29bSBram Moolenaar
18245b5ae29bSBram Moolenaar  CheckDefFailure([
18255b5ae29bSBram Moolenaar    'var ll = [1, 2]',
18265b5ae29bSBram Moolenaar    'll[1 : 2] = 7',
18274f0884d6SBram Moolenaar    ], 'E1012: Type mismatch; expected list<number> but got number', 2)
18285b5ae29bSBram Moolenaar  CheckDefFailure([
18295b5ae29bSBram Moolenaar    'var dd = {a: 1}',
18305b5ae29bSBram Moolenaar    'unlet dd["a" : "a"]',
18315b5ae29bSBram Moolenaar    ], 'E1166:', 2)
18325b5ae29bSBram Moolenaar  CheckDefExecFailure([
18335b5ae29bSBram Moolenaar    'unlet g:adict[0 : 1]',
18345b5ae29bSBram Moolenaar    ], 'E1148:', 1)
18355b5ae29bSBram Moolenaar  CheckDefFailure([
18365b5ae29bSBram Moolenaar    'var ll = [1, 2]',
18375b5ae29bSBram Moolenaar    'unlet ll[0:1]',
18385b5ae29bSBram Moolenaar    ], 'E1004:', 2)
18395b5ae29bSBram Moolenaar  CheckDefFailure([
18405b5ae29bSBram Moolenaar    'var ll = [1, 2]',
18415b5ae29bSBram Moolenaar    'unlet ll[0 :1]',
18425b5ae29bSBram Moolenaar    ], 'E1004:', 2)
18435b5ae29bSBram Moolenaar  CheckDefFailure([
18445b5ae29bSBram Moolenaar    'var ll = [1, 2]',
18455b5ae29bSBram Moolenaar    'unlet ll[0: 1]',
18465b5ae29bSBram Moolenaar    ], 'E1004:', 2)
18475b5ae29bSBram Moolenaar
18485b5ae29bSBram Moolenaar  CheckDefFailure([
18495b5ae29bSBram Moolenaar    'var ll = [1, 2]',
18505b5ae29bSBram Moolenaar    'unlet ll["x" : 1]',
18515b5ae29bSBram Moolenaar    ], 'E1012:', 2)
18525b5ae29bSBram Moolenaar  CheckDefFailure([
18535b5ae29bSBram Moolenaar    'var ll = [1, 2]',
18545b5ae29bSBram Moolenaar    'unlet ll[0 : "x"]',
18555b5ae29bSBram Moolenaar    ], 'E1012:', 2)
18565b5ae29bSBram Moolenaar
1857752fc692SBram Moolenaar  # list of dict unlet
1858752fc692SBram Moolenaar  var dl = [{a: 1, b: 2}, {c: 3}]
1859752fc692SBram Moolenaar  unlet dl[0]['b']
1860752fc692SBram Moolenaar  assert_equal([{a: 1}, {c: 3}], dl)
1861752fc692SBram Moolenaar
1862752fc692SBram Moolenaar  CheckDefExecFailure([
1863752fc692SBram Moolenaar    'var ll = test_null_list()',
1864752fc692SBram Moolenaar    'unlet ll[0]',
18650acbf5aeSBram Moolenaar    ], 'E684:', 2)
1866752fc692SBram Moolenaar  CheckDefExecFailure([
1867752fc692SBram Moolenaar    'var ll = [1]',
1868752fc692SBram Moolenaar    'unlet ll[2]',
18690acbf5aeSBram Moolenaar    ], 'E684:', 2)
18700acbf5aeSBram Moolenaar  CheckDefExecFailure([
18710acbf5aeSBram Moolenaar    'var ll = [1]',
18720acbf5aeSBram Moolenaar    'unlet ll[g:astring]',
1873f30a14dbSBram Moolenaar    ], 'E1012:', 2)
1874752fc692SBram Moolenaar  CheckDefExecFailure([
1875752fc692SBram Moolenaar    'var dd = test_null_dict()',
1876752fc692SBram Moolenaar    'unlet dd["a"]',
18770acbf5aeSBram Moolenaar    ], 'E716:', 2)
1878752fc692SBram Moolenaar  CheckDefExecFailure([
1879752fc692SBram Moolenaar    'var dd = {a: 1}',
1880752fc692SBram Moolenaar    'unlet dd["b"]',
18810acbf5aeSBram Moolenaar    ], 'E716:', 2)
18820acbf5aeSBram Moolenaar  CheckDefExecFailure([
18830acbf5aeSBram Moolenaar    'var dd = {a: 1}',
18840acbf5aeSBram Moolenaar    'unlet dd[g:alist]',
18850acbf5aeSBram Moolenaar    ], 'E1105:', 2)
1886752fc692SBram Moolenaar
18872ef951ddSBram Moolenaar  # can compile unlet before variable exists
1888752fc692SBram Moolenaar  g:someDict = {key: 'val'}
1889752fc692SBram Moolenaar  var k = 'key'
1890752fc692SBram Moolenaar  unlet g:someDict[k]
1891752fc692SBram Moolenaar  assert_equal({}, g:someDict)
1892752fc692SBram Moolenaar  unlet g:someDict
1893752fc692SBram Moolenaar  assert_false(exists('g:someDict'))
18942ef951ddSBram Moolenaar
189555759b52SBram Moolenaar  CheckScriptFailure([
189655759b52SBram Moolenaar   'vim9script',
189755759b52SBram Moolenaar   'var svar = 123',
189855759b52SBram Moolenaar   'unlet svar',
189955759b52SBram Moolenaar   ], 'E1081:')
190055759b52SBram Moolenaar  CheckScriptFailure([
190155759b52SBram Moolenaar   'vim9script',
190255759b52SBram Moolenaar   'var svar = 123',
190355759b52SBram Moolenaar   'unlet s:svar',
190455759b52SBram Moolenaar   ], 'E1081:')
190555759b52SBram Moolenaar  CheckScriptFailure([
190655759b52SBram Moolenaar   'vim9script',
190755759b52SBram Moolenaar   'var svar = 123',
190855759b52SBram Moolenaar   'def Func()',
190955759b52SBram Moolenaar   '  unlet svar',
191055759b52SBram Moolenaar   'enddef',
191155759b52SBram Moolenaar   'defcompile',
191255759b52SBram Moolenaar   ], 'E1081:')
191355759b52SBram Moolenaar  CheckScriptFailure([
191455759b52SBram Moolenaar   'vim9script',
191555759b52SBram Moolenaar   'var svar = 123',
19169aed729fSBram Moolenaar   'func Func()',
19179aed729fSBram Moolenaar   '  unlet s:svar',
19189aed729fSBram Moolenaar   'endfunc',
19199aed729fSBram Moolenaar   'Func()',
19209aed729fSBram Moolenaar   ], 'E1081:')
19219aed729fSBram Moolenaar  CheckScriptFailure([
19229aed729fSBram Moolenaar   'vim9script',
19239aed729fSBram Moolenaar   'var svar = 123',
192455759b52SBram Moolenaar   'def Func()',
192555759b52SBram Moolenaar   '  unlet s:svar',
192655759b52SBram Moolenaar   'enddef',
192755759b52SBram Moolenaar   'defcompile',
192855759b52SBram Moolenaar   ], 'E1081:')
192955759b52SBram Moolenaar
19300acbf5aeSBram Moolenaar  writefile(['vim9script', 'export var svar = 1234'], 'XunletExport.vim')
19310acbf5aeSBram Moolenaar  var lines =<< trim END
19320acbf5aeSBram Moolenaar    vim9script
19330acbf5aeSBram Moolenaar    import svar from './XunletExport.vim'
19340acbf5aeSBram Moolenaar    def UnletSvar()
19350acbf5aeSBram Moolenaar      unlet svar
19360acbf5aeSBram Moolenaar    enddef
19370acbf5aeSBram Moolenaar    defcompile
19380acbf5aeSBram Moolenaar  END
19390acbf5aeSBram Moolenaar  CheckScriptFailure(lines, 'E1081:', 1)
19400acbf5aeSBram Moolenaar  delete('XunletExport.vim')
19410acbf5aeSBram Moolenaar
194255759b52SBram Moolenaar  $ENVVAR = 'foobar'
194355759b52SBram Moolenaar  assert_equal('foobar', $ENVVAR)
194455759b52SBram Moolenaar  unlet $ENVVAR
194555759b52SBram Moolenaar  assert_equal('', $ENVVAR)
194655759b52SBram Moolenaarenddef
194755759b52SBram Moolenaar
1948c5f59fabSBram Moolenaardef Test_expr_error_no_assign()
1949c5f59fabSBram Moolenaar  var lines =<< trim END
1950c5f59fabSBram Moolenaar      vim9script
1951c5f59fabSBram Moolenaar      var x = invalid
1952c5f59fabSBram Moolenaar      echo x
1953c5f59fabSBram Moolenaar  END
1954c5f59fabSBram Moolenaar  CheckScriptFailureList(lines, ['E121:', 'E121:'])
1955c5f59fabSBram Moolenaar
1956c5f59fabSBram Moolenaar  lines =<< trim END
1957c5f59fabSBram Moolenaar      vim9script
1958c5f59fabSBram Moolenaar      var x = 1 / 0
1959c5f59fabSBram Moolenaar      echo x
1960c5f59fabSBram Moolenaar  END
1961227c58a4SBram Moolenaar  CheckScriptFailure(lines, 'E1154:')
1962c5f59fabSBram Moolenaar
1963c5f59fabSBram Moolenaar  lines =<< trim END
1964c5f59fabSBram Moolenaar      vim9script
1965c5f59fabSBram Moolenaar      var x = 1 % 0
1966c5f59fabSBram Moolenaar      echo x
1967c5f59fabSBram Moolenaar  END
1968227c58a4SBram Moolenaar  CheckScriptFailure(lines, 'E1154:')
1969ccc25aa2SBram Moolenaar
1970ccc25aa2SBram Moolenaar  lines =<< trim END
1971ccc25aa2SBram Moolenaar      var x: string  'string'
1972ccc25aa2SBram Moolenaar  END
1973ccc25aa2SBram Moolenaar  CheckDefAndScriptFailure(lines, 'E488:')
1974c5f59fabSBram Moolenaarenddef
1975c5f59fabSBram Moolenaar
1976c5f59fabSBram Moolenaar
197717126b13SBram Moolenaardef Test_assign_command_modifier()
197817126b13SBram Moolenaar  var lines =<< trim END
197917126b13SBram Moolenaar      var verbose = 0
198017126b13SBram Moolenaar      verbose = 1
198117126b13SBram Moolenaar      assert_equal(1, verbose)
198217126b13SBram Moolenaar      silent verbose = 2
198317126b13SBram Moolenaar      assert_equal(2, verbose)
198417126b13SBram Moolenaar      silent verbose += 2
198517126b13SBram Moolenaar      assert_equal(4, verbose)
198617126b13SBram Moolenaar      silent verbose -= 1
198717126b13SBram Moolenaar      assert_equal(3, verbose)
198817126b13SBram Moolenaar
198917126b13SBram Moolenaar      var topleft = {one: 1}
199017126b13SBram Moolenaar      sandbox topleft.one = 3
199117126b13SBram Moolenaar      assert_equal({one: 3}, topleft)
199217126b13SBram Moolenaar      leftabove topleft[' '] = 4
199317126b13SBram Moolenaar      assert_equal({one: 3, ' ': 4}, topleft)
19949e0f883fSBram Moolenaar
19959e0f883fSBram Moolenaar      var x: number
19969e0f883fSBram Moolenaar      var y: number
19979e0f883fSBram Moolenaar      silent [x, y] = [1, 2]
19989e0f883fSBram Moolenaar      assert_equal(1, x)
19999e0f883fSBram Moolenaar      assert_equal(2, y)
200017126b13SBram Moolenaar  END
200117126b13SBram Moolenaar  CheckDefAndScriptSuccess(lines)
200217126b13SBram Moolenaarenddef
200317126b13SBram Moolenaar
200474f4a965SBram Moolenaardef Test_assign_alt_buf_register()
200574f4a965SBram Moolenaar  var lines =<< trim END
200674f4a965SBram Moolenaar      edit 'file_b1'
200774f4a965SBram Moolenaar      var b1 = bufnr()
200874f4a965SBram Moolenaar      edit 'file_b2'
200974f4a965SBram Moolenaar      var b2 = bufnr()
201074f4a965SBram Moolenaar      assert_equal(b1, bufnr('#'))
201174f4a965SBram Moolenaar      @# = b2
201274f4a965SBram Moolenaar      assert_equal(b2, bufnr('#'))
201374f4a965SBram Moolenaar  END
201474f4a965SBram Moolenaar  CheckDefAndScriptSuccess(lines)
201574f4a965SBram Moolenaarenddef
201674f4a965SBram Moolenaar
20173215466aSBram Moolenaardef Test_script_funcref_case()
20183215466aSBram Moolenaar  var lines =<< trim END
20193215466aSBram Moolenaar      var Len = (s: string): number => len(s) + 1
20203215466aSBram Moolenaar      assert_equal(5, Len('asdf'))
20213215466aSBram Moolenaar  END
20223215466aSBram Moolenaar  CheckDefAndScriptSuccess(lines)
20233215466aSBram Moolenaar
20243215466aSBram Moolenaar  lines =<< trim END
20253215466aSBram Moolenaar      var len = (s: string): number => len(s) + 1
20263215466aSBram Moolenaar  END
20273215466aSBram Moolenaar  CheckDefAndScriptFailure(lines, 'E704:')
20283215466aSBram Moolenaar
20293215466aSBram Moolenaar  lines =<< trim END
20303215466aSBram Moolenaar      vim9script
20313215466aSBram Moolenaar      var s:Len = (s: string): number => len(s) + 2
20323215466aSBram Moolenaar      assert_equal(6, Len('asdf'))
20333215466aSBram Moolenaar  END
20343215466aSBram Moolenaar  CheckScriptSuccess(lines)
20353215466aSBram Moolenaar
20363215466aSBram Moolenaar  lines =<< trim END
20373215466aSBram Moolenaar      vim9script
20383215466aSBram Moolenaar      var s:len = (s: string): number => len(s) + 1
20393215466aSBram Moolenaar  END
20403215466aSBram Moolenaar  CheckScriptFailure(lines, 'E704:')
20413215466aSBram Moolenaarenddef
20423215466aSBram Moolenaar
2043bdc0f1c6SBram Moolenaardef Test_inc_dec()
2044bdc0f1c6SBram Moolenaar  var lines =<< trim END
2045bdc0f1c6SBram Moolenaar      var nr = 7
2046bdc0f1c6SBram Moolenaar      ++nr
2047730bf300SBram Moolenaar      assert_equal(8, nr)
2048bdc0f1c6SBram Moolenaar      --nr
2049730bf300SBram Moolenaar      assert_equal(7, nr)
2050f3d30842SBram Moolenaar      ++nr | ++nr
2051f3d30842SBram Moolenaar      assert_equal(9, nr)
2052f3d30842SBram Moolenaar      ++nr # comment
2053f3d30842SBram Moolenaar      assert_equal(10, nr)
2054bdc0f1c6SBram Moolenaar
2055bdc0f1c6SBram Moolenaar      var ll = [1, 2]
2056bdc0f1c6SBram Moolenaar      --ll[0]
2057bdc0f1c6SBram Moolenaar      ++ll[1]
2058730bf300SBram Moolenaar      assert_equal([0, 3], ll)
2059730bf300SBram Moolenaar
2060730bf300SBram Moolenaar      g:count = 1
2061730bf300SBram Moolenaar      ++g:count
2062730bf300SBram Moolenaar      --g:count
2063730bf300SBram Moolenaar      assert_equal(1, g:count)
2064730bf300SBram Moolenaar      unlet g:count
2065bdc0f1c6SBram Moolenaar  END
2066bdc0f1c6SBram Moolenaar  CheckDefAndScriptSuccess(lines)
206722480d14SBram Moolenaar
206822480d14SBram Moolenaar  lines =<< trim END
206922480d14SBram Moolenaar      var nr = 7
207022480d14SBram Moolenaar      ++ nr
207122480d14SBram Moolenaar  END
207222480d14SBram Moolenaar  CheckDefAndScriptFailure(lines, "E1202: No white space allowed after '++': ++ nr")
2073bdc0f1c6SBram Moolenaarenddef
2074bdc0f1c6SBram Moolenaar
2075327d3ee4SBram Moolenaardef Test_abort_after_error()
2076327d3ee4SBram Moolenaar  # should abort after strpart() fails, not give another type error
2077327d3ee4SBram Moolenaar  var lines =<< trim END
2078327d3ee4SBram Moolenaar      vim9script
2079327d3ee4SBram Moolenaar      var x: string
2080327d3ee4SBram Moolenaar      x = strpart(1, 2)
2081327d3ee4SBram Moolenaar  END
2082327d3ee4SBram Moolenaar  writefile(lines, 'Xtestscript')
2083327d3ee4SBram Moolenaar  var expected = 'E1174: String required for argument 1'
2084327d3ee4SBram Moolenaar  assert_fails('so Xtestscript', [expected, expected], 3)
2085327d3ee4SBram Moolenaar
2086327d3ee4SBram Moolenaar  delete('Xtestscript')
2087327d3ee4SBram Moolenaarenddef
2088327d3ee4SBram Moolenaar
2089327d3ee4SBram Moolenaar
209055759b52SBram Moolenaar
2091971caf53SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
2092