1" Tests for Vim9 script expressions 2 3source check.vim 4source vim9.vim 5 6" test cond ? expr : expr 7def Test_expr1() 8 assert_equal('one', true ? 'one' : 'two') 9 assert_equal('one', 1 ? 10 'one' : 11 'two') 12 if has('float') 13 assert_equal('one', 0.1 ? 'one' : 'two') 14 endif 15 assert_equal('one', 'x' ? 'one' : 'two') 16 assert_equal('one', 'x' 17 ? 'one' 18 : 'two') 19 assert_equal('one', 0z1234 ? 'one' : 'two') 20 assert_equal('one', [0] ? 'one' : 'two') 21 assert_equal('one', #{x: 0} ? 'one' : 'two') 22 let var = 1 23 assert_equal('one', var ? 'one' : 'two') 24 25 assert_equal('two', false ? 'one' : 'two') 26 assert_equal('two', 0 ? 'one' : 'two') 27 if has('float') 28 assert_equal('two', 0.0 ? 'one' : 'two') 29 endif 30 assert_equal('two', '' ? 'one' : 'two') 31 assert_equal('two', 0z ? 'one' : 'two') 32 assert_equal('two', [] ? 'one' : 'two') 33 assert_equal('two', {} ? 'one' : 'two') 34 var = 0 35 assert_equal('two', var ? 'one' : 'two') 36 37 let Some: func = function('len') 38 let Other: func = function('winnr') 39 let Res: func = g:atrue ? Some : Other 40 assert_equal(function('len'), Res) 41 42 let RetOne: func(string): number = function('len') 43 let RetTwo: func(string): number = function('winnr') 44 let RetThat: func = g:atrue ? RetOne : RetTwo 45 assert_equal(function('len'), RetThat) 46enddef 47 48def Test_expr1_vimscript() 49 " only checks line continuation 50 let lines =<< trim END 51 vim9script 52 let var = 1 53 ? 'yes' 54 : 'no' 55 assert_equal('yes', var) 56 END 57 CheckScriptSuccess(lines) 58 59 lines =<< trim END 60 vim9script 61 let var = v:false 62 ? 'yes' 63 : 'no' 64 assert_equal('no', var) 65 END 66 CheckScriptSuccess(lines) 67 68 lines =<< trim END 69 vim9script 70 let var = v:false ? 71 'yes' : 72 'no' 73 assert_equal('no', var) 74 END 75 CheckScriptSuccess(lines) 76enddef 77 78func Test_expr1_fails() 79 call CheckDefFailure(["let x = 1 ? 'one'"], "Missing ':' after '?'") 80 call CheckDefFailure(["let x = 1 ? 'one' : xxx"], "E1001:") 81 82 let msg = "white space required before and after '?'" 83 call CheckDefFailure(["let x = 1? 'one' : 'two'"], msg) 84 call CheckDefFailure(["let x = 1 ?'one' : 'two'"], msg) 85 call CheckDefFailure(["let x = 1?'one' : 'two'"], msg) 86 87 let msg = "white space required before and after ':'" 88 call CheckDefFailure(["let x = 1 ? 'one': 'two'"], msg) 89 call CheckDefFailure(["let x = 1 ? 'one' :'two'"], msg) 90 call CheckDefFailure(["let x = 1 ? 'one':'two'"], msg) 91endfunc 92 93" TODO: define inside test function 94def Record(val: any): any 95 g:vals->add(val) 96 return val 97enddef 98 99" test || 100def Test_expr2() 101 assert_equal(2, 2 || 0) 102 assert_equal(7, 0 || 103 0 || 104 7) 105 assert_equal(0, 0 || 0) 106 assert_equal(0, 0 107 || 0) 108 assert_equal('', 0 || '') 109 110 g:vals = [] 111 assert_equal(3, Record(3) || Record(1)) 112 assert_equal([3], g:vals) 113 114 g:vals = [] 115 assert_equal(5, Record(0) || Record(5)) 116 assert_equal([0, 5], g:vals) 117 118 g:vals = [] 119 assert_equal(4, Record(0) 120 || Record(4) 121 || Record(0)) 122 assert_equal([0, 4], g:vals) 123 124 g:vals = [] 125 assert_equal(0, Record([]) || Record('') || Record(0)) 126 assert_equal([[], '', 0], g:vals) 127enddef 128 129def Test_expr2_vimscript() 130 " check line continuation 131 let lines =<< trim END 132 vim9script 133 let var = 0 134 || 1 135 assert_equal(1, var) 136 END 137 CheckScriptSuccess(lines) 138 139 lines =<< trim END 140 vim9script 141 let var = v:false 142 || v:true 143 || v:false 144 assert_equal(v:true, var) 145 END 146 CheckScriptSuccess(lines) 147 148 lines =<< trim END 149 vim9script 150 let var = v:false || 151 v:true || 152 v:false 153 assert_equal(v:true, var) 154 END 155 CheckScriptSuccess(lines) 156 157 " check keeping the value 158 lines =<< trim END 159 vim9script 160 assert_equal(2, 2 || 0) 161 assert_equal(7, 0 || 162 0 || 163 7) 164 assert_equal(0, 0 || 0) 165 assert_equal(0, 0 166 || 0) 167 assert_equal('', 0 || '') 168 169 g:vals = [] 170 assert_equal(3, Record(3) || Record(1)) 171 assert_equal([3], g:vals) 172 173 g:vals = [] 174 assert_equal(5, Record(0) || Record(5)) 175 assert_equal([0, 5], g:vals) 176 177 g:vals = [] 178 assert_equal(4, Record(0) 179 || Record(4) 180 || Record(0)) 181 assert_equal([0, 4], g:vals) 182 183 g:vals = [] 184 assert_equal(0, Record([]) || Record('') || Record(0)) 185 assert_equal([[], '', 0], g:vals) 186 END 187 CheckScriptSuccess(lines) 188enddef 189 190func Test_expr2_fails() 191 let msg = "white space required before and after '||'" 192 call CheckDefFailure(["let x = 1||2"], msg) 193 call CheckDefFailure(["let x = 1 ||2"], msg) 194 call CheckDefFailure(["let x = 1|| 2"], msg) 195 196 call CheckDefFailure(["let x = 1 || xxx"], 'E1001:') 197endfunc 198 199" test && 200def Test_expr3() 201 assert_equal(0, 2 && 0) 202 assert_equal(0, 0 && 203 0 && 204 7) 205 assert_equal(7, 2 206 && 3 207 && 7) 208 assert_equal(0, 0 && 0) 209 assert_equal(0, 0 && '') 210 assert_equal('', 8 && '') 211 212 g:vals = [] 213 assert_equal(1, Record(3) && Record(1)) 214 assert_equal([3, 1], g:vals) 215 216 g:vals = [] 217 assert_equal(0, Record(0) && Record(5)) 218 assert_equal([0], g:vals) 219 220 g:vals = [] 221 assert_equal(0, Record(0) && Record(4) && Record(0)) 222 assert_equal([0], g:vals) 223 224 g:vals = [] 225 assert_equal(0, Record(8) && Record(4) && Record(0)) 226 assert_equal([8, 4, 0], g:vals) 227 228 g:vals = [] 229 assert_equal(0, Record([1]) && Record('z') && Record(0)) 230 assert_equal([[1], 'z', 0], g:vals) 231enddef 232 233def Test_expr3_vimscript() 234 " check line continuation 235 let lines =<< trim END 236 vim9script 237 let var = 0 238 && 1 239 assert_equal(0, var) 240 END 241 CheckScriptSuccess(lines) 242 243 lines =<< trim END 244 vim9script 245 let var = v:true 246 && v:true 247 && v:true 248 assert_equal(v:true, var) 249 END 250 CheckScriptSuccess(lines) 251 252 lines =<< trim END 253 vim9script 254 let var = v:true && 255 v:true && 256 v:true 257 assert_equal(v:true, var) 258 END 259 CheckScriptSuccess(lines) 260 261 " check keeping the value 262 lines =<< trim END 263 vim9script 264 assert_equal(0, 2 && 0) 265 assert_equal(0, 0 && 266 0 && 267 7) 268 assert_equal(7, 2 269 && 3 270 && 7) 271 assert_equal(0, 0 && 0) 272 assert_equal(0, 0 && '') 273 assert_equal('', 8 && '') 274 275 g:vals = [] 276 assert_equal(1, Record(3) && Record(1)) 277 assert_equal([3, 1], g:vals) 278 279 g:vals = [] 280 assert_equal(0, Record(0) && Record(5)) 281 assert_equal([0], g:vals) 282 283 g:vals = [] 284 assert_equal(0, Record(0) && Record(4) && Record(0)) 285 assert_equal([0], g:vals) 286 287 g:vals = [] 288 assert_equal(0, Record(8) && Record(4) && Record(0)) 289 assert_equal([8, 4, 0], g:vals) 290 291 g:vals = [] 292 assert_equal(0, Record([1]) && Record('z') && Record(0)) 293 assert_equal([[1], 'z', 0], g:vals) 294 END 295 CheckScriptSuccess(lines) 296enddef 297 298func Test_expr3_fails() 299 let msg = "white space required before and after '&&'" 300 call CheckDefFailure(["let x = 1&&2"], msg) 301 call CheckDefFailure(["let x = 1 &&2"], msg) 302 call CheckDefFailure(["let x = 1&& 2"], msg) 303endfunc 304 305let atrue = v:true 306let afalse = v:false 307let anone = v:none 308let anull = v:null 309let anint = 10 310let alsoint = 4 311if has('float') 312 let afloat = 0.1 313endif 314let astring = 'asdf' 315let ablob = 0z01ab 316let alist = [2, 3, 4] 317let adict = #{aaa: 2, bbb: 8} 318 319" test == comperator 320def Test_expr4_equal() 321 let trueVar = true 322 let falseVar = false 323 assert_equal(true, true == true) 324 assert_equal(false, true == 325 false) 326 assert_equal(true, true 327 == trueVar) 328 assert_equal(false, true == falseVar) 329 assert_equal(true, true == g:atrue) 330 assert_equal(false, g:atrue == false) 331 332 assert_equal(true, v:none == v:none) 333 assert_equal(false, v:none == v:null) 334 assert_equal(true, g:anone == v:none) 335 assert_equal(false, v:none == g:anull) 336 337 let nr0 = 0 338 let nr61 = 61 339 assert_equal(false, 2 == 0) 340 assert_equal(false, 2 == nr0) 341 assert_equal(true, 61 == 61) 342 assert_equal(true, 61 == nr61) 343 assert_equal(true, g:anint == 10) 344 assert_equal(false, 61 == g:anint) 345 346 if has('float') 347 let ff = 0.3 348 assert_equal(true, ff == 0.3) 349 assert_equal(false, 0.4 == ff) 350 assert_equal(true, 0.1 == g:afloat) 351 assert_equal(false, g:afloat == 0.3) 352 353 ff = 3.0 354 assert_equal(true, ff == 3) 355 assert_equal(true, 3 == ff) 356 ff = 3.1 357 assert_equal(false, ff == 3) 358 assert_equal(false, 3 == ff) 359 endif 360 361 assert_equal(true, 'abc' == 'abc') 362 assert_equal(false, 'xyz' == 'abc') 363 assert_equal(true, g:astring == 'asdf') 364 assert_equal(false, 'xyz' == g:astring) 365 366 assert_equal(false, 'abc' == 'aBc') 367 assert_equal(false, 'abc' ==# 'aBc') 368 assert_equal(true, 'abc' ==? 'aBc') 369 370 assert_equal(false, 'abc' == 'ABC') 371 set ignorecase 372 assert_equal(false, 'abc' == 'ABC') 373 assert_equal(false, 'abc' ==# 'ABC') 374 set noignorecase 375 376 call CheckDefFailure(["let x = 'a' == xxx"], 'E1001:') 377 378 let bb = 0z3f 379 assert_equal(true, 0z3f == bb) 380 assert_equal(false, bb == 0z4f) 381 assert_equal(true, g:ablob == 0z01ab) 382 assert_equal(false, 0z3f == g:ablob) 383 384 assert_equal(true, [1, 2, 3] == [1, 2, 3]) 385 assert_equal(false, [1, 2, 3] == [2, 3, 1]) 386 assert_equal(true, [2, 3, 4] == g:alist) 387 assert_equal(false, g:alist == [2, 3, 1]) 388 assert_equal(false, [1, 2, 3] == []) 389 assert_equal(false, [1, 2, 3] == ['1', '2', '3']) 390 391 assert_equal(true, #{one: 1, two: 2} == #{one: 1, two: 2}) 392 assert_equal(false, #{one: 1, two: 2} == #{one: 2, two: 2}) 393 assert_equal(false, #{one: 1, two: 2} == #{two: 2}) 394 assert_equal(false, #{one: 1, two: 2} == #{}) 395 assert_equal(true, g:adict == #{bbb: 8, aaa: 2}) 396 assert_equal(false, #{ccc: 9, aaa: 2} == g:adict) 397 398 assert_equal(true, function('g:Test_expr4_equal') == function('g:Test_expr4_equal')) 399 assert_equal(false, function('g:Test_expr4_equal') == function('g:Test_expr4_is')) 400 401 assert_equal(true, function('g:Test_expr4_equal', [123]) == function('g:Test_expr4_equal', [123])) 402 assert_equal(false, function('g:Test_expr4_equal', [123]) == function('g:Test_expr4_is', [123])) 403 assert_equal(false, function('g:Test_expr4_equal', [123]) == function('g:Test_expr4_equal', [999])) 404 405 let OneFunc: func 406 let TwoFunc: func 407 OneFunc = function('len') 408 TwoFunc = function('len') 409 assert_equal(true, OneFunc('abc') == TwoFunc('123')) 410enddef 411 412" test != comperator 413def Test_expr4_notequal() 414 let trueVar = true 415 let falseVar = false 416 assert_equal(false, true != true) 417 assert_equal(true, true != 418 false) 419 assert_equal(false, true 420 != trueVar) 421 assert_equal(true, true != falseVar) 422 assert_equal(false, true != g:atrue) 423 assert_equal(true, g:atrue != false) 424 425 assert_equal(false, v:none != v:none) 426 assert_equal(true, v:none != v:null) 427 assert_equal(false, g:anone != v:none) 428 assert_equal(true, v:none != g:anull) 429 430 let nr55 = 55 431 let nr0 = 55 432 assert_equal(true, 2 != 0) 433 assert_equal(true, 2 != nr0) 434 assert_equal(false, 55 != 55) 435 assert_equal(false, 55 != nr55) 436 assert_equal(false, g:anint != 10) 437 assert_equal(true, 61 != g:anint) 438 439 if has('float') 440 let ff = 0.3 441 assert_equal(false, 0.3 != ff) 442 assert_equal(true, 0.4 != ff) 443 assert_equal(false, 0.1 != g:afloat) 444 assert_equal(true, g:afloat != 0.3) 445 446 ff = 3.0 447 assert_equal(false, ff != 3) 448 assert_equal(false, 3 != ff) 449 ff = 3.1 450 assert_equal(true, ff != 3) 451 assert_equal(true, 3 != ff) 452 endif 453 454 assert_equal(false, 'abc' != 'abc') 455 assert_equal(true, 'xyz' != 'abc') 456 assert_equal(false, g:astring != 'asdf') 457 assert_equal(true, 'xyz' != g:astring) 458 459 assert_equal(true, 'abc' != 'ABC') 460 set ignorecase 461 assert_equal(true, 'abc' != 'ABC') 462 set noignorecase 463 464 let bb = 0z3f 465 assert_equal(false, 0z3f != bb) 466 assert_equal(true, bb != 0z4f) 467 assert_equal(false, g:ablob != 0z01ab) 468 assert_equal(true, 0z3f != g:ablob) 469 470 assert_equal(false, [1, 2, 3] != [1, 2, 3]) 471 assert_equal(true, [1, 2, 3] != [2, 3, 1]) 472 assert_equal(false, [2, 3, 4] != g:alist) 473 assert_equal(true, g:alist != [2, 3, 1]) 474 assert_equal(true, [1, 2, 3] != []) 475 assert_equal(true, [1, 2, 3] != ['1', '2', '3']) 476 477 assert_equal(false, #{one: 1, two: 2} != #{one: 1, two: 2}) 478 assert_equal(true, #{one: 1, two: 2} != #{one: 2, two: 2}) 479 assert_equal(true, #{one: 1, two: 2} != #{two: 2}) 480 assert_equal(true, #{one: 1, two: 2} != #{}) 481 assert_equal(false, g:adict != #{bbb: 8, aaa: 2}) 482 assert_equal(true, #{ccc: 9, aaa: 2} != g:adict) 483 484 assert_equal(false, function('g:Test_expr4_equal') != function('g:Test_expr4_equal')) 485 assert_equal(true, function('g:Test_expr4_equal') != function('g:Test_expr4_is')) 486 487 assert_equal(false, function('g:Test_expr4_equal', [123]) != function('g:Test_expr4_equal', [123])) 488 assert_equal(true, function('g:Test_expr4_equal', [123]) != function('g:Test_expr4_is', [123])) 489 assert_equal(true, function('g:Test_expr4_equal', [123]) != function('g:Test_expr4_equal', [999])) 490enddef 491 492" test > comperator 493def Test_expr4_greater() 494 assert_true(2 > 0) 495 assert_true(2 > 496 1) 497 assert_false(2 > 2) 498 assert_false(2 > 3) 499 let nr2 = 2 500 assert_true(nr2 > 0) 501 assert_true(nr2 > 502 1) 503 assert_false(nr2 > 2) 504 assert_false(nr2 505 > 3) 506 if has('float') 507 let ff = 2.0 508 assert_true(ff > 0.0) 509 assert_true(ff > 1.0) 510 assert_false(ff > 2.0) 511 assert_false(ff > 3.0) 512 endif 513enddef 514 515" test >= comperator 516def Test_expr4_greaterequal() 517 assert_true(2 >= 0) 518 assert_true(2 >= 519 2) 520 assert_false(2 >= 3) 521 let nr2 = 2 522 assert_true(nr2 >= 0) 523 assert_true(nr2 >= 2) 524 assert_false(nr2 >= 3) 525 if has('float') 526 let ff = 2.0 527 assert_true(ff >= 0.0) 528 assert_true(ff >= 2.0) 529 assert_false(ff >= 3.0) 530 endif 531enddef 532 533" test < comperator 534def Test_expr4_smaller() 535 assert_false(2 < 0) 536 assert_false(2 < 537 2) 538 assert_true(2 539 < 3) 540 let nr2 = 2 541 assert_false(nr2 < 0) 542 assert_false(nr2 < 2) 543 assert_true(nr2 < 3) 544 if has('float') 545 let ff = 2.0 546 assert_false(ff < 0.0) 547 assert_false(ff < 2.0) 548 assert_true(ff < 3.0) 549 endif 550enddef 551 552" test <= comperator 553def Test_expr4_smallerequal() 554 assert_false(2 <= 0) 555 assert_false(2 <= 556 1) 557 assert_true(2 558 <= 2) 559 assert_true(2 <= 3) 560 let nr2 = 2 561 assert_false(nr2 <= 0) 562 assert_false(nr2 <= 1) 563 assert_true(nr2 <= 2) 564 assert_true(nr2 <= 3) 565 if has('float') 566 let ff = 2.0 567 assert_false(ff <= 0.0) 568 assert_false(ff <= 1.0) 569 assert_true(ff <= 2.0) 570 assert_true(ff <= 3.0) 571 endif 572enddef 573 574" test =~ comperator 575def Test_expr4_match() 576 assert_equal(false, '2' =~ '0') 577 assert_equal(false, '' 578 =~ '0') 579 assert_equal(true, '2' =~ 580 '[0-9]') 581enddef 582 583" test !~ comperator 584def Test_expr4_nomatch() 585 assert_equal(true, '2' !~ '0') 586 assert_equal(true, '' 587 !~ '0') 588 assert_equal(false, '2' !~ 589 '[0-9]') 590enddef 591 592" test is comperator 593def Test_expr4_is() 594 let mylist = [2] 595 assert_false(mylist is [2]) 596 let other = mylist 597 assert_true(mylist is 598 other) 599 600 let myblob = 0z1234 601 assert_false(myblob 602 is 0z1234) 603 let otherblob = myblob 604 assert_true(myblob is otherblob) 605enddef 606 607" test isnot comperator 608def Test_expr4_isnot() 609 let mylist = [2] 610 assert_true('2' isnot '0') 611 assert_true(mylist isnot [2]) 612 let other = mylist 613 assert_false(mylist isnot 614 other) 615 616 let myblob = 0z1234 617 assert_true(myblob 618 isnot 0z1234) 619 let otherblob = myblob 620 assert_false(myblob isnot otherblob) 621enddef 622 623def RetVoid() 624 let x = 1 625enddef 626 627def Test_expr4_vimscript() 628 " check line continuation 629 let lines =<< trim END 630 vim9script 631 let var = 0 632 < 1 633 assert_equal(1, var) 634 END 635 CheckScriptSuccess(lines) 636 637 lines =<< trim END 638 vim9script 639 let var = 123 640 != 123 641 assert_equal(0, var) 642 END 643 CheckScriptSuccess(lines) 644 645 lines =<< trim END 646 vim9script 647 let var = 123 == 648 123 649 assert_equal(1, var) 650 END 651 CheckScriptSuccess(lines) 652 653 lines =<< trim END 654 vim9script 655 let list = [1, 2, 3] 656 let var = list 657 is list 658 assert_equal(1, var) 659 END 660 CheckScriptSuccess(lines) 661 662 lines =<< trim END 663 vim9script 664 let myblob = 0z1234 665 let var = myblob 666 isnot 0z11 667 assert_equal(1, var) 668 END 669 CheckScriptSuccess(lines) 670 671 " spot check mismatching types 672 lines =<< trim END 673 vim9script 674 echo '' == 0 675 END 676 CheckScriptFailure(lines, 'E1072:') 677 678 lines =<< trim END 679 vim9script 680 echo v:true > v:false 681 END 682 CheckScriptFailure(lines, 'Cannot compare bool with bool') 683 684 lines =<< trim END 685 vim9script 686 echo 123 is 123 687 END 688 CheckScriptFailure(lines, 'Cannot use "is" with number') 689enddef 690 691func Test_expr4_fails() 692 let msg = "white space required before and after '>'" 693 call CheckDefFailure(["let x = 1>2"], msg) 694 call CheckDefFailure(["let x = 1 >2"], msg) 695 call CheckDefFailure(["let x = 1> 2"], msg) 696 697 let msg = "white space required before and after '=='" 698 call CheckDefFailure(["let x = 1==2"], msg) 699 call CheckDefFailure(["let x = 1 ==2"], msg) 700 call CheckDefFailure(["let x = 1== 2"], msg) 701 702 let msg = "white space required before and after 'is'" 703 call CheckDefFailure(["let x = '1'is'2'"], msg) 704 call CheckDefFailure(["let x = '1' is'2'"], msg) 705 call CheckDefFailure(["let x = '1'is '2'"], msg) 706 707 let msg = "white space required before and after 'isnot'" 708 call CheckDefFailure(["let x = '1'isnot'2'"], msg) 709 call CheckDefFailure(["let x = '1' isnot'2'"], msg) 710 call CheckDefFailure(["let x = '1'isnot '2'"], msg) 711 712 call CheckDefFailure(["let x = 1 is# 2"], 'E15:') 713 call CheckDefFailure(["let x = 1 is? 2"], 'E15:') 714 call CheckDefFailure(["let x = 1 isnot# 2"], 'E15:') 715 call CheckDefFailure(["let x = 1 isnot? 2"], 'E15:') 716 717 call CheckDefFailure(["let x = 1 == '2'"], 'Cannot compare number with string') 718 call CheckDefFailure(["let x = '1' == 2"], 'Cannot compare string with number') 719 call CheckDefFailure(["let x = 1 == RetVoid()"], 'Cannot compare number with void') 720 call CheckDefFailure(["let x = RetVoid() == 1"], 'Cannot compare void with number') 721 722 call CheckDefFailure(["let x = true > false"], 'Cannot compare bool with bool') 723 call CheckDefFailure(["let x = true >= false"], 'Cannot compare bool with bool') 724 call CheckDefFailure(["let x = true < false"], 'Cannot compare bool with bool') 725 call CheckDefFailure(["let x = true <= false"], 'Cannot compare bool with bool') 726 call CheckDefFailure(["let x = true =~ false"], 'Cannot compare bool with bool') 727 call CheckDefFailure(["let x = true !~ false"], 'Cannot compare bool with bool') 728 call CheckDefFailure(["let x = true is false"], 'Cannot use "is" with bool') 729 call CheckDefFailure(["let x = true isnot false"], 'Cannot use "isnot" with bool') 730 731 call CheckDefFailure(["let x = v:none is v:null"], 'Cannot use "is" with special') 732 call CheckDefFailure(["let x = v:none isnot v:null"], 'Cannot use "isnot" with special') 733 call CheckDefFailure(["let x = 123 is 123"], 'Cannot use "is" with number') 734 call CheckDefFailure(["let x = 123 isnot 123"], 'Cannot use "isnot" with number') 735 if has('float') 736 call CheckDefFailure(["let x = 1.3 is 1.3"], 'Cannot use "is" with float') 737 call CheckDefFailure(["let x = 1.3 isnot 1.3"], 'Cannot use "isnot" with float') 738 endif 739 740 call CheckDefFailure(["let x = 0za1 > 0z34"], 'Cannot compare blob with blob') 741 call CheckDefFailure(["let x = 0za1 >= 0z34"], 'Cannot compare blob with blob') 742 call CheckDefFailure(["let x = 0za1 < 0z34"], 'Cannot compare blob with blob') 743 call CheckDefFailure(["let x = 0za1 <= 0z34"], 'Cannot compare blob with blob') 744 call CheckDefFailure(["let x = 0za1 =~ 0z34"], 'Cannot compare blob with blob') 745 call CheckDefFailure(["let x = 0za1 !~ 0z34"], 'Cannot compare blob with blob') 746 747 call CheckDefFailure(["let x = [13] > [88]"], 'Cannot compare list with list') 748 call CheckDefFailure(["let x = [13] >= [88]"], 'Cannot compare list with list') 749 call CheckDefFailure(["let x = [13] < [88]"], 'Cannot compare list with list') 750 call CheckDefFailure(["let x = [13] <= [88]"], 'Cannot compare list with list') 751 call CheckDefFailure(["let x = [13] =~ [88]"], 'Cannot compare list with list') 752 call CheckDefFailure(["let x = [13] !~ [88]"], 'Cannot compare list with list') 753 754 call CheckDefFailure(['let j: job', 'let chan: channel', 'let r = j == chan'], 'Cannot compare job with channel') 755 call CheckDefFailure(['let j: job', 'let x: list<any>', 'let r = j == x'], 'Cannot compare job with list') 756 call CheckDefFailure(['let j: job', 'let Xx: func', 'let r = j == Xx'], 'Cannot compare job with func') 757 call CheckDefFailure(['let j: job', 'let Xx: func', 'let r = j == Xx'], 'Cannot compare job with func') 758endfunc 759 760" test addition, subtraction, concatenation 761def Test_expr5() 762 assert_equal(66, 60 + 6) 763 assert_equal(70, 60 + 764 g:anint) 765 assert_equal(9, g:alsoint 766 + 5) 767 assert_equal(14, g:alsoint + g:anint) 768 assert_equal([1, 2, 3, 4], [1] + g:alist) 769 770 assert_equal(54, 60 - 6) 771 assert_equal(50, 60 - 772 g:anint) 773 assert_equal(-1, g:alsoint 774 - 5) 775 assert_equal(-6, g:alsoint - g:anint) 776 777 assert_equal('hello', 'hel' .. 'lo') 778 assert_equal('hello 123', 'hello ' .. 779 123) 780 assert_equal('hello 123', 'hello ' 781 .. 123) 782 assert_equal('123 hello', 123 .. ' hello') 783 assert_equal('123456', 123 .. 456) 784 785 assert_equal([1, 2, 3, 4], [1, 2] + [3, 4]) 786 assert_equal(0z11223344, 0z1122 + 0z3344) 787 assert_equal(0z112201ab, 0z1122 788 + g:ablob) 789 assert_equal(0z01ab3344, g:ablob + 0z3344) 790 assert_equal(0z01ab01ab, g:ablob + g:ablob) 791enddef 792 793def Test_expr5_vim9script() 794 " only checks line continuation 795 let lines =<< trim END 796 vim9script 797 let var = 11 798 + 77 799 - 22 800 assert_equal(66, var) 801 END 802 CheckScriptSuccess(lines) 803 804 lines =<< trim END 805 vim9script 806 let var = 'one' 807 .. 'two' 808 assert_equal('onetwo', var) 809 END 810 CheckScriptSuccess(lines) 811enddef 812 813def Test_expr5_float() 814 if !has('float') 815 MissingFeature 'float' 816 else 817 assert_equal(66.0, 60.0 + 6.0) 818 assert_equal(66.0, 60.0 + 6) 819 assert_equal(66.0, 60 + 820 6.0) 821 assert_equal(5.1, g:afloat 822 + 5) 823 assert_equal(8.1, 8 + g:afloat) 824 assert_equal(10.1, g:anint + g:afloat) 825 assert_equal(10.1, g:afloat + g:anint) 826 827 assert_equal(54.0, 60.0 - 6.0) 828 assert_equal(54.0, 60.0 829 - 6) 830 assert_equal(54.0, 60 - 6.0) 831 assert_equal(-4.9, g:afloat - 5) 832 assert_equal(7.9, 8 - g:afloat) 833 assert_equal(9.9, g:anint - g:afloat) 834 assert_equal(-9.9, g:afloat - g:anint) 835 endif 836enddef 837 838func Test_expr5_fails() 839 let msg = "white space required before and after '+'" 840 call CheckDefFailure(["let x = 1+2"], msg) 841 call CheckDefFailure(["let x = 1 +2"], msg) 842 call CheckDefFailure(["let x = 1+ 2"], msg) 843 844 let msg = "white space required before and after '-'" 845 call CheckDefFailure(["let x = 1-2"], msg) 846 call CheckDefFailure(["let x = 1 -2"], msg) 847 call CheckDefFailure(["let x = 1- 2"], msg) 848 849 let msg = "white space required before and after '..'" 850 call CheckDefFailure(["let x = '1'..'2'"], msg) 851 call CheckDefFailure(["let x = '1' ..'2'"], msg) 852 call CheckDefFailure(["let x = '1'.. '2'"], msg) 853 854 call CheckDefFailure(["let x = 0z1122 + 33"], 'E1051') 855 call CheckDefFailure(["let x = 0z1122 + [3]"], 'E1051') 856 call CheckDefFailure(["let x = 0z1122 + 'asd'"], 'E1051') 857 call CheckDefFailure(["let x = 33 + 0z1122"], 'E1051') 858 call CheckDefFailure(["let x = [3] + 0z1122"], 'E1051') 859 call CheckDefFailure(["let x = 'asdf' + 0z1122"], 'E1051') 860 call CheckDefFailure(["let x = 6 + xxx"], 'E1001') 861endfunc 862 863" test multiply, divide, modulo 864def Test_expr6() 865 assert_equal(36, 6 * 6) 866 assert_equal(24, 6 * 867 g:alsoint) 868 assert_equal(24, g:alsoint 869 * 6) 870 assert_equal(40, g:anint * g:alsoint) 871 872 assert_equal(10, 60 / 6) 873 assert_equal(6, 60 / 874 g:anint) 875 assert_equal(1, g:anint / 6) 876 assert_equal(2, g:anint 877 / g:alsoint) 878 879 assert_equal(5, 11 % 6) 880 assert_equal(4, g:anint % 6) 881 assert_equal(3, 13 % 882 g:anint) 883 assert_equal(2, g:anint 884 % g:alsoint) 885 886 assert_equal(4, 6 * 4 / 6) 887 888 let x = [2] 889 let y = [3] 890 assert_equal(5, x[0] + y[0]) 891 assert_equal(6, x[0] * y[0]) 892 if has('float') 893 let xf = [2.0] 894 let yf = [3.0] 895 assert_equal(5.0, xf[0] 896 + yf[0]) 897 assert_equal(6.0, xf[0] 898 * yf[0]) 899 endif 900 901 call CheckDefFailure(["let x = 6 * xxx"], 'E1001') 902enddef 903 904def Test_expr6_vim9script() 905 " only checks line continuation 906 let lines =<< trim END 907 vim9script 908 let var = 11 909 * 22 910 / 3 911 assert_equal(80, var) 912 END 913 CheckScriptSuccess(lines) 914 915 lines =<< trim END 916 vim9script 917 let var = 25 918 % 10 919 assert_equal(5, var) 920 END 921 CheckScriptSuccess(lines) 922enddef 923 924def Test_expr6_float() 925 if !has('float') 926 MissingFeature 'float' 927 else 928 assert_equal(36.0, 6.0 * 6) 929 assert_equal(36.0, 6 * 930 6.0) 931 assert_equal(36.0, 6.0 * 6.0) 932 assert_equal(1.0, g:afloat * g:anint) 933 934 assert_equal(10.0, 60 / 6.0) 935 assert_equal(10.0, 60.0 / 936 6) 937 assert_equal(10.0, 60.0 / 6.0) 938 assert_equal(0.01, g:afloat / g:anint) 939 940 assert_equal(4.0, 6.0 * 4 / 6) 941 assert_equal(4.0, 6 * 942 4.0 / 943 6) 944 assert_equal(4.0, 6 * 4 / 6.0) 945 assert_equal(4.0, 6.0 * 4.0 / 6) 946 assert_equal(4.0, 6 * 4.0 / 6.0) 947 assert_equal(4.0, 6.0 * 4 / 6.0) 948 assert_equal(4.0, 6.0 * 4.0 / 6.0) 949 950 assert_equal(4.0, 6.0 * 4.0 / 6.0) 951 endif 952enddef 953 954func Test_expr6_fails() 955 let msg = "white space required before and after '*'" 956 call CheckDefFailure(["let x = 1*2"], msg) 957 call CheckDefFailure(["let x = 1 *2"], msg) 958 call CheckDefFailure(["let x = 1* 2"], msg) 959 960 let msg = "white space required before and after '/'" 961 call CheckDefFailure(["let x = 1/2"], msg) 962 call CheckDefFailure(["let x = 1 /2"], msg) 963 call CheckDefFailure(["let x = 1/ 2"], msg) 964 965 let msg = "white space required before and after '%'" 966 call CheckDefFailure(["let x = 1%2"], msg) 967 call CheckDefFailure(["let x = 1 %2"], msg) 968 call CheckDefFailure(["let x = 1% 2"], msg) 969 970 call CheckDefFailure(["let x = '1' * '2'"], 'E1036:') 971 call CheckDefFailure(["let x = '1' / '2'"], 'E1036:') 972 call CheckDefFailure(["let x = '1' % '2'"], 'E1035:') 973 974 call CheckDefFailure(["let x = 0z01 * 0z12"], 'E1036:') 975 call CheckDefFailure(["let x = 0z01 / 0z12"], 'E1036:') 976 call CheckDefFailure(["let x = 0z01 % 0z12"], 'E1035:') 977 978 call CheckDefFailure(["let x = [1] * [2]"], 'E1036:') 979 call CheckDefFailure(["let x = [1] / [2]"], 'E1036:') 980 call CheckDefFailure(["let x = [1] % [2]"], 'E1035:') 981 982 call CheckDefFailure(["let x = #{one: 1} * #{two: 2}"], 'E1036:') 983 call CheckDefFailure(["let x = #{one: 1} / #{two: 2}"], 'E1036:') 984 call CheckDefFailure(["let x = #{one: 1} % #{two: 2}"], 'E1035:') 985 986 call CheckDefFailure(["let x = 0xff[1]"], 'E1090:') 987 if has('float') 988 call CheckDefFailure(["let x = 0.7[1]"], 'E1090:') 989 endif 990endfunc 991 992func Test_expr6_float_fails() 993 CheckFeature float 994 call CheckDefFailure(["let x = 1.0 % 2"], 'E1035:') 995endfunc 996 997" define here to use old style parsing 998if has('float') 999 let g:float_zero = 0.0 1000 let g:float_neg = -9.8 1001 let g:float_big = 9.9e99 1002endif 1003let g:blob_empty = 0z 1004let g:blob_one = 0z01 1005let g:blob_long = 0z0102.0304 1006 1007let g:string_empty = '' 1008let g:string_short = 'x' 1009let g:string_long = 'abcdefghijklm' 1010let g:string_special = "ab\ncd\ref\ekk" 1011 1012let g:special_true = v:true 1013let g:special_false = v:false 1014let g:special_null = v:null 1015let g:special_none = v:none 1016 1017let g:list_empty = [] 1018let g:list_mixed = [1, 'b', v:false] 1019 1020let g:dict_empty = {} 1021let g:dict_one = #{one: 1} 1022 1023let $TESTVAR = 'testvar' 1024 1025" test low level expression 1026def Test_expr7_number() 1027 " number constant 1028 assert_equal(0, 0) 1029 assert_equal(654, 0654) 1030 1031 assert_equal(6, 0x6) 1032 assert_equal(15, 0xf) 1033 assert_equal(255, 0xff) 1034enddef 1035 1036def Test_expr7_float() 1037 " float constant 1038 if !has('float') 1039 MissingFeature 'float' 1040 else 1041 assert_equal(g:float_zero, .0) 1042 assert_equal(g:float_zero, 0.0) 1043 assert_equal(g:float_neg, -9.8) 1044 assert_equal(g:float_big, 9.9e99) 1045 endif 1046enddef 1047 1048def Test_expr7_blob() 1049 " blob constant 1050 assert_equal(g:blob_empty, 0z) 1051 assert_equal(g:blob_one, 0z01) 1052 assert_equal(g:blob_long, 0z0102.0304) 1053 1054 call CheckDefFailure(["let x = 0z123"], 'E973:') 1055enddef 1056 1057def Test_expr7_string() 1058 " string constant 1059 assert_equal(g:string_empty, '') 1060 assert_equal(g:string_empty, "") 1061 assert_equal(g:string_short, 'x') 1062 assert_equal(g:string_short, "x") 1063 assert_equal(g:string_long, 'abcdefghijklm') 1064 assert_equal(g:string_long, "abcdefghijklm") 1065 assert_equal(g:string_special, "ab\ncd\ref\ekk") 1066 1067 call CheckDefFailure(['let x = "abc'], 'E114:') 1068 call CheckDefFailure(["let x = 'abc"], 'E115:') 1069enddef 1070 1071def Test_expr7_vimvar() 1072 let old: list<string> = v:oldfiles 1073 let compl: dict<any> = v:completed_item 1074 1075 call CheckDefFailure(["let old: list<number> = v:oldfiles"], 'E1013: type mismatch, expected list<number> but got list<string>') 1076 call CheckDefFailure(["let old: dict<number> = v:completed_item"], 'E1013: type mismatch, expected dict<number> but got dict<any>') 1077enddef 1078 1079def Test_expr7_special() 1080 " special constant 1081 assert_equal(g:special_true, true) 1082 assert_equal(g:special_false, false) 1083 assert_equal(g:special_true, v:true) 1084 assert_equal(g:special_false, v:false) 1085 assert_equal(g:special_null, v:null) 1086 assert_equal(g:special_none, v:none) 1087 1088 call CheckDefFailure(['v:true = true'], 'E46:') 1089 call CheckDefFailure(['v:true = false'], 'E46:') 1090 call CheckDefFailure(['v:false = true'], 'E46:') 1091 call CheckDefFailure(['v:null = 11'], 'E46:') 1092 call CheckDefFailure(['v:none = 22'], 'E46:') 1093enddef 1094 1095def Test_expr7_special_vim9script() 1096 let lines =<< trim END 1097 vim9script 1098 let t = true 1099 let f = false 1100 assert_equal(v:true, true) 1101 assert_equal(true, t) 1102 assert_equal(v:false, false) 1103 assert_equal(false, f) 1104 END 1105 CheckScriptSuccess(lines) 1106enddef 1107 1108def Test_expr7_list() 1109 " list 1110 assert_equal(g:list_empty, []) 1111 assert_equal(g:list_empty, [ ]) 1112 assert_equal(g:list_mixed, [1, 'b', false,]) 1113 assert_equal('b', g:list_mixed[1]) 1114 1115 call CheckDefExecFailure(["let x = g:anint[3]"], 'E714:') 1116 call CheckDefFailure(["let x = g:list_mixed[xxx]"], 'E1001:') 1117 call CheckDefFailure(["let x = [1,2,3]"], 'E1069:') 1118 call CheckDefExecFailure(["let x = g:list_mixed['xx']"], 'E39:') 1119 call CheckDefFailure(["let x = g:list_mixed["], 'E1097:') 1120 call CheckDefFailure(["let x = g:list_mixed[0"], 'E1097:') 1121 call CheckDefExecFailure(["let x = g:list_empty[3]"], 'E684:') 1122enddef 1123 1124def Test_expr7_list_vim9script() 1125 let lines =<< trim END 1126 vim9script 1127 let l = [ 1128 11, 1129 22, 1130 ] 1131 assert_equal([11, 22], l) 1132 END 1133 CheckScriptSuccess(lines) 1134 1135 lines =<< trim END 1136 vim9script 1137 let l = [11, 1138 22] 1139 assert_equal([11, 22], l) 1140 END 1141 CheckScriptSuccess(lines) 1142 1143 lines =<< trim END 1144 vim9script 1145 let l = [11,22] 1146 END 1147 CheckScriptFailure(lines, 'E1069:') 1148enddef 1149 1150def Test_expr7_lambda() 1151 let La = { -> 'result'} 1152 assert_equal('result', La()) 1153 assert_equal([1, 3, 5], [1, 2, 3]->map({key, val -> key + val})) 1154 1155 " line continuation inside lambda with "cond ? expr : expr" works 1156 let ll = range(3) 1157 map(ll, {k, v -> v % 2 ? { 1158 '111': 111 } : {} 1159 }) 1160 assert_equal([{}, {'111': 111}, {}], ll) 1161 1162 ll = range(3) 1163 map(ll, {k, v -> v == 8 || v 1164 == 9 1165 || v % 2 ? 111 : 222 1166 }) 1167 assert_equal([222, 111, 222], ll) 1168 1169 ll = range(3) 1170 map(ll, {k, v -> v != 8 && v 1171 != 9 1172 && v % 2 == 0 ? 111 : 222 1173 }) 1174 assert_equal([111, 222, 111], ll) 1175 1176 call CheckDefFailure(["filter([1, 2], {k,v -> 1})"], 'E1069:') 1177enddef 1178 1179def Test_expr7_lambda_vim9script() 1180 let lines =<< trim END 1181 vim9script 1182 let v = 10->{a -> 1183 a 1184 + 2 1185 }() 1186 assert_equal(12, v) 1187 END 1188 CheckScriptSuccess(lines) 1189enddef 1190 1191def Test_expr7_dict() 1192 " dictionary 1193 assert_equal(g:dict_empty, {}) 1194 assert_equal(g:dict_empty, { }) 1195 assert_equal(g:dict_one, {'one': 1}) 1196 let key = 'one' 1197 let val = 1 1198 assert_equal(g:dict_one, {key: val}) 1199 1200 call CheckDefFailure(["let x = #{8: 8}"], 'E1014:') 1201 call CheckDefFailure(["let x = #{xxx}"], 'E720:') 1202 call CheckDefFailure(["let x = #{xxx: 1", "let y = 2"], 'E722:') 1203 call CheckDefFailure(["let x = #{xxx: 1,"], 'E723:') 1204 call CheckDefFailure(["let x = {'a': xxx}"], 'E1001:') 1205 call CheckDefFailure(["let x = {xxx: 8}"], 'E1001:') 1206 call CheckDefFailure(["let x = #{a: 1, a: 2}"], 'E721:') 1207 call CheckDefFailure(["let x = #"], 'E1015:') 1208 call CheckDefFailure(["let x += 1"], 'E1020:') 1209 call CheckDefFailure(["let x = x + 1"], 'E1001:') 1210 call CheckDefExecFailure(["let x = g:anint.member"], 'E715:') 1211 call CheckDefExecFailure(["let x = g:dict_empty.member"], 'E716:') 1212enddef 1213 1214def Test_expr7_dict_vim9script() 1215 let lines =<< trim END 1216 vim9script 1217 let d = { 1218 'one': 1219 1, 1220 'two': 2, 1221 } 1222 assert_equal({'one': 1, 'two': 2}, d) 1223 END 1224 CheckScriptSuccess(lines) 1225 1226 lines =<< trim END 1227 vim9script 1228 let d = { "one": "one", "two": "two", } 1229 assert_equal({'one': 'one', 'two': 'two'}, d) 1230 END 1231 CheckScriptSuccess(lines) 1232 1233 lines =<< trim END 1234 vim9script 1235 let d = #{one: 1, 1236 two: 2, 1237 } 1238 assert_equal({'one': 1, 'two': 2}, d) 1239 END 1240 CheckScriptSuccess(lines) 1241 1242 lines =<< trim END 1243 vim9script 1244 let d = #{one:1, two: 2} 1245 END 1246 CheckScriptFailure(lines, 'E1069:') 1247 1248 lines =<< trim END 1249 vim9script 1250 let d = #{one: 1,two: 2} 1251 END 1252 CheckScriptFailure(lines, 'E1069:') 1253enddef 1254 1255let g:oneString = 'one' 1256 1257def Test_expr_member() 1258 assert_equal(1, g:dict_one.one) 1259 let d: dict<number> = g:dict_one 1260 assert_equal(1, d['one']) 1261 assert_equal(1, d[ 1262 'one' 1263 ]) 1264 assert_equal(1, d 1265 .one) 1266 1267 # getting the one member should clear the dict after getting the item 1268 assert_equal('one', #{one: 'one'}.one) 1269 assert_equal('one', #{one: 'one'}[g:oneString]) 1270 1271 call CheckDefFailure(["let x = g:dict_one.#$!"], 'E1002:') 1272 call CheckDefExecFailure(["let d: dict<any>", "echo d['a']"], 'E716:') 1273 call CheckDefExecFailure(["let d: dict<number>", "d = g:list_empty"], 'E1029: Expected dict but got list') 1274enddef 1275 1276def Test_expr_index() 1277 # getting the one member should clear the list only after getting the item 1278 assert_equal('bbb', ['aaa', 'bbb', 'ccc'][1]) 1279enddef 1280 1281def Test_expr_member_vim9script() 1282 let lines =<< trim END 1283 vim9script 1284 let d = #{one: 1285 'one', 1286 two: 'two'} 1287 assert_equal('one', d.one) 1288 assert_equal('one', d 1289 .one) 1290 assert_equal('one', d[ 1291 'one' 1292 ]) 1293 END 1294 CheckScriptSuccess(lines) 1295 1296 lines =<< trim END 1297 vim9script 1298 let l = [1, 1299 2, 1300 3, 4 1301 ] 1302 assert_equal(2, l[ 1303 1 1304 ]) 1305 assert_equal([2, 3], l[1 : 2]) 1306 assert_equal([1, 2, 3], l[ 1307 : 1308 2 1309 ]) 1310 assert_equal([3, 4], l[ 1311 2 1312 : 1313 ]) 1314 END 1315 CheckScriptSuccess(lines) 1316enddef 1317 1318def Test_expr7_option() 1319 " option 1320 set ts=11 1321 assert_equal(11, &ts) 1322 &ts = 9 1323 assert_equal(9, &ts) 1324 set ts=8 1325 set grepprg=some\ text 1326 assert_equal('some text', &grepprg) 1327 &grepprg = test_null_string() 1328 assert_equal('', &grepprg) 1329 set grepprg& 1330enddef 1331 1332def Test_expr7_environment() 1333 " environment variable 1334 assert_equal('testvar', $TESTVAR) 1335 assert_equal('', $ASDF_ASD_XXX) 1336 1337 call CheckDefFailure(["let x = $$$"], 'E1002:') 1338enddef 1339 1340def Test_expr7_register() 1341 @a = 'register a' 1342 assert_equal('register a', @a) 1343enddef 1344 1345def Test_expr7_parens() 1346 " (expr) 1347 assert_equal(4, (6 * 4) / 6) 1348 assert_equal(0, 6 * ( 4 / 6 )) 1349 1350 assert_equal(6, +6) 1351 assert_equal(-6, -6) 1352 assert_equal(6, --6) 1353 assert_equal(6, -+-6) 1354 assert_equal(-6, ---6) 1355 assert_equal(false, !-3) 1356 assert_equal(true, !+-+0) 1357enddef 1358 1359def Test_expr7_parens_vim9script() 1360 let lines =<< trim END 1361 vim9script 1362 let s = ( 1363 'one' 1364 .. 1365 'two' 1366 ) 1367 assert_equal('onetwo', s) 1368 END 1369 CheckScriptSuccess(lines) 1370enddef 1371 1372def Test_expr7_negate() 1373 assert_equal(-99, -99) 1374 assert_equal(99, --99) 1375 let nr = 88 1376 assert_equal(-88, -nr) 1377 assert_equal(88, --nr) 1378enddef 1379 1380def Echo(arg: any): string 1381 return arg 1382enddef 1383 1384def s:EchoArg(arg: any): string 1385 return arg 1386enddef 1387 1388def Test_expr7_call() 1389 assert_equal('yes', 'yes'->Echo()) 1390 assert_equal('yes', 'yes'->s:EchoArg()) 1391 assert_equal(1, !range(5)->empty()) 1392 assert_equal([0, 1, 2], --3->range()) 1393 1394 call CheckDefFailure(["let x = 'yes'->Echo"], 'E107:') 1395enddef 1396 1397 1398def Test_expr7_not() 1399 assert_equal(true, !'') 1400 assert_equal(true, ![]) 1401 assert_equal(false, !'asdf') 1402 assert_equal(false, ![2]) 1403 assert_equal(true, !!'asdf') 1404 assert_equal(true, !![2]) 1405 1406 assert_equal(true, !test_null_partial()) 1407 assert_equal(false, !{-> 'yes'}) 1408 1409 assert_equal(true, !test_null_dict()) 1410 assert_equal(true, !{}) 1411 assert_equal(false, !{'yes': 'no'}) 1412 1413 if has('channel') 1414 assert_equal(true, !test_null_job()) 1415 assert_equal(true, !test_null_channel()) 1416 endif 1417 1418 assert_equal(true, !test_null_blob()) 1419 assert_equal(true, !0z) 1420 assert_equal(false, !0z01) 1421 1422 assert_equal(true, !test_void()) 1423 assert_equal(true, !test_unknown()) 1424enddef 1425 1426func Test_expr7_fails() 1427 call CheckDefFailure(["let x = (12"], "E110:") 1428 1429 call CheckDefFailure(["let x = -'xx'"], "E1030:") 1430 call CheckDefFailure(["let x = +'xx'"], "E1030:") 1431 call CheckDefFailure(["let x = -0z12"], "E974:") 1432 call CheckDefExecFailure(["let x = -[8]"], "E39:") 1433 call CheckDefExecFailure(["let x = -{'a': 1}"], "E39:") 1434 1435 call CheckDefFailure(["let x = @"], "E1002:") 1436 call CheckDefFailure(["let x = @<"], "E354:") 1437 1438 call CheckDefFailure(["let x = [1, 2"], "E697:") 1439 call CheckDefFailure(["let x = [notfound]"], "E1001:") 1440 1441 call CheckDefFailure(["let x = { -> 123) }"], "E451:") 1442 call CheckDefFailure(["let x = 123->{x -> x + 5) }"], "E451:") 1443 1444 call CheckDefFailure(["let x = ¬exist"], 'E113:') 1445 call CheckDefFailure(["&grepprg = [343]"], 'E1013:') 1446 1447 call CheckDefExecFailure(["echo s:doesnt_exist"], 'E121:') 1448 call CheckDefExecFailure(["echo g:doesnt_exist"], 'E121:') 1449 1450 call CheckDefFailure(["echo a:somevar"], 'E1075:') 1451 call CheckDefFailure(["echo l:somevar"], 'E1075:') 1452 call CheckDefFailure(["echo x:somevar"], 'E1075:') 1453 1454 call CheckDefExecFailure(["let x = +g:astring"], 'E1030:') 1455 call CheckDefExecFailure(["let x = +g:ablob"], 'E974:') 1456 call CheckDefExecFailure(["let x = +g:alist"], 'E745:') 1457 call CheckDefExecFailure(["let x = +g:adict"], 'E728:') 1458 1459 call CheckDefFailure(["let x = ''", "let y = x.memb"], 'E715:') 1460 1461 call CheckDefExecFailure(["[1, 2->len()"], 'E697:') 1462 call CheckDefExecFailure(["#{a: 1->len()"], 'E488:') 1463 call CheckDefExecFailure(["{'a': 1->len()"], 'E723:') 1464endfunc 1465 1466let g:Funcrefs = [function('add')] 1467 1468func CallMe(arg) 1469 return a:arg 1470endfunc 1471 1472func CallMe2(one, two) 1473 return a:one .. a:two 1474endfunc 1475 1476def Test_expr7_trailing() 1477 " user function call 1478 assert_equal(123, g:CallMe(123)) 1479 assert_equal(123, g:CallMe( 123)) 1480 assert_equal(123, g:CallMe(123 )) 1481 assert_equal('yesno', g:CallMe2('yes', 'no')) 1482 assert_equal('yesno', g:CallMe2( 'yes', 'no' )) 1483 assert_equal('nothing', g:CallMe('nothing')) 1484 1485 " partial call 1486 let Part = function('g:CallMe') 1487 assert_equal('yes', Part('yes')) 1488 1489 " funcref call, using list index 1490 let l = [] 1491 g:Funcrefs[0](l, 2) 1492 assert_equal([2], l) 1493 1494 " method call 1495 l = [2, 5, 6] 1496 l->map({k, v -> k + v}) 1497 assert_equal([2, 6, 8], l) 1498 1499 " lambda method call 1500 l = [2, 5] 1501 l->{l -> add(l, 8)}() 1502 assert_equal([2, 5, 8], l) 1503 1504 " dict member 1505 let d = #{key: 123} 1506 assert_equal(123, d.key) 1507enddef 1508 1509def Test_expr7_subscript_linebreak() 1510 let range = range( 1511 3) 1512 let l = range-> 1513 map('string(v:key)') 1514 assert_equal(['0', '1', '2'], l) 1515 1516 l = range 1517 ->map('string(v:key)') 1518 assert_equal(['0', '1', '2'], l) 1519 1520 l = range # comment 1521 ->map('string(v:key)') 1522 assert_equal(['0', '1', '2'], l) 1523 1524 l = range 1525 1526 ->map('string(v:key)') 1527 assert_equal(['0', '1', '2'], l) 1528 1529 l = range 1530 # comment 1531 ->map('string(v:key)') 1532 assert_equal(['0', '1', '2'], l) 1533 1534 assert_equal('1', l[ 1535 1]) 1536 1537 let d = #{one: 33} 1538 assert_equal(33, d. 1539 one) 1540enddef 1541 1542def Test_expr7_method_call() 1543 new 1544 setline(1, ['first', 'last']) 1545 eval 'second'->append(1) 1546 assert_equal(['first', 'second', 'last'], getline(1, '$')) 1547 bwipe! 1548 1549 let bufnr = bufnr() 1550 let loclist = [#{bufnr: bufnr, lnum: 42, col: 17, text: 'wrong'}] 1551 loclist->setloclist(0) 1552 assert_equal([#{bufnr: bufnr, 1553 lnum: 42, 1554 col: 17, 1555 text: 'wrong', 1556 pattern: '', 1557 valid: 1, 1558 vcol: 0, 1559 nr: 0, 1560 type: '', 1561 module: ''} 1562 ], getloclist(0)) 1563enddef 1564 1565func Test_expr7_trailing_fails() 1566 call CheckDefFailure(['let l = [2]', 'l->{l -> add(l, 8)}'], 'E107') 1567 call CheckDefFailure(['let l = [2]', 'l->{l -> add(l, 8)} ()'], 'E274') 1568endfunc 1569 1570func Test_expr_fails() 1571 call CheckDefFailure(["let x = '1'is2"], 'E488:') 1572 call CheckDefFailure(["let x = '1'isnot2"], 'E488:') 1573 1574 call CheckDefFailure(["CallMe ('yes')"], 'E476:') 1575 call CheckDefFailure(["CallMe2('yes','no')"], 'E1069:') 1576 call CheckDefFailure(["CallMe2('yes' , 'no')"], 'E1068:') 1577 1578 call CheckDefFailure(["v:nosuch += 3"], 'E1001:') 1579 call CheckDefFailure(["let v:statusmsg = ''"], 'E1016: Cannot declare a v: variable:') 1580 call CheckDefFailure(["let asdf = v:nosuch"], 'E1001:') 1581 1582 call CheckDefFailure(["echo len('asdf'"], 'E110:') 1583 call CheckDefFailure(["echo Func0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789()"], 'E1011:') 1584 call CheckDefFailure(["echo doesnotexist()"], 'E117:') 1585endfunc 1586