comparison src/testdir/test_vim9_expr.vim @ 27457:4c16acb2525f v8.2.4257

patch 8.2.4257: Vim9: finding global function without g: prefix inconsistent Commit: https://github.com/vim/vim/commit/62aec93bfdb9e1b40d03a6d2e8e9511f8b1bdb2d Author: Bram Moolenaar <Bram@vim.org> Date: Sat Jan 29 21:45:34 2022 +0000 patch 8.2.4257: Vim9: finding global function without g: prefix inconsistent Problem: Vim9: finding global function without g: prefix but not finding global variable is inconsistent. Solution: Require using g: for a global function. Change the vim9.vim script into a Vim9 script with exports. Fix that import in legacy script does not work.
author Bram Moolenaar <Bram@vim.org>
date Sat, 29 Jan 2022 23:00:05 +0100
parents d4f254d02d7c
children a14c4d3e3260
comparison
equal deleted inserted replaced
27456:a8e2d91995ce 27457:4c16acb2525f
1 " Tests for Vim9 script expressions 1 " Tests for Vim9 script expressions
2 2
3 source check.vim 3 source check.vim
4 source vim9.vim 4 import './vim9.vim' as v9
5 5
6 let g:cond = v:false 6 let g:cond = v:false
7 def FuncOne(arg: number): string 7 def FuncOne(arg: number): string
8 return 'yes' 8 return 'yes'
9 enddef 9 enddef
64 var X = FuncOne 64 var X = FuncOne
65 var Y = FuncTwo 65 var Y = FuncTwo
66 var Z = g:cond ? FuncOne : FuncTwo 66 var Z = g:cond ? FuncOne : FuncTwo
67 assert_equal(123, Z(3)) 67 assert_equal(123, Z(3))
68 END 68 END
69 CheckDefAndScriptSuccess(lines) 69 v9.CheckDefAndScriptSuccess(lines)
70 enddef 70 enddef
71 71
72 def Test_expr1_trinary_vimscript() 72 def Test_expr1_trinary_vimscript()
73 # check line continuation 73 # check line continuation
74 var lines =<< trim END 74 var lines =<< trim END
75 var name = 1 75 var name = 1
76 ? 'yes' 76 ? 'yes'
77 : 'no' 77 : 'no'
78 assert_equal('yes', name) 78 assert_equal('yes', name)
79 END 79 END
80 CheckDefAndScriptSuccess(lines) 80 v9.CheckDefAndScriptSuccess(lines)
81 81
82 lines =<< trim END 82 lines =<< trim END
83 var name = v:false 83 var name = v:false
84 ? 'yes' 84 ? 'yes'
85 : 'no' 85 : 'no'
86 assert_equal('no', name) 86 assert_equal('no', name)
87 END 87 END
88 CheckDefAndScriptSuccess(lines) 88 v9.CheckDefAndScriptSuccess(lines)
89 89
90 lines =<< trim END 90 lines =<< trim END
91 var name = v:false ? 91 var name = v:false ?
92 'yes' : 92 'yes' :
93 'no' 93 'no'
94 assert_equal('no', name) 94 assert_equal('no', name)
95 END 95 END
96 CheckDefAndScriptSuccess(lines) 96 v9.CheckDefAndScriptSuccess(lines)
97 97
98 lines =<< trim END 98 lines =<< trim END
99 var name = v:false ? # comment 99 var name = v:false ? # comment
100 'yes' : 100 'yes' :
101 # comment 101 # comment
102 'no' # comment 102 'no' # comment
103 assert_equal('no', name) 103 assert_equal('no', name)
104 END 104 END
105 CheckDefAndScriptSuccess(lines) 105 v9.CheckDefAndScriptSuccess(lines)
106 106
107 # check white space 107 # check white space
108 lines =<< trim END 108 lines =<< trim END
109 var name = v:true?1:2 109 var name = v:true?1:2
110 END 110 END
111 CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''?'' at "?1:2"', 1) 111 v9.CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''?'' at "?1:2"', 1)
112 112
113 lines =<< trim END 113 lines =<< trim END
114 var name = v:true? 1 : 2 114 var name = v:true? 1 : 2
115 END 115 END
116 CheckDefAndScriptFailure(lines, 'E1004:', 1) 116 v9.CheckDefAndScriptFailure(lines, 'E1004:', 1)
117 117
118 lines =<< trim END 118 lines =<< trim END
119 var name = v:true ?1 : 2 119 var name = v:true ?1 : 2
120 END 120 END
121 CheckDefAndScriptFailure(lines, 'E1004:', 1) 121 v9.CheckDefAndScriptFailure(lines, 'E1004:', 1)
122 122
123 lines =<< trim END 123 lines =<< trim END
124 var name = v:true ? 1: 2 124 var name = v:true ? 1: 2
125 END 125 END
126 CheckDefAndScriptFailure(lines, 'E1004: White space required before and after '':'' at ": 2"', 1) 126 v9.CheckDefAndScriptFailure(lines, 'E1004: White space required before and after '':'' at ": 2"', 1)
127 127
128 lines =<< trim END 128 lines =<< trim END
129 var name = v:true ? 1 :2 129 var name = v:true ? 1 :2
130 END 130 END
131 CheckDefAndScriptFailure(lines, 'E1004:', 1) 131 v9.CheckDefAndScriptFailure(lines, 'E1004:', 1)
132 132
133 lines =<< trim END 133 lines =<< trim END
134 var name = 'x' ? 1 : 2 134 var name = 'x' ? 1 : 2
135 END 135 END
136 CheckDefAndScriptFailure(lines, 'E1135:', 1) 136 v9.CheckDefAndScriptFailure(lines, 'E1135:', 1)
137 137
138 lines =<< trim END 138 lines =<< trim END
139 var name = [] ? 1 : 2 139 var name = [] ? 1 : 2
140 END 140 END
141 CheckDefExecAndScriptFailure(lines, 'E745:', 1) 141 v9.CheckDefExecAndScriptFailure(lines, 'E745:', 1)
142 142
143 lines =<< trim END 143 lines =<< trim END
144 var name = {} ? 1 : 2 144 var name = {} ? 1 : 2
145 END 145 END
146 CheckDefExecAndScriptFailure(lines, 'E728:', 1) 146 v9.CheckDefExecAndScriptFailure(lines, 'E728:', 1)
147 147
148 # check after failure eval_flags is reset 148 # check after failure eval_flags is reset
149 lines =<< trim END 149 lines =<< trim END
150 try 150 try
151 eval('0 ? 1: 2') 151 eval('0 ? 1: 2')
152 catch 152 catch
153 endtry 153 endtry
154 assert_equal(v:true, eval(string(v:true))) 154 assert_equal(v:true, eval(string(v:true)))
155 END 155 END
156 CheckDefAndScriptSuccess(lines) 156 v9.CheckDefAndScriptSuccess(lines)
157 157
158 lines =<< trim END 158 lines =<< trim END
159 try 159 try
160 eval('0 ? 1 :2') 160 eval('0 ? 1 :2')
161 catch 161 catch
162 endtry 162 endtry
163 assert_equal(v:true, eval(string(v:true))) 163 assert_equal(v:true, eval(string(v:true)))
164 END 164 END
165 CheckDefAndScriptSuccess(lines) 165 v9.CheckDefAndScriptSuccess(lines)
166 enddef 166 enddef
167 167
168 func Test_expr1_trinary_fails() 168 func Test_expr1_trinary_fails()
169 call CheckDefAndScriptFailure(["var x = 1 ? 'one'"], "Missing ':' after '?'", 1) 169 call v9.CheckDefAndScriptFailure(["var x = 1 ? 'one'"], "Missing ':' after '?'", 1)
170 170
171 let msg = "White space required before and after '?'" 171 let msg = "White space required before and after '?'"
172 call CheckDefAndScriptFailure(["var x = 1? 'one' : 'two'"], msg, 1) 172 call v9.CheckDefAndScriptFailure(["var x = 1? 'one' : 'two'"], msg, 1)
173 call CheckDefAndScriptFailure(["var x = 1 ?'one' : 'two'"], msg, 1) 173 call v9.CheckDefAndScriptFailure(["var x = 1 ?'one' : 'two'"], msg, 1)
174 call CheckDefAndScriptFailure(["var x = 1?'one' : 'two'"], msg, 1) 174 call v9.CheckDefAndScriptFailure(["var x = 1?'one' : 'two'"], msg, 1)
175 let lines =<< trim END 175 let lines =<< trim END
176 var x = 1 176 var x = 1
177 ?'one' : 'two' 177 ?'one' : 'two'
178 # comment 178 # comment
179 END 179 END
180 call CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''?'' at "?''one'' : ''two''"', 2) 180 call v9.CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''?'' at "?''one'' : ''two''"', 2)
181 181
182 let msg = "White space required before and after ':'" 182 let msg = "White space required before and after ':'"
183 call CheckDefAndScriptFailure(["var x = 1 ? 'one': 'two'"], msg, 1) 183 call v9.CheckDefAndScriptFailure(["var x = 1 ? 'one': 'two'"], msg, 1)
184 call CheckDefAndScriptFailure(["var x = 1 ? 'one' :'two'"], msg, 1) 184 call v9.CheckDefAndScriptFailure(["var x = 1 ? 'one' :'two'"], msg, 1)
185 call CheckDefAndScriptFailure(["var x = 1 ? 'one':'two'"], msg, 1) 185 call v9.CheckDefAndScriptFailure(["var x = 1 ? 'one':'two'"], msg, 1)
186 let lines =<< trim END 186 let lines =<< trim END
187 var x = 1 ? 'one' 187 var x = 1 ? 'one'
188 :'two' 188 :'two'
189 # Comment 189 # Comment
190 END 190 END
191 call CheckDefAndScriptFailure(lines, 'E1004: White space required before and after '':'' at ":''two''"', 2) 191 call v9.CheckDefAndScriptFailure(lines, 'E1004: White space required before and after '':'' at ":''two''"', 2)
192 192
193 call CheckDefAndScriptFailure(["var x = 'x' ? 'one' : 'two'"], 'E1135:', 1) 193 call v9.CheckDefAndScriptFailure(["var x = 'x' ? 'one' : 'two'"], 'E1135:', 1)
194 call CheckDefAndScriptFailure(["var x = 0z1234 ? 'one' : 'two'"], 'E974:', 1) 194 call v9.CheckDefAndScriptFailure(["var x = 0z1234 ? 'one' : 'two'"], 'E974:', 1)
195 call CheckDefExecAndScriptFailure(["var x = [] ? 'one' : 'two'"], 'E745:', 1) 195 call v9.CheckDefExecAndScriptFailure(["var x = [] ? 'one' : 'two'"], 'E745:', 1)
196 call CheckDefExecAndScriptFailure(["var x = {} ? 'one' : 'two'"], 'E728:', 1) 196 call v9.CheckDefExecAndScriptFailure(["var x = {} ? 'one' : 'two'"], 'E728:', 1)
197 197
198 call CheckDefExecFailure(["var x = false ? "], 'E1097:', 3) 198 call v9.CheckDefExecFailure(["var x = false ? "], 'E1097:', 3)
199 call CheckScriptFailure(['vim9script', "var x = false ? "], 'E15:', 2) 199 call v9.CheckScriptFailure(['vim9script', "var x = false ? "], 'E15:', 2)
200 call CheckDefExecFailure(["var x = false ? 'one' : "], 'E1097:', 3) 200 call v9.CheckDefExecFailure(["var x = false ? 'one' : "], 'E1097:', 3)
201 call CheckScriptFailure(['vim9script', "var x = false ? 'one' : "], 'E15:', 2) 201 call v9.CheckScriptFailure(['vim9script', "var x = false ? 'one' : "], 'E15:', 2)
202 202
203 call CheckDefExecAndScriptFailure(["var x = true ? xxx : 'foo'"], ['E1001:', 'E121:'], 1) 203 call v9.CheckDefExecAndScriptFailure(["var x = true ? xxx : 'foo'"], ['E1001:', 'E121:'], 1)
204 call CheckDefExecAndScriptFailure(["var x = false ? 'foo' : xxx"], ['E1001:', 'E121:'], 1) 204 call v9.CheckDefExecAndScriptFailure(["var x = false ? 'foo' : xxx"], ['E1001:', 'E121:'], 1)
205 205
206 if has('float') 206 if has('float')
207 call CheckDefAndScriptFailure(["var x = 0.1 ? 'one' : 'two'"], 'E805:', 1) 207 call v9.CheckDefAndScriptFailure(["var x = 0.1 ? 'one' : 'two'"], 'E805:', 1)
208 endif 208 endif
209 209
210 " missing argument detected even when common type is used 210 " missing argument detected even when common type is used
211 call CheckDefAndScriptFailure([ 211 call v9.CheckDefAndScriptFailure([
212 \ 'var X = FuncOne', 212 \ 'var X = FuncOne',
213 \ 'var Y = FuncTwo', 213 \ 'var Y = FuncTwo',
214 \ 'var Z = g:cond ? FuncOne : FuncTwo', 214 \ 'var Z = g:cond ? FuncOne : FuncTwo',
215 \ 'Z()'], 'E119:', 4) 215 \ 'Z()'], 'E119:', 4)
216 endfunc 216 endfunc
233 assert_equal(456, {} ?? 456) 233 assert_equal(456, {} ?? 456)
234 if has('float') 234 if has('float')
235 assert_equal(456, 0.0 ?? 456) 235 assert_equal(456, 0.0 ?? 456)
236 endif 236 endif
237 END 237 END
238 CheckDefAndScriptSuccess(lines) 238 v9.CheckDefAndScriptSuccess(lines)
239 239
240 var msg = "White space required before and after '??'" 240 var msg = "White space required before and after '??'"
241 call CheckDefAndScriptFailure(["var x = 1?? 'one' : 'two'"], msg, 1) 241 call v9.CheckDefAndScriptFailure(["var x = 1?? 'one' : 'two'"], msg, 1)
242 call CheckDefAndScriptFailure(["var x = 1 ??'one' : 'two'"], msg, 1) 242 call v9.CheckDefAndScriptFailure(["var x = 1 ??'one' : 'two'"], msg, 1)
243 call CheckDefAndScriptFailure(["var x = 1??'one' : 'two'"], msg, 1) 243 call v9.CheckDefAndScriptFailure(["var x = 1??'one' : 'two'"], msg, 1)
244 lines =<< trim END 244 lines =<< trim END
245 var x = 1 245 var x = 1
246 ??'one' : 'two' 246 ??'one' : 'two'
247 #comment 247 #comment
248 END 248 END
249 CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''??'' at "??''one'' : ''two''"', 2) 249 v9.CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''??'' at "??''one'' : ''two''"', 2)
250 enddef 250 enddef
251 251
252 def Record(val: any): any 252 def g:Record(val: any): any
253 g:vals->add(val) 253 g:vals->add(val)
254 return val 254 return val
255 enddef 255 enddef
256 256
257 " test || 257 " test ||
268 assert_equal(false, 0 268 assert_equal(false, 0
269 || 0) 269 || 0)
270 assert_equal(false, 0 || false) 270 assert_equal(false, 0 || false)
271 271
272 g:vals = [] 272 g:vals = []
273 assert_equal(true, Record(1) || Record(3)) 273 assert_equal(true, g:Record(1) || g:Record(3))
274 assert_equal([1], g:vals) 274 assert_equal([1], g:vals)
275 275
276 g:vals = [] 276 g:vals = []
277 assert_equal(true, Record(0) || Record(1)) 277 assert_equal(true, g:Record(0) || g:Record(1))
278 assert_equal([0, 1], g:vals) 278 assert_equal([0, 1], g:vals)
279 279
280 g:vals = [] 280 g:vals = []
281 assert_equal(true, Record(0) || Record(true)) 281 assert_equal(true, g:Record(0) || g:Record(true))
282 assert_equal([0, true], g:vals) 282 assert_equal([0, true], g:vals)
283 283
284 g:vals = [] 284 g:vals = []
285 assert_equal(true, Record(0) 285 assert_equal(true, g:Record(0)
286 || Record(1) 286 || g:Record(1)
287 || Record(0)) 287 || g:Record(0))
288 assert_equal([0, 1], g:vals) 288 assert_equal([0, 1], g:vals)
289 289
290 g:vals = [] 290 g:vals = []
291 assert_equal(true, Record(0) 291 assert_equal(true, g:Record(0)
292 || Record(true) 292 || g:Record(true)
293 || Record(0)) 293 || g:Record(0))
294 assert_equal([0, true], g:vals) 294 assert_equal([0, true], g:vals)
295 295
296 g:vals = [] 296 g:vals = []
297 assert_equal(true, Record(true) || Record(false)) 297 assert_equal(true, g:Record(true) || g:Record(false))
298 assert_equal([true], g:vals) 298 assert_equal([true], g:vals)
299 299
300 g:vals = [] 300 g:vals = []
301 assert_equal(false, Record(0) || Record(false) || Record(0)) 301 assert_equal(false, g:Record(0) || g:Record(false) || g:Record(0))
302 assert_equal([0, false, 0], g:vals) 302 assert_equal([0, false, 0], g:vals)
303 303
304 g:vals = [] 304 g:vals = []
305 var x = 1 305 var x = 1
306 if x || true 306 if x || true
313 if true || x 313 if true || x
314 g:vals = [1] 314 g:vals = [1]
315 endif 315 endif
316 assert_equal([1], g:vals) 316 assert_equal([1], g:vals)
317 END 317 END
318 CheckDefAndScriptSuccess(lines) 318 v9.CheckDefAndScriptSuccess(lines)
319 enddef 319 enddef
320 320
321 def Test_expr2_vimscript() 321 def Test_expr2_vimscript()
322 # check line continuation 322 # check line continuation
323 var lines =<< trim END 323 var lines =<< trim END
324 var name = 0 324 var name = 0
325 || 1 325 || 1
326 assert_equal(true, name) 326 assert_equal(true, name)
327 END 327 END
328 CheckDefAndScriptSuccess(lines) 328 v9.CheckDefAndScriptSuccess(lines)
329 329
330 lines =<< trim END 330 lines =<< trim END
331 var name = v:false 331 var name = v:false
332 || v:true 332 || v:true
333 || v:false 333 || v:false
334 assert_equal(v:true, name) 334 assert_equal(v:true, name)
335 END 335 END
336 CheckDefAndScriptSuccess(lines) 336 v9.CheckDefAndScriptSuccess(lines)
337 337
338 lines =<< trim END 338 lines =<< trim END
339 var name = v:false || 339 var name = v:false ||
340 v:true || 340 v:true ||
341 v:false 341 v:false
342 assert_equal(v:true, name) 342 assert_equal(v:true, name)
343 END 343 END
344 CheckDefAndScriptSuccess(lines) 344 v9.CheckDefAndScriptSuccess(lines)
345 345
346 lines =<< trim END 346 lines =<< trim END
347 var name = v:false || # comment 347 var name = v:false || # comment
348 # comment 348 # comment
349 v:true || 349 v:true ||
350 # comment 350 # comment
351 v:false # comment 351 v:false # comment
352 assert_equal(v:true, name) 352 assert_equal(v:true, name)
353 END 353 END
354 CheckDefAndScriptSuccess(lines) 354 v9.CheckDefAndScriptSuccess(lines)
355 355
356 # check white space 356 # check white space
357 lines =<< trim END 357 lines =<< trim END
358 var name = v:true||v:true 358 var name = v:true||v:true
359 END 359 END
360 CheckDefExecAndScriptFailure(lines, 'E1004: White space required before and after ''||'' at "||v:true"', 1) 360 v9.CheckDefExecAndScriptFailure(lines, 'E1004: White space required before and after ''||'' at "||v:true"', 1)
361 361
362 lines =<< trim END 362 lines =<< trim END
363 var name = v:true ||v:true 363 var name = v:true ||v:true
364 END 364 END
365 CheckDefAndScriptFailure(lines, 'E1004:', 1) 365 v9.CheckDefAndScriptFailure(lines, 'E1004:', 1)
366 366
367 lines =<< trim END 367 lines =<< trim END
368 var name = v:true|| v:true 368 var name = v:true|| v:true
369 END 369 END
370 CheckDefAndScriptFailure(lines, 'E1004:', 1) 370 v9.CheckDefAndScriptFailure(lines, 'E1004:', 1)
371 enddef 371 enddef
372 372
373 def Test_expr2_fails() 373 def Test_expr2_fails()
374 var msg = "White space required before and after '||'" 374 var msg = "White space required before and after '||'"
375 call CheckDefAndScriptFailure(["var x = 1||0"], msg, 1) 375 v9.CheckDefAndScriptFailure(["var x = 1||0"], msg, 1)
376 call CheckDefAndScriptFailure(["var x = 1 ||0"], msg, 1) 376 v9.CheckDefAndScriptFailure(["var x = 1 ||0"], msg, 1)
377 call CheckDefAndScriptFailure(["var x = 1|| 0"], msg, 1) 377 v9.CheckDefAndScriptFailure(["var x = 1|| 0"], msg, 1)
378 378
379 call CheckDefFailure(["var x = false || "], 'E1097:', 3) 379 v9.CheckDefFailure(["var x = false || "], 'E1097:', 3)
380 call CheckScriptFailure(['vim9script', "var x = false || "], 'E15:', 2) 380 v9.CheckScriptFailure(['vim9script', "var x = false || "], 'E15:', 2)
381 381
382 # script does not fail, the second expression is skipped 382 # script does not fail, the second expression is skipped
383 call CheckDefFailure(["var x = 1 || xxx"], 'E1001:', 1) 383 v9.CheckDefFailure(["var x = 1 || xxx"], 'E1001:', 1)
384 384
385 call CheckDefAndScriptFailure(["var x = [] || false"], ['E1012:', 'E745:'], 1) 385 v9.CheckDefAndScriptFailure(["var x = [] || false"], ['E1012:', 'E745:'], 1)
386 386
387 call CheckDefAndScriptFailure(["if 'yes' || 0", 'echo 0', 'endif'], ['E1012: Type mismatch; expected bool but got string', 'E1135: Using a String as a Bool'], 1) 387 v9.CheckDefAndScriptFailure(["if 'yes' || 0", 'echo 0', 'endif'], ['E1012: Type mismatch; expected bool but got string', 'E1135: Using a String as a Bool'], 1)
388 388
389 call CheckDefAndScriptFailure(["var x = 3 || false"], ['E1012:', 'E1023:'], 1) 389 v9.CheckDefAndScriptFailure(["var x = 3 || false"], ['E1012:', 'E1023:'], 1)
390 call CheckDefAndScriptFailure(["var x = false || 3"], ['E1012:', 'E1023:'], 1) 390 v9.CheckDefAndScriptFailure(["var x = false || 3"], ['E1012:', 'E1023:'], 1)
391 391
392 call CheckDefAndScriptFailure(["if 3"], 'E1023:', 1) 392 v9.CheckDefAndScriptFailure(["if 3"], 'E1023:', 1)
393 call CheckDefExecAndScriptFailure(['var x = 3', 'if x', 'endif'], 'E1023:', 2) 393 v9.CheckDefExecAndScriptFailure(['var x = 3', 'if x', 'endif'], 'E1023:', 2)
394 394
395 call CheckDefAndScriptFailure(["var x = [] || false"], ['E1012: Type mismatch; expected bool but got list<unknown>', 'E745:'], 1) 395 v9.CheckDefAndScriptFailure(["var x = [] || false"], ['E1012: Type mismatch; expected bool but got list<unknown>', 'E745:'], 1)
396 396
397 var lines =<< trim END 397 var lines =<< trim END
398 vim9script 398 vim9script
399 echo false 399 echo false
400 ||true 400 ||true
401 # comment 401 # comment
402 END 402 END
403 CheckScriptFailure(lines, 'E1004: White space required before and after ''||'' at "||true"', 3) 403 v9.CheckScriptFailure(lines, 'E1004: White space required before and after ''||'' at "||true"', 3)
404 404
405 lines =<< trim END 405 lines =<< trim END
406 var x = false 406 var x = false
407 || false 407 || false
408 || a.b 408 || a.b
409 END 409 END
410 CheckDefFailure(lines, 'E1001:', 3) 410 v9.CheckDefFailure(lines, 'E1001:', 3)
411 enddef 411 enddef
412 412
413 " test && 413 " test &&
414 def Test_expr3() 414 def Test_expr3()
415 var lines =<< trim END 415 var lines =<< trim END
423 assert_equal(false, 0 && 0) 423 assert_equal(false, 0 && 0)
424 assert_equal(false, 0 && false) 424 assert_equal(false, 0 && false)
425 assert_equal(true, 1 && true) 425 assert_equal(true, 1 && true)
426 426
427 g:vals = [] 427 g:vals = []
428 assert_equal(true, Record(true) && Record(1)) 428 assert_equal(true, g:Record(true) && g:Record(1))
429 assert_equal([true, 1], g:vals) 429 assert_equal([true, 1], g:vals)
430 430
431 g:vals = [] 431 g:vals = []
432 assert_equal(true, Record(1) && Record(true)) 432 assert_equal(true, g:Record(1) && g:Record(true))
433 assert_equal([1, true], g:vals) 433 assert_equal([1, true], g:vals)
434 434
435 g:vals = [] 435 g:vals = []
436 assert_equal(false, Record(0) && Record(1)) 436 assert_equal(false, g:Record(0) && g:Record(1))
437 assert_equal([0], g:vals) 437 assert_equal([0], g:vals)
438 438
439 g:vals = [] 439 g:vals = []
440 assert_equal(false, Record(0) && Record(1) && Record(0)) 440 assert_equal(false, g:Record(0) && g:Record(1) && g:Record(0))
441 assert_equal([0], g:vals) 441 assert_equal([0], g:vals)
442 442
443 g:vals = [] 443 g:vals = []
444 assert_equal(false, Record(0) && Record(4) && Record(0)) 444 assert_equal(false, g:Record(0) && g:Record(4) && g:Record(0))
445 assert_equal([0], g:vals) 445 assert_equal([0], g:vals)
446 446
447 g:vals = [] 447 g:vals = []
448 assert_equal(false, Record(1) && Record(true) && Record(0)) 448 assert_equal(false, g:Record(1) && g:Record(true) && g:Record(0))
449 assert_equal([1, true, 0], g:vals) 449 assert_equal([1, true, 0], g:vals)
450 END 450 END
451 CheckDefAndScriptSuccess(lines) 451 v9.CheckDefAndScriptSuccess(lines)
452 enddef 452 enddef
453 453
454 def Test_expr3_vimscript() 454 def Test_expr3_vimscript()
455 # check line continuation 455 # check line continuation
456 var lines =<< trim END 456 var lines =<< trim END
457 var name = 0 457 var name = 0
458 && 1 458 && 1
459 assert_equal(false, name) 459 assert_equal(false, name)
460 END 460 END
461 CheckDefAndScriptSuccess(lines) 461 v9.CheckDefAndScriptSuccess(lines)
462 462
463 lines =<< trim END 463 lines =<< trim END
464 var name = v:true 464 var name = v:true
465 && v:true 465 && v:true
466 && v:true 466 && v:true
467 assert_equal(v:true, name) 467 assert_equal(v:true, name)
468 END 468 END
469 CheckDefAndScriptSuccess(lines) 469 v9.CheckDefAndScriptSuccess(lines)
470 470
471 lines =<< trim END 471 lines =<< trim END
472 var name = v:true && 472 var name = v:true &&
473 v:true && 473 v:true &&
474 v:true 474 v:true
475 assert_equal(v:true, name) 475 assert_equal(v:true, name)
476 END 476 END
477 CheckDefAndScriptSuccess(lines) 477 v9.CheckDefAndScriptSuccess(lines)
478 478
479 lines =<< trim END 479 lines =<< trim END
480 var name = v:true && # comment 480 var name = v:true && # comment
481 # comment 481 # comment
482 v:true && 482 v:true &&
483 # comment 483 # comment
484 v:true 484 v:true
485 assert_equal(v:true, name) 485 assert_equal(v:true, name)
486 END 486 END
487 CheckDefAndScriptSuccess(lines) 487 v9.CheckDefAndScriptSuccess(lines)
488 488
489 # check white space 489 # check white space
490 lines =<< trim END 490 lines =<< trim END
491 var name = v:true&&v:true 491 var name = v:true&&v:true
492 END 492 END
493 CheckDefAndScriptFailure(lines, 'E1004:', 1) 493 v9.CheckDefAndScriptFailure(lines, 'E1004:', 1)
494 494
495 lines =<< trim END 495 lines =<< trim END
496 var name = v:true &&v:true 496 var name = v:true &&v:true
497 END 497 END
498 CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''&&'' at "&&v:true"', 1) 498 v9.CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''&&'' at "&&v:true"', 1)
499 499
500 lines =<< trim END 500 lines =<< trim END
501 var name = v:true&& v:true 501 var name = v:true&& v:true
502 END 502 END
503 CheckDefAndScriptFailure(lines, 'E1004:', 1) 503 v9.CheckDefAndScriptFailure(lines, 'E1004:', 1)
504 enddef 504 enddef
505 505
506 def Test_expr3_fails() 506 def Test_expr3_fails()
507 var msg = "White space required before and after '&&'" 507 var msg = "White space required before and after '&&'"
508 CheckDefAndScriptFailure(["var x = 1&&0"], msg, 1) 508 v9.CheckDefAndScriptFailure(["var x = 1&&0"], msg, 1)
509 CheckDefAndScriptFailure(["var x = 1 &&0"], msg, 1) 509 v9.CheckDefAndScriptFailure(["var x = 1 &&0"], msg, 1)
510 CheckDefAndScriptFailure(["var x = 1&& 0"], msg, 1) 510 v9.CheckDefAndScriptFailure(["var x = 1&& 0"], msg, 1)
511 var lines =<< trim END 511 var lines =<< trim END
512 var x = 1 512 var x = 1
513 &&0 513 &&0
514 # comment 514 # comment
515 END 515 END
516 CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''&&'' at "&&0"', 2) 516 v9.CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''&&'' at "&&0"', 2)
517 517
518 g:vals = [] 518 g:vals = []
519 CheckDefAndScriptFailure(["if 'yes' && 0", 'echo 0', 'endif'], ['E1012: Type mismatch; expected bool but got string', 'E1135: Using a String as a Bool'], 1) 519 v9.CheckDefAndScriptFailure(["if 'yes' && 0", 'echo 0', 'endif'], ['E1012: Type mismatch; expected bool but got string', 'E1135: Using a String as a Bool'], 1)
520 520
521 CheckDefExecAndScriptFailure(['assert_equal(false, Record(1) && Record(4) && Record(0))'], 'E1023: Using a Number as a Bool: 4', 1) 521 v9.CheckDefExecAndScriptFailure(['assert_equal(false, g:Record(1) && g:Record(4) && g:Record(0))'], 'E1023: Using a Number as a Bool: 4', 1)
522 522
523 lines =<< trim END 523 lines =<< trim END
524 if 3 524 if 3
525 && true 525 && true
526 endif 526 endif
527 END 527 END
528 CheckDefAndScriptFailure(lines, ['E1012:', 'E1023:'], 1) 528 v9.CheckDefAndScriptFailure(lines, ['E1012:', 'E1023:'], 1)
529 529
530 lines =<< trim END 530 lines =<< trim END
531 if true 531 if true
532 && 3 532 && 3
533 endif 533 endif
534 END 534 END
535 CheckDefAndScriptFailure(lines, ['E1012:', 'E1023:'], 2) 535 v9.CheckDefAndScriptFailure(lines, ['E1012:', 'E1023:'], 2)
536 536
537 lines =<< trim END 537 lines =<< trim END
538 if 'yes' 538 if 'yes'
539 && true 539 && true
540 endif 540 endif
541 END 541 END
542 CheckDefAndScriptFailure(lines, ['E1012:', 'E1135: Using a String as a Bool'], 1) 542 v9.CheckDefAndScriptFailure(lines, ['E1012:', 'E1135: Using a String as a Bool'], 1)
543 enddef 543 enddef
544 544
545 " global variables to use for tests with the "any" type 545 " global variables to use for tests with the "any" type
546 let atrue = v:true 546 let atrue = v:true
547 let afalse = v:false 547 let afalse = v:false
661 OneFunc = function('len') 661 OneFunc = function('len')
662 TwoFunc = function('len') 662 TwoFunc = function('len')
663 assert_equal(true, OneFunc('abc') == TwoFunc('123')) 663 assert_equal(true, OneFunc('abc') == TwoFunc('123'))
664 endif 664 endif
665 END 665 END
666 CheckDefAndScriptSuccess(lines) 666 v9.CheckDefAndScriptSuccess(lines)
667 667
668 CheckDefAndScriptFailure(["var x = 'a' == xxx"], ['E1001:', 'E121:'], 1) 668 v9.CheckDefAndScriptFailure(["var x = 'a' == xxx"], ['E1001:', 'E121:'], 1)
669 CheckDefFailure(["var x = 'a' == "], 'E1097:', 3) 669 v9.CheckDefFailure(["var x = 'a' == "], 'E1097:', 3)
670 CheckScriptFailure(['vim9script', "var x = 'a' == "], 'E15:', 2) 670 v9.CheckScriptFailure(['vim9script', "var x = 'a' == "], 'E15:', 2)
671 671
672 CheckDefExecAndScriptFailure(['var items: any', 'eval 1 + 1', 'eval 2 + 2', 'if items == []', 'endif'], ['E691:', 'E1072:'], 4) 672 v9.CheckDefExecAndScriptFailure(['var items: any', 'eval 1 + 1', 'eval 2 + 2', 'if items == []', 'endif'], ['E691:', 'E1072:'], 4)
673 673
674 CheckDefExecAndScriptFailure(['var x: any = "a"', 'echo x == true'], 'E1072: Cannot compare string with bool', 2) 674 v9.CheckDefExecAndScriptFailure(['var x: any = "a"', 'echo x == true'], 'E1072: Cannot compare string with bool', 2)
675 CheckDefExecAndScriptFailure(["var x: any = true", 'echo x == ""'], 'E1072: Cannot compare bool with string', 2) 675 v9.CheckDefExecAndScriptFailure(["var x: any = true", 'echo x == ""'], 'E1072: Cannot compare bool with string', 2)
676 CheckDefExecAndScriptFailure(["var x: any = 99", 'echo x == true'], ['E1138', 'E1072:'], 2) 676 v9.CheckDefExecAndScriptFailure(["var x: any = 99", 'echo x == true'], ['E1138', 'E1072:'], 2)
677 CheckDefExecAndScriptFailure(["var x: any = 'a'", 'echo x == 99'], ['E1030:', 'E1072:'], 2) 677 v9.CheckDefExecAndScriptFailure(["var x: any = 'a'", 'echo x == 99'], ['E1030:', 'E1072:'], 2)
678 678
679 lines =<< trim END 679 lines =<< trim END
680 vim9script 680 vim9script
681 var n: any = 2 681 var n: any = 2
682 def Compare() 682 def Compare()
684 g:notReached = false 684 g:notReached = false
685 enddef 685 enddef
686 g:notReached = true 686 g:notReached = true
687 Compare() 687 Compare()
688 END 688 END
689 CheckScriptFailure(lines, 'E1030: Using a String as a Number: "3"') 689 v9.CheckScriptFailure(lines, 'E1030: Using a String as a Number: "3"')
690 assert_true(g:notReached) 690 assert_true(g:notReached)
691 691
692 if has('float') 692 if has('float')
693 lines =<< trim END 693 lines =<< trim END
694 vim9script 694 vim9script
698 g:notReached = false 698 g:notReached = false
699 enddef 699 enddef
700 g:notReached = true 700 g:notReached = true
701 Compare() 701 Compare()
702 END 702 END
703 CheckScriptFailure(lines, 'E892: Using a String as a Float') 703 v9.CheckScriptFailure(lines, 'E892: Using a String as a Float')
704 assert_true(g:notReached) 704 assert_true(g:notReached)
705 endif 705 endif
706 706
707 unlet g:notReached 707 unlet g:notReached
708 enddef 708 enddef
709 709
710 def Test_expr4_wrong_type() 710 def Test_expr4_wrong_type()
711 for op in ['>', '>=', '<', '<=', '=~', '!~'] 711 for op in ['>', '>=', '<', '<=', '=~', '!~']
712 CheckDefExecAndScriptFailure([ 712 v9.CheckDefExecAndScriptFailure([
713 "var a: any = 'a'", 713 "var a: any = 'a'",
714 'var b: any = true', 714 'var b: any = true',
715 'echo a ' .. op .. ' b'], 'E1072:', 3) 715 'echo a ' .. op .. ' b'], 'E1072:', 3)
716 endfor 716 endfor
717 for op in ['>', '>=', '<', '<='] 717 for op in ['>', '>=', '<', '<=']
718 CheckDefExecAndScriptFailure([ 718 v9.CheckDefExecAndScriptFailure([
719 "var n: any = 2", 719 "var n: any = 2",
720 'echo n ' .. op .. ' "3"'], ['E1030:', 'E1072:'], 2) 720 'echo n ' .. op .. ' "3"'], ['E1030:', 'E1072:'], 2)
721 endfor 721 endfor
722 for op in ['=~', '!~'] 722 for op in ['=~', '!~']
723 CheckDefExecAndScriptFailure([ 723 v9.CheckDefExecAndScriptFailure([
724 "var n: any = 2", 724 "var n: any = 2",
725 'echo n ' .. op .. ' "3"'], 'E1072:', 2) 725 'echo n ' .. op .. ' "3"'], 'E1072:', 2)
726 endfor 726 endfor
727 727
728 CheckDefAndScriptFailure([ 728 v9.CheckDefAndScriptFailure([
729 'echo v:none == true'], 'E1072:', 1) 729 'echo v:none == true'], 'E1072:', 1)
730 CheckDefAndScriptFailure([ 730 v9.CheckDefAndScriptFailure([
731 'echo false >= true'], 'E1072:', 1) 731 'echo false >= true'], 'E1072:', 1)
732 CheckDefExecAndScriptFailure([ 732 v9.CheckDefExecAndScriptFailure([
733 "var n: any = v:none", 733 "var n: any = v:none",
734 'echo n == true'], 'E1072:', 2) 734 'echo n == true'], 'E1072:', 2)
735 CheckDefExecAndScriptFailure([ 735 v9.CheckDefExecAndScriptFailure([
736 "var n: any = v:none", 736 "var n: any = v:none",
737 'echo n < true'], 'E1072:', 2) 737 'echo n < true'], 'E1072:', 2)
738 enddef 738 enddef
739 739
740 " test != comperator 740 " test != comperator
817 817
818 assert_equal(false, function('g:Test_expr4_equal', [123]) != function('g:Test_expr4_equal', [123])) 818 assert_equal(false, function('g:Test_expr4_equal', [123]) != function('g:Test_expr4_equal', [123]))
819 assert_equal(true, function('g:Test_expr4_equal', [123]) != function('g:Test_expr4_is', [123])) 819 assert_equal(true, function('g:Test_expr4_equal', [123]) != function('g:Test_expr4_is', [123]))
820 assert_equal(true, function('g:Test_expr4_equal', [123]) != function('g:Test_expr4_equal', [999])) 820 assert_equal(true, function('g:Test_expr4_equal', [123]) != function('g:Test_expr4_equal', [999]))
821 END 821 END
822 CheckDefAndScriptSuccess(lines) 822 v9.CheckDefAndScriptSuccess(lines)
823 enddef 823 enddef
824 824
825 " test > comperator 825 " test > comperator
826 def Test_expr4_greater() 826 def Test_expr4_greater()
827 var lines =<< trim END 827 var lines =<< trim END
843 assert_true(ff > 1.0) 843 assert_true(ff > 1.0)
844 assert_false(ff > 2.0) 844 assert_false(ff > 2.0)
845 assert_false(ff > 3.0) 845 assert_false(ff > 3.0)
846 endif 846 endif
847 END 847 END
848 CheckDefAndScriptSuccess(lines) 848 v9.CheckDefAndScriptSuccess(lines)
849 enddef 849 enddef
850 850
851 " test >= comperator 851 " test >= comperator
852 def Test_expr4_greaterequal() 852 def Test_expr4_greaterequal()
853 var lines =<< trim END 853 var lines =<< trim END
864 assert_true(ff >= 0.0) 864 assert_true(ff >= 0.0)
865 assert_true(ff >= 2.0) 865 assert_true(ff >= 2.0)
866 assert_false(ff >= 3.0) 866 assert_false(ff >= 3.0)
867 endif 867 endif
868 END 868 END
869 CheckDefAndScriptSuccess(lines) 869 v9.CheckDefAndScriptSuccess(lines)
870 enddef 870 enddef
871 871
872 " test < comperator 872 " test < comperator
873 def Test_expr4_smaller() 873 def Test_expr4_smaller()
874 var lines =<< trim END 874 var lines =<< trim END
886 assert_false(ff < 0.0) 886 assert_false(ff < 0.0)
887 assert_false(ff < 2.0) 887 assert_false(ff < 2.0)
888 assert_true(ff < 3.0) 888 assert_true(ff < 3.0)
889 endif 889 endif
890 END 890 END
891 CheckDefAndScriptSuccess(lines) 891 v9.CheckDefAndScriptSuccess(lines)
892 enddef 892 enddef
893 893
894 " test <= comperator 894 " test <= comperator
895 def Test_expr4_smallerequal() 895 def Test_expr4_smallerequal()
896 var lines =<< trim END 896 var lines =<< trim END
911 assert_false(ff <= 1.0) 911 assert_false(ff <= 1.0)
912 assert_true(ff <= 2.0) 912 assert_true(ff <= 2.0)
913 assert_true(ff <= 3.0) 913 assert_true(ff <= 3.0)
914 endif 914 endif
915 END 915 END
916 CheckDefAndScriptSuccess(lines) 916 v9.CheckDefAndScriptSuccess(lines)
917 enddef 917 enddef
918 918
919 " test =~ comperator 919 " test =~ comperator
920 def Test_expr4_match() 920 def Test_expr4_match()
921 var lines =<< trim END 921 var lines =<< trim END
928 assert_equal(false, 'abc' =~ 'ABC') 928 assert_equal(false, 'abc' =~ 'ABC')
929 assert_equal(false, 'abc' =~# 'ABC') 929 assert_equal(false, 'abc' =~# 'ABC')
930 assert_equal(true, 'abc' =~? 'ABC') 930 assert_equal(true, 'abc' =~? 'ABC')
931 set noignorecase 931 set noignorecase
932 END 932 END
933 CheckDefAndScriptSuccess(lines) 933 v9.CheckDefAndScriptSuccess(lines)
934 enddef 934 enddef
935 935
936 " test !~ comperator 936 " test !~ comperator
937 def Test_expr4_nomatch() 937 def Test_expr4_nomatch()
938 var lines =<< trim END 938 var lines =<< trim END
940 assert_equal(true, '' 940 assert_equal(true, ''
941 !~ '0') 941 !~ '0')
942 assert_equal(false, '2' !~ 942 assert_equal(false, '2' !~
943 '[0-9]') 943 '[0-9]')
944 END 944 END
945 CheckDefAndScriptSuccess(lines) 945 v9.CheckDefAndScriptSuccess(lines)
946 enddef 946 enddef
947 947
948 " test is comperator 948 " test is comperator
949 def Test_expr4_is() 949 def Test_expr4_is()
950 var lines =<< trim END 950 var lines =<< trim END
958 assert_false(myblob 958 assert_false(myblob
959 is 0z1234) 959 is 0z1234)
960 var otherblob = myblob 960 var otherblob = myblob
961 assert_true(myblob is otherblob) 961 assert_true(myblob is otherblob)
962 END 962 END
963 CheckDefAndScriptSuccess(lines) 963 v9.CheckDefAndScriptSuccess(lines)
964 enddef 964 enddef
965 965
966 " test isnot comperator 966 " test isnot comperator
967 def Test_expr4_isnot() 967 def Test_expr4_isnot()
968 var lines =<< trim END 968 var lines =<< trim END
977 assert_true(myblob 977 assert_true(myblob
978 isnot 0z1234) 978 isnot 0z1234)
979 var otherblob = myblob 979 var otherblob = myblob
980 assert_false(myblob isnot otherblob) 980 assert_false(myblob isnot otherblob)
981 END 981 END
982 CheckDefAndScriptSuccess(lines) 982 v9.CheckDefAndScriptSuccess(lines)
983 enddef 983 enddef
984 984
985 def RetVoid() 985 def g:RetVoid()
986 var x = 1 986 var x = 1
987 enddef 987 enddef
988 988
989 def Test_expr4_vim9script() 989 def Test_expr4_vim9script()
990 # check line continuation 990 # check line continuation
991 var lines =<< trim END 991 var lines =<< trim END
992 var name = 0 992 var name = 0
993 < 1 993 < 1
994 assert_equal(true, name) 994 assert_equal(true, name)
995 END 995 END
996 CheckDefAndScriptSuccess(lines) 996 v9.CheckDefAndScriptSuccess(lines)
997 997
998 lines =<< trim END 998 lines =<< trim END
999 var name = 123 999 var name = 123
1000 # comment 1000 # comment
1001 != 123 1001 != 123
1002 assert_equal(false, name) 1002 assert_equal(false, name)
1003 END 1003 END
1004 CheckDefAndScriptSuccess(lines) 1004 v9.CheckDefAndScriptSuccess(lines)
1005 1005
1006 lines =<< trim END 1006 lines =<< trim END
1007 var name = 123 == 1007 var name = 123 ==
1008 123 1008 123
1009 assert_equal(true, name) 1009 assert_equal(true, name)
1010 END 1010 END
1011 CheckDefAndScriptSuccess(lines) 1011 v9.CheckDefAndScriptSuccess(lines)
1012 1012
1013 lines =<< trim END 1013 lines =<< trim END
1014 var list = [1, 2, 3] 1014 var list = [1, 2, 3]
1015 var name = list 1015 var name = list
1016 is list 1016 is list
1017 assert_equal(true, name) 1017 assert_equal(true, name)
1018 END 1018 END
1019 CheckDefAndScriptSuccess(lines) 1019 v9.CheckDefAndScriptSuccess(lines)
1020 1020
1021 lines =<< trim END 1021 lines =<< trim END
1022 var list = [1, 2, 3] 1022 var list = [1, 2, 3]
1023 var name = list # comment 1023 var name = list # comment
1024 # comment 1024 # comment
1025 is list 1025 is list
1026 assert_equal(true, name) 1026 assert_equal(true, name)
1027 END 1027 END
1028 CheckDefAndScriptSuccess(lines) 1028 v9.CheckDefAndScriptSuccess(lines)
1029 1029
1030 lines =<< trim END 1030 lines =<< trim END
1031 var myblob = 0z1234 1031 var myblob = 0z1234
1032 var name = myblob 1032 var name = myblob
1033 isnot 0z11 1033 isnot 0z11
1034 assert_equal(true, name) 1034 assert_equal(true, name)
1035 END 1035 END
1036 CheckDefAndScriptSuccess(lines) 1036 v9.CheckDefAndScriptSuccess(lines)
1037 1037
1038 # spot check mismatching types 1038 # spot check mismatching types
1039 lines =<< trim END 1039 lines =<< trim END
1040 echo '' == 0 1040 echo '' == 0
1041 END 1041 END
1042 CheckDefAndScriptFailure(lines, 'E1072:', 1) 1042 v9.CheckDefAndScriptFailure(lines, 'E1072:', 1)
1043 1043
1044 lines =<< trim END 1044 lines =<< trim END
1045 echo v:true > v:false 1045 echo v:true > v:false
1046 END 1046 END
1047 CheckDefAndScriptFailure(lines, 'Cannot compare bool with bool', 1) 1047 v9.CheckDefAndScriptFailure(lines, 'Cannot compare bool with bool', 1)
1048 1048
1049 lines =<< trim END 1049 lines =<< trim END
1050 echo 123 is 123 1050 echo 123 is 123
1051 END 1051 END
1052 CheckDefAndScriptFailure(lines, 'Cannot use "is" with number', 1) 1052 v9.CheckDefAndScriptFailure(lines, 'Cannot use "is" with number', 1)
1053 1053
1054 # check missing white space 1054 # check missing white space
1055 lines =<< trim END 1055 lines =<< trim END
1056 echo 2>3 1056 echo 2>3
1057 END 1057 END
1058 CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''>'' at ">3"', 1) 1058 v9.CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''>'' at ">3"', 1)
1059 1059
1060 lines =<< trim END 1060 lines =<< trim END
1061 echo 2 >3 1061 echo 2 >3
1062 END 1062 END
1063 CheckDefAndScriptFailure(lines, 'E1004:', 1) 1063 v9.CheckDefAndScriptFailure(lines, 'E1004:', 1)
1064 1064
1065 lines =<< trim END 1065 lines =<< trim END
1066 echo 2> 3 1066 echo 2> 3
1067 END 1067 END
1068 CheckDefAndScriptFailure(lines, 'E1004:', 1) 1068 v9.CheckDefAndScriptFailure(lines, 'E1004:', 1)
1069 1069
1070 lines =<< trim END 1070 lines =<< trim END
1071 echo 2!=3 1071 echo 2!=3
1072 END 1072 END
1073 CheckDefAndScriptFailure(lines, 'E1004:', 1) 1073 v9.CheckDefAndScriptFailure(lines, 'E1004:', 1)
1074 1074
1075 lines =<< trim END 1075 lines =<< trim END
1076 echo 2 !=3 1076 echo 2 !=3
1077 END 1077 END
1078 CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''!='' at "!=3"', 1) 1078 v9.CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''!='' at "!=3"', 1)
1079 1079
1080 lines =<< trim END 1080 lines =<< trim END
1081 echo 2!= 3 1081 echo 2!= 3
1082 END 1082 END
1083 CheckDefAndScriptFailure(lines, 'E1004:', 1) 1083 v9.CheckDefAndScriptFailure(lines, 'E1004:', 1)
1084 1084
1085 for op in ['==', '>', '>=', '<', '<=', '=~', '!~', 'is', 'isnot'] 1085 for op in ['==', '>', '>=', '<', '<=', '=~', '!~', 'is', 'isnot']
1086 lines = ["echo 'aaa'", op .. "'bbb'", '# comment'] 1086 lines = ["echo 'aaa'", op .. "'bbb'", '# comment']
1087 var msg = printf("E1004: White space required before and after '%s'", op) 1087 var msg = printf("E1004: White space required before and after '%s'", op)
1088 CheckDefAndScriptFailure(lines, msg, 2) 1088 v9.CheckDefAndScriptFailure(lines, msg, 2)
1089 endfor 1089 endfor
1090 1090
1091 lines =<< trim END 1091 lines =<< trim END
1092 echo len('xxx') == 3 1092 echo len('xxx') == 3
1093 END 1093 END
1094 CheckDefAndScriptSuccess(lines) 1094 v9.CheckDefAndScriptSuccess(lines)
1095 1095
1096 lines =<< trim END 1096 lines =<< trim END
1097 var line = 'abc' 1097 var line = 'abc'
1098 echo line[1] =~ '\w' 1098 echo line[1] =~ '\w'
1099 END 1099 END
1100 CheckDefAndScriptSuccess(lines) 1100 v9.CheckDefAndScriptSuccess(lines)
1101 enddef 1101 enddef
1102 1102
1103 func Test_expr4_fails() 1103 func Test_expr4_fails()
1104 let msg = "White space required before and after '>'" 1104 let msg = "White space required before and after '>'"
1105 call CheckDefAndScriptFailure(["var x = 1>2"], msg, 1) 1105 call v9.CheckDefAndScriptFailure(["var x = 1>2"], msg, 1)
1106 call CheckDefAndScriptFailure(["var x = 1 >2"], msg, 1) 1106 call v9.CheckDefAndScriptFailure(["var x = 1 >2"], msg, 1)
1107 call CheckDefAndScriptFailure(["var x = 1> 2"], msg, 1) 1107 call v9.CheckDefAndScriptFailure(["var x = 1> 2"], msg, 1)
1108 1108
1109 let msg = "White space required before and after '=='" 1109 let msg = "White space required before and after '=='"
1110 call CheckDefAndScriptFailure(["var x = 1==2"], msg, 1) 1110 call v9.CheckDefAndScriptFailure(["var x = 1==2"], msg, 1)
1111 call CheckDefAndScriptFailure(["var x = 1 ==2"], msg, 1) 1111 call v9.CheckDefAndScriptFailure(["var x = 1 ==2"], msg, 1)
1112 call CheckDefAndScriptFailure(["var x = 1== 2"], msg, 1) 1112 call v9.CheckDefAndScriptFailure(["var x = 1== 2"], msg, 1)
1113 1113
1114 let msg = "White space required before and after 'is'" 1114 let msg = "White space required before and after 'is'"
1115 call CheckDefAndScriptFailure(["var x = '1'is'2'"], msg, 1) 1115 call v9.CheckDefAndScriptFailure(["var x = '1'is'2'"], msg, 1)
1116 call CheckDefAndScriptFailure(["var x = '1' is'2'"], msg, 1) 1116 call v9.CheckDefAndScriptFailure(["var x = '1' is'2'"], msg, 1)
1117 call CheckDefAndScriptFailure(["var x = '1'is '2'"], msg, 1) 1117 call v9.CheckDefAndScriptFailure(["var x = '1'is '2'"], msg, 1)
1118 1118
1119 let msg = "White space required before and after 'isnot'" 1119 let msg = "White space required before and after 'isnot'"
1120 call CheckDefAndScriptFailure(["var x = '1'isnot'2'"], msg, 1) 1120 call v9.CheckDefAndScriptFailure(["var x = '1'isnot'2'"], msg, 1)
1121 call CheckDefAndScriptFailure(["var x = '1' isnot'2'"], msg, 1) 1121 call v9.CheckDefAndScriptFailure(["var x = '1' isnot'2'"], msg, 1)
1122 call CheckDefAndScriptFailure(["var x = '1'isnot '2'"], msg, 1) 1122 call v9.CheckDefAndScriptFailure(["var x = '1'isnot '2'"], msg, 1)
1123 1123
1124 call CheckDefAndScriptFailure(["var x = 1 is# 2"], 'E15:', 1) 1124 call v9.CheckDefAndScriptFailure(["var x = 1 is# 2"], 'E15:', 1)
1125 call CheckDefAndScriptFailure(["var x = 1 is? 2"], 'E15:', 1) 1125 call v9.CheckDefAndScriptFailure(["var x = 1 is? 2"], 'E15:', 1)
1126 call CheckDefAndScriptFailure(["var x = 1 isnot# 2"], 'E15:', 1) 1126 call v9.CheckDefAndScriptFailure(["var x = 1 isnot# 2"], 'E15:', 1)
1127 call CheckDefAndScriptFailure(["var x = 1 isnot? 2"], 'E15:', 1) 1127 call v9.CheckDefAndScriptFailure(["var x = 1 isnot? 2"], 'E15:', 1)
1128 1128
1129 call CheckDefAndScriptFailure(["var x = 1 == '2'"], 'Cannot compare number with string', 1) 1129 call v9.CheckDefAndScriptFailure(["var x = 1 == '2'"], 'Cannot compare number with string', 1)
1130 call CheckDefAndScriptFailure(["var x = '1' == 2"], 'Cannot compare string with number', 1) 1130 call v9.CheckDefAndScriptFailure(["var x = '1' == 2"], 'Cannot compare string with number', 1)
1131 call CheckDefAndScriptFailure(["var x = 1 == RetVoid()"], 'Cannot compare number with void', 1) 1131 call v9.CheckDefAndScriptFailure(["var x = 1 == g:RetVoid()"], 'Cannot compare number with void', 1)
1132 call CheckDefAndScriptFailure(["var x = RetVoid() == 1"], 'Cannot compare void with number', 1) 1132 call v9.CheckDefAndScriptFailure(["var x = g:RetVoid() == 1"], 'Cannot compare void with number', 1)
1133 1133
1134 call CheckDefAndScriptFailure(["var x = true > false"], 'Cannot compare bool with bool', 1) 1134 call v9.CheckDefAndScriptFailure(["var x = true > false"], 'Cannot compare bool with bool', 1)
1135 call CheckDefAndScriptFailure(["var x = true >= false"], 'Cannot compare bool with bool', 1) 1135 call v9.CheckDefAndScriptFailure(["var x = true >= false"], 'Cannot compare bool with bool', 1)
1136 call CheckDefAndScriptFailure(["var x = true < false"], 'Cannot compare bool with bool', 1) 1136 call v9.CheckDefAndScriptFailure(["var x = true < false"], 'Cannot compare bool with bool', 1)
1137 call CheckDefAndScriptFailure(["var x = true <= false"], 'Cannot compare bool with bool', 1) 1137 call v9.CheckDefAndScriptFailure(["var x = true <= false"], 'Cannot compare bool with bool', 1)
1138 call CheckDefAndScriptFailure(["var x = true =~ false"], 'Cannot compare bool with bool', 1) 1138 call v9.CheckDefAndScriptFailure(["var x = true =~ false"], 'Cannot compare bool with bool', 1)
1139 call CheckDefAndScriptFailure(["var x = true !~ false"], 'Cannot compare bool with bool', 1) 1139 call v9.CheckDefAndScriptFailure(["var x = true !~ false"], 'Cannot compare bool with bool', 1)
1140 call CheckDefAndScriptFailure(["var x = true is false"], 'Cannot use "is" with bool', 1) 1140 call v9.CheckDefAndScriptFailure(["var x = true is false"], 'Cannot use "is" with bool', 1)
1141 call CheckDefAndScriptFailure(["var x = true isnot false"], 'Cannot use "isnot" with bool', 1) 1141 call v9.CheckDefAndScriptFailure(["var x = true isnot false"], 'Cannot use "isnot" with bool', 1)
1142 1142
1143 call CheckDefAndScriptFailure(["var x = v:none is v:null"], 'Cannot use "is" with special', 1) 1143 call v9.CheckDefAndScriptFailure(["var x = v:none is v:null"], 'Cannot use "is" with special', 1)
1144 call CheckDefAndScriptFailure(["var x = v:none isnot v:null"], 'Cannot use "isnot" with special', 1) 1144 call v9.CheckDefAndScriptFailure(["var x = v:none isnot v:null"], 'Cannot use "isnot" with special', 1)
1145 call CheckDefAndScriptFailure(["var x = 123 is 123"], 'Cannot use "is" with number', 1) 1145 call v9.CheckDefAndScriptFailure(["var x = 123 is 123"], 'Cannot use "is" with number', 1)
1146 call CheckDefAndScriptFailure(["var x = 123 isnot 123"], 'Cannot use "isnot" with number', 1) 1146 call v9.CheckDefAndScriptFailure(["var x = 123 isnot 123"], 'Cannot use "isnot" with number', 1)
1147 if has('float') 1147 if has('float')
1148 call CheckDefAndScriptFailure(["var x = 1.3 is 1.3"], 'Cannot use "is" with float', 1) 1148 call v9.CheckDefAndScriptFailure(["var x = 1.3 is 1.3"], 'Cannot use "is" with float', 1)
1149 call CheckDefAndScriptFailure(["var x = 1.3 isnot 1.3"], 'Cannot use "isnot" with float', 1) 1149 call v9.CheckDefAndScriptFailure(["var x = 1.3 isnot 1.3"], 'Cannot use "isnot" with float', 1)
1150 endif 1150 endif
1151 1151
1152 call CheckDefAndScriptFailure(["var x = 0za1 > 0z34"], 'Cannot compare blob with blob', 1) 1152 call v9.CheckDefAndScriptFailure(["var x = 0za1 > 0z34"], 'Cannot compare blob with blob', 1)
1153 call CheckDefAndScriptFailure(["var x = 0za1 >= 0z34"], 'Cannot compare blob with blob', 1) 1153 call v9.CheckDefAndScriptFailure(["var x = 0za1 >= 0z34"], 'Cannot compare blob with blob', 1)
1154 call CheckDefAndScriptFailure(["var x = 0za1 < 0z34"], 'Cannot compare blob with blob', 1) 1154 call v9.CheckDefAndScriptFailure(["var x = 0za1 < 0z34"], 'Cannot compare blob with blob', 1)
1155 call CheckDefAndScriptFailure(["var x = 0za1 <= 0z34"], 'Cannot compare blob with blob', 1) 1155 call v9.CheckDefAndScriptFailure(["var x = 0za1 <= 0z34"], 'Cannot compare blob with blob', 1)
1156 call CheckDefAndScriptFailure(["var x = 0za1 =~ 0z34"], 'Cannot compare blob with blob', 1) 1156 call v9.CheckDefAndScriptFailure(["var x = 0za1 =~ 0z34"], 'Cannot compare blob with blob', 1)
1157 call CheckDefAndScriptFailure(["var x = 0za1 !~ 0z34"], 'Cannot compare blob with blob', 1) 1157 call v9.CheckDefAndScriptFailure(["var x = 0za1 !~ 0z34"], 'Cannot compare blob with blob', 1)
1158 1158
1159 call CheckDefAndScriptFailure(["var x = [13] > [88]"], 'Cannot compare list with list', 1) 1159 call v9.CheckDefAndScriptFailure(["var x = [13] > [88]"], 'Cannot compare list with list', 1)
1160 call CheckDefAndScriptFailure(["var x = [13] >= [88]"], 'Cannot compare list with list', 1) 1160 call v9.CheckDefAndScriptFailure(["var x = [13] >= [88]"], 'Cannot compare list with list', 1)
1161 call CheckDefAndScriptFailure(["var x = [13] < [88]"], 'Cannot compare list with list', 1) 1161 call v9.CheckDefAndScriptFailure(["var x = [13] < [88]"], 'Cannot compare list with list', 1)
1162 call CheckDefAndScriptFailure(["var x = [13] <= [88]"], 'Cannot compare list with list', 1) 1162 call v9.CheckDefAndScriptFailure(["var x = [13] <= [88]"], 'Cannot compare list with list', 1)
1163 call CheckDefAndScriptFailure(["var x = [13] =~ [88]"], 'Cannot compare list with list', 1) 1163 call v9.CheckDefAndScriptFailure(["var x = [13] =~ [88]"], 'Cannot compare list with list', 1)
1164 call CheckDefAndScriptFailure(["var x = [13] !~ [88]"], 'Cannot compare list with list', 1) 1164 call v9.CheckDefAndScriptFailure(["var x = [13] !~ [88]"], 'Cannot compare list with list', 1)
1165 1165
1166 call CheckDefAndScriptFailure(['var j: job', 'var chan: channel', 'var r = j == chan'], 'Cannot compare job with channel', 3) 1166 call v9.CheckDefAndScriptFailure(['var j: job', 'var chan: channel', 'var r = j == chan'], 'Cannot compare job with channel', 3)
1167 call CheckDefAndScriptFailure(['var j: job', 'var x: list<any>', 'var r = j == x'], 'Cannot compare job with list', 3) 1167 call v9.CheckDefAndScriptFailure(['var j: job', 'var x: list<any>', 'var r = j == x'], 'Cannot compare job with list', 3)
1168 call CheckDefAndScriptFailure(['var j: job', 'var Xx: func', 'var r = j == Xx'], 'Cannot compare job with func', 3) 1168 call v9.CheckDefAndScriptFailure(['var j: job', 'var Xx: func', 'var r = j == Xx'], 'Cannot compare job with func', 3)
1169 call CheckDefAndScriptFailure(['var j: job', 'var Xx: func', 'var r = j == Xx'], 'Cannot compare job with func', 3) 1169 call v9.CheckDefAndScriptFailure(['var j: job', 'var Xx: func', 'var r = j == Xx'], 'Cannot compare job with func', 3)
1170 endfunc 1170 endfunc
1171 1171
1172 " test addition, subtraction, concatenation 1172 " test addition, subtraction, concatenation
1173 def Test_expr5() 1173 def Test_expr5()
1174 var lines =<< trim END 1174 var lines =<< trim END
1230 $ENVVAR = 'env' 1230 $ENVVAR = 'env'
1231 assert_equal('aenv', 'a' .. $ENVVAR) 1231 assert_equal('aenv', 'a' .. $ENVVAR)
1232 1232
1233 assert_equal('val', '' .. {key: 'val'}['key']) 1233 assert_equal('val', '' .. {key: 'val'}['key'])
1234 END 1234 END
1235 CheckDefAndScriptSuccess(lines) 1235 v9.CheckDefAndScriptSuccess(lines)
1236 enddef 1236 enddef
1237 1237
1238 def Test_expr5_vim9script() 1238 def Test_expr5_vim9script()
1239 # check line continuation 1239 # check line continuation
1240 var lines =<< trim END 1240 var lines =<< trim END
1241 var name = 11 1241 var name = 11
1242 + 77 1242 + 77
1243 - 22 1243 - 22
1244 assert_equal(66, name) 1244 assert_equal(66, name)
1245 END 1245 END
1246 CheckDefAndScriptSuccess(lines) 1246 v9.CheckDefAndScriptSuccess(lines)
1247 1247
1248 lines =<< trim END 1248 lines =<< trim END
1249 var name = 11 + 1249 var name = 11 +
1250 77 - 1250 77 -
1251 22 1251 22
1252 assert_equal(66, name) 1252 assert_equal(66, name)
1253 END 1253 END
1254 CheckDefAndScriptSuccess(lines) 1254 v9.CheckDefAndScriptSuccess(lines)
1255 1255
1256 lines =<< trim END 1256 lines =<< trim END
1257 var name = 11 + # comment 1257 var name = 11 + # comment
1258 77 - 1258 77 -
1259 # comment 1259 # comment
1260 22 1260 22
1261 assert_equal(66, name) 1261 assert_equal(66, name)
1262 END 1262 END
1263 CheckDefAndScriptSuccess(lines) 1263 v9.CheckDefAndScriptSuccess(lines)
1264 1264
1265 lines =<< trim END 1265 lines =<< trim END
1266 var name = 'one' 1266 var name = 'one'
1267 .. 'two' 1267 .. 'two'
1268 assert_equal('onetwo', name) 1268 assert_equal('onetwo', name)
1269 END 1269 END
1270 CheckDefAndScriptSuccess(lines) 1270 v9.CheckDefAndScriptSuccess(lines)
1271 1271
1272 lines =<< trim END 1272 lines =<< trim END
1273 echo 'abc' is# 'abc' 1273 echo 'abc' is# 'abc'
1274 END 1274 END
1275 CheckDefAndScriptFailure(lines, 'E15:', 1) 1275 v9.CheckDefAndScriptFailure(lines, 'E15:', 1)
1276 1276
1277 lines =<< trim END 1277 lines =<< trim END
1278 echo {} - 22 1278 echo {} - 22
1279 END 1279 END
1280 CheckDefAndScriptFailure(lines, ['E1036:', 'E728:'], 1) 1280 v9.CheckDefAndScriptFailure(lines, ['E1036:', 'E728:'], 1)
1281 1281
1282 lines =<< trim END 1282 lines =<< trim END
1283 echo [] - 33 1283 echo [] - 33
1284 END 1284 END
1285 CheckDefAndScriptFailure(lines, ['E1036:', 'E745:'], 1) 1285 v9.CheckDefAndScriptFailure(lines, ['E1036:', 'E745:'], 1)
1286 1286
1287 lines =<< trim END 1287 lines =<< trim END
1288 echo 0z1234 - 44 1288 echo 0z1234 - 44
1289 END 1289 END
1290 CheckDefAndScriptFailure(lines, ['E1036', 'E974:'], 1) 1290 v9.CheckDefAndScriptFailure(lines, ['E1036', 'E974:'], 1)
1291 1291
1292 lines =<< trim END 1292 lines =<< trim END
1293 echo 'abc' is? 'abc' 1293 echo 'abc' is? 'abc'
1294 END 1294 END
1295 CheckDefAndScriptFailure(lines, 'E15:', 1) 1295 v9.CheckDefAndScriptFailure(lines, 'E15:', 1)
1296 1296
1297 lines =<< trim END 1297 lines =<< trim END
1298 echo 'abc' isnot# 'abc' 1298 echo 'abc' isnot# 'abc'
1299 END 1299 END
1300 CheckDefAndScriptFailure(lines, 'E15:', 1) 1300 v9.CheckDefAndScriptFailure(lines, 'E15:', 1)
1301 1301
1302 lines =<< trim END 1302 lines =<< trim END
1303 echo 'abc' isnot? 'abc' 1303 echo 'abc' isnot? 'abc'
1304 END 1304 END
1305 CheckDefAndScriptFailure(lines, 'E15:', 1) 1305 v9.CheckDefAndScriptFailure(lines, 'E15:', 1)
1306 1306
1307 # check white space 1307 # check white space
1308 lines =<< trim END 1308 lines =<< trim END
1309 echo 5+6 1309 echo 5+6
1310 END 1310 END
1311 CheckDefAndScriptFailure(lines, 'E1004:', 1) 1311 v9.CheckDefAndScriptFailure(lines, 'E1004:', 1)
1312 lines =<< trim END 1312 lines =<< trim END
1313 echo 5 +6 1313 echo 5 +6
1314 END 1314 END
1315 CheckDefAndScriptFailure(lines, 'E1004:', 1) 1315 v9.CheckDefAndScriptFailure(lines, 'E1004:', 1)
1316 1316
1317 lines =<< trim END 1317 lines =<< trim END
1318 echo 5+ 6 1318 echo 5+ 6
1319 END 1319 END
1320 CheckDefAndScriptFailure(lines, 'E1004:', 1) 1320 v9.CheckDefAndScriptFailure(lines, 'E1004:', 1)
1321 1321
1322 lines =<< trim END 1322 lines =<< trim END
1323 echo 'a'..'b' 1323 echo 'a'..'b'
1324 END 1324 END
1325 CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''..'' at "..''b''"', 1) 1325 v9.CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''..'' at "..''b''"', 1)
1326 1326
1327 lines =<< trim END 1327 lines =<< trim END
1328 echo 'a' ..'b' 1328 echo 'a' ..'b'
1329 END 1329 END
1330 CheckDefAndScriptFailure(lines, 'E1004:', 1) 1330 v9.CheckDefAndScriptFailure(lines, 'E1004:', 1)
1331 1331
1332 lines =<< trim END 1332 lines =<< trim END
1333 echo 'a'.. 'b' 1333 echo 'a'.. 'b'
1334 END 1334 END
1335 CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''..'' at ".. ''b''"', 1) 1335 v9.CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''..'' at ".. ''b''"', 1)
1336 1336
1337 lines =<< trim END 1337 lines =<< trim END
1338 echo 'a' 1338 echo 'a'
1339 ..'b' 1339 ..'b'
1340 # comment 1340 # comment
1341 END 1341 END
1342 CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''..'' at "..''b''"', 2) 1342 v9.CheckDefAndScriptFailure(lines, 'E1004: White space required before and after ''..'' at "..''b''"', 2)
1343 1343
1344 # check invalid string concatenation 1344 # check invalid string concatenation
1345 lines =<< trim END 1345 lines =<< trim END
1346 echo 'a' .. [1] 1346 echo 'a' .. [1]
1347 END 1347 END
1348 CheckDefAndScriptFailure(lines, ['E1105:', 'E730:'], 1) 1348 v9.CheckDefAndScriptFailure(lines, ['E1105:', 'E730:'], 1)
1349 1349
1350 lines =<< trim END 1350 lines =<< trim END
1351 echo 'a' .. {a: 1} 1351 echo 'a' .. {a: 1}
1352 END 1352 END
1353 CheckDefAndScriptFailure(lines, ['E1105:', 'E731:'], 1) 1353 v9.CheckDefAndScriptFailure(lines, ['E1105:', 'E731:'], 1)
1354 1354
1355 lines =<< trim END 1355 lines =<< trim END
1356 echo 'a' .. test_void() 1356 echo 'a' .. test_void()
1357 END 1357 END
1358 CheckDefAndScriptFailure(lines, ['E1105:', 'E908:'], 1) 1358 v9.CheckDefAndScriptFailure(lines, ['E1105:', 'E908:'], 1)
1359 1359
1360 lines =<< trim END 1360 lines =<< trim END
1361 echo 'a' .. 0z33 1361 echo 'a' .. 0z33
1362 END 1362 END
1363 CheckDefAndScriptFailure(lines, ['E1105:', 'E976:'], 1) 1363 v9.CheckDefAndScriptFailure(lines, ['E1105:', 'E976:'], 1)
1364 1364
1365 lines =<< trim END 1365 lines =<< trim END
1366 echo 'a' .. function('len') 1366 echo 'a' .. function('len')
1367 END 1367 END
1368 CheckDefAndScriptFailure(lines, ['E1105:', 'E729:'], 1) 1368 v9.CheckDefAndScriptFailure(lines, ['E1105:', 'E729:'], 1)
1369 1369
1370 lines =<< trim END 1370 lines =<< trim END
1371 new 1371 new
1372 ['']->setline(1) 1372 ['']->setline(1)
1373 /pattern 1373 /pattern
1374 1374
1375 eval 0 1375 eval 0
1376 bwipe! 1376 bwipe!
1377 END 1377 END
1378 CheckDefAndScriptFailure(lines, "E1004: White space required before and after '/' at \"/pattern", 3) 1378 v9.CheckDefAndScriptFailure(lines, "E1004: White space required before and after '/' at \"/pattern", 3)
1379 1379
1380 for op in ['+', '-'] 1380 for op in ['+', '-']
1381 lines = ['var x = 1', op .. '2', '# comment'] 1381 lines = ['var x = 1', op .. '2', '# comment']
1382 var msg = printf("E1004: White space required before and after '%s' at \"%s2\"", op, op) 1382 var msg = printf("E1004: White space required before and after '%s' at \"%s2\"", op, op)
1383 CheckDefAndScriptFailure(lines, msg, 2) 1383 v9.CheckDefAndScriptFailure(lines, msg, 2)
1384 endfor 1384 endfor
1385 enddef 1385 enddef
1386 1386
1387 def Test_expr5_vim9script_channel() 1387 def Test_expr5_vim9script_channel()
1388 if !has('channel') 1388 if !has('channel')
1389 MissingFeature 'channel' 1389 MissingFeature 'channel'
1390 else 1390 else
1391 var lines =<< trim END 1391 var lines =<< trim END
1392 echo 'a' .. test_null_job() 1392 echo 'a' .. test_null_job()
1393 END 1393 END
1394 CheckDefAndScriptFailure(lines, ['E1105:', 'E908:'], 1) 1394 v9.CheckDefAndScriptFailure(lines, ['E1105:', 'E908:'], 1)
1395 lines =<< trim END 1395 lines =<< trim END
1396 echo 'a' .. test_null_channel() 1396 echo 'a' .. test_null_channel()
1397 END 1397 END
1398 CheckDefAndScriptFailure(lines, ['E1105:', 'E908:'], 1) 1398 v9.CheckDefAndScriptFailure(lines, ['E1105:', 'E908:'], 1)
1399 endif 1399 endif
1400 enddef 1400 enddef
1401 1401
1402 def Test_expr5_float() 1402 def Test_expr5_float()
1403 if !has('float') 1403 if !has('float')
1421 assert_equal(-4.9, g:afloat - 5) 1421 assert_equal(-4.9, g:afloat - 5)
1422 assert_equal(7.9, 8 - g:afloat) 1422 assert_equal(7.9, 8 - g:afloat)
1423 assert_equal(9.9, g:anint - g:afloat) 1423 assert_equal(9.9, g:anint - g:afloat)
1424 assert_equal(-9.9, g:afloat - g:anint) 1424 assert_equal(-9.9, g:afloat - g:anint)
1425 END 1425 END
1426 CheckDefAndScriptSuccess(lines) 1426 v9.CheckDefAndScriptSuccess(lines)
1427 endif 1427 endif
1428 enddef 1428 enddef
1429 1429
1430 func Test_expr5_fails() 1430 func Test_expr5_fails()
1431 let msg = "White space required before and after '+'" 1431 let msg = "White space required before and after '+'"
1432 call CheckDefAndScriptFailure(["var x = 1+2"], msg, 1) 1432 call v9.CheckDefAndScriptFailure(["var x = 1+2"], msg, 1)
1433 call CheckDefAndScriptFailure(["var x = 1 +2"], msg, 1) 1433 call v9.CheckDefAndScriptFailure(["var x = 1 +2"], msg, 1)
1434 call CheckDefAndScriptFailure(["var x = 1+ 2"], msg, 1) 1434 call v9.CheckDefAndScriptFailure(["var x = 1+ 2"], msg, 1)
1435 1435
1436 let msg = "White space required before and after '-'" 1436 let msg = "White space required before and after '-'"
1437 call CheckDefAndScriptFailure(["var x = 1-2"], msg, 1) 1437 call v9.CheckDefAndScriptFailure(["var x = 1-2"], msg, 1)
1438 call CheckDefAndScriptFailure(["var x = 1 -2"], msg, 1) 1438 call v9.CheckDefAndScriptFailure(["var x = 1 -2"], msg, 1)
1439 call CheckDefAndScriptFailure(["var x = 1- 2"], msg, 1) 1439 call v9.CheckDefAndScriptFailure(["var x = 1- 2"], msg, 1)
1440 1440
1441 let msg = "White space required before and after '..'" 1441 let msg = "White space required before and after '..'"
1442 call CheckDefAndScriptFailure(["var x = '1'..'2'"], msg, 1) 1442 call v9.CheckDefAndScriptFailure(["var x = '1'..'2'"], msg, 1)
1443 call CheckDefAndScriptFailure(["var x = '1' ..'2'"], msg, 1) 1443 call v9.CheckDefAndScriptFailure(["var x = '1' ..'2'"], msg, 1)
1444 call CheckDefAndScriptFailure(["var x = '1'.. '2'"], msg, 1) 1444 call v9.CheckDefAndScriptFailure(["var x = '1'.. '2'"], msg, 1)
1445 1445
1446 call CheckDefAndScriptFailure(["var x = 0z1122 + 33"], ['E1051:', 'E974:'], 1) 1446 call v9.CheckDefAndScriptFailure(["var x = 0z1122 + 33"], ['E1051:', 'E974:'], 1)
1447 call CheckDefAndScriptFailure(["var x = 0z1122 + [3]"], ['E1051:', 'E974:'], 1) 1447 call v9.CheckDefAndScriptFailure(["var x = 0z1122 + [3]"], ['E1051:', 'E974:'], 1)
1448 call CheckDefAndScriptFailure(["var x = 0z1122 + 'asd'"], ['E1051:', 'E974:'], 1) 1448 call v9.CheckDefAndScriptFailure(["var x = 0z1122 + 'asd'"], ['E1051:', 'E974:'], 1)
1449 call CheckDefAndScriptFailure(["var x = 33 + 0z1122"], ['E1051:', 'E974:'], 1) 1449 call v9.CheckDefAndScriptFailure(["var x = 33 + 0z1122"], ['E1051:', 'E974:'], 1)
1450 call CheckDefAndScriptFailure(["var x = [3] + 0z1122"], ['E1051:', 'E745:'], 1) 1450 call v9.CheckDefAndScriptFailure(["var x = [3] + 0z1122"], ['E1051:', 'E745:'], 1)
1451 call CheckDefAndScriptFailure(["var x = 'asdf' + 0z1122"], ['E1051:', 'E1030:'], 1) 1451 call v9.CheckDefAndScriptFailure(["var x = 'asdf' + 0z1122"], ['E1051:', 'E1030:'], 1)
1452 call CheckDefAndScriptFailure(["var x = 6 + xxx"], ['E1001:', 'E121:'], 1) 1452 call v9.CheckDefAndScriptFailure(["var x = 6 + xxx"], ['E1001:', 'E121:'], 1)
1453 1453
1454 call CheckDefAndScriptFailure(["var x = 'a' .. [1]"], ['E1105:', 'E730:'], 1) 1454 call v9.CheckDefAndScriptFailure(["var x = 'a' .. [1]"], ['E1105:', 'E730:'], 1)
1455 call CheckDefAndScriptFailure(["var x = 'a' .. {a: 1}"], ['E1105:', 'E731:'], 1) 1455 call v9.CheckDefAndScriptFailure(["var x = 'a' .. {a: 1}"], ['E1105:', 'E731:'], 1)
1456 call CheckDefAndScriptFailure(["var x = 'a' .. test_void()"], ['E1105:', 'E908:'], 1) 1456 call v9.CheckDefAndScriptFailure(["var x = 'a' .. test_void()"], ['E1105:', 'E908:'], 1)
1457 call CheckDefAndScriptFailure(["var x = 'a' .. 0z32"], ['E1105:', 'E976:'], 1) 1457 call v9.CheckDefAndScriptFailure(["var x = 'a' .. 0z32"], ['E1105:', 'E976:'], 1)
1458 call CheckDefAndScriptFailure(["var x = 'a' .. function('len')"], ['E1105:', 'E729:'], 1) 1458 call v9.CheckDefAndScriptFailure(["var x = 'a' .. function('len')"], ['E1105:', 'E729:'], 1)
1459 call CheckDefAndScriptFailure(["var x = 'a' .. function('len', ['a'])"], ['E1105:', 'E729:'], 1) 1459 call v9.CheckDefAndScriptFailure(["var x = 'a' .. function('len', ['a'])"], ['E1105:', 'E729:'], 1)
1460 1460
1461 call CheckDefAndScriptFailure(['var x = 1 + v:none'], ['E1051:', 'E611:'], 1) 1461 call v9.CheckDefAndScriptFailure(['var x = 1 + v:none'], ['E1051:', 'E611:'], 1)
1462 call CheckDefAndScriptFailure(['var x = 1 + v:null'], ['E1051:', 'E611:'], 1) 1462 call v9.CheckDefAndScriptFailure(['var x = 1 + v:null'], ['E1051:', 'E611:'], 1)
1463 call CheckDefAndScriptFailure(['var x = 1 + v:true'], ['E1051:', 'E1138:'], 1) 1463 call v9.CheckDefAndScriptFailure(['var x = 1 + v:true'], ['E1051:', 'E1138:'], 1)
1464 call CheckDefAndScriptFailure(['var x = 1 + v:false'], ['E1051:', 'E1138:'], 1) 1464 call v9.CheckDefAndScriptFailure(['var x = 1 + v:false'], ['E1051:', 'E1138:'], 1)
1465 call CheckDefAndScriptFailure(['var x = 1 + true'], ['E1051:', 'E1138:'], 1) 1465 call v9.CheckDefAndScriptFailure(['var x = 1 + true'], ['E1051:', 'E1138:'], 1)
1466 call CheckDefAndScriptFailure(['var x = 1 + false'], ['E1051:', 'E1138:'], 1) 1466 call v9.CheckDefAndScriptFailure(['var x = 1 + false'], ['E1051:', 'E1138:'], 1)
1467 endfunc 1467 endfunc
1468 1468
1469 func Test_expr5_fails_channel() 1469 func Test_expr5_fails_channel()
1470 CheckFeature channel 1470 g:CheckFeature channel
1471 call CheckDefAndScriptFailure(["var x = 'a' .. test_null_job()"], ['E1105:', 'E908:'], 1) 1471 call v9.CheckDefAndScriptFailure(["var x = 'a' .. test_null_job()"], ['E1105:', 'E908:'], 1)
1472 call CheckDefAndScriptFailure(["var x = 'a' .. test_null_channel()"], ['E1105:', 'E908:'], 1) 1472 call v9.CheckDefAndScriptFailure(["var x = 'a' .. test_null_channel()"], ['E1105:', 'E908:'], 1)
1473 endfunc 1473 endfunc
1474 1474
1475 def Test_expr5_list_add() 1475 def Test_expr5_list_add()
1476 var lines =<< trim END 1476 var lines =<< trim END
1477 # concatenating two lists with same member types is OK 1477 # concatenating two lists with same member types is OK
1488 assert_equal({a: 'a', 12: 12}, dany) 1488 assert_equal({a: 'a', 12: 12}, dany)
1489 1489
1490 # result of glob() is "any", runtime type check 1490 # result of glob() is "any", runtime type check
1491 var sl: list<string> = glob('*.txt', false, true) + [''] 1491 var sl: list<string> = glob('*.txt', false, true) + ['']
1492 END 1492 END
1493 CheckDefAndScriptSuccess(lines) 1493 v9.CheckDefAndScriptSuccess(lines)
1494 enddef 1494 enddef
1495 1495
1496 " test multiply, divide, modulo 1496 " test multiply, divide, modulo
1497 def Test_expr6() 1497 def Test_expr6()
1498 var lines =<< trim END 1498 var lines =<< trim END
1530 + yf[0]) 1530 + yf[0])
1531 assert_equal(6.0, xf[0] 1531 assert_equal(6.0, xf[0]
1532 * yf[0]) 1532 * yf[0])
1533 endif 1533 endif
1534 END 1534 END
1535 CheckDefAndScriptSuccess(lines) 1535 v9.CheckDefAndScriptSuccess(lines)
1536 1536
1537 CheckDefAndScriptFailure(["var x = 6 * xxx"], ['E1001:', 'E121:'], 1) 1537 v9.CheckDefAndScriptFailure(["var x = 6 * xxx"], ['E1001:', 'E121:'], 1)
1538 CheckDefFailure(["var d = 6 * "], 'E1097:', 3) 1538 v9.CheckDefFailure(["var d = 6 * "], 'E1097:', 3)
1539 CheckScriptFailure(['vim9script', "var d = 6 * "], 'E15:', 2) 1539 v9.CheckScriptFailure(['vim9script', "var d = 6 * "], 'E15:', 2)
1540 1540
1541 CheckDefExecAndScriptFailure(['echo 1 / 0'], 'E1154', 1) 1541 v9.CheckDefExecAndScriptFailure(['echo 1 / 0'], 'E1154', 1)
1542 CheckDefExecAndScriptFailure(['echo 1 % 0'], 'E1154', 1) 1542 v9.CheckDefExecAndScriptFailure(['echo 1 % 0'], 'E1154', 1)
1543 1543
1544 lines =<< trim END 1544 lines =<< trim END
1545 var n = 0 1545 var n = 0
1546 eval 1 / n 1546 eval 1 / n
1547 END 1547 END
1548 CheckDefExecAndScriptFailure(lines, 'E1154', 2) 1548 v9.CheckDefExecAndScriptFailure(lines, 'E1154', 2)
1549 1549
1550 lines =<< trim END 1550 lines =<< trim END
1551 var n = 0 1551 var n = 0
1552 eval 1 % n 1552 eval 1 % n
1553 END 1553 END
1554 CheckDefExecAndScriptFailure(lines, 'E1154', 2) 1554 v9.CheckDefExecAndScriptFailure(lines, 'E1154', 2)
1555 enddef 1555 enddef
1556 1556
1557 def Test_expr6_vim9script() 1557 def Test_expr6_vim9script()
1558 # check line continuation 1558 # check line continuation
1559 var lines =<< trim END 1559 var lines =<< trim END
1560 var name = 11 1560 var name = 11
1561 * 22 1561 * 22
1562 / 3 1562 / 3
1563 assert_equal(80, name) 1563 assert_equal(80, name)
1564 END 1564 END
1565 CheckDefAndScriptSuccess(lines) 1565 v9.CheckDefAndScriptSuccess(lines)
1566 1566
1567 lines =<< trim END 1567 lines =<< trim END
1568 var name = 25 1568 var name = 25
1569 % 10 1569 % 10
1570 assert_equal(5, name) 1570 assert_equal(5, name)
1571 END 1571 END
1572 CheckDefAndScriptSuccess(lines) 1572 v9.CheckDefAndScriptSuccess(lines)
1573 1573
1574 lines =<< trim END 1574 lines =<< trim END
1575 var name = 25 1575 var name = 25
1576 # comment 1576 # comment
1577 1577
1578 # comment 1578 # comment
1579 % 10 1579 % 10
1580 assert_equal(5, name) 1580 assert_equal(5, name)
1581 END 1581 END
1582 CheckDefAndScriptSuccess(lines) 1582 v9.CheckDefAndScriptSuccess(lines)
1583 1583
1584 lines =<< trim END 1584 lines =<< trim END
1585 var name = 11 * 1585 var name = 11 *
1586 22 / 1586 22 /
1587 3 1587 3
1588 assert_equal(80, name) 1588 assert_equal(80, name)
1589 END 1589 END
1590 CheckDefAndScriptSuccess(lines) 1590 v9.CheckDefAndScriptSuccess(lines)
1591 1591
1592 # check white space 1592 # check white space
1593 lines =<< trim END 1593 lines =<< trim END
1594 echo 5*6 1594 echo 5*6
1595 END 1595 END
1596 CheckDefAndScriptFailure(lines, 'E1004:', 1) 1596 v9.CheckDefAndScriptFailure(lines, 'E1004:', 1)
1597 1597
1598 lines =<< trim END 1598 lines =<< trim END
1599 echo 5 *6 1599 echo 5 *6
1600 END 1600 END
1601 CheckDefAndScriptFailure(lines, 'E1004:', 1) 1601 v9.CheckDefAndScriptFailure(lines, 'E1004:', 1)
1602 1602
1603 lines =<< trim END 1603 lines =<< trim END
1604 echo 5* 6 1604 echo 5* 6
1605 END 1605 END
1606 CheckDefAndScriptFailure(lines, 'E1004:', 1) 1606 v9.CheckDefAndScriptFailure(lines, 'E1004:', 1)
1607 enddef 1607 enddef
1608 1608
1609 def Test_expr6_float() 1609 def Test_expr6_float()
1610 if !has('float') 1610 if !has('float')
1611 MissingFeature 'float' 1611 MissingFeature 'float'
1633 assert_equal(4.0, 6.0 * 4 / 6.0) 1633 assert_equal(4.0, 6.0 * 4 / 6.0)
1634 assert_equal(4.0, 6.0 * 4.0 / 6.0) 1634 assert_equal(4.0, 6.0 * 4.0 / 6.0)
1635 1635
1636 assert_equal(4.0, 6.0 * 4.0 / 6.0) 1636 assert_equal(4.0, 6.0 * 4.0 / 6.0)
1637 END 1637 END
1638 CheckDefAndScriptSuccess(lines) 1638 v9.CheckDefAndScriptSuccess(lines)
1639 endif 1639 endif
1640 enddef 1640 enddef
1641 1641
1642 func Test_expr6_fails() 1642 func Test_expr6_fails()
1643 let msg = "White space required before and after '*'" 1643 let msg = "White space required before and after '*'"
1644 call CheckDefAndScriptFailure(["var x = 1*2"], msg, 1) 1644 call v9.CheckDefAndScriptFailure(["var x = 1*2"], msg, 1)
1645 call CheckDefAndScriptFailure(["var x = 1 *2"], msg, 1) 1645 call v9.CheckDefAndScriptFailure(["var x = 1 *2"], msg, 1)
1646 call CheckDefAndScriptFailure(["var x = 1* 2"], msg, 1) 1646 call v9.CheckDefAndScriptFailure(["var x = 1* 2"], msg, 1)
1647 1647
1648 let msg = "White space required before and after '/'" 1648 let msg = "White space required before and after '/'"
1649 call CheckDefAndScriptFailure(["var x = 1/2"], msg, 1) 1649 call v9.CheckDefAndScriptFailure(["var x = 1/2"], msg, 1)
1650 call CheckDefAndScriptFailure(["var x = 1 /2"], msg, 1) 1650 call v9.CheckDefAndScriptFailure(["var x = 1 /2"], msg, 1)
1651 call CheckDefAndScriptFailure(["var x = 1/ 2"], msg, 1) 1651 call v9.CheckDefAndScriptFailure(["var x = 1/ 2"], msg, 1)
1652 1652
1653 let msg = "White space required before and after '%'" 1653 let msg = "White space required before and after '%'"
1654 call CheckDefAndScriptFailure(["var x = 1%2"], msg, 1) 1654 call v9.CheckDefAndScriptFailure(["var x = 1%2"], msg, 1)
1655 call CheckDefAndScriptFailure(["var x = 1 %2"], msg, 1) 1655 call v9.CheckDefAndScriptFailure(["var x = 1 %2"], msg, 1)
1656 call CheckDefAndScriptFailure(["var x = 1% 2"], msg, 1) 1656 call v9.CheckDefAndScriptFailure(["var x = 1% 2"], msg, 1)
1657 1657
1658 call CheckDefAndScriptFailure(["var x = '1' * '2'"], ['E1036:', 'E1030:'], 1) 1658 call v9.CheckDefAndScriptFailure(["var x = '1' * '2'"], ['E1036:', 'E1030:'], 1)
1659 call CheckDefAndScriptFailure(["var x = '1' / '2'"], ['E1036:', 'E1030:'], 1) 1659 call v9.CheckDefAndScriptFailure(["var x = '1' / '2'"], ['E1036:', 'E1030:'], 1)
1660 call CheckDefAndScriptFailure(["var x = '1' % '2'"], ['E1035:', 'E1030:'], 1) 1660 call v9.CheckDefAndScriptFailure(["var x = '1' % '2'"], ['E1035:', 'E1030:'], 1)
1661 1661
1662 call CheckDefAndScriptFailure(["var x = 0z01 * 0z12"], ['E1036:', 'E974:'], 1) 1662 call v9.CheckDefAndScriptFailure(["var x = 0z01 * 0z12"], ['E1036:', 'E974:'], 1)
1663 call CheckDefAndScriptFailure(["var x = 0z01 / 0z12"], ['E1036:', 'E974:'], 1) 1663 call v9.CheckDefAndScriptFailure(["var x = 0z01 / 0z12"], ['E1036:', 'E974:'], 1)
1664 call CheckDefAndScriptFailure(["var x = 0z01 % 0z12"], ['E1035:', 'E974:'], 1) 1664 call v9.CheckDefAndScriptFailure(["var x = 0z01 % 0z12"], ['E1035:', 'E974:'], 1)
1665 1665
1666 call CheckDefAndScriptFailure(["var x = [1] * [2]"], ['E1036:', 'E745:'], 1) 1666 call v9.CheckDefAndScriptFailure(["var x = [1] * [2]"], ['E1036:', 'E745:'], 1)
1667 call CheckDefAndScriptFailure(["var x = [1] / [2]"], ['E1036:', 'E745:'], 1) 1667 call v9.CheckDefAndScriptFailure(["var x = [1] / [2]"], ['E1036:', 'E745:'], 1)
1668 call CheckDefAndScriptFailure(["var x = [1] % [2]"], ['E1035:', 'E745:'], 1) 1668 call v9.CheckDefAndScriptFailure(["var x = [1] % [2]"], ['E1035:', 'E745:'], 1)
1669 1669
1670 call CheckDefAndScriptFailure(["var x = {one: 1} * {two: 2}"], ['E1036:', 'E728:'], 1) 1670 call v9.CheckDefAndScriptFailure(["var x = {one: 1} * {two: 2}"], ['E1036:', 'E728:'], 1)
1671 call CheckDefAndScriptFailure(["var x = {one: 1} / {two: 2}"], ['E1036:', 'E728:'], 1) 1671 call v9.CheckDefAndScriptFailure(["var x = {one: 1} / {two: 2}"], ['E1036:', 'E728:'], 1)
1672 call CheckDefAndScriptFailure(["var x = {one: 1} % {two: 2}"], ['E1035:', 'E728:'], 1) 1672 call v9.CheckDefAndScriptFailure(["var x = {one: 1} % {two: 2}"], ['E1035:', 'E728:'], 1)
1673 1673
1674 call CheckDefAndScriptFailure(["var x = 0xff[1]"], ['E1107:', 'E1062:'], 1) 1674 call v9.CheckDefAndScriptFailure(["var x = 0xff[1]"], ['E1107:', 'E1062:'], 1)
1675 if has('float') 1675 if has('float')
1676 call CheckDefAndScriptFailure(["var x = 0.7[1]"], ['E1107:', 'E806:'], 1) 1676 call v9.CheckDefAndScriptFailure(["var x = 0.7[1]"], ['E1107:', 'E806:'], 1)
1677 endif 1677 endif
1678 1678
1679 for op in ['*', '/', '%'] 1679 for op in ['*', '/', '%']
1680 let lines = ['var x = 1', op .. '2', '# comment'] 1680 let lines = ['var x = 1', op .. '2', '# comment']
1681 let msg = printf("E1004: White space required before and after '%s' at \"%s2\"", op, op) 1681 let msg = printf("E1004: White space required before and after '%s' at \"%s2\"", op, op)
1682 call CheckDefAndScriptFailure(lines, msg, 2) 1682 call v9.CheckDefAndScriptFailure(lines, msg, 2)
1683 endfor 1683 endfor
1684 endfunc 1684 endfunc
1685 1685
1686 func Test_expr6_float_fails() 1686 func Test_expr6_float_fails()
1687 CheckFeature float 1687 g:CheckFeature float
1688 call CheckDefAndScriptFailure(["var x = 1.0 % 2"], ['E1035:', 'E804:'], 1) 1688 call v9.CheckDefAndScriptFailure(["var x = 1.0 % 2"], ['E1035:', 'E804:'], 1)
1689 endfunc 1689 endfunc
1690 1690
1691 " define here to use old style parsing 1691 " define here to use old style parsing
1692 if has('float') 1692 if has('float')
1693 let g:float_zero = 0.0 1693 let g:float_zero = 0.0
1730 'text' 1730 'text'
1731 if false 1731 if false
1732 text = <number>'xxx' 1732 text = <number>'xxx'
1733 endif 1733 endif
1734 END 1734 END
1735 CheckDefAndScriptSuccess(lines) 1735 v9.CheckDefAndScriptSuccess(lines)
1736 1736
1737 CheckDefAndScriptFailure(["var x = <nr>123"], 'E1010:', 1) 1737 v9.CheckDefAndScriptFailure(["var x = <nr>123"], 'E1010:', 1)
1738 CheckDefFailure(["var x = <number>"], 'E1097:', 3) 1738 v9.CheckDefFailure(["var x = <number>"], 'E1097:', 3)
1739 CheckDefFailure(["var x = <number>string(1)"], 'E1012:', 1) 1739 v9.CheckDefFailure(["var x = <number>string(1)"], 'E1012:', 1)
1740 CheckScriptFailure(['vim9script', "var x = <number>"], 'E15:', 2) 1740 v9.CheckScriptFailure(['vim9script', "var x = <number>"], 'E15:', 2)
1741 CheckDefAndScriptFailure(["var x = <number >123"], 'E1068:', 1) 1741 v9.CheckDefAndScriptFailure(["var x = <number >123"], 'E1068:', 1)
1742 CheckDefAndScriptFailure(["var x = <number 123"], 'E1104:', 1) 1742 v9.CheckDefAndScriptFailure(["var x = <number 123"], 'E1104:', 1)
1743 enddef 1743 enddef
1744 1744
1745 " test low level expression 1745 " test low level expression
1746 def Test_expr8_number() 1746 def Test_expr8_number()
1747 # number constant 1747 # number constant
1751 1751
1752 assert_equal(6, 0x6) 1752 assert_equal(6, 0x6)
1753 assert_equal(15, 0xf) 1753 assert_equal(15, 0xf)
1754 assert_equal(255, 0xff) 1754 assert_equal(255, 0xff)
1755 END 1755 END
1756 CheckDefAndScriptSuccess(lines) 1756 v9.CheckDefAndScriptSuccess(lines)
1757 enddef 1757 enddef
1758 1758
1759 def Test_expr8_float() 1759 def Test_expr8_float()
1760 # float constant 1760 # float constant
1761 if !has('float') 1761 if !has('float')
1765 assert_equal(g:float_zero, .0) 1765 assert_equal(g:float_zero, .0)
1766 assert_equal(g:float_zero, 0.0) 1766 assert_equal(g:float_zero, 0.0)
1767 assert_equal(g:float_neg, -9.8) 1767 assert_equal(g:float_neg, -9.8)
1768 assert_equal(g:float_big, 9.9e99) 1768 assert_equal(g:float_big, 9.9e99)
1769 END 1769 END
1770 CheckDefAndScriptSuccess(lines) 1770 v9.CheckDefAndScriptSuccess(lines)
1771 endif 1771 endif
1772 enddef 1772 enddef
1773 1773
1774 def Test_expr8_blob() 1774 def Test_expr8_blob()
1775 # blob constant 1775 # blob constant
1796 1796
1797 # blob slice accepts out of range 1797 # blob slice accepts out of range
1798 assert_equal(0z, testblob[3 : 3]) 1798 assert_equal(0z, testblob[3 : 3])
1799 assert_equal(0z, testblob[0 : -4]) 1799 assert_equal(0z, testblob[0 : -4])
1800 END 1800 END
1801 CheckDefAndScriptSuccess(lines) 1801 v9.CheckDefAndScriptSuccess(lines)
1802 1802
1803 CheckDefAndScriptFailure(["var x = 0z123"], 'E973:', 1) 1803 v9.CheckDefAndScriptFailure(["var x = 0z123"], 'E973:', 1)
1804 enddef 1804 enddef
1805 1805
1806 def Test_expr8_string() 1806 def Test_expr8_string()
1807 # string constant 1807 # string constant
1808 var lines =<< trim END 1808 var lines =<< trim END
1812 assert_equal(g:string_short, "x") 1812 assert_equal(g:string_short, "x")
1813 assert_equal(g:string_long, 'abcdefghijklm') 1813 assert_equal(g:string_long, 'abcdefghijklm')
1814 assert_equal(g:string_long, "abcdefghijklm") 1814 assert_equal(g:string_long, "abcdefghijklm")
1815 assert_equal(g:string_special, "ab\ncd\ref\ekk") 1815 assert_equal(g:string_special, "ab\ncd\ref\ekk")
1816 END 1816 END
1817 CheckDefAndScriptSuccess(lines) 1817 v9.CheckDefAndScriptSuccess(lines)
1818 1818
1819 CheckDefAndScriptFailure(['var x = "abc'], 'E114:', 1) 1819 v9.CheckDefAndScriptFailure(['var x = "abc'], 'E114:', 1)
1820 CheckDefAndScriptFailure(["var x = 'abc"], 'E115:', 1) 1820 v9.CheckDefAndScriptFailure(["var x = 'abc"], 'E115:', 1)
1821 enddef 1821 enddef
1822 1822
1823 def Test_expr8_vimvar() 1823 def Test_expr8_vimvar()
1824 v:errors = [] 1824 v:errors = []
1825 var errs: list<string> = v:errors 1825 var errs: list<string> = v:errors
1826 CheckDefFailure(['var errs: list<number> = v:errors'], 'E1012:') 1826 v9.CheckDefFailure(['var errs: list<number> = v:errors'], 'E1012:')
1827 1827
1828 var old: list<string> = v:oldfiles 1828 var old: list<string> = v:oldfiles
1829 CheckDefFailure(['var old: list<number> = v:oldfiles'], 'E1012:') 1829 v9.CheckDefFailure(['var old: list<number> = v:oldfiles'], 'E1012:')
1830 1830
1831 var compl: dict<string> = v:completed_item 1831 var compl: dict<string> = v:completed_item
1832 CheckDefFailure(['var compl: dict<number> = v:completed_item'], 'E1012:') 1832 v9.CheckDefFailure(['var compl: dict<number> = v:completed_item'], 'E1012:')
1833 1833
1834 var args: list<string> = v:argv 1834 var args: list<string> = v:argv
1835 CheckDefFailure(['var args: list<number> = v:argv'], 'E1012:') 1835 v9.CheckDefFailure(['var args: list<number> = v:argv'], 'E1012:')
1836 1836
1837 var colors: dict<string> = v:colornames 1837 var colors: dict<string> = v:colornames
1838 CheckDefFailure(['var colors: dict<number> = v:colornames'], 'E1012:') 1838 v9.CheckDefFailure(['var colors: dict<number> = v:colornames'], 'E1012:')
1839 1839
1840 CheckDefFailure(["var old: list<number> = v:oldfiles"], 'E1012: Type mismatch; expected list<number> but got list<string>', 1) 1840 v9.CheckDefFailure(["var old: list<number> = v:oldfiles"], 'E1012: Type mismatch; expected list<number> but got list<string>', 1)
1841 CheckScriptFailure(['vim9script', 'v:oldfiles = ["foo"]', "var old: list<number> = v:oldfiles"], 'E1012: Type mismatch; expected list<number> but got list<string>', 3) 1841 v9.CheckScriptFailure(['vim9script', 'v:oldfiles = ["foo"]', "var old: list<number> = v:oldfiles"], 'E1012: Type mismatch; expected list<number> but got list<string>', 3)
1842 new 1842 new
1843 exec "normal! afoo fo\<C-N>\<Esc>" 1843 exec "normal! afoo fo\<C-N>\<Esc>"
1844 CheckDefExecAndScriptFailure(["var old: dict<number> = v:completed_item"], 'E1012: Type mismatch; expected dict<number> but got dict<string>', 1) 1844 v9.CheckDefExecAndScriptFailure(["var old: dict<number> = v:completed_item"], 'E1012: Type mismatch; expected dict<number> but got dict<string>', 1)
1845 bwipe! 1845 bwipe!
1846 enddef 1846 enddef
1847 1847
1848 def Test_expr8_special() 1848 def Test_expr8_special()
1849 # special constant 1849 # special constant
1871 1871
1872 assert_equal(g:special_null, v:null) 1872 assert_equal(g:special_null, v:null)
1873 assert_equal(g:special_null, null) 1873 assert_equal(g:special_null, null)
1874 assert_equal(g:special_none, v:none) 1874 assert_equal(g:special_none, v:none)
1875 END 1875 END
1876 CheckDefAndScriptSuccess(lines) 1876 v9.CheckDefAndScriptSuccess(lines)
1877 1877
1878 CheckDefAndScriptFailure(['v:true = true'], 'E46:', 1) 1878 v9.CheckDefAndScriptFailure(['v:true = true'], 'E46:', 1)
1879 CheckDefAndScriptFailure(['v:true = false'], 'E46:', 1) 1879 v9.CheckDefAndScriptFailure(['v:true = false'], 'E46:', 1)
1880 CheckDefAndScriptFailure(['v:false = true'], 'E46:', 1) 1880 v9.CheckDefAndScriptFailure(['v:false = true'], 'E46:', 1)
1881 CheckDefAndScriptFailure(['v:null = 11'], 'E46:', 1) 1881 v9.CheckDefAndScriptFailure(['v:null = 11'], 'E46:', 1)
1882 CheckDefAndScriptFailure(['v:none = 22'], 'E46:', 1) 1882 v9.CheckDefAndScriptFailure(['v:none = 22'], 'E46:', 1)
1883 enddef 1883 enddef
1884 1884
1885 def Test_expr8_list() 1885 def Test_expr8_list()
1886 # list 1886 # list
1887 var lines =<< trim END 1887 var lines =<< trim END
1906 1906
1907 var llstring: list<list<string>> = [['text'], []] 1907 var llstring: list<list<string>> = [['text'], []]
1908 llstring = [[], ['text']] 1908 llstring = [[], ['text']]
1909 llstring = [[], []] 1909 llstring = [[], []]
1910 END 1910 END
1911 CheckDefAndScriptSuccess(lines) 1911 v9.CheckDefAndScriptSuccess(lines)
1912 1912
1913 var rangelist: list<number> = range(3) 1913 var rangelist: list<number> = range(3)
1914 g:rangelist = range(3) 1914 g:rangelist = range(3)
1915 CheckDefExecAndScriptFailure(["var x: list<string> = g:rangelist"], 'E1012: Type mismatch; expected list<string> but got list<number>', 1) 1915 v9.CheckDefExecAndScriptFailure(["var x: list<string> = g:rangelist"], 'E1012: Type mismatch; expected list<string> but got list<number>', 1)
1916 1916
1917 CheckDefAndScriptFailure(["var x = 1234[3]"], ['E1107:', 'E1062:'], 1) 1917 v9.CheckDefAndScriptFailure(["var x = 1234[3]"], ['E1107:', 'E1062:'], 1)
1918 CheckDefExecAndScriptFailure(["var x = g:anint[3]"], 'E1062:', 1) 1918 v9.CheckDefExecAndScriptFailure(["var x = g:anint[3]"], 'E1062:', 1)
1919 1919
1920 CheckDefAndScriptFailure(["var x = g:list_mixed[xxx]"], ['E1001:', 'E121:'], 1) 1920 v9.CheckDefAndScriptFailure(["var x = g:list_mixed[xxx]"], ['E1001:', 'E121:'], 1)
1921 1921
1922 CheckDefAndScriptFailure(["var x = [1,2,3]"], 'E1069:', 1) 1922 v9.CheckDefAndScriptFailure(["var x = [1,2,3]"], 'E1069:', 1)
1923 CheckDefAndScriptFailure(["var x = [1 ,2, 3]"], 'E1068:', 1) 1923 v9.CheckDefAndScriptFailure(["var x = [1 ,2, 3]"], 'E1068:', 1)
1924 1924
1925 CheckDefExecAndScriptFailure(["echo 1", "var x = [][0]", "echo 3"], 'E684:', 2) 1925 v9.CheckDefExecAndScriptFailure(["echo 1", "var x = [][0]", "echo 3"], 'E684:', 2)
1926 1926
1927 CheckDefExecAndScriptFailure(["var x = g:list_mixed['xx']"], ['E1012:', 'E1030:'], 1) 1927 v9.CheckDefExecAndScriptFailure(["var x = g:list_mixed['xx']"], ['E1012:', 'E1030:'], 1)
1928 CheckDefFailure(["var x = g:list_mixed["], 'E1097:', 3) 1928 v9.CheckDefFailure(["var x = g:list_mixed["], 'E1097:', 3)
1929 CheckScriptFailure(['vim9script', "var x = g:list_mixed["], 'E15:', 2) 1929 v9.CheckScriptFailure(['vim9script', "var x = g:list_mixed["], 'E15:', 2)
1930 CheckDefFailure(["var x = g:list_mixed[0"], 'E1097:', 3) 1930 v9.CheckDefFailure(["var x = g:list_mixed[0"], 'E1097:', 3)
1931 CheckScriptFailure(['vim9script', "var x = g:list_mixed[0"], 'E111:', 2) 1931 v9.CheckScriptFailure(['vim9script', "var x = g:list_mixed[0"], 'E111:', 2)
1932 CheckDefExecAndScriptFailure(["var x = g:list_empty[3]"], 'E684:', 1) 1932 v9.CheckDefExecAndScriptFailure(["var x = g:list_empty[3]"], 'E684:', 1)
1933 CheckDefExecAndScriptFailure(["var l: list<number> = [234, 'x']"], 'E1012:', 1) 1933 v9.CheckDefExecAndScriptFailure(["var l: list<number> = [234, 'x']"], 'E1012:', 1)
1934 CheckDefExecAndScriptFailure(["var l: list<number> = ['x', 234]"], 'E1012:', 1) 1934 v9.CheckDefExecAndScriptFailure(["var l: list<number> = ['x', 234]"], 'E1012:', 1)
1935 CheckDefExecAndScriptFailure(["var l: list<string> = [234, 'x']"], 'E1012:', 1) 1935 v9.CheckDefExecAndScriptFailure(["var l: list<string> = [234, 'x']"], 'E1012:', 1)
1936 CheckDefExecAndScriptFailure(["var l: list<string> = ['x', 123]"], 'E1012:', 1) 1936 v9.CheckDefExecAndScriptFailure(["var l: list<string> = ['x', 123]"], 'E1012:', 1)
1937 1937
1938 lines =<< trim END 1938 lines =<< trim END
1939 var datalist: list<string> 1939 var datalist: list<string>
1940 def Main() 1940 def Main()
1941 datalist += ['x'. 1941 datalist += ['x'.
1942 enddef 1942 enddef
1943 Main() 1943 Main()
1944 END 1944 END
1945 CheckDefAndScriptFailure(lines, 'E1127:') 1945 v9.CheckDefAndScriptFailure(lines, 'E1127:')
1946 1946
1947 lines =<< trim END 1947 lines =<< trim END
1948 var numbers = [1, 2, 3, 4] 1948 var numbers = [1, 2, 3, 4]
1949 var a = 1 1949 var a = 1
1950 var b = 2 1950 var b = 2
1951 END 1951 END
1952 CheckDefAndScriptFailure(lines + ['echo numbers[1:b]'], 1952 v9.CheckDefAndScriptFailure(lines + ['echo numbers[1:b]'],
1953 'E1004: White space required before and after '':'' at ":b]"', 4) 1953 'E1004: White space required before and after '':'' at ":b]"', 4)
1954 CheckDefAndScriptFailure(lines + ['echo numbers[1: b]'], 'E1004:', 4) 1954 v9.CheckDefAndScriptFailure(lines + ['echo numbers[1: b]'], 'E1004:', 4)
1955 CheckDefAndScriptFailure(lines + ['echo numbers[a :b]'], 'E1004:', 4) 1955 v9.CheckDefAndScriptFailure(lines + ['echo numbers[a :b]'], 'E1004:', 4)
1956 enddef 1956 enddef
1957 1957
1958 def Test_expr8_list_vim9script() 1958 def Test_expr8_list_vim9script()
1959 var lines =<< trim END 1959 var lines =<< trim END
1960 var l = [ 1960 var l = [
1971 # comment 1971 # comment
1972 2] [3, 1972 2] [3,
1973 # comment 1973 # comment
1974 4] 1974 4]
1975 END 1975 END
1976 CheckDefAndScriptSuccess(lines) 1976 v9.CheckDefAndScriptSuccess(lines)
1977 1977
1978 lines =<< trim END 1978 lines =<< trim END
1979 var l = [11, 1979 var l = [11,
1980 22] 1980 22]
1981 assert_equal([11, 22], l) 1981 assert_equal([11, 22], l)
1982 END 1982 END
1983 CheckDefAndScriptSuccess(lines) 1983 v9.CheckDefAndScriptSuccess(lines)
1984 1984
1985 lines =<< trim END 1985 lines =<< trim END
1986 var l = [11,22] 1986 var l = [11,22]
1987 END 1987 END
1988 CheckDefAndScriptFailure(lines, 'E1069:', 1) 1988 v9.CheckDefAndScriptFailure(lines, 'E1069:', 1)
1989 1989
1990 lines =<< trim END 1990 lines =<< trim END
1991 var l = [11 , 22] 1991 var l = [11 , 22]
1992 END 1992 END
1993 CheckDefAndScriptFailure(lines, 'E1068:', 1) 1993 v9.CheckDefAndScriptFailure(lines, 'E1068:', 1)
1994 1994
1995 lines =<< trim END 1995 lines =<< trim END
1996 var l: list<number> = [234, 'x'] 1996 var l: list<number> = [234, 'x']
1997 END 1997 END
1998 CheckDefAndScriptFailure(lines, 'E1012:', 1) 1998 v9.CheckDefAndScriptFailure(lines, 'E1012:', 1)
1999 1999
2000 lines =<< trim END 2000 lines =<< trim END
2001 var l: list<number> = ['x', 234] 2001 var l: list<number> = ['x', 234]
2002 END 2002 END
2003 CheckDefAndScriptFailure(lines, 'E1012:', 1) 2003 v9.CheckDefAndScriptFailure(lines, 'E1012:', 1)
2004 2004
2005 lines =<< trim END 2005 lines =<< trim END
2006 var l: list<string> = ['x', 234] 2006 var l: list<string> = ['x', 234]
2007 END 2007 END
2008 CheckDefAndScriptFailure(lines, 'E1012:', 1) 2008 v9.CheckDefAndScriptFailure(lines, 'E1012:', 1)
2009 2009
2010 lines =<< trim END 2010 lines =<< trim END
2011 var l: list<string> = [234, 'x'] 2011 var l: list<string> = [234, 'x']
2012 END 2012 END
2013 CheckDefAndScriptFailure(lines, 'E1012:', 1) 2013 v9.CheckDefAndScriptFailure(lines, 'E1012:', 1)
2014 2014
2015 lines =<< trim END 2015 lines =<< trim END
2016 def Failing() 2016 def Failing()
2017 job_stop() 2017 job_stop()
2018 enddef 2018 enddef
2019 var list = [Failing] 2019 var list = [Failing]
2020 END 2020 END
2021 if has('channel') 2021 if has('channel')
2022 CheckDefAndScriptFailure(lines, 'E119:', 0) 2022 v9.CheckDefAndScriptFailure(lines, 'E119:', 0)
2023 else 2023 else
2024 CheckDefAndScriptFailure(lines, 'E117:', 0) 2024 v9.CheckDefAndScriptFailure(lines, 'E117:', 0)
2025 endif 2025 endif
2026 enddef 2026 enddef
2027 2027
2028 def LambdaWithComments(): func 2028 def LambdaWithComments(): func
2029 return (x) => 2029 return (x) =>
2082 2082
2083 dl = [{key: 12}, {['foo']: 34}] 2083 dl = [{key: 12}, {['foo']: 34}]
2084 assert_equal([{key: 12}], filter(dl, 2084 assert_equal([{key: 12}], filter(dl,
2085 (_, v) => has_key(v, 'key') ? v['key'] == 12 : 0)) 2085 (_, v) => has_key(v, 'key') ? v['key'] == 12 : 0))
2086 2086
2087 assert_equal(false, LambdaWithComments()(0)) 2087 assert_equal(false, g:LambdaWithComments()(0))
2088 assert_equal(true, LambdaWithComments()(1)) 2088 assert_equal(true, g:LambdaWithComments()(1))
2089 assert_equal(true, LambdaWithComments()(2)) 2089 assert_equal(true, g:LambdaWithComments()(2))
2090 assert_equal(false, LambdaWithComments()(3)) 2090 assert_equal(false, g:LambdaWithComments()(3))
2091 2091
2092 assert_equal(false, LambdaUsingArg(0)()) 2092 assert_equal(false, g:LambdaUsingArg(0)())
2093 assert_equal(true, LambdaUsingArg(1)()) 2093 assert_equal(true, g:LambdaUsingArg(1)())
2094 2094
2095 var res = map([1, 2, 3], (i: number, v: number) => i + v) 2095 var res = map([1, 2, 3], (i: number, v: number) => i + v)
2096 assert_equal([1, 3, 5], res) 2096 assert_equal([1, 3, 5], res)
2097 END 2097 END
2098 CheckDefAndScriptSuccess(lines) 2098 v9.CheckDefAndScriptSuccess(lines)
2099 2099
2100 CheckDefAndScriptFailure(["var Ref = (a)=>a + 1"], 'E1004:') 2100 v9.CheckDefAndScriptFailure(["var Ref = (a)=>a + 1"], 'E1004:')
2101 CheckDefAndScriptFailure(["var Ref = (a)=> a + 1"], 'E1004: White space required before and after ''=>'' at "=> a + 1"') 2101 v9.CheckDefAndScriptFailure(["var Ref = (a)=> a + 1"], 'E1004: White space required before and after ''=>'' at "=> a + 1"')
2102 CheckDefAndScriptFailure(["var Ref = (a) =>a + 1"], 'E1004:') 2102 v9.CheckDefAndScriptFailure(["var Ref = (a) =>a + 1"], 'E1004:')
2103 CheckDefAndScriptFailure(["var Ref = (a) =< a + 1"], ['E1001:', 'E121:']) 2103 v9.CheckDefAndScriptFailure(["var Ref = (a) =< a + 1"], ['E1001:', 'E121:'])
2104 CheckDefAndScriptFailure(["var Ref = (a: int) => a + 1"], 'E1010:') 2104 v9.CheckDefAndScriptFailure(["var Ref = (a: int) => a + 1"], 'E1010:')
2105 CheckDefAndScriptFailure(["var Ref = (a): int => a + 1"], 'E1010:') 2105 v9.CheckDefAndScriptFailure(["var Ref = (a): int => a + 1"], 'E1010:')
2106 2106
2107 CheckDefAndScriptFailure(["filter([1, 2], (k,v) => 1)"], 'E1069:', 1) 2107 v9.CheckDefAndScriptFailure(["filter([1, 2], (k,v) => 1)"], 'E1069:', 1)
2108 # error is in first line of the lambda 2108 # error is in first line of the lambda
2109 CheckDefAndScriptFailure(["var L = (a) => a + b"], 'E1001:', 0) 2109 v9.CheckDefAndScriptFailure(["var L = (a) => a + b"], 'E1001:', 0)
2110 2110
2111 assert_equal('xxxyyy', 'xxx'->((a, b) => a .. b)('yyy')) 2111 assert_equal('xxxyyy', 'xxx'->((a, b) => a .. b)('yyy'))
2112 2112
2113 CheckDefExecFailure(["var s = 'asdf'->((a) => a)('x')"], 'E118:') 2113 v9.CheckDefExecFailure(["var s = 'asdf'->((a) => a)('x')"], 'E118:')
2114 CheckDefExecFailure(["var s = 'asdf'->((a) => a)('x', 'y')"], 'E118:') 2114 v9.CheckDefExecFailure(["var s = 'asdf'->((a) => a)('x', 'y')"], 'E118:')
2115 CheckDefAndScriptFailure(["echo 'asdf'->((a) => a)(x)"], ['E1001:', 'E121:'], 1) 2115 v9.CheckDefAndScriptFailure(["echo 'asdf'->((a) => a)(x)"], ['E1001:', 'E121:'], 1)
2116 2116
2117 CheckDefAndScriptSuccess(['var Fx = (a) => ({k1: 0,', ' k2: 1})']) 2117 v9.CheckDefAndScriptSuccess(['var Fx = (a) => ({k1: 0,', ' k2: 1})'])
2118 CheckDefAndScriptFailure(['var Fx = (a) => ({k1: 0', ' k2: 1})'], 'E722:', 2) 2118 v9.CheckDefAndScriptFailure(['var Fx = (a) => ({k1: 0', ' k2: 1})'], 'E722:', 2)
2119 CheckDefAndScriptFailure(['var Fx = (a) => ({k1: 0,', ' k2 1})'], 'E720:', 2) 2119 v9.CheckDefAndScriptFailure(['var Fx = (a) => ({k1: 0,', ' k2 1})'], 'E720:', 2)
2120 2120
2121 CheckDefAndScriptSuccess(['var Fx = (a) => [0,', ' 1]']) 2121 v9.CheckDefAndScriptSuccess(['var Fx = (a) => [0,', ' 1]'])
2122 CheckDefAndScriptFailure(['var Fx = (a) => [0', ' 1]'], 'E696:', 2) 2122 v9.CheckDefAndScriptFailure(['var Fx = (a) => [0', ' 1]'], 'E696:', 2)
2123 2123
2124 # no error for existing script variable when checking for lambda 2124 # no error for existing script variable when checking for lambda
2125 lines =<< trim END 2125 lines =<< trim END
2126 var name = 0 2126 var name = 0
2127 eval (name + 2) / 3 2127 eval (name + 2) / 3
2128 END 2128 END
2129 CheckDefAndScriptSuccess(lines) 2129 v9.CheckDefAndScriptSuccess(lines)
2130 enddef 2130 enddef
2131 2131
2132 def Test_expr8_lambda_block() 2132 def Test_expr8_lambda_block()
2133 var lines =<< trim END 2133 var lines =<< trim END
2134 var Func = (s: string): string => { 2134 var Func = (s: string): string => {
2152 sandbox var Safe = (nr: number): number => { 2152 sandbox var Safe = (nr: number): number => {
2153 return nr + 7 2153 return nr + 7
2154 } 2154 }
2155 assert_equal(10, Safe(3)) 2155 assert_equal(10, Safe(3))
2156 END 2156 END
2157 CheckDefAndScriptSuccess(lines) 2157 v9.CheckDefAndScriptSuccess(lines)
2158 2158
2159 lines =<< trim END 2159 lines =<< trim END
2160 map([1, 2], (k, v) => { redrawt }) 2160 map([1, 2], (k, v) => { redrawt })
2161 END 2161 END
2162 CheckDefAndScriptFailure(lines, 'E488') 2162 v9.CheckDefAndScriptFailure(lines, 'E488')
2163 2163
2164 lines =<< trim END 2164 lines =<< trim END
2165 var Func = (nr: int) => { 2165 var Func = (nr: int) => {
2166 echo nr 2166 echo nr
2167 } 2167 }
2168 END 2168 END
2169 CheckDefAndScriptFailure(lines, 'E1010', 1) 2169 v9.CheckDefAndScriptFailure(lines, 'E1010', 1)
2170 2170
2171 lines =<< trim END 2171 lines =<< trim END
2172 var Func = (nr: number): int => { 2172 var Func = (nr: number): int => {
2173 return nr 2173 return nr
2174 } 2174 }
2175 END 2175 END
2176 CheckDefAndScriptFailure(lines, 'E1010', 1) 2176 v9.CheckDefAndScriptFailure(lines, 'E1010', 1)
2177 2177
2178 lines =<< trim END 2178 lines =<< trim END
2179 var Func = (nr: number): int => { 2179 var Func = (nr: number): int => {
2180 return nr 2180 return nr
2181 END 2181 END
2182 CheckDefFailure(lines, 'E1171', 0) # line nr is function start 2182 v9.CheckDefFailure(lines, 'E1171', 0) # line nr is function start
2183 CheckScriptFailure(['vim9script'] + lines, 'E1171', 2) 2183 v9.CheckScriptFailure(['vim9script'] + lines, 'E1171', 2)
2184 2184
2185 lines =<< trim END 2185 lines =<< trim END
2186 var Func = (nr: number): int => { 2186 var Func = (nr: number): int => {
2187 var ll =<< ENDIT 2187 var ll =<< ENDIT
2188 nothing 2188 nothing
2189 END 2189 END
2190 CheckDefFailure(lines, 'E1145: Missing heredoc end marker: ENDIT', 0) 2190 v9.CheckDefFailure(lines, 'E1145: Missing heredoc end marker: ENDIT', 0)
2191 CheckScriptFailure(['vim9script'] + lines, 'E1145: Missing heredoc end marker: ENDIT', 2) 2191 v9.CheckScriptFailure(['vim9script'] + lines, 'E1145: Missing heredoc end marker: ENDIT', 2)
2192 enddef 2192 enddef
2193 2193
2194 def NewLambdaWithComments(): func 2194 def NewLambdaWithComments(): func
2195 return (x) => 2195 return (x) =>
2196 # some comment 2196 # some comment
2241 2241
2242 dl = [{key: 12}, {['foo']: 34}] 2242 dl = [{key: 12}, {['foo']: 34}]
2243 assert_equal([{key: 12}], filter(dl, 2243 assert_equal([{key: 12}], filter(dl,
2244 (_, v) => has_key(v, 'key') ? v['key'] == 12 : 0)) 2244 (_, v) => has_key(v, 'key') ? v['key'] == 12 : 0))
2245 2245
2246 assert_equal(false, NewLambdaWithComments()(0)) 2246 assert_equal(false, g:NewLambdaWithComments()(0))
2247 assert_equal(true, NewLambdaWithComments()(1)) 2247 assert_equal(true, g:NewLambdaWithComments()(1))
2248 assert_equal(true, NewLambdaWithComments()(2)) 2248 assert_equal(true, g:NewLambdaWithComments()(2))
2249 assert_equal(false, NewLambdaWithComments()(3)) 2249 assert_equal(false, g:NewLambdaWithComments()(3))
2250 2250
2251 assert_equal(false, NewLambdaUsingArg(0)()) 2251 assert_equal(false, g:NewLambdaUsingArg(0)())
2252 assert_equal(true, NewLambdaUsingArg(1)()) 2252 assert_equal(true, g:NewLambdaUsingArg(1)())
2253 2253
2254 var res = map([1, 2, 3], (i: number, v: number) => i + v) 2254 var res = map([1, 2, 3], (i: number, v: number) => i + v)
2255 assert_equal([1, 3, 5], res) 2255 assert_equal([1, 3, 5], res)
2256 2256
2257 # Lambda returning a dict 2257 # Lambda returning a dict
2264 var Fx = (a) => ({k1: 0, 2264 var Fx = (a) => ({k1: 0,
2265 k2: 1}) 2265 k2: 1})
2266 var Fy = (a) => [0, 2266 var Fy = (a) => [0,
2267 1] 2267 1]
2268 END 2268 END
2269 CheckDefAndScriptSuccess(lines) 2269 v9.CheckDefAndScriptSuccess(lines)
2270 2270
2271 CheckDefAndScriptFailure(["var Ref = (a)=>a + 1"], 'E1004:') 2271 v9.CheckDefAndScriptFailure(["var Ref = (a)=>a + 1"], 'E1004:')
2272 CheckDefAndScriptFailure(["var Ref = (a)=> a + 1"], 'E1004:') 2272 v9.CheckDefAndScriptFailure(["var Ref = (a)=> a + 1"], 'E1004:')
2273 CheckDefAndScriptFailure(["var Ref = (a) =>a + 1"], 2273 v9.CheckDefAndScriptFailure(["var Ref = (a) =>a + 1"],
2274 'E1004: White space required before and after ''=>'' at " =>a + 1"') 2274 'E1004: White space required before and after ''=>'' at " =>a + 1"')
2275 2275
2276 CheckDefAndScriptFailure(["var Ref: func(number): number = (a: number): string => 'x'"], 'E1012:') 2276 v9.CheckDefAndScriptFailure(["var Ref: func(number): number = (a: number): string => 'x'"], 'E1012:')
2277 CheckDefAndScriptFailure(["var Ref: func(number): string = (a: number): string => 99"], 'E1012:') 2277 v9.CheckDefAndScriptFailure(["var Ref: func(number): string = (a: number): string => 99"], 'E1012:')
2278 2278
2279 CheckDefAndScriptFailure(["filter([1, 2], (k,v) => 1)"], 'E1069:', 1) 2279 v9.CheckDefAndScriptFailure(["filter([1, 2], (k,v) => 1)"], 'E1069:', 1)
2280 # error is in first line of the lambda 2280 # error is in first line of the lambda
2281 CheckDefAndScriptFailure(["var L = (a) -> a + b"], ['E1001:', 'E121:'], 1) 2281 v9.CheckDefAndScriptFailure(["var L = (a) -> a + b"], ['E1001:', 'E121:'], 1)
2282 2282
2283 assert_equal('xxxyyy', 'xxx'->((a, b) => a .. b)('yyy')) 2283 assert_equal('xxxyyy', 'xxx'->((a, b) => a .. b)('yyy'))
2284 2284
2285 CheckDefExecFailure(["var s = 'asdf'->((a) => a)('x')"], 2285 v9.CheckDefExecFailure(["var s = 'asdf'->((a) => a)('x')"],
2286 'E118: Too many arguments for function:') 2286 'E118: Too many arguments for function:')
2287 CheckDefExecFailure(["var s = 'asdf'->((a) => a)('x', 'y')"], 2287 v9.CheckDefExecFailure(["var s = 'asdf'->((a) => a)('x', 'y')"],
2288 'E118: Too many arguments for function:') 2288 'E118: Too many arguments for function:')
2289 CheckDefFailure(["echo 'asdf'->((a) => a)(x)"], 'E1001:', 1) 2289 v9.CheckDefFailure(["echo 'asdf'->((a) => a)(x)"], 'E1001:', 1)
2290 2290
2291 CheckDefAndScriptFailure(['var Fx = (a) => ({k1: 0', ' k2: 1})'], 'E722:', 2) 2291 v9.CheckDefAndScriptFailure(['var Fx = (a) => ({k1: 0', ' k2: 1})'], 'E722:', 2)
2292 CheckDefAndScriptFailure(['var Fx = (a) => ({k1: 0,', ' k2 1})'], 'E720:', 2) 2292 v9.CheckDefAndScriptFailure(['var Fx = (a) => ({k1: 0,', ' k2 1})'], 'E720:', 2)
2293 2293
2294 CheckDefAndScriptFailure(['var Fx = (a) => [0', ' 1]'], 'E696:', 2) 2294 v9.CheckDefAndScriptFailure(['var Fx = (a) => [0', ' 1]'], 'E696:', 2)
2295 enddef 2295 enddef
2296 2296
2297 def Test_expr8_lambda_vim9script() 2297 def Test_expr8_lambda_vim9script()
2298 var lines =<< trim END 2298 var lines =<< trim END
2299 var v = 10->((a) => 2299 var v = 10->((a) =>
2300 a 2300 a
2301 + 2 2301 + 2
2302 )() 2302 )()
2303 assert_equal(12, v) 2303 assert_equal(12, v)
2304 END 2304 END
2305 CheckDefAndScriptSuccess(lines) 2305 v9.CheckDefAndScriptSuccess(lines)
2306 2306
2307 # nested lambda with line breaks 2307 # nested lambda with line breaks
2308 lines =<< trim END 2308 lines =<< trim END
2309 search('"', 'cW', 0, 0, () => 2309 search('"', 'cW', 0, 0, () =>
2310 synstack('.', col('.')) 2310 synstack('.', col('.'))
2311 ->mapnew((_, v) => synIDattr(v, 'name'))->len()) 2311 ->mapnew((_, v) => synIDattr(v, 'name'))->len())
2312 END 2312 END
2313 CheckDefAndScriptSuccess(lines) 2313 v9.CheckDefAndScriptSuccess(lines)
2314 enddef 2314 enddef
2315 2315
2316 def Test_expr8_funcref() 2316 def Test_expr8_funcref()
2317 var lines =<< trim END 2317 var lines =<< trim END
2318 def RetNumber(): number 2318 def RetNumber(): number
2319 return 123 2319 return 123
2320 enddef 2320 enddef
2321 var FuncRef = RetNumber 2321 var FuncRef = RetNumber
2322 assert_equal(123, FuncRef()) 2322 assert_equal(123, FuncRef())
2323 END 2323 END
2324 CheckDefAndScriptSuccess(lines) 2324 v9.CheckDefAndScriptSuccess(lines)
2325 2325
2326 lines =<< trim END 2326 lines =<< trim END
2327 vim9script 2327 vim9script
2328 func g:GlobalFunc() 2328 func g:GlobalFunc()
2329 return 'global' 2329 return 'global'
2342 Ref = ScriptFunc 2342 Ref = ScriptFunc
2343 assert_equal('script', Ref()) 2343 assert_equal('script', Ref())
2344 enddef 2344 enddef
2345 Test() 2345 Test()
2346 END 2346 END
2347 CheckScriptSuccess(lines) 2347 v9.CheckScriptSuccess(lines)
2348 enddef 2348 enddef
2349 2349
2350 let g:test_space_dict = {'': 'empty', ' ': 'space'} 2350 let g:test_space_dict = {'': 'empty', ' ': 'space'}
2351 let g:test_hash_dict = #{one: 1, two: 2} 2351 let g:test_hash_dict = #{one: 1, two: 2}
2352 2352
2423 2423
2424 # comment to start fold is OK 2424 # comment to start fold is OK
2425 var x1: number #{{ fold 2425 var x1: number #{{ fold
2426 var x2 = 9 #{{ fold 2426 var x2 = 9 #{{ fold
2427 END 2427 END
2428 CheckDefAndScriptSuccess(lines) 2428 v9.CheckDefAndScriptSuccess(lines)
2429 2429
2430 # legacy syntax doesn't work 2430 # legacy syntax doesn't work
2431 CheckDefAndScriptFailure(["var x = #{key: 8}"], 'E1170:', 1) 2431 v9.CheckDefAndScriptFailure(["var x = #{key: 8}"], 'E1170:', 1)
2432 CheckDefAndScriptFailure(["var x = 'a' #{a: 1}"], 'E1170:', 1) 2432 v9.CheckDefAndScriptFailure(["var x = 'a' #{a: 1}"], 'E1170:', 1)
2433 CheckDefAndScriptFailure(["var x = 'a' .. #{a: 1}"], 'E1170:', 1) 2433 v9.CheckDefAndScriptFailure(["var x = 'a' .. #{a: 1}"], 'E1170:', 1)
2434 CheckDefAndScriptFailure(["var x = true ? #{a: 1}"], 'E1170:', 1) 2434 v9.CheckDefAndScriptFailure(["var x = true ? #{a: 1}"], 'E1170:', 1)
2435 2435
2436 CheckDefAndScriptFailure(["var x = {a:8}"], 'E1069:', 1) 2436 v9.CheckDefAndScriptFailure(["var x = {a:8}"], 'E1069:', 1)
2437 CheckDefAndScriptFailure(["var x = {a : 8}"], 'E1068:', 1) 2437 v9.CheckDefAndScriptFailure(["var x = {a : 8}"], 'E1068:', 1)
2438 CheckDefAndScriptFailure(["var x = {a :8}"], 'E1068:', 1) 2438 v9.CheckDefAndScriptFailure(["var x = {a :8}"], 'E1068:', 1)
2439 CheckDefAndScriptFailure(["var x = {a: 8 , b: 9}"], 'E1068:', 1) 2439 v9.CheckDefAndScriptFailure(["var x = {a: 8 , b: 9}"], 'E1068:', 1)
2440 CheckDefAndScriptFailure(["var x = {a: 1,b: 2}"], 'E1069:', 1) 2440 v9.CheckDefAndScriptFailure(["var x = {a: 1,b: 2}"], 'E1069:', 1)
2441 2441
2442 CheckDefAndScriptFailure(["var x = {xxx}"], 'E720:', 1) 2442 v9.CheckDefAndScriptFailure(["var x = {xxx}"], 'E720:', 1)
2443 CheckDefAndScriptFailure(["var x = {xxx: 1", "var y = 2"], 'E722:', 2) 2443 v9.CheckDefAndScriptFailure(["var x = {xxx: 1", "var y = 2"], 'E722:', 2)
2444 CheckDefFailure(["var x = {xxx: 1,"], 'E723:', 2) 2444 v9.CheckDefFailure(["var x = {xxx: 1,"], 'E723:', 2)
2445 CheckScriptFailure(['vim9script', "var x = {xxx: 1,"], 'E723:', 2) 2445 v9.CheckScriptFailure(['vim9script', "var x = {xxx: 1,"], 'E723:', 2)
2446 CheckDefAndScriptFailure(["var x = {['a']: xxx}"], ['E1001:', 'E121:'], 1) 2446 v9.CheckDefAndScriptFailure(["var x = {['a']: xxx}"], ['E1001:', 'E121:'], 1)
2447 CheckDefAndScriptFailure(["var x = {a: 1, a: 2}"], 'E721:', 1) 2447 v9.CheckDefAndScriptFailure(["var x = {a: 1, a: 2}"], 'E721:', 1)
2448 CheckDefExecAndScriptFailure(["var x = g:anint.member"], ['E715:', 'E488:'], 1) 2448 v9.CheckDefExecAndScriptFailure(["var x = g:anint.member"], ['E715:', 'E488:'], 1)
2449 CheckDefExecAndScriptFailure(["var x = g:dict_empty.member"], 'E716:', 1) 2449 v9.CheckDefExecAndScriptFailure(["var x = g:dict_empty.member"], 'E716:', 1)
2450 2450
2451 CheckDefExecAndScriptFailure(['var x: dict<number> = {a: 234, b: "1"}'], 'E1012:', 1) 2451 v9.CheckDefExecAndScriptFailure(['var x: dict<number> = {a: 234, b: "1"}'], 'E1012:', 1)
2452 CheckDefExecAndScriptFailure(['var x: dict<number> = {a: "x", b: 134}'], 'E1012:', 1) 2452 v9.CheckDefExecAndScriptFailure(['var x: dict<number> = {a: "x", b: 134}'], 'E1012:', 1)
2453 CheckDefExecAndScriptFailure(['var x: dict<string> = {a: 234, b: "1"}'], 'E1012:', 1) 2453 v9.CheckDefExecAndScriptFailure(['var x: dict<string> = {a: 234, b: "1"}'], 'E1012:', 1)
2454 CheckDefExecAndScriptFailure(['var x: dict<string> = {a: "x", b: 134}'], 'E1012:', 1) 2454 v9.CheckDefExecAndScriptFailure(['var x: dict<string> = {a: "x", b: 134}'], 'E1012:', 1)
2455 2455
2456 # invalid types for the key 2456 # invalid types for the key
2457 CheckDefAndScriptFailure(["var x = {[[1, 2]]: 0}"], ['E1105:', 'E730:'], 1) 2457 v9.CheckDefAndScriptFailure(["var x = {[[1, 2]]: 0}"], ['E1105:', 'E730:'], 1)
2458 2458
2459 CheckDefFailure(['var x = ({'], 'E723:', 2) 2459 v9.CheckDefFailure(['var x = ({'], 'E723:', 2)
2460 CheckScriptFailure(['vim9script', 'var x = ({'], 'E723:', 2) 2460 v9.CheckScriptFailure(['vim9script', 'var x = ({'], 'E723:', 2)
2461 CheckDefExecAndScriptFailure(['{}[getftype("file")]'], 'E716: Key not present in Dictionary: ""', 1) 2461 v9.CheckDefExecAndScriptFailure(['{}[getftype("file")]'], 'E716: Key not present in Dictionary: ""', 1)
2462 enddef 2462 enddef
2463 2463
2464 def Test_expr8_dict_vim9script() 2464 def Test_expr8_dict_vim9script()
2465 var lines =<< trim END 2465 var lines =<< trim END
2466 var d = { 2466 var d = {
2482 assert_equal({one: 1, two: 2}, d) 2482 assert_equal({one: 1, two: 2}, d)
2483 2483
2484 var dd = {k: 123->len()} 2484 var dd = {k: 123->len()}
2485 assert_equal(3, dd.k) 2485 assert_equal(3, dd.k)
2486 END 2486 END
2487 CheckDefAndScriptSuccess(lines) 2487 v9.CheckDefAndScriptSuccess(lines)
2488 2488
2489 lines =<< trim END 2489 lines =<< trim END
2490 var d = { ["one"]: "one", ["two"]: "two", } 2490 var d = { ["one"]: "one", ["two"]: "two", }
2491 assert_equal({one: 'one', two: 'two'}, d) 2491 assert_equal({one: 'one', two: 'two'}, d)
2492 END 2492 END
2493 CheckDefAndScriptSuccess(lines) 2493 v9.CheckDefAndScriptSuccess(lines)
2494 2494
2495 lines =<< trim END 2495 lines =<< trim END
2496 var d = {one: 1, 2496 var d = {one: 1,
2497 two: 2, 2497 two: 2,
2498 } 2498 }
2499 assert_equal({one: 1, two: 2}, d) 2499 assert_equal({one: 1, two: 2}, d)
2500 END 2500 END
2501 CheckDefAndScriptSuccess(lines) 2501 v9.CheckDefAndScriptSuccess(lines)
2502 2502
2503 lines =<< trim END 2503 lines =<< trim END
2504 var d = {one:1, two: 2} 2504 var d = {one:1, two: 2}
2505 END 2505 END
2506 CheckDefAndScriptFailure(lines, 'E1069:', 1) 2506 v9.CheckDefAndScriptFailure(lines, 'E1069:', 1)
2507 2507
2508 lines =<< trim END 2508 lines =<< trim END
2509 var d = {one: 1,two: 2} 2509 var d = {one: 1,two: 2}
2510 END 2510 END
2511 CheckDefAndScriptFailure(lines, 'E1069:', 1) 2511 v9.CheckDefAndScriptFailure(lines, 'E1069:', 1)
2512 2512
2513 lines =<< trim END 2513 lines =<< trim END
2514 var d = {one : 1} 2514 var d = {one : 1}
2515 END 2515 END
2516 CheckDefAndScriptFailure(lines, 'E1068:', 1) 2516 v9.CheckDefAndScriptFailure(lines, 'E1068:', 1)
2517 2517
2518 lines =<< trim END 2518 lines =<< trim END
2519 var d = {one:1} 2519 var d = {one:1}
2520 END 2520 END
2521 CheckDefAndScriptFailure(lines, 'E1069:', 1) 2521 v9.CheckDefAndScriptFailure(lines, 'E1069:', 1)
2522 2522
2523 lines =<< trim END 2523 lines =<< trim END
2524 var d = {one: 1 , two: 2} 2524 var d = {one: 1 , two: 2}
2525 END 2525 END
2526 CheckDefAndScriptFailure(lines, 'E1068:', 1) 2526 v9.CheckDefAndScriptFailure(lines, 'E1068:', 1)
2527 2527
2528 lines =<< trim END 2528 lines =<< trim END
2529 var l: dict<number> = {a: 234, b: 'x'} 2529 var l: dict<number> = {a: 234, b: 'x'}
2530 END 2530 END
2531 CheckDefAndScriptFailure(lines, 'E1012:', 1) 2531 v9.CheckDefAndScriptFailure(lines, 'E1012:', 1)
2532 2532
2533 lines =<< trim END 2533 lines =<< trim END
2534 var l: dict<number> = {a: 'x', b: 234} 2534 var l: dict<number> = {a: 'x', b: 234}
2535 END 2535 END
2536 CheckDefAndScriptFailure(lines, 'E1012:', 1) 2536 v9.CheckDefAndScriptFailure(lines, 'E1012:', 1)
2537 2537
2538 lines =<< trim END 2538 lines =<< trim END
2539 var l: dict<string> = {a: 'x', b: 234} 2539 var l: dict<string> = {a: 'x', b: 234}
2540 END 2540 END
2541 CheckDefAndScriptFailure(lines, 'E1012:', 1) 2541 v9.CheckDefAndScriptFailure(lines, 'E1012:', 1)
2542 2542
2543 lines =<< trim END 2543 lines =<< trim END
2544 var l: dict<string> = {a: 234, b: 'x'} 2544 var l: dict<string> = {a: 234, b: 'x'}
2545 END 2545 END
2546 CheckDefAndScriptFailure(lines, 'E1012:', 1) 2546 v9.CheckDefAndScriptFailure(lines, 'E1012:', 1)
2547 2547
2548 lines =<< trim END 2548 lines =<< trim END
2549 var d = {['a']: 234, ['b': 'x'} 2549 var d = {['a']: 234, ['b': 'x'}
2550 END 2550 END
2551 CheckDefAndScriptFailure(lines, 'E1139:', 1) 2551 v9.CheckDefAndScriptFailure(lines, 'E1139:', 1)
2552 2552
2553 lines =<< trim END 2553 lines =<< trim END
2554 def Func() 2554 def Func()
2555 var d = {['a']: 234, ['b': 'x'} 2555 var d = {['a']: 234, ['b': 'x'}
2556 enddef 2556 enddef
2557 defcompile 2557 defcompile
2558 END 2558 END
2559 CheckDefAndScriptFailure(lines, 'E1139:', 0) 2559 v9.CheckDefAndScriptFailure(lines, 'E1139:', 0)
2560 2560
2561 lines =<< trim END 2561 lines =<< trim END
2562 var d = {'a': 2562 var d = {'a':
2563 END 2563 END
2564 CheckDefFailure(lines, 'E723:', 2) 2564 v9.CheckDefFailure(lines, 'E723:', 2)
2565 CheckScriptFailure(['vim9script'] + lines, 'E15:', 2) 2565 v9.CheckScriptFailure(['vim9script'] + lines, 'E15:', 2)
2566 2566
2567 lines =<< trim END 2567 lines =<< trim END
2568 def Func() 2568 def Func()
2569 var d = {'a': 2569 var d = {'a':
2570 enddef 2570 enddef
2571 defcompile 2571 defcompile
2572 END 2572 END
2573 CheckDefAndScriptFailure(lines, 'E723:', 0) 2573 v9.CheckDefAndScriptFailure(lines, 'E723:', 0)
2574 2574
2575 lines =<< trim END 2575 lines =<< trim END
2576 def Failing() 2576 def Failing()
2577 job_stop() 2577 job_stop()
2578 enddef 2578 enddef
2579 var dict = {name: Failing} 2579 var dict = {name: Failing}
2580 END 2580 END
2581 if has('channel') 2581 if has('channel')
2582 CheckDefAndScriptFailure(lines, 'E119:', 0) 2582 v9.CheckDefAndScriptFailure(lines, 'E119:', 0)
2583 else 2583 else
2584 CheckDefAndScriptFailure(lines, 'E117:', 0) 2584 v9.CheckDefAndScriptFailure(lines, 'E117:', 0)
2585 endif 2585 endif
2586 2586
2587 lines =<< trim END 2587 lines =<< trim END
2588 vim9script 2588 vim9script
2589 var x = 99 2589 var x = 99
2590 assert_equal({x: 99}, s:) 2590 assert_equal({x: 99}, s:)
2591 END 2591 END
2592 CheckScriptSuccess(lines) 2592 v9.CheckScriptSuccess(lines)
2593 enddef 2593 enddef
2594 2594
2595 def Test_expr8_dict_in_block() 2595 def Test_expr8_dict_in_block()
2596 var lines =<< trim END 2596 var lines =<< trim END
2597 vim9script 2597 vim9script
2607 } 2607 }
2608 YourCommand 2608 YourCommand
2609 assert_equal({key: 'value'}, g:global) 2609 assert_equal({key: 'value'}, g:global)
2610 unlet g:global 2610 unlet g:global
2611 END 2611 END
2612 CheckScriptSuccess(lines) 2612 v9.CheckScriptSuccess(lines)
2613 2613
2614 delcommand MyCommand 2614 delcommand MyCommand
2615 delcommand YourCommand 2615 delcommand YourCommand
2616 enddef 2616 enddef
2617 2617
2629 BrokenCall(3, 0, 'ab') 2629 BrokenCall(3, 0, 'ab')
2630 enddef 2630 enddef
2631 2631
2632 TestBrokenCall() 2632 TestBrokenCall()
2633 END 2633 END
2634 CheckScriptSuccess(lines) 2634 v9.CheckScriptSuccess(lines)
2635 enddef 2635 enddef
2636 2636
2637 let g:oneString = 'one' 2637 let g:oneString = 'one'
2638 2638
2639 def Test_expr_member() 2639 def Test_expr_member()
2654 2654
2655 # getting the one member should clear the dict after getting the item 2655 # getting the one member should clear the dict after getting the item
2656 assert_equal('one', {one: 'one'}.one) 2656 assert_equal('one', {one: 'one'}.one)
2657 assert_equal('one', {one: 'one'}[g:oneString]) 2657 assert_equal('one', {one: 'one'}[g:oneString])
2658 END 2658 END
2659 CheckDefAndScriptSuccess(lines) 2659 v9.CheckDefAndScriptSuccess(lines)
2660 2660
2661 CheckDefAndScriptFailure(["var x = g:dict_one.#$!"], ['E1002:', 'E15:'], 1) 2661 v9.CheckDefAndScriptFailure(["var x = g:dict_one.#$!"], ['E1002:', 'E15:'], 1)
2662 CheckDefExecAndScriptFailure(["var d: dict<any>", "echo d['a']"], 'E716:', 2) 2662 v9.CheckDefExecAndScriptFailure(["var d: dict<any>", "echo d['a']"], 'E716:', 2)
2663 CheckDefExecAndScriptFailure(["var d: dict<number>", "d = g:list_empty"], 'E1012: Type mismatch; expected dict<number> but got list<unknown>', 2) 2663 v9.CheckDefExecAndScriptFailure(["var d: dict<number>", "d = g:list_empty"], 'E1012: Type mismatch; expected dict<number> but got list<unknown>', 2)
2664 enddef 2664 enddef
2665 2665
2666 def Test_expr8_any_index_slice() 2666 def Test_expr8_any_index_slice()
2667 var lines =<< trim END 2667 var lines =<< trim END
2668 # getting the one member should clear the list only after getting the item 2668 # getting the one member should clear the list only after getting the item
2754 g:testdict = {a: 1, b: 2} 2754 g:testdict = {a: 1, b: 2}
2755 assert_equal(1, g:testdict['a']) 2755 assert_equal(1, g:testdict['a'])
2756 assert_equal(2, g:testdict['b']) 2756 assert_equal(2, g:testdict['b'])
2757 END 2757 END
2758 2758
2759 CheckDefAndScriptSuccess(lines) 2759 v9.CheckDefAndScriptSuccess(lines)
2760 2760
2761 CheckDefExecAndScriptFailure(['echo g:testblob[2]'], 'E979:', 1) 2761 v9.CheckDefExecAndScriptFailure(['echo g:testblob[2]'], 'E979:', 1)
2762 CheckDefExecAndScriptFailure(['echo g:testblob[-3]'], 'E979:', 1) 2762 v9.CheckDefExecAndScriptFailure(['echo g:testblob[-3]'], 'E979:', 1)
2763 2763
2764 CheckDefExecAndScriptFailure(['echo g:testlist[4]'], 'E684: list index out of range: 4', 1) 2764 v9.CheckDefExecAndScriptFailure(['echo g:testlist[4]'], 'E684: list index out of range: 4', 1)
2765 CheckDefExecAndScriptFailure(['echo g:testlist[-5]'], 'E684:', 1) 2765 v9.CheckDefExecAndScriptFailure(['echo g:testlist[-5]'], 'E684:', 1)
2766 2766
2767 CheckDefExecAndScriptFailure(['echo g:testdict["a" : "b"]'], 'E719:', 1) 2767 v9.CheckDefExecAndScriptFailure(['echo g:testdict["a" : "b"]'], 'E719:', 1)
2768 CheckDefExecAndScriptFailure(['echo g:testdict[1]'], 'E716:', 1) 2768 v9.CheckDefExecAndScriptFailure(['echo g:testdict[1]'], 'E716:', 1)
2769 2769
2770 unlet g:teststring 2770 unlet g:teststring
2771 unlet g:testblob 2771 unlet g:testblob
2772 unlet g:testlist 2772 unlet g:testlist
2773 enddef 2773 enddef
2788 ._) 2788 ._)
2789 assert_equal('one', d[ 2789 assert_equal('one', d[
2790 'one' 2790 'one'
2791 ]) 2791 ])
2792 END 2792 END
2793 CheckDefAndScriptSuccess(lines) 2793 v9.CheckDefAndScriptSuccess(lines)
2794 2794
2795 lines =<< trim END 2795 lines =<< trim END
2796 var l = [1, 2796 var l = [1,
2797 2, 2797 2,
2798 3, 4 2798 3, 4
2808 assert_equal([3, 4], l[ 2808 assert_equal([3, 4], l[
2809 2 2809 2
2810 : 2810 :
2811 ]) 2811 ])
2812 END 2812 END
2813 CheckDefAndScriptSuccess(lines) 2813 v9.CheckDefAndScriptSuccess(lines)
2814 enddef 2814 enddef
2815 2815
2816 def SetSomeVar() 2816 def SetSomeVar()
2817 b:someVar = &fdm 2817 b:someVar = &fdm
2818 enddef 2818 enddef
2835 var bval: bool = &tgc 2835 var bval: bool = &tgc
2836 var nval: number = &ts 2836 var nval: number = &ts
2837 var sval: string = &path 2837 var sval: string = &path
2838 2838
2839 # check v_lock is cleared (requires using valgrind, doesn't always show) 2839 # check v_lock is cleared (requires using valgrind, doesn't always show)
2840 SetSomeVar() 2840 g:SetSomeVar()
2841 b:someVar = 0 2841 b:someVar = 0
2842 unlet b:someVar 2842 unlet b:someVar
2843 END 2843 END
2844 CheckDefAndScriptSuccess(lines) 2844 v9.CheckDefAndScriptSuccess(lines)
2845 enddef 2845 enddef
2846 2846
2847 def Test_expr8_environment() 2847 def Test_expr8_environment()
2848 var lines =<< trim END 2848 var lines =<< trim END
2849 # environment variable 2849 # environment variable
2850 assert_equal('testvar', $TESTVAR) 2850 assert_equal('testvar', $TESTVAR)
2851 assert_equal('', $ASDF_ASD_XXX) 2851 assert_equal('', $ASDF_ASD_XXX)
2852 END 2852 END
2853 CheckDefAndScriptSuccess(lines) 2853 v9.CheckDefAndScriptSuccess(lines)
2854 2854
2855 CheckDefAndScriptFailure(["var x = $$$"], ['E1002:', 'E15:'], 1) 2855 v9.CheckDefAndScriptFailure(["var x = $$$"], ['E1002:', 'E15:'], 1)
2856 CheckDefAndScriptFailure(["$"], ['E1002:', 'E15:'], 1) 2856 v9.CheckDefAndScriptFailure(["$"], ['E1002:', 'E15:'], 1)
2857 enddef 2857 enddef
2858 2858
2859 def Test_expr8_register() 2859 def Test_expr8_register()
2860 var lines =<< trim END 2860 var lines =<< trim END
2861 @a = 'register a' 2861 @a = 'register a'
2874 assert_equal('slash', @/) 2874 assert_equal('slash', @/)
2875 2875
2876 @= = 'equal' 2876 @= = 'equal'
2877 assert_equal('equal', @=) 2877 assert_equal('equal', @=)
2878 END 2878 END
2879 CheckDefAndScriptSuccess(lines) 2879 v9.CheckDefAndScriptSuccess(lines)
2880 2880
2881 CheckDefAndScriptFailure(["@. = 'yes'"], ['E354:', 'E488:'], 1) 2881 v9.CheckDefAndScriptFailure(["@. = 'yes'"], ['E354:', 'E488:'], 1)
2882 enddef 2882 enddef
2883 2883
2884 " This is slow when run under valgrind. 2884 " This is slow when run under valgrind.
2885 def Test_expr8_namespace() 2885 def Test_expr8_namespace()
2886 var lines =<< trim END 2886 var lines =<< trim END
2906 assert_equal('some', get(t:, 'some_var')) 2906 assert_equal('some', get(t:, 'some_var'))
2907 assert_equal('some', get(t:, 'some_var', 'xxx')) 2907 assert_equal('some', get(t:, 'some_var', 'xxx'))
2908 assert_equal('xxx', get(t:, 'no_var', 'xxx')) 2908 assert_equal('xxx', get(t:, 'no_var', 'xxx'))
2909 unlet t:some_var 2909 unlet t:some_var
2910 END 2910 END
2911 CheckDefAndScriptSuccess(lines) 2911 v9.CheckDefAndScriptSuccess(lines)
2912 enddef 2912 enddef
2913 2913
2914 def Test_expr8_namespace_loop_def() 2914 def Test_expr8_namespace_loop_def()
2915 var lines =<< trim END 2915 var lines =<< trim END
2916 # check using g: in a for loop more than DO_NOT_FREE_CNT times 2916 # check using g: in a for loop more than DO_NOT_FREE_CNT times
2924 endif 2924 endif
2925 endfor 2925 endfor
2926 assert_equal(0, exists) 2926 assert_equal(0, exists)
2927 assert_equal(100000, exists_not) 2927 assert_equal(100000, exists_not)
2928 END 2928 END
2929 CheckDefSuccess(lines) 2929 v9.CheckDefSuccess(lines)
2930 enddef 2930 enddef
2931 2931
2932 " NOTE: this is known to be slow. To skip use: 2932 " NOTE: this is known to be slow. To skip use:
2933 " :let $TEST_SKIP_PAT = 'Test_expr8_namespace_loop_script' 2933 " :let $TEST_SKIP_PAT = 'Test_expr8_namespace_loop_script'
2934 def Test_expr8_namespace_loop_script() 2934 def Test_expr8_namespace_loop_script()
2945 endif 2945 endif
2946 endfor 2946 endfor
2947 assert_equal(0, exists) 2947 assert_equal(0, exists)
2948 assert_equal(100000, exists_not) 2948 assert_equal(100000, exists_not)
2949 END 2949 END
2950 CheckScriptSuccess(lines) 2950 v9.CheckScriptSuccess(lines)
2951 enddef 2951 enddef
2952 2952
2953 def Test_expr8_parens() 2953 def Test_expr8_parens()
2954 # (expr) 2954 # (expr)
2955 var lines =<< trim END 2955 var lines =<< trim END
2977 .. 2977 ..
2978 'two' 2978 'two'
2979 ) 2979 )
2980 assert_equal('onetwo', s) 2980 assert_equal('onetwo', s)
2981 END 2981 END
2982 CheckDefAndScriptSuccess(lines) 2982 v9.CheckDefAndScriptSuccess(lines)
2983 enddef 2983 enddef
2984 2984
2985 def Test_expr8_negate_add() 2985 def Test_expr8_negate_add()
2986 var lines =<< trim END 2986 var lines =<< trim END
2987 assert_equal(-99, -99) 2987 assert_equal(-99, -99)
2991 var nr = 88 2991 var nr = 88
2992 assert_equal(-88, -nr) 2992 assert_equal(-88, -nr)
2993 assert_equal(-88, - nr) 2993 assert_equal(-88, - nr)
2994 assert_equal(88, + nr) 2994 assert_equal(88, + nr)
2995 END 2995 END
2996 CheckDefAndScriptSuccess(lines) 2996 v9.CheckDefAndScriptSuccess(lines)
2997 2997
2998 lines =<< trim END 2998 lines =<< trim END
2999 var n = 12 2999 var n = 12
3000 echo ++n 3000 echo ++n
3001 END 3001 END
3002 CheckDefAndScriptFailure(lines, 'E15:') 3002 v9.CheckDefAndScriptFailure(lines, 'E15:')
3003 lines =<< trim END 3003 lines =<< trim END
3004 var n = 12 3004 var n = 12
3005 echo --n 3005 echo --n
3006 END 3006 END
3007 CheckDefAndScriptFailure(lines, 'E15:') 3007 v9.CheckDefAndScriptFailure(lines, 'E15:')
3008 lines =<< trim END 3008 lines =<< trim END
3009 var n = 12 3009 var n = 12
3010 echo +-n 3010 echo +-n
3011 END 3011 END
3012 CheckDefAndScriptFailure(lines, 'E15:') 3012 v9.CheckDefAndScriptFailure(lines, 'E15:')
3013 lines =<< trim END 3013 lines =<< trim END
3014 var n = 12 3014 var n = 12
3015 echo -+n 3015 echo -+n
3016 END 3016 END
3017 CheckDefAndScriptFailure(lines, 'E15:') 3017 v9.CheckDefAndScriptFailure(lines, 'E15:')
3018 lines =<< trim END 3018 lines =<< trim END
3019 var n = 12 3019 var n = 12
3020 echo - -n 3020 echo - -n
3021 END 3021 END
3022 CheckDefAndScriptFailure(lines, 'E15:') 3022 v9.CheckDefAndScriptFailure(lines, 'E15:')
3023 lines =<< trim END 3023 lines =<< trim END
3024 var n = 12 3024 var n = 12
3025 echo + +n 3025 echo + +n
3026 END 3026 END
3027 CheckDefAndScriptFailure(lines, 'E15:') 3027 v9.CheckDefAndScriptFailure(lines, 'E15:')
3028 enddef 3028 enddef
3029 3029
3030 def LegacyReturn(): string 3030 def LegacyReturn(): string
3031 legacy return #{key: 'ok'}.key 3031 legacy return #{key: 'ok'}.key
3032 enddef 3032 enddef
3041 return s:legacy 3041 return s:legacy
3042 enddef 3042 enddef
3043 call assert_equal('legacy', GetLocal()) 3043 call assert_equal('legacy', GetLocal())
3044 call assert_equal('legacy', GetLocalPrefix()) 3044 call assert_equal('legacy', GetLocalPrefix())
3045 END 3045 END
3046 CheckScriptSuccess(lines) 3046 v9.CheckScriptSuccess(lines)
3047 3047
3048 assert_equal('ok', LegacyReturn()) 3048 assert_equal('ok', g:LegacyReturn())
3049 3049
3050 lines =<< trim END 3050 lines =<< trim END
3051 vim9script 3051 vim9script
3052 def GetNumber(): number 3052 def GetNumber(): number
3053 legacy return range(3)->map('v:val + 1') 3053 legacy return range(3)->map('v:val + 1')
3054 enddef 3054 enddef
3055 echo GetNumber() 3055 echo GetNumber()
3056 END 3056 END
3057 CheckScriptFailure(lines, 'E1012: Type mismatch; expected number but got list<number>') 3057 v9.CheckScriptFailure(lines, 'E1012: Type mismatch; expected number but got list<number>')
3058 enddef 3058 enddef
3059 3059
3060 def Echo(arg: any): string 3060 def Echo(arg: any): string
3061 return arg 3061 return arg
3062 enddef 3062 enddef
3065 return arg 3065 return arg
3066 enddef 3066 enddef
3067 3067
3068 def Test_expr8_call() 3068 def Test_expr8_call()
3069 var lines =<< trim END 3069 var lines =<< trim END
3070 assert_equal('yes', 'yes'->Echo()) 3070 assert_equal('yes', 'yes'->g:Echo())
3071 assert_equal(true, !range(5)->empty()) 3071 assert_equal(true, !range(5)->empty())
3072 assert_equal([0, 1, 2], 3->range()) 3072 assert_equal([0, 1, 2], 3->range())
3073 END 3073 END
3074 CheckDefAndScriptSuccess(lines) 3074 v9.CheckDefAndScriptSuccess(lines)
3075 3075
3076 assert_equal('yes', 'yes' 3076 assert_equal('yes', 'yes'
3077 ->s:Echo4Arg()) 3077 ->s:Echo4Arg())
3078 3078
3079 CheckDefAndScriptFailure(["var x = 'yes'->Echo"], 'E107:', 1) 3079 v9.CheckDefAndScriptFailure(["var x = 'yes'->g:Echo"], 'E107:', 1)
3080 CheckDefAndScriptFailure([ 3080 v9.CheckDefAndScriptFailure([
3081 "var x = substitute ('x', 'x', 'x', 'x')" 3081 "var x = substitute ('x', 'x', 'x', 'x')"
3082 ], ['E1001:', 'E121:'], 1) 3082 ], ['E1001:', 'E121:'], 1)
3083 CheckDefAndScriptFailure(["var Ref = function('len' [1, 2])"], ['E1123:', 'E116:'], 1) 3083 v9.CheckDefAndScriptFailure(["var Ref = function('len' [1, 2])"], ['E1123:', 'E116:'], 1)
3084 3084 enddef
3085
3086 def g:ExistingGloba(): string
3087 return 'existing'
3088 enddef
3089
3090 def Test_expr8_call_global()
3091 assert_equal('existing', g:ExistingGloba())
3092
3093 def g:DefinedLater(): string
3094 return 'later'
3095 enddef
3096 assert_equal('later', g:DefinedLater())
3097
3098 var lines =<< trim END
3099 echo ExistingGlobal()
3100 END
3101 v9.CheckDefAndScriptFailure(lines, 'E117: Unknown function: ExistingGlobal')
3102 enddef
3103
3104 def Test_expr8_call_autoload()
3085 var auto_lines =<< trim END 3105 var auto_lines =<< trim END
3086 def g:some#func(): string 3106 def g:some#func(): string
3087 return 'found' 3107 return 'found'
3088 enddef 3108 enddef
3089 END 3109 END
3135 3155
3136 var sorted = [3, 1, 2] 3156 var sorted = [3, 1, 2]
3137 -> sort() 3157 -> sort()
3138 assert_equal([1, 2, 3], sorted) 3158 assert_equal([1, 2, 3], sorted)
3139 END 3159 END
3140 CheckDefAndScriptSuccess(lines) 3160 v9.CheckDefAndScriptSuccess(lines)
3141 3161
3142 lines =<< trim END 3162 lines =<< trim END
3143 def SetNumber(n: number) 3163 def SetNumber(n: number)
3144 g:number = n 3164 g:number = n
3145 enddef 3165 enddef
3163 len('xxxxx')->SetDict.key() 3183 len('xxxxx')->SetDict.key()
3164 assert_equal(5, g:number) 3184 assert_equal(5, g:number)
3165 3185
3166 unlet g:number 3186 unlet g:number
3167 END 3187 END
3168 CheckDefAndScriptSuccess(lines) 3188 v9.CheckDefAndScriptSuccess(lines)
3169 3189
3170 lines =<< trim END 3190 lines =<< trim END
3171 def RetVoid() 3191 def RetVoid()
3172 enddef 3192 enddef
3173 RetVoid()->byteidx(3) 3193 RetVoid()->byteidx(3)
3174 END 3194 END
3175 CheckDefExecFailure(lines, 'E1013:') 3195 v9.CheckDefExecFailure(lines, 'E1013:')
3176 enddef 3196 enddef
3177 3197
3178 def Test_expr8_method_call_linebreak() 3198 def Test_expr8_method_call_linebreak()
3179 # this was giving an error when skipping over the expression 3199 # this was giving an error when skipping over the expression
3180 var lines =<< trim END 3200 var lines =<< trim END
3186 echo a 3206 echo a
3187 enddef 3207 enddef
3188 defcompile 3208 defcompile
3189 assert_equal('', v:errmsg) 3209 assert_equal('', v:errmsg)
3190 END 3210 END
3191 CheckScriptSuccess(lines) 3211 v9.CheckScriptSuccess(lines)
3192 enddef 3212 enddef
3193 3213
3194 def Test_expr8_method_call_import() 3214 def Test_expr8_method_call_import()
3195 var lines =<< trim END 3215 var lines =<< trim END
3196 vim9script 3216 vim9script
3210 ->map((_, i) => i * 10) 3230 ->map((_, i) => i * 10)
3211 enddef 3231 enddef
3212 3232
3213 assert_equal([0, 10, 40, 90, 160], Test()) 3233 assert_equal([0, 10, 40, 90, 160], Test())
3214 END 3234 END
3215 CheckScriptSuccess(lines) 3235 v9.CheckScriptSuccess(lines)
3216 3236
3217 lines =<< trim END 3237 lines =<< trim END
3218 vim9script 3238 vim9script
3219 import './Xsquare.vim' 3239 import './Xsquare.vim'
3220 3240
3221 echo range(5)->Xsquare.NoSuchFunc() 3241 echo range(5)->Xsquare.NoSuchFunc()
3222 END 3242 END
3223 CheckScriptFailure(lines, 'E1048: Item not found in script: NoSuchFunc') 3243 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: NoSuchFunc')
3224 3244
3225 delete('Xsquare.vim') 3245 delete('Xsquare.vim')
3226 enddef 3246 enddef
3227 3247
3228 3248
3271 assert_equal(true, !test_unknown()) 3291 assert_equal(true, !test_unknown())
3272 3292
3273 assert_equal(false, ![1, 2, 3]->reverse()) 3293 assert_equal(false, ![1, 2, 3]->reverse())
3274 assert_equal(true, ![]->reverse()) 3294 assert_equal(true, ![]->reverse())
3275 END 3295 END
3276 CheckDefAndScriptSuccess(lines) 3296 v9.CheckDefAndScriptSuccess(lines)
3277 enddef 3297 enddef
3278 3298
3279 let g:anumber = 42 3299 let g:anumber = 42
3280 3300
3281 def Test_expr8_negate() 3301 def Test_expr8_negate()
3282 var lines =<< trim END 3302 var lines =<< trim END
3283 var nr = 1 3303 var nr = 1
3284 assert_equal(-1, -nr) 3304 assert_equal(-1, -nr)
3285 assert_equal(-42, -g:anumber) 3305 assert_equal(-42, -g:anumber)
3286 END 3306 END
3287 CheckDefAndScriptSuccess(lines) 3307 v9.CheckDefAndScriptSuccess(lines)
3288 enddef 3308 enddef
3289 3309
3290 func Test_expr8_fails() 3310 func Test_expr8_fails()
3291 call CheckDefFailure(["var x = (12"], "E1097:", 3) 3311 call v9.CheckDefFailure(["var x = (12"], "E1097:", 3)
3292 call CheckScriptFailure(['vim9script', "var x = (12"], 'E110:', 2) 3312 call v9.CheckScriptFailure(['vim9script', "var x = (12"], 'E110:', 2)
3293 3313
3294 call CheckDefAndScriptFailure(["var x = -'xx'"], "E1030:", 1) 3314 call v9.CheckDefAndScriptFailure(["var x = -'xx'"], "E1030:", 1)
3295 call CheckDefAndScriptFailure(["var x = +'xx'"], "E1030:", 1) 3315 call v9.CheckDefAndScriptFailure(["var x = +'xx'"], "E1030:", 1)
3296 call CheckDefAndScriptFailure(["var x = -0z12"], "E974:", 1) 3316 call v9.CheckDefAndScriptFailure(["var x = -0z12"], "E974:", 1)
3297 call CheckDefExecAndScriptFailure(["var x = -[8]"], ["E1012:", 'E745:'], 1) 3317 call v9.CheckDefExecAndScriptFailure(["var x = -[8]"], ["E1012:", 'E745:'], 1)
3298 call CheckDefExecAndScriptFailure(["var x = -{a: 1}"], ["E1012:", 'E728:'], 1) 3318 call v9.CheckDefExecAndScriptFailure(["var x = -{a: 1}"], ["E1012:", 'E728:'], 1)
3299 3319
3300 call CheckDefAndScriptFailure(["var x = @"], "E1002:", 1) 3320 call v9.CheckDefAndScriptFailure(["var x = @"], "E1002:", 1)
3301 call CheckDefAndScriptFailure(["var x = @<"], "E354:", 1) 3321 call v9.CheckDefAndScriptFailure(["var x = @<"], "E354:", 1)
3302 3322
3303 call CheckDefFailure(["var x = [1, 2"], "E697:", 2) 3323 call v9.CheckDefFailure(["var x = [1, 2"], "E697:", 2)
3304 call CheckScriptFailure(['vim9script', "var x = [1, 2"], 'E696:', 2) 3324 call v9.CheckScriptFailure(['vim9script', "var x = [1, 2"], 'E696:', 2)
3305 3325
3306 call CheckDefAndScriptFailure(["var x = [notfound]"], ["E1001:", 'E121:'], 1) 3326 call v9.CheckDefAndScriptFailure(["var x = [notfound]"], ["E1001:", 'E121:'], 1)
3307 3327
3308 call CheckDefAndScriptFailure(["var X = () => 123)"], 'E488:', 1) 3328 call v9.CheckDefAndScriptFailure(["var X = () => 123)"], 'E488:', 1)
3309 call CheckDefAndScriptFailure(["var x = 123->((x) => x + 5)"], "E107:", 1) 3329 call v9.CheckDefAndScriptFailure(["var x = 123->((x) => x + 5)"], "E107:", 1)
3310 3330
3311 call CheckDefAndScriptFailure(["var x = &notexist"], 'E113:', 1) 3331 call v9.CheckDefAndScriptFailure(["var x = &notexist"], 'E113:', 1)
3312 call CheckDefAndScriptFailure(["&grepprg = [343]"], ['E1012:', 'E730:'], 1) 3332 call v9.CheckDefAndScriptFailure(["&grepprg = [343]"], ['E1012:', 'E730:'], 1)
3313 3333
3314 call CheckDefExecAndScriptFailure(["echo s:doesnt_exist"], 'E121:', 1) 3334 call v9.CheckDefExecAndScriptFailure(["echo s:doesnt_exist"], 'E121:', 1)
3315 call CheckDefExecAndScriptFailure(["echo g:doesnt_exist"], 'E121:', 1) 3335 call v9.CheckDefExecAndScriptFailure(["echo g:doesnt_exist"], 'E121:', 1)
3316 3336
3317 call CheckDefAndScriptFailure(["echo a:somevar"], ['E1075:', 'E121:'], 1) 3337 call v9.CheckDefAndScriptFailure(["echo a:somevar"], ['E1075:', 'E121:'], 1)
3318 call CheckDefAndScriptFailure(["echo l:somevar"], ['E1075:', 'E121:'], 1) 3338 call v9.CheckDefAndScriptFailure(["echo l:somevar"], ['E1075:', 'E121:'], 1)
3319 call CheckDefAndScriptFailure(["echo x:somevar"], ['E1075:', 'E121:'], 1) 3339 call v9.CheckDefAndScriptFailure(["echo x:somevar"], ['E1075:', 'E121:'], 1)
3320 3340
3321 call CheckDefExecAndScriptFailure(["var x = +g:astring"], ['E1012:', 'E1030:'], 1) 3341 call v9.CheckDefExecAndScriptFailure(["var x = +g:astring"], ['E1012:', 'E1030:'], 1)
3322 call CheckDefExecAndScriptFailure(["var x = +g:ablob"], ['E1012:', 'E974:'], 1) 3342 call v9.CheckDefExecAndScriptFailure(["var x = +g:ablob"], ['E1012:', 'E974:'], 1)
3323 call CheckDefExecAndScriptFailure(["var x = +g:alist"], ['E1012:', 'E745:'], 1) 3343 call v9.CheckDefExecAndScriptFailure(["var x = +g:alist"], ['E1012:', 'E745:'], 1)
3324 call CheckDefExecAndScriptFailure(["var x = +g:adict"], ['E1012:', 'E728:'], 1) 3344 call v9.CheckDefExecAndScriptFailure(["var x = +g:adict"], ['E1012:', 'E728:'], 1)
3325 3345
3326 call CheckDefAndScriptFailure(["var x = ''", "var y = x.memb"], ['E1229: Expected dictionary for using key "memb", but got string', 'E488:'], 2) 3346 call v9.CheckDefAndScriptFailure(["var x = ''", "var y = x.memb"], ['E1229: Expected dictionary for using key "memb", but got string', 'E488:'], 2)
3327 3347
3328 call CheckDefAndScriptFailure(["'yes'->", "Echo()"], ['E488: Trailing characters: ->', 'E260: Missing name after ->'], 1) 3348 call v9.CheckDefAndScriptFailure(["'yes'->", "Echo()"], ['E488: Trailing characters: ->', 'E260: Missing name after ->'], 1)
3329 3349
3330 call CheckDefExecFailure(["[1, 2->len()"], 'E697:', 2) 3350 call v9.CheckDefExecFailure(["[1, 2->len()"], 'E697:', 2)
3331 call CheckScriptFailure(['vim9script', "[1, 2->len()"], 'E696:', 2) 3351 call v9.CheckScriptFailure(['vim9script', "[1, 2->len()"], 'E696:', 2)
3332 3352
3333 call CheckDefFailure(["{a: 1->len()"], 'E723:', 2) 3353 call v9.CheckDefFailure(["{a: 1->len()"], 'E723:', 2)
3334 call CheckScriptFailure(['vim9script', "{a: 1->len()"], 'E722:', 2) 3354 call v9.CheckScriptFailure(['vim9script', "{a: 1->len()"], 'E722:', 2)
3335 3355
3336 call CheckDefExecFailure(["{['a']: 1->len()"], 'E723:', 2) 3356 call v9.CheckDefExecFailure(["{['a']: 1->len()"], 'E723:', 2)
3337 call CheckScriptFailure(['vim9script', "{['a']: 1->len()"], 'E722:', 2) 3357 call v9.CheckScriptFailure(['vim9script', "{['a']: 1->len()"], 'E722:', 2)
3338 endfunc 3358 endfunc
3339 3359
3340 let g:Funcrefs = [function('add')] 3360 let g:Funcrefs = [function('add')]
3341 3361
3342 func CallMe(arg) 3362 func CallMe(arg)
3378 3398
3379 # dict member 3399 # dict member
3380 var d = {key: 123} 3400 var d = {key: 123}
3381 assert_equal(123, d.key) 3401 assert_equal(123, d.key)
3382 END 3402 END
3383 CheckDefAndScriptSuccess(lines) 3403 v9.CheckDefAndScriptSuccess(lines)
3384 enddef 3404 enddef
3385 3405
3386 def Test_expr8_string_subscript() 3406 def Test_expr8_string_subscript()
3387 var lines =<< trim END 3407 var lines =<< trim END
3388 var text = 'abcdef' 3408 var text = 'abcdef'
3436 3456
3437 assert_equal('a', g:astring[0]) 3457 assert_equal('a', g:astring[0])
3438 assert_equal('sd', g:astring[1 : 2]) 3458 assert_equal('sd', g:astring[1 : 2])
3439 assert_equal('asdf', g:astring[:]) 3459 assert_equal('asdf', g:astring[:])
3440 END 3460 END
3441 CheckDefAndScriptSuccess(lines) 3461 v9.CheckDefAndScriptSuccess(lines)
3442 3462
3443 lines =<< trim END 3463 lines =<< trim END
3444 var d = 'asdf'[1 : 3464 var d = 'asdf'[1 :
3445 END 3465 END
3446 CheckDefFailure(lines, 'E1097:', 3) 3466 v9.CheckDefFailure(lines, 'E1097:', 3)
3447 CheckScriptFailure(['vim9script'] + lines, 'E15:', 2) 3467 v9.CheckScriptFailure(['vim9script'] + lines, 'E15:', 2)
3448 3468
3449 lines =<< trim END 3469 lines =<< trim END
3450 var d = 'asdf'[1 : xxx] 3470 var d = 'asdf'[1 : xxx]
3451 END 3471 END
3452 CheckDefAndScriptFailure(lines, ['E1001:', 'E121:'], 1) 3472 v9.CheckDefAndScriptFailure(lines, ['E1001:', 'E121:'], 1)
3453 3473
3454 lines =<< trim END 3474 lines =<< trim END
3455 var d = 'asdf'[1 : 2 3475 var d = 'asdf'[1 : 2
3456 END 3476 END
3457 CheckDefFailure(lines, 'E1097:', 3) 3477 v9.CheckDefFailure(lines, 'E1097:', 3)
3458 CheckScriptFailure(['vim9script'] + lines, 'E111:', 2) 3478 v9.CheckScriptFailure(['vim9script'] + lines, 'E111:', 2)
3459 3479
3460 lines =<< trim END 3480 lines =<< trim END
3461 var d = 'asdf'[1 : 2 3481 var d = 'asdf'[1 : 2
3462 echo d 3482 echo d
3463 END 3483 END
3464 CheckDefAndScriptFailure(lines, 'E111:', 2) 3484 v9.CheckDefAndScriptFailure(lines, 'E111:', 2)
3465 3485
3466 lines =<< trim END 3486 lines =<< trim END
3467 var d = 'asdf'['1'] 3487 var d = 'asdf'['1']
3468 echo d 3488 echo d
3469 END 3489 END
3470 CheckDefAndScriptFailure(lines, ['E1012: Type mismatch; expected number but got string', 'E1030: Using a String as a Number: "1"'], 1) 3490 v9.CheckDefAndScriptFailure(lines, ['E1012: Type mismatch; expected number but got string', 'E1030: Using a String as a Number: "1"'], 1)
3471 3491
3472 lines =<< trim END 3492 lines =<< trim END
3473 var d = 'asdf'['1' : 2] 3493 var d = 'asdf'['1' : 2]
3474 echo d 3494 echo d
3475 END 3495 END
3476 CheckDefAndScriptFailure(lines, ['E1012: Type mismatch; expected number but got string', 'E1030: Using a String as a Number: "1"'], 1) 3496 v9.CheckDefAndScriptFailure(lines, ['E1012: Type mismatch; expected number but got string', 'E1030: Using a String as a Number: "1"'], 1)
3477 3497
3478 lines =<< trim END 3498 lines =<< trim END
3479 var d = 'asdf'[1 : '2'] 3499 var d = 'asdf'[1 : '2']
3480 echo d 3500 echo d
3481 END 3501 END
3482 CheckDefAndScriptFailure(lines, ['E1012: Type mismatch; expected number but got string', 'E1030: Using a String as a Number: "2"'], 1) 3502 v9.CheckDefAndScriptFailure(lines, ['E1012: Type mismatch; expected number but got string', 'E1030: Using a String as a Number: "2"'], 1)
3483 enddef 3503 enddef
3484 3504
3485 def Test_expr8_list_subscript() 3505 def Test_expr8_list_subscript()
3486 var lines =<< trim END 3506 var lines =<< trim END
3487 var list = [0, 1, 2, 3, 4] 3507 var list = [0, 1, 2, 3, 4]
3508 assert_equal([], list[0 : -99]) 3528 assert_equal([], list[0 : -99])
3509 3529
3510 assert_equal(2, g:alist[0]) 3530 assert_equal(2, g:alist[0])
3511 assert_equal([2, 3, 4], g:alist[:]) 3531 assert_equal([2, 3, 4], g:alist[:])
3512 END 3532 END
3513 CheckDefAndScriptSuccess(lines) 3533 v9.CheckDefAndScriptSuccess(lines)
3514 3534
3515 lines = ['var l = [0, 1, 2]', 'echo l[g:astring : g:theone]'] 3535 lines = ['var l = [0, 1, 2]', 'echo l[g:astring : g:theone]']
3516 CheckDefExecAndScriptFailure(lines, ['E1012:', 'E1030:'], 2) 3536 v9.CheckDefExecAndScriptFailure(lines, ['E1012:', 'E1030:'], 2)
3517 3537
3518 lines =<< trim END 3538 lines =<< trim END
3519 var ld = [] 3539 var ld = []
3520 def Func() 3540 def Func()
3521 eval ld[0].key 3541 eval ld[0].key
3522 enddef 3542 enddef
3523 defcompile 3543 defcompile
3524 END 3544 END
3525 CheckDefAndScriptSuccess(lines) 3545 v9.CheckDefAndScriptSuccess(lines)
3526 enddef 3546 enddef
3527 3547
3528 def Test_expr8_dict_subscript() 3548 def Test_expr8_dict_subscript()
3529 var lines =<< trim END 3549 var lines =<< trim END
3530 var l = [{lnum: 2}, {lnum: 1}] 3550 var l = [{lnum: 2}, {lnum: 1}]
3541 def Func2() 3561 def Func2()
3542 eval dd['key1'].key2 3562 eval dd['key1'].key2
3543 enddef 3563 enddef
3544 defcompile 3564 defcompile
3545 END 3565 END
3546 CheckDefAndScriptSuccess(lines) 3566 v9.CheckDefAndScriptSuccess(lines)
3547 enddef 3567 enddef
3548 3568
3549 def Test_expr8_blob_subscript() 3569 def Test_expr8_blob_subscript()
3550 var lines =<< trim END 3570 var lines =<< trim END
3551 var b = 0z112233 3571 var b = 0z112233
3553 assert_equal(0z112233, b[:]) 3573 assert_equal(0z112233, b[:])
3554 3574
3555 assert_equal(0x01, g:ablob[0]) 3575 assert_equal(0x01, g:ablob[0])
3556 assert_equal(0z01ab, g:ablob[:]) 3576 assert_equal(0z01ab, g:ablob[:])
3557 END 3577 END
3558 CheckDefAndScriptSuccess(lines) 3578 v9.CheckDefAndScriptSuccess(lines)
3559 enddef 3579 enddef
3560 3580
3561 def Test_expr8_subscript_linebreak() 3581 def Test_expr8_subscript_linebreak()
3562 var lines =<< trim END 3582 var lines =<< trim END
3563 var range = range( 3583 var range = range(
3589 3609
3590 var d = {one: 33} 3610 var d = {one: 33}
3591 assert_equal(33, d 3611 assert_equal(33, d
3592 .one) 3612 .one)
3593 END 3613 END
3594 CheckDefAndScriptSuccess(lines) 3614 v9.CheckDefAndScriptSuccess(lines)
3595 3615
3596 lines =<< trim END 3616 lines =<< trim END
3597 var d = {one: 33} 3617 var d = {one: 33}
3598 assert_equal(33, d. 3618 assert_equal(33, d.
3599 one) 3619 one)
3600 END 3620 END
3601 CheckDefAndScriptFailure(lines, ['E1127:', 'E116:'], 2) 3621 v9.CheckDefAndScriptFailure(lines, ['E1127:', 'E116:'], 2)
3602 enddef 3622 enddef
3603 3623
3604 func Test_expr8_trailing_fails() 3624 func Test_expr8_trailing_fails()
3605 call CheckDefAndScriptFailure(['var l = [2]', 'l->((ll) => add(ll, 8))'], 'E107:', 2) 3625 call v9.CheckDefAndScriptFailure(['var l = [2]', 'l->((ll) => add(ll, 8))'], 'E107:', 2)
3606 call CheckDefAndScriptFailure(['var l = [2]', 'l->((ll) => add(ll, 8)) ()'], 'E274:', 2) 3626 call v9.CheckDefAndScriptFailure(['var l = [2]', 'l->((ll) => add(ll, 8)) ()'], 'E274:', 2)
3607 endfunc 3627 endfunc
3608 3628
3609 func Test_expr_fails() 3629 func Test_expr_fails()
3610 call CheckDefAndScriptFailure(["var x = '1'is2"], 'E488:', 1) 3630 call v9.CheckDefAndScriptFailure(["var x = '1'is2"], 'E488:', 1)
3611 call CheckDefAndScriptFailure(["var x = '1'isnot2"], 'E488:', 1) 3631 call v9.CheckDefAndScriptFailure(["var x = '1'isnot2"], 'E488:', 1)
3612 3632
3613 call CheckDefAndScriptFailure(["CallMe ('yes')"], ['E476:', 'E492:'], 1) 3633 call v9.CheckDefAndScriptFailure(["CallMe ('yes')"], ['E476:', 'E492:'], 1)
3614 3634
3615 call CheckDefAndScriptFailure(["CallMe2('yes','no')"], 'E1069:', 1) 3635 call v9.CheckDefAndScriptFailure(["CallMe2('yes','no')"], 'E1069:', 1)
3616 3636
3617 call CheckDefAndScriptFailure(["v:nosuch += 3"], ['E1001:', 'E121:'], 1) 3637 call v9.CheckDefAndScriptFailure(["v:nosuch += 3"], ['E1001:', 'E121:'], 1)
3618 call CheckDefAndScriptFailure(["var v:statusmsg = ''"], 'E1016: Cannot declare a v: variable:', 1) 3638 call v9.CheckDefAndScriptFailure(["var v:statusmsg = ''"], 'E1016: Cannot declare a v: variable:', 1)
3619 call CheckDefAndScriptFailure(["var asdf = v:nosuch"], ['E1001:', 'E121:'], 1) 3639 call v9.CheckDefAndScriptFailure(["var asdf = v:nosuch"], ['E1001:', 'E121:'], 1)
3620 3640
3621 call CheckDefFailure(["echo len('asdf'"], 'E110:', 2) 3641 call v9.CheckDefFailure(["echo len('asdf'"], 'E110:', 2)
3622 call CheckScriptFailure(['vim9script', "echo len('asdf'"], 'E116:', 2) 3642 call v9.CheckScriptFailure(['vim9script', "echo len('asdf'"], 'E116:', 2)
3623 3643
3624 call CheckDefAndScriptFailure(["echo Func0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789()"], ['E1011:', 'E117:'], 1) 3644 call v9.CheckDefAndScriptFailure(["echo Func0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789()"], ['E1011:', 'E117:'], 1)
3625 call CheckDefAndScriptFailure(["echo doesnotexist()"], 'E117:', 1) 3645 call v9.CheckDefAndScriptFailure(["echo doesnotexist()"], 'E117:', 1)
3626 endfunc 3646 endfunc
3627 3647
3628 " vim: shiftwidth=2 sts=2 expandtab 3648 " vim: shiftwidth=2 sts=2 expandtab