1" Tests for the Blob types 2 3source vim9.vim 4 5func TearDown() 6 " Run garbage collection after every test 7 call test_garbagecollect_now() 8endfunc 9 10" Tests for Blob type 11 12" Blob creation from constant 13func Test_blob_create() 14 let lines =<< trim END 15 VAR b = 0zDEADBEEF 16 call assert_equal(v:t_blob, type(b)) 17 call assert_equal(4, len(b)) 18 call assert_equal(0xDE, b[0]) 19 call assert_equal(0xAD, b[1]) 20 call assert_equal(0xBE, b[2]) 21 call assert_equal(0xEF, b[3]) 22 call assert_fails('VAR x = b[4]') 23 24 call assert_equal(0xDE, get(b, 0)) 25 call assert_equal(0xEF, get(b, 3)) 26 27 call assert_fails('VAR b = 0z1', 'E973:') 28 call assert_fails('VAR b = 0z1x', 'E973:') 29 call assert_fails('VAR b = 0z12345', 'E973:') 30 31 call assert_equal(0z, test_null_blob()) 32 33 LET b = 0z001122.33445566.778899.aabbcc.dd 34 call assert_equal(0z00112233445566778899aabbccdd, b) 35 call assert_fails('VAR b = 0z1.1') 36 call assert_fails('VAR b = 0z.') 37 call assert_fails('VAR b = 0z001122.') 38 call assert_fails('call get("", 1)', 'E896:') 39 call assert_equal(0, len(test_null_blob())) 40 END 41 call CheckLegacyAndVim9Success(lines) 42endfunc 43 44" assignment to a blob 45func Test_blob_assign() 46 let lines =<< trim END 47 VAR b = 0zDEADBEEF 48 VAR b2 = b[1 : 2] 49 call assert_equal(0zADBE, b2) 50 51 VAR bcopy = b[:] 52 call assert_equal(b, bcopy) 53 call assert_false(b is bcopy) 54 55 LET b = 0zDEADBEEF 56 LET b2 = b 57 call assert_true(b is b2) 58 LET b[:] = 0z11223344 59 call assert_equal(0z11223344, b) 60 call assert_equal(0z11223344, b2) 61 call assert_true(b is b2) 62 63 LET b = 0zDEADBEEF 64 LET b[3 :] = 0z66 65 call assert_equal(0zDEADBE66, b) 66 LET b[: 1] = 0z8899 67 call assert_equal(0z8899BE66, b) 68 69 LET b = 0zDEADBEEF 70 LET b += 0z99 71 call assert_equal(0zDEADBEEF99, b) 72 73 VAR l = [0z12] 74 VAR m = deepcopy(l) 75 LET m[0] = 0z34 #" E742 or E741 should not occur. 76 END 77 call CheckLegacyAndVim9Success(lines) 78 79 let lines =<< trim END 80 VAR b = 0zDEADBEEF 81 LET b[2 : 3] = 0z112233 82 END 83 call CheckLegacyAndVim9Failure(lines, 'E972:') 84 85 let lines =<< trim END 86 VAR b = 0zDEADBEEF 87 LET b[2 : 3] = 0z11 88 END 89 call CheckLegacyAndVim9Failure(lines, 'E972:') 90 91 let lines =<< trim END 92 VAR b = 0zDEADBEEF 93 LET b[3 : 2] = 0z 94 END 95 call CheckLegacyAndVim9Failure(lines, 'E979:') 96 97 let lines =<< trim END 98 VAR b = 0zDEADBEEF 99 LET b ..= 0z33 100 END 101 call CheckLegacyAndVim9Failure(lines, ['E734:', 'E1019:', 'E734:']) 102 103 let lines =<< trim END 104 VAR b = 0zDEADBEEF 105 LET b ..= "xx" 106 END 107 call CheckLegacyAndVim9Failure(lines, ['E734:', 'E1019:', 'E734:']) 108 109 let lines =<< trim END 110 VAR b = 0zDEADBEEF 111 LET b += "xx" 112 END 113 call CheckLegacyAndVim9Failure(lines, ['E734:', 'E1012:', 'E734:']) 114 115 let lines =<< trim END 116 VAR b = 0zDEADBEEF 117 LET b[1 : 1] ..= 0z55 118 END 119 call CheckLegacyAndVim9Failure(lines, ['E734:', 'E1183:', 'E734:']) 120endfunc 121 122func Test_blob_get_range() 123 let lines =<< trim END 124 VAR b = 0z0011223344 125 call assert_equal(0z2233, b[2 : 3]) 126 call assert_equal(0z223344, b[2 : -1]) 127 call assert_equal(0z00, b[0 : -5]) 128 call assert_equal(0z, b[0 : -11]) 129 call assert_equal(0z44, b[-1 :]) 130 call assert_equal(0z0011223344, b[:]) 131 call assert_equal(0z0011223344, b[: -1]) 132 call assert_equal(0z, b[5 : 6]) 133 call assert_equal(0z0011, b[-10 : 1]) 134 END 135 call CheckLegacyAndVim9Success(lines) 136 137 " legacy script white space 138 let b = 0z0011223344 139 call assert_equal(0z2233, b[2:3]) 140endfunc 141 142func Test_blob_get() 143 let lines =<< trim END 144 VAR b = 0z0011223344 145 call assert_equal(0x00, get(b, 0)) 146 call assert_equal(0x22, get(b, 2, 999)) 147 call assert_equal(0x44, get(b, 4)) 148 call assert_equal(0x44, get(b, -1)) 149 call assert_equal(-1, get(b, 5)) 150 call assert_equal(999, get(b, 5, 999)) 151 call assert_equal(-1, get(b, -8)) 152 call assert_equal(999, get(b, -8, 999)) 153 call assert_equal(10, get(test_null_blob(), 2, 10)) 154 155 call assert_equal(0x00, b[0]) 156 call assert_equal(0x22, b[2]) 157 call assert_equal(0x44, b[4]) 158 call assert_equal(0x44, b[-1]) 159 END 160 call CheckLegacyAndVim9Success(lines) 161 162 let lines =<< trim END 163 VAR b = 0z0011223344 164 echo b[5] 165 END 166 call CheckLegacyAndVim9Failure(lines, 'E979:') 167 168 let lines =<< trim END 169 VAR b = 0z0011223344 170 echo b[-8] 171 END 172 call CheckLegacyAndVim9Failure(lines, 'E979:') 173endfunc 174 175func Test_blob_to_string() 176 let lines =<< trim END 177 VAR b = 0z00112233445566778899aabbccdd 178 call assert_equal('0z00112233.44556677.8899AABB.CCDD', string(b)) 179 call assert_equal(b, eval(string(b))) 180 call remove(b, 4, -1) 181 call assert_equal('0z00112233', string(b)) 182 call remove(b, 0, 3) 183 call assert_equal('0z', string(b)) 184 call assert_equal('0z', string(test_null_blob())) 185 END 186 call CheckLegacyAndVim9Success(lines) 187endfunc 188 189func Test_blob_compare() 190 let lines =<< trim END 191 VAR b1 = 0z0011 192 VAR b2 = 0z1100 193 VAR b3 = 0z001122 194 call assert_true(b1 == b1) 195 call assert_false(b1 == b2) 196 call assert_false(b1 == b3) 197 call assert_true(b1 != b2) 198 call assert_true(b1 != b3) 199 call assert_true(b1 == 0z0011) 200 201 call assert_false(b1 is b2) 202 LET b2 = b1 203 call assert_true(b1 == b2) 204 call assert_true(b1 is b2) 205 LET b2 = copy(b1) 206 call assert_true(b1 == b2) 207 call assert_false(b1 is b2) 208 LET b2 = b1[:] 209 call assert_true(b1 == b2) 210 call assert_false(b1 is b2) 211 call assert_true(b1 isnot b2) 212 END 213 call CheckLegacyAndVim9Success(lines) 214 215 let lines =<< trim END 216 VAR b1 = 0z0011 217 echo b1 == 9 218 END 219 call CheckLegacyAndVim9Failure(lines, ['E977:', 'E1072', 'E1072']) 220 221 let lines =<< trim END 222 VAR b1 = 0z0011 223 echo b1 != 9 224 END 225 call CheckLegacyAndVim9Failure(lines, ['E977:', 'E1072', 'E1072']) 226 227 let lines =<< trim END 228 VAR b1 = 0z0011 229 VAR b2 = 0z1100 230 VAR x = b1 > b2 231 END 232 call CheckLegacyAndVim9Failure(lines, ['E978:', 'E1072:', 'E1072:']) 233 234 let lines =<< trim END 235 VAR b1 = 0z0011 236 VAR b2 = 0z1100 237 VAR x = b1 < b2 238 END 239 call CheckLegacyAndVim9Failure(lines, ['E978:', 'E1072:', 'E1072:']) 240 241 let lines =<< trim END 242 VAR b1 = 0z0011 243 VAR b2 = 0z1100 244 VAR x = b1 - b2 245 END 246 call CheckLegacyAndVim9Failure(lines, ['E974:', 'E1036:', 'E974:']) 247 248 let lines =<< trim END 249 VAR b1 = 0z0011 250 VAR b2 = 0z1100 251 VAR x = b1 / b2 252 END 253 call CheckLegacyAndVim9Failure(lines, ['E974:', 'E1036:', 'E974:']) 254 255 let lines =<< trim END 256 VAR b1 = 0z0011 257 VAR b2 = 0z1100 258 VAR x = b1 * b2 259 END 260 call CheckLegacyAndVim9Failure(lines, ['E974:', 'E1036:', 'E974:']) 261endfunc 262 263func Test_blob_index_assign() 264 let lines =<< trim END 265 VAR b = 0z00 266 LET b[1] = 0x11 267 LET b[2] = 0x22 268 call assert_equal(0z001122, b) 269 END 270 call CheckLegacyAndVim9Success(lines) 271 272 let lines =<< trim END 273 VAR b = 0z00 274 LET b[2] = 0x33 275 END 276 call CheckLegacyAndVim9Failure(lines, 'E979:') 277 278 let lines =<< trim END 279 VAR b = 0z00 280 LET b[-2] = 0x33 281 END 282 call CheckLegacyAndVim9Failure(lines, 'E979:') 283endfunc 284 285func Test_blob_for_loop() 286 let lines =<< trim END 287 VAR blob = 0z00010203 288 VAR i = 0 289 for byte in blob 290 call assert_equal(i, byte) 291 LET i += 1 292 endfor 293 call assert_equal(4, i) 294 295 LET blob = 0z00 296 call remove(blob, 0) 297 call assert_equal(0, len(blob)) 298 for byte in blob 299 call assert_report('loop over empty blob') 300 endfor 301 302 LET blob = 0z0001020304 303 LET i = 0 304 for byte in blob 305 call assert_equal(i, byte) 306 if i == 1 307 call remove(blob, 0) 308 elseif i == 3 309 call remove(blob, 3) 310 endif 311 LET i += 1 312 endfor 313 call assert_equal(5, i) 314 END 315 call CheckLegacyAndVim9Success(lines) 316endfunc 317 318func Test_blob_concatenate() 319 let lines =<< trim END 320 VAR b = 0z0011 321 LET b += 0z2233 322 call assert_equal(0z00112233, b) 323 324 LET b = 0zDEAD + 0zBEEF 325 call assert_equal(0zDEADBEEF, b) 326 END 327 call CheckLegacyAndVim9Success(lines) 328 329 let lines =<< trim END 330 VAR b = 0z0011 331 LET b += "a" 332 END 333 call CheckLegacyAndVim9Failure(lines, ['E734:', 'E1012:', 'E734:']) 334 335 let lines =<< trim END 336 VAR b = 0z0011 337 LET b += 88 338 END 339 call CheckLegacyAndVim9Failure(lines, ['E734:', 'E1012:', 'E734:']) 340endfunc 341 342func Test_blob_add() 343 let lines =<< trim END 344 VAR b = 0z0011 345 call add(b, 0x22) 346 call assert_equal(0z001122, b) 347 END 348 call CheckLegacyAndVim9Success(lines) 349 350 " Only works in legacy script 351 let b = 0z0011 352 call add(b, '51') 353 call assert_equal(0z001133, b) 354 call assert_equal(1, add(test_null_blob(), 0x22)) 355 356 let lines =<< trim END 357 VAR b = 0z0011 358 call add(b, [9]) 359 END 360 call CheckLegacyAndVim9Failure(lines, ['E745:', 'E1012:', 'E745:']) 361 362 let lines =<< trim END 363 VAR b = 0z0011 364 call add("", 0x01) 365 END 366 call CheckLegacyAndVim9Failure(lines, 'E897:') 367 368 let lines =<< trim END 369 add(test_null_blob(), 0x22) 370 END 371 call CheckDefExecAndScriptFailure(lines, 'E1131:') 372endfunc 373 374func Test_blob_empty() 375 call assert_false(empty(0z001122)) 376 call assert_true(empty(0z)) 377 call assert_true(empty(test_null_blob())) 378endfunc 379 380" Test removing items in blob 381func Test_blob_func_remove() 382 let lines =<< trim END 383 #" Test removing 1 element 384 VAR b = 0zDEADBEEF 385 call assert_equal(0xDE, remove(b, 0)) 386 call assert_equal(0zADBEEF, b) 387 388 LET b = 0zDEADBEEF 389 call assert_equal(0xEF, remove(b, -1)) 390 call assert_equal(0zDEADBE, b) 391 392 LET b = 0zDEADBEEF 393 call assert_equal(0xAD, remove(b, 1)) 394 call assert_equal(0zDEBEEF, b) 395 396 #" Test removing range of element(s) 397 LET b = 0zDEADBEEF 398 call assert_equal(0zBE, remove(b, 2, 2)) 399 call assert_equal(0zDEADEF, b) 400 401 LET b = 0zDEADBEEF 402 call assert_equal(0zADBE, remove(b, 1, 2)) 403 call assert_equal(0zDEEF, b) 404 END 405 call CheckLegacyAndVim9Success(lines) 406 407 " Test invalid cases 408 let lines =<< trim END 409 VAR b = 0zDEADBEEF 410 call remove(b, 5) 411 END 412 call CheckLegacyAndVim9Failure(lines, 'E979:') 413 414 let lines =<< trim END 415 VAR b = 0zDEADBEEF 416 call remove(b, 1, 5) 417 END 418 call CheckLegacyAndVim9Failure(lines, 'E979:') 419 420 let lines =<< trim END 421 VAR b = 0zDEADBEEF 422 call remove(b, 3, 2) 423 END 424 call CheckLegacyAndVim9Failure(lines, 'E979:') 425 426 let lines =<< trim END 427 VAR b = 0zDEADBEEF 428 call remove(1, 0) 429 END 430 call CheckLegacyAndVim9Failure(lines, 'E896:') 431 432 let lines =<< trim END 433 VAR b = 0zDEADBEEF 434 call remove(b, b) 435 END 436 call CheckLegacyAndVim9Failure(lines, 'E974:') 437 438 let lines =<< trim END 439 VAR b = 0zDEADBEEF 440 call remove(b, 1, []) 441 END 442 call CheckLegacyAndVim9Failure(lines, 'E745:') 443 444 let lines =<< trim END 445 VAR b = 0zDEADBEEF 446 call remove(test_null_blob(), 1, 2) 447 END 448 call CheckLegacyAndVim9Failure(lines, 'E979:') 449endfunc 450 451func Test_blob_read_write() 452 let lines =<< trim END 453 VAR b = 0zDEADBEEF 454 call writefile(b, 'Xblob') 455 VAR br = readfile('Xblob', 'B') 456 call assert_equal(b, br) 457 call delete('Xblob') 458 END 459 call CheckLegacyAndVim9Success(lines) 460 461 " This was crashing when calling readfile() with a directory. 462 call assert_fails("call readfile('.', 'B')", 'E17: "." is a directory') 463endfunc 464 465" filter() item in blob 466func Test_blob_filter() 467 let lines =<< trim END 468 call assert_equal(test_null_blob(), filter(test_null_blob(), '0')) 469 call assert_equal(0z, filter(0zDEADBEEF, '0')) 470 call assert_equal(0zADBEEF, filter(0zDEADBEEF, 'v:val != 0xDE')) 471 call assert_equal(0zDEADEF, filter(0zDEADBEEF, 'v:val != 0xBE')) 472 call assert_equal(0zDEADBE, filter(0zDEADBEEF, 'v:val != 0xEF')) 473 call assert_equal(0zDEADBEEF, filter(0zDEADBEEF, '1')) 474 call assert_equal(0z01030103, filter(0z010203010203, 'v:val != 0x02')) 475 call assert_equal(0zADEF, filter(0zDEADBEEF, 'v:key % 2')) 476 END 477 call CheckLegacyAndVim9Success(lines) 478endfunc 479 480" map() item in blob 481func Test_blob_map() 482 let lines =<< trim END 483 call assert_equal(0zDFAEBFF0, map(0zDEADBEEF, 'v:val + 1')) 484 call assert_equal(0z00010203, map(0zDEADBEEF, 'v:key')) 485 call assert_equal(0zDEAEC0F2, map(0zDEADBEEF, 'v:key + v:val')) 486 END 487 call CheckLegacyAndVim9Success(lines) 488 489 let lines =<< trim END 490 call map(0z00, '[9]') 491 END 492 call CheckLegacyAndVim9Failure(lines, 'E978:') 493endfunc 494 495func Test_blob_index() 496 let lines =<< trim END 497 call assert_equal(2, index(0zDEADBEEF, 0xBE)) 498 call assert_equal(-1, index(0zDEADBEEF, 0)) 499 call assert_equal(2, index(0z11111111, 0x11, 2)) 500 call assert_equal(3, 0z11110111->index(0x11, 2)) 501 call assert_equal(2, index(0z11111111, 0x11, -2)) 502 call assert_equal(3, index(0z11110111, 0x11, -2)) 503 call assert_equal(0, index(0z11110111, 0x11, -10)) 504 call assert_equal(-1, index(test_null_blob(), 1)) 505 END 506 call CheckLegacyAndVim9Success(lines) 507 508 let lines =<< trim END 509 echo index(0z11110111, 0x11, []) 510 END 511 call CheckLegacyAndVim9Failure(lines, 'E745:') 512 513 let lines =<< trim END 514 call index("asdf", 0) 515 END 516 call CheckLegacyAndVim9Failure(lines, 'E897:') 517endfunc 518 519func Test_blob_insert() 520 let lines =<< trim END 521 VAR b = 0zDEADBEEF 522 call insert(b, 0x33) 523 call assert_equal(0z33DEADBEEF, b) 524 525 LET b = 0zDEADBEEF 526 call insert(b, 0x33, 2) 527 call assert_equal(0zDEAD33BEEF, b) 528 END 529 call CheckLegacyAndVim9Success(lines) 530 531 " only works in legacy script 532 call assert_equal(0, insert(test_null_blob(), 0x33)) 533 534 let lines =<< trim END 535 VAR b = 0zDEADBEEF 536 call insert(b, -1) 537 END 538 call CheckLegacyAndVim9Failure(lines, 'E475:') 539 540 let lines =<< trim END 541 VAR b = 0zDEADBEEF 542 call insert(b, 257) 543 END 544 call CheckLegacyAndVim9Failure(lines, 'E475:') 545 546 let lines =<< trim END 547 VAR b = 0zDEADBEEF 548 call insert(b, 0, [9]) 549 END 550 call CheckLegacyAndVim9Failure(lines, ['E745:', 'E1013:', 'E745:']) 551 552 let lines =<< trim END 553 VAR b = 0zDEADBEEF 554 call insert(b, 0, -20) 555 END 556 call CheckLegacyAndVim9Failure(lines, 'E475:') 557 558 let lines =<< trim END 559 VAR b = 0zDEADBEEF 560 call insert(b, 0, 20) 561 END 562 call CheckLegacyAndVim9Failure(lines, 'E475:') 563 564 let lines =<< trim END 565 VAR b = 0zDEADBEEF 566 call insert(b, []) 567 END 568 call CheckLegacyAndVim9Failure(lines, ['E745:', 'E1013:', 'E745:']) 569 570 let lines =<< trim END 571 insert(test_null_blob(), 0x33) 572 END 573 call CheckDefExecAndScriptFailure(lines, 'E1131:') 574endfunc 575 576func Test_blob_reverse() 577 let lines =<< trim END 578 call assert_equal(0zEFBEADDE, reverse(0zDEADBEEF)) 579 call assert_equal(0zBEADDE, reverse(0zDEADBE)) 580 call assert_equal(0zADDE, reverse(0zDEAD)) 581 call assert_equal(0zDE, reverse(0zDE)) 582 call assert_equal(0z, reverse(test_null_blob())) 583 END 584 call CheckLegacyAndVim9Success(lines) 585endfunc 586 587func Test_blob_json_encode() 588 let lines =<< trim END 589 call assert_equal('[222,173,190,239]', json_encode(0zDEADBEEF)) 590 call assert_equal('[]', json_encode(0z)) 591 END 592 call CheckLegacyAndVim9Success(lines) 593endfunc 594 595func Test_blob_lock() 596 let lines =<< trim END 597 let b = 0z112233 598 lockvar b 599 unlockvar b 600 let b = 0z44 601 END 602 call CheckScriptSuccess(lines) 603 604 let lines =<< trim END 605 vim9script 606 var b = 0z112233 607 lockvar b 608 unlockvar b 609 b = 0z44 610 END 611 call CheckScriptSuccess(lines) 612 613 let lines =<< trim END 614 let b = 0z112233 615 lockvar b 616 let b = 0z44 617 END 618 call CheckScriptFailure(lines, 'E741:') 619 620 let lines =<< trim END 621 vim9script 622 var b = 0z112233 623 lockvar b 624 b = 0z44 625 END 626 call CheckScriptFailure(lines, 'E741:') 627endfunc 628 629func Test_blob_sort() 630 if has('float') 631 call CheckLegacyAndVim9Failure(['call sort([1.0, 0z11], "f")'], 'E975:') 632 endif 633 call CheckLegacyAndVim9Failure(['call sort([11, 0z11], "N")'], 'E974:') 634endfunc 635 636" vim: shiftwidth=2 sts=2 expandtab 637