1*8a7d6542SBram Moolenaar" Tests for Vim9 script expressions
2*8a7d6542SBram Moolenaar
3*8a7d6542SBram Moolenaarsource check.vim
4*8a7d6542SBram Moolenaar
5*8a7d6542SBram Moolenaar" Check that "line" inside ":def" results in an "error" message.
6*8a7d6542SBram Moolenaarfunc CheckDefFailure(line, error)
7*8a7d6542SBram Moolenaar  call writefile(['def! Func()', a:line, 'enddef'], 'Xdef')
8*8a7d6542SBram Moolenaar  call assert_fails('so Xdef', a:error, a:line)
9*8a7d6542SBram Moolenaar  call delete('Xdef')
10*8a7d6542SBram Moolenaarendfunc
11*8a7d6542SBram Moolenaar
12*8a7d6542SBram Moolenaarfunc CheckDefFailureList(lines, error)
13*8a7d6542SBram Moolenaar  call writefile(['def! Func()'] + a:lines + ['enddef'], 'Xdef')
14*8a7d6542SBram Moolenaar  call assert_fails('so Xdef', a:error, string(a:lines))
15*8a7d6542SBram Moolenaar  call delete('Xdef')
16*8a7d6542SBram Moolenaarendfunc
17*8a7d6542SBram Moolenaar
18*8a7d6542SBram Moolenaar" test cond ? expr : expr
19*8a7d6542SBram Moolenaardef Test_expr1()
20*8a7d6542SBram Moolenaar  assert_equal('one', true ? 'one' : 'two')
21*8a7d6542SBram Moolenaar  assert_equal('one', 1 ? 'one' : 'two')
22*8a7d6542SBram Moolenaar  assert_equal('one', 0.1 ? 'one' : 'two')
23*8a7d6542SBram Moolenaar  assert_equal('one', 'x' ? 'one' : 'two')
24*8a7d6542SBram Moolenaar"  assert_equal('one', 0z1234 ? 'one' : 'two')
25*8a7d6542SBram Moolenaar  assert_equal('one', [0] ? 'one' : 'two')
26*8a7d6542SBram Moolenaar"  assert_equal('one', #{x: 0} ? 'one' : 'two')
27*8a7d6542SBram Moolenaar  let var = 1
28*8a7d6542SBram Moolenaar  assert_equal('one', var ? 'one' : 'two')
29*8a7d6542SBram Moolenaar
30*8a7d6542SBram Moolenaar  assert_equal('two', false ? 'one' : 'two')
31*8a7d6542SBram Moolenaar  assert_equal('two', 0 ? 'one' : 'two')
32*8a7d6542SBram Moolenaar  assert_equal('two', 0.0 ? 'one' : 'two')
33*8a7d6542SBram Moolenaar  assert_equal('two', '' ? 'one' : 'two')
34*8a7d6542SBram Moolenaar"  assert_equal('one', 0z ? 'one' : 'two')
35*8a7d6542SBram Moolenaar  assert_equal('two', [] ? 'one' : 'two')
36*8a7d6542SBram Moolenaar"  assert_equal('two', {} ? 'one' : 'two')
37*8a7d6542SBram Moolenaar  var = 0
38*8a7d6542SBram Moolenaar  assert_equal('two', var ? 'one' : 'two')
39*8a7d6542SBram Moolenaarenddef
40*8a7d6542SBram Moolenaar
41*8a7d6542SBram Moolenaarfunc Test_expr1_fails()
42*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1 ? 'one'", "Missing ':' after '?'")
43*8a7d6542SBram Moolenaar
44*8a7d6542SBram Moolenaar  let msg = "white space required before and after '?'"
45*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1? 'one' : 'two'", msg)
46*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1 ?'one' : 'two'", msg)
47*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1?'one' : 'two'", msg)
48*8a7d6542SBram Moolenaar
49*8a7d6542SBram Moolenaar  let msg = "white space required before and after ':'"
50*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1 ? 'one': 'two'", msg)
51*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1 ? 'one' :'two'", msg)
52*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1 ? 'one':'two'", msg)
53*8a7d6542SBram Moolenaarendfunc
54*8a7d6542SBram Moolenaar
55*8a7d6542SBram Moolenaar" TODO: define inside test function
56*8a7d6542SBram Moolenaardef Record(val: any): any
57*8a7d6542SBram Moolenaar  g:vals->add(val)
58*8a7d6542SBram Moolenaar  return val
59*8a7d6542SBram Moolenaarenddef
60*8a7d6542SBram Moolenaar
61*8a7d6542SBram Moolenaar" test ||
62*8a7d6542SBram Moolenaardef Test_expr2()
63*8a7d6542SBram Moolenaar  assert_equal(2, 2 || 0)
64*8a7d6542SBram Moolenaar  assert_equal(7, 0 || 0 || 7)
65*8a7d6542SBram Moolenaar  assert_equal(0, 0 || 0)
66*8a7d6542SBram Moolenaar  assert_equal('', 0 || '')
67*8a7d6542SBram Moolenaar
68*8a7d6542SBram Moolenaar  g:vals = []
69*8a7d6542SBram Moolenaar  assert_equal(3, Record(3) || Record(1))
70*8a7d6542SBram Moolenaar  assert_equal([3], g:vals)
71*8a7d6542SBram Moolenaar
72*8a7d6542SBram Moolenaar  g:vals = []
73*8a7d6542SBram Moolenaar  assert_equal(5, Record(0) || Record(5))
74*8a7d6542SBram Moolenaar  assert_equal([0, 5], g:vals)
75*8a7d6542SBram Moolenaar
76*8a7d6542SBram Moolenaar  g:vals = []
77*8a7d6542SBram Moolenaar  assert_equal(4, Record(0) || Record(4) || Record(0))
78*8a7d6542SBram Moolenaar  assert_equal([0, 4], g:vals)
79*8a7d6542SBram Moolenaar
80*8a7d6542SBram Moolenaar  g:vals = []
81*8a7d6542SBram Moolenaar  assert_equal(0, Record([]) || Record('') || Record(0))
82*8a7d6542SBram Moolenaar  assert_equal([[], '', 0], g:vals)
83*8a7d6542SBram Moolenaarenddef
84*8a7d6542SBram Moolenaar
85*8a7d6542SBram Moolenaarfunc Test_expr2_fails()
86*8a7d6542SBram Moolenaar  let msg = "white space required before and after '||'"
87*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1||2", msg)
88*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1 ||2", msg)
89*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1|| 2", msg)
90*8a7d6542SBram Moolenaarendfunc
91*8a7d6542SBram Moolenaar
92*8a7d6542SBram Moolenaar" test &&
93*8a7d6542SBram Moolenaardef Test_expr3()
94*8a7d6542SBram Moolenaar  assert_equal(0, 2 && 0)
95*8a7d6542SBram Moolenaar  assert_equal(0, 0 && 0 && 7)
96*8a7d6542SBram Moolenaar  assert_equal(7, 2 && 3 && 7)
97*8a7d6542SBram Moolenaar  assert_equal(0, 0 && 0)
98*8a7d6542SBram Moolenaar  assert_equal(0, 0 && '')
99*8a7d6542SBram Moolenaar  assert_equal('', 8 && '')
100*8a7d6542SBram Moolenaar
101*8a7d6542SBram Moolenaar  g:vals = []
102*8a7d6542SBram Moolenaar  assert_equal(1, Record(3) && Record(1))
103*8a7d6542SBram Moolenaar  assert_equal([3, 1], g:vals)
104*8a7d6542SBram Moolenaar
105*8a7d6542SBram Moolenaar  g:vals = []
106*8a7d6542SBram Moolenaar  assert_equal(0, Record(0) && Record(5))
107*8a7d6542SBram Moolenaar  assert_equal([0], g:vals)
108*8a7d6542SBram Moolenaar
109*8a7d6542SBram Moolenaar  g:vals = []
110*8a7d6542SBram Moolenaar  assert_equal(0, Record(0) && Record(4) && Record(0))
111*8a7d6542SBram Moolenaar  assert_equal([0], g:vals)
112*8a7d6542SBram Moolenaar
113*8a7d6542SBram Moolenaar  g:vals = []
114*8a7d6542SBram Moolenaar  assert_equal(0, Record(8) && Record(4) && Record(0))
115*8a7d6542SBram Moolenaar  assert_equal([8, 4, 0], g:vals)
116*8a7d6542SBram Moolenaar
117*8a7d6542SBram Moolenaar  g:vals = []
118*8a7d6542SBram Moolenaar  assert_equal(0, Record([1]) && Record('z') && Record(0))
119*8a7d6542SBram Moolenaar  assert_equal([[1], 'z', 0], g:vals)
120*8a7d6542SBram Moolenaarenddef
121*8a7d6542SBram Moolenaar
122*8a7d6542SBram Moolenaarfunc Test_expr3_fails()
123*8a7d6542SBram Moolenaar  let msg = "white space required before and after '&&'"
124*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1&&2", msg)
125*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1 &&2", msg)
126*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1&& 2", msg)
127*8a7d6542SBram Moolenaarendfunc
128*8a7d6542SBram Moolenaar
129*8a7d6542SBram Moolenaarlet atrue = v:true
130*8a7d6542SBram Moolenaarlet afalse = v:false
131*8a7d6542SBram Moolenaarlet anone = v:none
132*8a7d6542SBram Moolenaarlet anull = v:null
133*8a7d6542SBram Moolenaarlet anint = 10
134*8a7d6542SBram Moolenaarlet alsoint = 4
135*8a7d6542SBram Moolenaarif has('float')
136*8a7d6542SBram Moolenaar  let afloat = 0.1
137*8a7d6542SBram Moolenaarendif
138*8a7d6542SBram Moolenaarlet astring = 'asdf'
139*8a7d6542SBram Moolenaarlet ablob = 0z01ab
140*8a7d6542SBram Moolenaarlet alist = [2, 3, 4]
141*8a7d6542SBram Moolenaarlet adict = #{aaa: 2, bbb: 8}
142*8a7d6542SBram Moolenaar
143*8a7d6542SBram Moolenaar" test == comperator
144*8a7d6542SBram Moolenaardef Test_expr4_equal()
145*8a7d6542SBram Moolenaar  assert_equal(true, true == true)
146*8a7d6542SBram Moolenaar  assert_equal(false, true == false)
147*8a7d6542SBram Moolenaar  assert_equal(true, true == g:atrue)
148*8a7d6542SBram Moolenaar  assert_equal(false, g:atrue == false)
149*8a7d6542SBram Moolenaar
150*8a7d6542SBram Moolenaar  assert_equal(true, v:none == v:none)
151*8a7d6542SBram Moolenaar  assert_equal(false, v:none == v:null)
152*8a7d6542SBram Moolenaar  assert_equal(true, g:anone == v:none)
153*8a7d6542SBram Moolenaar  assert_equal(false, v:none == g:anull)
154*8a7d6542SBram Moolenaar
155*8a7d6542SBram Moolenaar  assert_equal(false, 2 == 0)
156*8a7d6542SBram Moolenaar  assert_equal(true, 61 == 61)
157*8a7d6542SBram Moolenaar  assert_equal(true, g:anint == 10)
158*8a7d6542SBram Moolenaar  assert_equal(false, 61 == g:anint)
159*8a7d6542SBram Moolenaar
160*8a7d6542SBram Moolenaar  if has('float')
161*8a7d6542SBram Moolenaar    assert_equal(true, 0.3 == 0.3)
162*8a7d6542SBram Moolenaar    assert_equal(false, 0.4 == 0.3)
163*8a7d6542SBram Moolenaar    assert_equal(true, 0.1 == g:afloat)
164*8a7d6542SBram Moolenaar    assert_equal(false, g:afloat == 0.3)
165*8a7d6542SBram Moolenaar
166*8a7d6542SBram Moolenaar    assert_equal(true, 3.0 == 3)
167*8a7d6542SBram Moolenaar    assert_equal(true, 3 == 3.0)
168*8a7d6542SBram Moolenaar    assert_equal(false, 3.1 == 3)
169*8a7d6542SBram Moolenaar    assert_equal(false, 3 == 3.1)
170*8a7d6542SBram Moolenaar  endif
171*8a7d6542SBram Moolenaar
172*8a7d6542SBram Moolenaar  assert_equal(true, 'abc' == 'abc')
173*8a7d6542SBram Moolenaar  assert_equal(false, 'xyz' == 'abc')
174*8a7d6542SBram Moolenaar  assert_equal(true, g:astring == 'asdf')
175*8a7d6542SBram Moolenaar  assert_equal(false, 'xyz' == g:astring)
176*8a7d6542SBram Moolenaar
177*8a7d6542SBram Moolenaar  assert_equal(false, 'abc' == 'ABC')
178*8a7d6542SBram Moolenaar  set ignorecase
179*8a7d6542SBram Moolenaar  assert_equal(false, 'abc' == 'ABC')
180*8a7d6542SBram Moolenaar  set noignorecase
181*8a7d6542SBram Moolenaar
182*8a7d6542SBram Moolenaar  assert_equal(true, 0z3f == 0z3f)
183*8a7d6542SBram Moolenaar  assert_equal(false, 0z3f == 0z4f)
184*8a7d6542SBram Moolenaar  assert_equal(true, g:ablob == 0z01ab)
185*8a7d6542SBram Moolenaar  assert_equal(false, 0z3f == g:ablob)
186*8a7d6542SBram Moolenaar
187*8a7d6542SBram Moolenaar  assert_equal(true, [1, 2, 3] == [1, 2, 3])
188*8a7d6542SBram Moolenaar  assert_equal(false, [1, 2, 3] == [2, 3, 1])
189*8a7d6542SBram Moolenaar  assert_equal(true, [2, 3, 4] == g:alist)
190*8a7d6542SBram Moolenaar  assert_equal(false, g:alist == [2, 3, 1])
191*8a7d6542SBram Moolenaar  assert_equal(false, [1, 2, 3] == [])
192*8a7d6542SBram Moolenaar  assert_equal(false, [1, 2, 3] == ['1', '2', '3'])
193*8a7d6542SBram Moolenaar
194*8a7d6542SBram Moolenaar  assert_equal(true, #{one: 1, two: 2} == #{one: 1, two: 2})
195*8a7d6542SBram Moolenaar  assert_equal(false, #{one: 1, two: 2} == #{one: 2, two: 2})
196*8a7d6542SBram Moolenaar  assert_equal(false, #{one: 1, two: 2} == #{two: 2})
197*8a7d6542SBram Moolenaar  assert_equal(false, #{one: 1, two: 2} == #{})
198*8a7d6542SBram Moolenaar  assert_equal(true, g:adict == #{bbb: 8, aaa: 2})
199*8a7d6542SBram Moolenaar  assert_equal(false, #{ccc: 9, aaa: 2} == g:adict)
200*8a7d6542SBram Moolenaar
201*8a7d6542SBram Moolenaar  assert_equal(true, function('Test_expr4_equal') == function('Test_expr4_equal'))
202*8a7d6542SBram Moolenaar  assert_equal(false, function('Test_expr4_equal') == function('Test_expr4_is'))
203*8a7d6542SBram Moolenaar
204*8a7d6542SBram Moolenaar  assert_equal(true, function('Test_expr4_equal', [123]) == function('Test_expr4_equal', [123]))
205*8a7d6542SBram Moolenaar  assert_equal(false, function('Test_expr4_equal', [123]) == function('Test_expr4_is', [123]))
206*8a7d6542SBram Moolenaar  assert_equal(false, function('Test_expr4_equal', [123]) == function('Test_expr4_equal', [999]))
207*8a7d6542SBram Moolenaarenddef
208*8a7d6542SBram Moolenaar
209*8a7d6542SBram Moolenaar" test != comperator
210*8a7d6542SBram Moolenaardef Test_expr4_notequal()
211*8a7d6542SBram Moolenaar  assert_equal(false, true != true)
212*8a7d6542SBram Moolenaar  assert_equal(true, true != false)
213*8a7d6542SBram Moolenaar  assert_equal(false, true != g:atrue)
214*8a7d6542SBram Moolenaar  assert_equal(true, g:atrue != false)
215*8a7d6542SBram Moolenaar
216*8a7d6542SBram Moolenaar  assert_equal(false, v:none != v:none)
217*8a7d6542SBram Moolenaar  assert_equal(true, v:none != v:null)
218*8a7d6542SBram Moolenaar  assert_equal(false, g:anone != v:none)
219*8a7d6542SBram Moolenaar  assert_equal(true, v:none != g:anull)
220*8a7d6542SBram Moolenaar
221*8a7d6542SBram Moolenaar  assert_equal(true, 2 != 0)
222*8a7d6542SBram Moolenaar  assert_equal(false, 55 != 55)
223*8a7d6542SBram Moolenaar  assert_equal(false, g:anint != 10)
224*8a7d6542SBram Moolenaar  assert_equal(true, 61 != g:anint)
225*8a7d6542SBram Moolenaar
226*8a7d6542SBram Moolenaar  if has('float')
227*8a7d6542SBram Moolenaar    assert_equal(false, 0.3 != 0.3)
228*8a7d6542SBram Moolenaar    assert_equal(true, 0.4 != 0.3)
229*8a7d6542SBram Moolenaar    assert_equal(false, 0.1 != g:afloat)
230*8a7d6542SBram Moolenaar    assert_equal(true, g:afloat != 0.3)
231*8a7d6542SBram Moolenaar
232*8a7d6542SBram Moolenaar    assert_equal(false, 3.0 != 3)
233*8a7d6542SBram Moolenaar    assert_equal(false, 3 != 3.0)
234*8a7d6542SBram Moolenaar    assert_equal(true, 3.1 != 3)
235*8a7d6542SBram Moolenaar    assert_equal(true, 3 != 3.1)
236*8a7d6542SBram Moolenaar  endif
237*8a7d6542SBram Moolenaar
238*8a7d6542SBram Moolenaar  assert_equal(false, 'abc' != 'abc')
239*8a7d6542SBram Moolenaar  assert_equal(true, 'xyz' != 'abc')
240*8a7d6542SBram Moolenaar  assert_equal(false, g:astring != 'asdf')
241*8a7d6542SBram Moolenaar  assert_equal(true, 'xyz' != g:astring)
242*8a7d6542SBram Moolenaar
243*8a7d6542SBram Moolenaar  assert_equal(true, 'abc' != 'ABC')
244*8a7d6542SBram Moolenaar  set ignorecase
245*8a7d6542SBram Moolenaar  assert_equal(true, 'abc' != 'ABC')
246*8a7d6542SBram Moolenaar  set noignorecase
247*8a7d6542SBram Moolenaar
248*8a7d6542SBram Moolenaar  assert_equal(false, 0z3f != 0z3f)
249*8a7d6542SBram Moolenaar  assert_equal(true, 0z3f != 0z4f)
250*8a7d6542SBram Moolenaar  assert_equal(false, g:ablob != 0z01ab)
251*8a7d6542SBram Moolenaar  assert_equal(true, 0z3f != g:ablob)
252*8a7d6542SBram Moolenaar
253*8a7d6542SBram Moolenaar  assert_equal(false, [1, 2, 3] != [1, 2, 3])
254*8a7d6542SBram Moolenaar  assert_equal(true, [1, 2, 3] != [2, 3, 1])
255*8a7d6542SBram Moolenaar  assert_equal(false, [2, 3, 4] != g:alist)
256*8a7d6542SBram Moolenaar  assert_equal(true, g:alist != [2, 3, 1])
257*8a7d6542SBram Moolenaar  assert_equal(true, [1, 2, 3] != [])
258*8a7d6542SBram Moolenaar  assert_equal(true, [1, 2, 3] != ['1', '2', '3'])
259*8a7d6542SBram Moolenaar
260*8a7d6542SBram Moolenaar  assert_equal(false, #{one: 1, two: 2} != #{one: 1, two: 2})
261*8a7d6542SBram Moolenaar  assert_equal(true, #{one: 1, two: 2} != #{one: 2, two: 2})
262*8a7d6542SBram Moolenaar  assert_equal(true, #{one: 1, two: 2} != #{two: 2})
263*8a7d6542SBram Moolenaar  assert_equal(true, #{one: 1, two: 2} != #{})
264*8a7d6542SBram Moolenaar  assert_equal(false, g:adict != #{bbb: 8, aaa: 2})
265*8a7d6542SBram Moolenaar  assert_equal(true, #{ccc: 9, aaa: 2} != g:adict)
266*8a7d6542SBram Moolenaar
267*8a7d6542SBram Moolenaar  assert_equal(false, function('Test_expr4_equal') != function('Test_expr4_equal'))
268*8a7d6542SBram Moolenaar  assert_equal(true, function('Test_expr4_equal') != function('Test_expr4_is'))
269*8a7d6542SBram Moolenaar
270*8a7d6542SBram Moolenaar  assert_equal(false, function('Test_expr4_equal', [123]) != function('Test_expr4_equal', [123]))
271*8a7d6542SBram Moolenaar  assert_equal(true, function('Test_expr4_equal', [123]) != function('Test_expr4_is', [123]))
272*8a7d6542SBram Moolenaar  assert_equal(true, function('Test_expr4_equal', [123]) != function('Test_expr4_equal', [999]))
273*8a7d6542SBram Moolenaarenddef
274*8a7d6542SBram Moolenaar
275*8a7d6542SBram Moolenaar" test > comperator
276*8a7d6542SBram Moolenaardef Test_expr4_greater()
277*8a7d6542SBram Moolenaar  assert_equal(true, 2 > 0)
278*8a7d6542SBram Moolenaar  assert_equal(true, 2 > 1)
279*8a7d6542SBram Moolenaar  assert_equal(false, 2 > 2)
280*8a7d6542SBram Moolenaar  assert_equal(false, 2 > 3)
281*8a7d6542SBram Moolenaarenddef
282*8a7d6542SBram Moolenaar
283*8a7d6542SBram Moolenaar" test >= comperator
284*8a7d6542SBram Moolenaardef Test_expr4_greaterequal()
285*8a7d6542SBram Moolenaar  assert_equal(true, 2 >= 0)
286*8a7d6542SBram Moolenaar  assert_equal(true, 2 >= 2)
287*8a7d6542SBram Moolenaar  assert_equal(false, 2 >= 3)
288*8a7d6542SBram Moolenaarenddef
289*8a7d6542SBram Moolenaar
290*8a7d6542SBram Moolenaar" test < comperator
291*8a7d6542SBram Moolenaardef Test_expr4_smaller()
292*8a7d6542SBram Moolenaar  assert_equal(false, 2 < 0)
293*8a7d6542SBram Moolenaar  assert_equal(false, 2 < 2)
294*8a7d6542SBram Moolenaar  assert_equal(true, 2 < 3)
295*8a7d6542SBram Moolenaarenddef
296*8a7d6542SBram Moolenaar
297*8a7d6542SBram Moolenaar" test <= comperator
298*8a7d6542SBram Moolenaardef Test_expr4_smallerequal()
299*8a7d6542SBram Moolenaar  assert_equal(false, 2 <= 0)
300*8a7d6542SBram Moolenaar  assert_equal(false, 2 <= 1)
301*8a7d6542SBram Moolenaar  assert_equal(true, 2 <= 2)
302*8a7d6542SBram Moolenaar  assert_equal(true, 2 <= 3)
303*8a7d6542SBram Moolenaarenddef
304*8a7d6542SBram Moolenaar
305*8a7d6542SBram Moolenaar" test =~ comperator
306*8a7d6542SBram Moolenaardef Test_expr4_match()
307*8a7d6542SBram Moolenaar  assert_equal(false, '2' =~ '0')
308*8a7d6542SBram Moolenaar  assert_equal(true, '2' =~ '[0-9]')
309*8a7d6542SBram Moolenaarenddef
310*8a7d6542SBram Moolenaar
311*8a7d6542SBram Moolenaar" test !~ comperator
312*8a7d6542SBram Moolenaardef Test_expr4_nomatch()
313*8a7d6542SBram Moolenaar  assert_equal(true, '2' !~ '0')
314*8a7d6542SBram Moolenaar  assert_equal(false, '2' !~ '[0-9]')
315*8a7d6542SBram Moolenaarenddef
316*8a7d6542SBram Moolenaar
317*8a7d6542SBram Moolenaar" test is comperator
318*8a7d6542SBram Moolenaardef Test_expr4_is()
319*8a7d6542SBram Moolenaar  let mylist = [2]
320*8a7d6542SBram Moolenaar  assert_equal(false, mylist is [2])
321*8a7d6542SBram Moolenaar  let other = mylist
322*8a7d6542SBram Moolenaar  assert_equal(true, mylist is other)
323*8a7d6542SBram Moolenaarenddef
324*8a7d6542SBram Moolenaar
325*8a7d6542SBram Moolenaar" test isnot comperator
326*8a7d6542SBram Moolenaardef Test_expr4_isnot()
327*8a7d6542SBram Moolenaar  let mylist = [2]
328*8a7d6542SBram Moolenaar  assert_equal(true, '2' isnot '0')
329*8a7d6542SBram Moolenaar  assert_equal(true, mylist isnot [2])
330*8a7d6542SBram Moolenaar  let other = mylist
331*8a7d6542SBram Moolenaar  assert_equal(false, mylist isnot other)
332*8a7d6542SBram Moolenaarenddef
333*8a7d6542SBram Moolenaar
334*8a7d6542SBram Moolenaardef RetVoid()
335*8a7d6542SBram Moolenaar  let x = 1
336*8a7d6542SBram Moolenaarenddef
337*8a7d6542SBram Moolenaar
338*8a7d6542SBram Moolenaarfunc Test_expr4_fails()
339*8a7d6542SBram Moolenaar  let msg = "white space required before and after '>'"
340*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1>2", msg)
341*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1 >2", msg)
342*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1> 2", msg)
343*8a7d6542SBram Moolenaar
344*8a7d6542SBram Moolenaar  let msg = "white space required before and after '=='"
345*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1==2", msg)
346*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1 ==2", msg)
347*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1== 2", msg)
348*8a7d6542SBram Moolenaar
349*8a7d6542SBram Moolenaar  let msg = "white space required before and after 'is'"
350*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = '1'is'2'", msg)
351*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = '1' is'2'", msg)
352*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = '1'is '2'", msg)
353*8a7d6542SBram Moolenaar
354*8a7d6542SBram Moolenaar  let msg = "white space required before and after 'isnot'"
355*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = '1'isnot'2'", msg)
356*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = '1' isnot'2'", msg)
357*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = '1'isnot '2'", msg)
358*8a7d6542SBram Moolenaar
359*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1 is# 2", 'E15:')
360*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1 is? 2", 'E15:')
361*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1 isnot# 2", 'E15:')
362*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1 isnot? 2", 'E15:')
363*8a7d6542SBram Moolenaar
364*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1 == '2'", 'Cannot compare number with string')
365*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = '1' == 2", 'Cannot compare string with number')
366*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1 == RetVoid()", 'Cannot use void value')
367*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = RetVoid() == 1", 'Cannot compare void with number')
368*8a7d6542SBram Moolenaar
369*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = true > false", 'Cannot compare bool with bool')
370*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = true >= false", 'Cannot compare bool with bool')
371*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = true < false", 'Cannot compare bool with bool')
372*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = true <= false", 'Cannot compare bool with bool')
373*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = true =~ false", 'Cannot compare bool with bool')
374*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = true !~ false", 'Cannot compare bool with bool')
375*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = true is false", 'Cannot use "is" with bool')
376*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = true isnot false", 'Cannot use "isnot" with bool')
377*8a7d6542SBram Moolenaar
378*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = v:none is v:null", 'Cannot use "is" with special')
379*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = v:none isnot v:null", 'Cannot use "isnot" with special')
380*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 123 is 123", 'Cannot use "is" with number')
381*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 123 isnot 123", 'Cannot use "isnot" with number')
382*8a7d6542SBram Moolenaar  if has('float')
383*8a7d6542SBram Moolenaar    call CheckDefFailure("let x = 1.3 is 1.3", 'Cannot use "is" with float')
384*8a7d6542SBram Moolenaar    call CheckDefFailure("let x = 1.3 isnot 1.3", 'Cannot use "isnot" with float')
385*8a7d6542SBram Moolenaar  endif
386*8a7d6542SBram Moolenaar
387*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 0za1 > 0z34", 'Cannot compare blob with blob')
388*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 0za1 >= 0z34", 'Cannot compare blob with blob')
389*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 0za1 < 0z34", 'Cannot compare blob with blob')
390*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 0za1 <= 0z34", 'Cannot compare blob with blob')
391*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 0za1 =~ 0z34", 'Cannot compare blob with blob')
392*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 0za1 !~ 0z34", 'Cannot compare blob with blob')
393*8a7d6542SBram Moolenaar
394*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = [13] > [88]", 'Cannot compare list with list')
395*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = [13] >= [88]", 'Cannot compare list with list')
396*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = [13] < [88]", 'Cannot compare list with list')
397*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = [13] <= [88]", 'Cannot compare list with list')
398*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = [13] =~ [88]", 'Cannot compare list with list')
399*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = [13] !~ [88]", 'Cannot compare list with list')
400*8a7d6542SBram Moolenaarendfunc
401*8a7d6542SBram Moolenaar
402*8a7d6542SBram Moolenaar" test addition, subtraction, concatenation
403*8a7d6542SBram Moolenaardef Test_expr5()
404*8a7d6542SBram Moolenaar  assert_equal(66, 60 + 6)
405*8a7d6542SBram Moolenaar  assert_equal(70, 60 + g:anint)
406*8a7d6542SBram Moolenaar  assert_equal(9, g:alsoint + 5)
407*8a7d6542SBram Moolenaar  assert_equal(14, g:alsoint + g:anint)
408*8a7d6542SBram Moolenaar
409*8a7d6542SBram Moolenaar  assert_equal(54, 60 - 6)
410*8a7d6542SBram Moolenaar  assert_equal(50, 60 - g:anint)
411*8a7d6542SBram Moolenaar  assert_equal(-1, g:alsoint - 5)
412*8a7d6542SBram Moolenaar  assert_equal(-6, g:alsoint - g:anint)
413*8a7d6542SBram Moolenaar
414*8a7d6542SBram Moolenaar  assert_equal('hello', 'hel' .. 'lo')
415*8a7d6542SBram Moolenaar  assert_equal('hello 123', 'hello ' .. 123)
416*8a7d6542SBram Moolenaar  assert_equal('123 hello', 123 .. ' hello')
417*8a7d6542SBram Moolenaar  assert_equal('123456', 123 .. 456)
418*8a7d6542SBram Moolenaarenddef
419*8a7d6542SBram Moolenaar
420*8a7d6542SBram Moolenaardef Test_expr5_float()
421*8a7d6542SBram Moolenaar  CheckFeature float
422*8a7d6542SBram Moolenaar  assert_equal(66.0, 60.0 + 6.0)
423*8a7d6542SBram Moolenaar  assert_equal(66.0, 60.0 + 6)
424*8a7d6542SBram Moolenaar  assert_equal(66.0, 60 + 6.0)
425*8a7d6542SBram Moolenaar  assert_equal(5.1, g:afloat + 5)
426*8a7d6542SBram Moolenaar  assert_equal(8.1, 8 + g:afloat)
427*8a7d6542SBram Moolenaar  assert_equal(10.1, g:anint + g:afloat)
428*8a7d6542SBram Moolenaar  assert_equal(10.1, g:afloat + g:anint)
429*8a7d6542SBram Moolenaar
430*8a7d6542SBram Moolenaar  assert_equal(54.0, 60.0 - 6.0)
431*8a7d6542SBram Moolenaar  assert_equal(54.0, 60.0 - 6)
432*8a7d6542SBram Moolenaar  assert_equal(54.0, 60 - 6.0)
433*8a7d6542SBram Moolenaar  assert_equal(-4.9, g:afloat - 5)
434*8a7d6542SBram Moolenaar  assert_equal(7.9, 8 - g:afloat)
435*8a7d6542SBram Moolenaar  assert_equal(9.9, g:anint - g:afloat)
436*8a7d6542SBram Moolenaar  assert_equal(-9.9, g:afloat - g:anint)
437*8a7d6542SBram Moolenaarenddef
438*8a7d6542SBram Moolenaar
439*8a7d6542SBram Moolenaarfunc Test_expr5_fails()
440*8a7d6542SBram Moolenaar  let msg = "white space required before and after '+'"
441*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1+2", msg)
442*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1 +2", msg)
443*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1+ 2", msg)
444*8a7d6542SBram Moolenaar
445*8a7d6542SBram Moolenaar  let msg = "white space required before and after '-'"
446*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1-2", msg)
447*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1 -2", msg)
448*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1- 2", msg)
449*8a7d6542SBram Moolenaar
450*8a7d6542SBram Moolenaar  let msg = "white space required before and after '..'"
451*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = '1'..'2'", msg)
452*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = '1' ..'2'", msg)
453*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = '1'.. '2'", msg)
454*8a7d6542SBram Moolenaarendfunc
455*8a7d6542SBram Moolenaar
456*8a7d6542SBram Moolenaar" test multiply, divide, modulo
457*8a7d6542SBram Moolenaardef Test_expr6()
458*8a7d6542SBram Moolenaar  assert_equal(36, 6 * 6)
459*8a7d6542SBram Moolenaar  assert_equal(24, 6 * g:alsoint)
460*8a7d6542SBram Moolenaar  assert_equal(24, g:alsoint * 6)
461*8a7d6542SBram Moolenaar  assert_equal(40, g:anint * g:alsoint)
462*8a7d6542SBram Moolenaar
463*8a7d6542SBram Moolenaar  assert_equal(10, 60 / 6)
464*8a7d6542SBram Moolenaar  assert_equal(6, 60 / g:anint)
465*8a7d6542SBram Moolenaar  assert_equal(1, g:anint / 6)
466*8a7d6542SBram Moolenaar  assert_equal(2, g:anint / g:alsoint)
467*8a7d6542SBram Moolenaar
468*8a7d6542SBram Moolenaar  assert_equal(5, 11 % 6)
469*8a7d6542SBram Moolenaar  assert_equal(4, g:anint % 6)
470*8a7d6542SBram Moolenaar  assert_equal(3, 13 % g:anint)
471*8a7d6542SBram Moolenaar  assert_equal(2, g:anint % g:alsoint)
472*8a7d6542SBram Moolenaar
473*8a7d6542SBram Moolenaar  assert_equal(4, 6 * 4 / 6)
474*8a7d6542SBram Moolenaarenddef
475*8a7d6542SBram Moolenaar
476*8a7d6542SBram Moolenaardef Test_expr6_float()
477*8a7d6542SBram Moolenaar  CheckFeature float
478*8a7d6542SBram Moolenaar
479*8a7d6542SBram Moolenaar  assert_equal(36.0, 6.0 * 6)
480*8a7d6542SBram Moolenaar  assert_equal(36.0, 6 * 6.0)
481*8a7d6542SBram Moolenaar  assert_equal(36.0, 6.0 * 6.0)
482*8a7d6542SBram Moolenaar  assert_equal(1.0, g:afloat * g:anint)
483*8a7d6542SBram Moolenaar
484*8a7d6542SBram Moolenaar  assert_equal(10.0, 60 / 6.0)
485*8a7d6542SBram Moolenaar  assert_equal(10.0, 60.0 / 6)
486*8a7d6542SBram Moolenaar  assert_equal(10.0, 60.0 / 6.0)
487*8a7d6542SBram Moolenaar  assert_equal(0.01, g:afloat / g:anint)
488*8a7d6542SBram Moolenaar
489*8a7d6542SBram Moolenaar  assert_equal(4.0, 6.0 * 4 / 6)
490*8a7d6542SBram Moolenaar  assert_equal(4.0, 6 * 4.0 / 6)
491*8a7d6542SBram Moolenaar  assert_equal(4.0, 6 * 4 / 6.0)
492*8a7d6542SBram Moolenaar  assert_equal(4.0, 6.0 * 4.0 / 6)
493*8a7d6542SBram Moolenaar  assert_equal(4.0, 6 * 4.0 / 6.0)
494*8a7d6542SBram Moolenaar  assert_equal(4.0, 6.0 * 4 / 6.0)
495*8a7d6542SBram Moolenaar  assert_equal(4.0, 6.0 * 4.0 / 6.0)
496*8a7d6542SBram Moolenaar
497*8a7d6542SBram Moolenaar  assert_equal(4.0, 6.0 * 4.0 / 6.0)
498*8a7d6542SBram Moolenaarenddef
499*8a7d6542SBram Moolenaar
500*8a7d6542SBram Moolenaarfunc Test_expr6_fails()
501*8a7d6542SBram Moolenaar  let msg = "white space required before and after '*'"
502*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1*2", msg)
503*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1 *2", msg)
504*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1* 2", msg)
505*8a7d6542SBram Moolenaar
506*8a7d6542SBram Moolenaar  let msg = "white space required before and after '/'"
507*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1/2", msg)
508*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1 /2", msg)
509*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1/ 2", msg)
510*8a7d6542SBram Moolenaar
511*8a7d6542SBram Moolenaar  let msg = "white space required before and after '%'"
512*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1%2", msg)
513*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1 %2", msg)
514*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1% 2", msg)
515*8a7d6542SBram Moolenaar
516*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = '1' * '2'", 'E1036:')
517*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = '1' / '2'", 'E1036:')
518*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = '1' % '2'", 'E1035:')
519*8a7d6542SBram Moolenaar
520*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 0z01 * 0z12", 'E1036:')
521*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 0z01 / 0z12", 'E1036:')
522*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 0z01 % 0z12", 'E1035:')
523*8a7d6542SBram Moolenaar
524*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = [1] * [2]", 'E1036:')
525*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = [1] / [2]", 'E1036:')
526*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = [1] % [2]", 'E1035:')
527*8a7d6542SBram Moolenaar
528*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = #{one: 1} * #{two: 2}", 'E1036:')
529*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = #{one: 1} / #{two: 2}", 'E1036:')
530*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = #{one: 1} % #{two: 2}", 'E1035:')
531*8a7d6542SBram Moolenaar
532*8a7d6542SBram Moolenaarendfunc
533*8a7d6542SBram Moolenaar
534*8a7d6542SBram Moolenaarfunc Test_expr6_float_fails()
535*8a7d6542SBram Moolenaar  CheckFeature float
536*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = 1.0 % 2", 'E1035:')
537*8a7d6542SBram Moolenaarendfunc
538*8a7d6542SBram Moolenaar
539*8a7d6542SBram Moolenaar" define here to use old style parsing
540*8a7d6542SBram Moolenaarif has('float')
541*8a7d6542SBram Moolenaar  let g:float_zero = 0.0
542*8a7d6542SBram Moolenaar  let g:float_neg = -9.8
543*8a7d6542SBram Moolenaar  let g:float_big = 9.9e99
544*8a7d6542SBram Moolenaarendif
545*8a7d6542SBram Moolenaarlet g:blob_empty = 0z
546*8a7d6542SBram Moolenaarlet g:blob_one = 0z01
547*8a7d6542SBram Moolenaarlet g:blob_long = 0z0102.0304
548*8a7d6542SBram Moolenaar
549*8a7d6542SBram Moolenaarlet g:string_empty = ''
550*8a7d6542SBram Moolenaarlet g:string_short = 'x'
551*8a7d6542SBram Moolenaarlet g:string_long = 'abcdefghijklm'
552*8a7d6542SBram Moolenaarlet g:string_special = "ab\ncd\ref\ekk"
553*8a7d6542SBram Moolenaar
554*8a7d6542SBram Moolenaarlet g:special_true = v:true
555*8a7d6542SBram Moolenaarlet g:special_false = v:false
556*8a7d6542SBram Moolenaarlet g:special_null = v:null
557*8a7d6542SBram Moolenaarlet g:special_none = v:none
558*8a7d6542SBram Moolenaar
559*8a7d6542SBram Moolenaarlet g:list_empty = []
560*8a7d6542SBram Moolenaarlet g:list_mixed = [1, 'b', v:false]
561*8a7d6542SBram Moolenaar
562*8a7d6542SBram Moolenaarlet g:dict_empty = {}
563*8a7d6542SBram Moolenaarlet g:dict_one = #{one: 1}
564*8a7d6542SBram Moolenaar
565*8a7d6542SBram Moolenaarlet $TESTVAR = 'testvar'
566*8a7d6542SBram Moolenaar
567*8a7d6542SBram Moolenaarlet @a = 'register a'
568*8a7d6542SBram Moolenaar
569*8a7d6542SBram Moolenaar" test low level expression
570*8a7d6542SBram Moolenaardef Test_expr7_number()
571*8a7d6542SBram Moolenaar  " number constant
572*8a7d6542SBram Moolenaar  assert_equal(0, 0)
573*8a7d6542SBram Moolenaar  assert_equal(654, 0654)
574*8a7d6542SBram Moolenaar
575*8a7d6542SBram Moolenaar  assert_equal(6, 0x6)
576*8a7d6542SBram Moolenaar  assert_equal(15, 0xf)
577*8a7d6542SBram Moolenaar  assert_equal(255, 0xff)
578*8a7d6542SBram Moolenaarenddef
579*8a7d6542SBram Moolenaar
580*8a7d6542SBram Moolenaardef Test_expr7_float()
581*8a7d6542SBram Moolenaar  " float constant
582*8a7d6542SBram Moolenaar  if has('float')
583*8a7d6542SBram Moolenaar    assert_equal(g:float_zero, .0)
584*8a7d6542SBram Moolenaar    assert_equal(g:float_zero, 0.0)
585*8a7d6542SBram Moolenaar    assert_equal(g:float_neg, -9.8)
586*8a7d6542SBram Moolenaar    assert_equal(g:float_big, 9.9e99)
587*8a7d6542SBram Moolenaar  endif
588*8a7d6542SBram Moolenaarenddef
589*8a7d6542SBram Moolenaar
590*8a7d6542SBram Moolenaardef Test_expr7_blob()
591*8a7d6542SBram Moolenaar  " blob constant
592*8a7d6542SBram Moolenaar  assert_equal(g:blob_empty, 0z)
593*8a7d6542SBram Moolenaar  assert_equal(g:blob_one, 0z01)
594*8a7d6542SBram Moolenaar  assert_equal(g:blob_long, 0z0102.0304)
595*8a7d6542SBram Moolenaarenddef
596*8a7d6542SBram Moolenaar
597*8a7d6542SBram Moolenaardef Test_expr7_string()
598*8a7d6542SBram Moolenaar  " string constant
599*8a7d6542SBram Moolenaar  assert_equal(g:string_empty, '')
600*8a7d6542SBram Moolenaar  assert_equal(g:string_empty, "")
601*8a7d6542SBram Moolenaar  assert_equal(g:string_short, 'x')
602*8a7d6542SBram Moolenaar  assert_equal(g:string_short, "x")
603*8a7d6542SBram Moolenaar  assert_equal(g:string_long, 'abcdefghijklm')
604*8a7d6542SBram Moolenaar  assert_equal(g:string_long, "abcdefghijklm")
605*8a7d6542SBram Moolenaar  assert_equal(g:string_special, "ab\ncd\ref\ekk")
606*8a7d6542SBram Moolenaarenddef
607*8a7d6542SBram Moolenaar
608*8a7d6542SBram Moolenaardef Test_expr7_special()
609*8a7d6542SBram Moolenaar  " special constant
610*8a7d6542SBram Moolenaar  assert_equal(g:special_true, true)
611*8a7d6542SBram Moolenaar  assert_equal(g:special_false, false)
612*8a7d6542SBram Moolenaar  assert_equal(g:special_null, v:null)
613*8a7d6542SBram Moolenaar  assert_equal(g:special_none, v:none)
614*8a7d6542SBram Moolenaarenddef
615*8a7d6542SBram Moolenaar
616*8a7d6542SBram Moolenaardef Test_expr7_list()
617*8a7d6542SBram Moolenaar  " list
618*8a7d6542SBram Moolenaar  assert_equal(g:list_empty, [])
619*8a7d6542SBram Moolenaar  assert_equal(g:list_empty, [  ])
620*8a7d6542SBram Moolenaar  assert_equal(g:list_mixed, [1, 'b', false])
621*8a7d6542SBram Moolenaarenddef
622*8a7d6542SBram Moolenaar
623*8a7d6542SBram Moolenaardef Test_expr7_lambda()
624*8a7d6542SBram Moolenaar  " lambda
625*8a7d6542SBram Moolenaar  let La = { -> 'result'}
626*8a7d6542SBram Moolenaar  assert_equal('result', La())
627*8a7d6542SBram Moolenaar  assert_equal([1, 3, 5], [1, 2, 3]->map({key, val -> key + val}))
628*8a7d6542SBram Moolenaarenddef
629*8a7d6542SBram Moolenaar
630*8a7d6542SBram Moolenaardef Test_expr7_dict()
631*8a7d6542SBram Moolenaar  " dictionary
632*8a7d6542SBram Moolenaar  assert_equal(g:dict_empty, {})
633*8a7d6542SBram Moolenaar  assert_equal(g:dict_empty, {  })
634*8a7d6542SBram Moolenaar  assert_equal(g:dict_one, {'one': 1})
635*8a7d6542SBram Moolenaar  let key = 'one'
636*8a7d6542SBram Moolenaar  let val = 1
637*8a7d6542SBram Moolenaar  assert_equal(g:dict_one, {key: val})
638*8a7d6542SBram Moolenaarenddef
639*8a7d6542SBram Moolenaar
640*8a7d6542SBram Moolenaardef Test_expr7_option()
641*8a7d6542SBram Moolenaar  " option
642*8a7d6542SBram Moolenaar  set ts=11
643*8a7d6542SBram Moolenaar  assert_equal(11, &ts)
644*8a7d6542SBram Moolenaar  set ts=8
645*8a7d6542SBram Moolenaar  set grepprg=some\ text
646*8a7d6542SBram Moolenaar  assert_equal('some text', &grepprg)
647*8a7d6542SBram Moolenaar  set grepprg&
648*8a7d6542SBram Moolenaarenddef
649*8a7d6542SBram Moolenaar
650*8a7d6542SBram Moolenaardef Test_expr7_environment()
651*8a7d6542SBram Moolenaar  " environment variable
652*8a7d6542SBram Moolenaar  assert_equal('testvar', $TESTVAR)
653*8a7d6542SBram Moolenaar  assert_equal('', $ASDF_ASD_XXX)
654*8a7d6542SBram Moolenaarenddef
655*8a7d6542SBram Moolenaar
656*8a7d6542SBram Moolenaardef Test_expr7_register()
657*8a7d6542SBram Moolenaar  " register
658*8a7d6542SBram Moolenaar  assert_equal('register a', @a)
659*8a7d6542SBram Moolenaarenddef
660*8a7d6542SBram Moolenaar
661*8a7d6542SBram Moolenaardef Test_expr7_parens()
662*8a7d6542SBram Moolenaar  " (expr)
663*8a7d6542SBram Moolenaar  assert_equal(4, (6 * 4) / 6)
664*8a7d6542SBram Moolenaar  assert_equal(0, 6 * ( 4 / 6 ))
665*8a7d6542SBram Moolenaar
666*8a7d6542SBram Moolenaar  assert_equal(6, +6)
667*8a7d6542SBram Moolenaar  assert_equal(-6, -6)
668*8a7d6542SBram Moolenaar  assert_equal(6, --6)
669*8a7d6542SBram Moolenaar  assert_equal(6, -+-6)
670*8a7d6542SBram Moolenaar  assert_equal(-6, ---6)
671*8a7d6542SBram Moolenaarenddef
672*8a7d6542SBram Moolenaar
673*8a7d6542SBram Moolenaardef Test_expr7_not()
674*8a7d6542SBram Moolenaar  assert_equal(true, !'')
675*8a7d6542SBram Moolenaar  assert_equal(true, ![])
676*8a7d6542SBram Moolenaar  assert_equal(false, !'asdf')
677*8a7d6542SBram Moolenaar  assert_equal(false, ![2])
678*8a7d6542SBram Moolenaar  assert_equal(true, !!'asdf')
679*8a7d6542SBram Moolenaar  assert_equal(true, !![2])
680*8a7d6542SBram Moolenaarenddef
681*8a7d6542SBram Moolenaar
682*8a7d6542SBram Moolenaarfunc Test_expr7_fails()
683*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = (12", "E110:")
684*8a7d6542SBram Moolenaar
685*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = -'xx'", "E1030:")
686*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = +'xx'", "E1030:")
687*8a7d6542SBram Moolenaar
688*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = @", "E1002:")
689*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = @<", "E354:")
690*8a7d6542SBram Moolenaarendfunc
691*8a7d6542SBram Moolenaar
692*8a7d6542SBram Moolenaarlet g:Funcrefs = [function('add')]
693*8a7d6542SBram Moolenaar
694*8a7d6542SBram Moolenaarfunc CallMe(arg)
695*8a7d6542SBram Moolenaar  return a:arg
696*8a7d6542SBram Moolenaarendfunc
697*8a7d6542SBram Moolenaar
698*8a7d6542SBram Moolenaardef Test_expr7_trailing()
699*8a7d6542SBram Moolenaar  " user function call
700*8a7d6542SBram Moolenaar  assert_equal(123, CallMe(123))
701*8a7d6542SBram Moolenaar  assert_equal('nothing', CallMe('nothing'))
702*8a7d6542SBram Moolenaar
703*8a7d6542SBram Moolenaar  " partial call
704*8a7d6542SBram Moolenaar  let Part = function('CallMe')
705*8a7d6542SBram Moolenaar  assert_equal('yes', Part('yes'))
706*8a7d6542SBram Moolenaar
707*8a7d6542SBram Moolenaar  " funcref call, using list index
708*8a7d6542SBram Moolenaar  let l = []
709*8a7d6542SBram Moolenaar  g:Funcrefs[0](l, 2)
710*8a7d6542SBram Moolenaar  assert_equal([2], l)
711*8a7d6542SBram Moolenaar
712*8a7d6542SBram Moolenaar  " method call
713*8a7d6542SBram Moolenaar  l = [2, 5, 6]
714*8a7d6542SBram Moolenaar  l->map({k, v -> k + v})
715*8a7d6542SBram Moolenaar  assert_equal([2, 6, 8], l)
716*8a7d6542SBram Moolenaar
717*8a7d6542SBram Moolenaar  " lambda method call
718*8a7d6542SBram Moolenaar  l = [2, 5]
719*8a7d6542SBram Moolenaar  l->{l -> add(l, 8)}()
720*8a7d6542SBram Moolenaar  assert_equal([2, 5, 8], l)
721*8a7d6542SBram Moolenaar
722*8a7d6542SBram Moolenaar  " dict member
723*8a7d6542SBram Moolenaar  let d = #{key: 123}
724*8a7d6542SBram Moolenaar  assert_equal(123, d.key)
725*8a7d6542SBram Moolenaarenddef
726*8a7d6542SBram Moolenaar
727*8a7d6542SBram Moolenaarfunc Test_expr7_trailing_fails()
728*8a7d6542SBram Moolenaar  call CheckDefFailureList(['let l = [2]', 'l->{l -> add(l, 8)}'], 'E107')
729*8a7d6542SBram Moolenaarendfunc
730*8a7d6542SBram Moolenaar
731*8a7d6542SBram Moolenaarfunc Test_expr_fails()
732*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = '1'is2", 'E488:')
733*8a7d6542SBram Moolenaar  call CheckDefFailure("let x = '1'isnot2", 'E488:')
734*8a7d6542SBram Moolenaarendfunc
735