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