test_blob.vim (24582B)
1 " Tests for the Blob types 2 3 source check.vim 4 source vim9.vim 5 6 func TearDown() 7 " Run garbage collection after every test 8 call test_garbagecollect_now() 9 endfunc 10 11 " Tests for Blob type 12 13 " Blob creation from constant 14 func Test_blob_create() 15 let lines =<< trim END 16 VAR b = 0zDEADBEEF 17 call assert_equal(v:t_blob, type(b)) 18 call assert_equal(4, len(b)) 19 call assert_equal(0xDE, b[0]) 20 call assert_equal(0xAD, b[1]) 21 call assert_equal(0xBE, b[2]) 22 call assert_equal(0xEF, b[3]) 23 call assert_fails('VAR x = b[4]') 24 25 call assert_equal(0xDE, get(b, 0)) 26 call assert_equal(0xEF, get(b, 3)) 27 28 call assert_fails('VAR b = 0z1', 'E973:') 29 call assert_fails('VAR b = 0z1x', 'E973:') 30 call assert_fails('VAR b = 0z12345', 'E973:') 31 32 call assert_equal(0z, v:_null_blob) 33 34 LET b = 0z001122.33445566.778899.aabbcc.dd 35 call assert_equal(0z00112233445566778899aabbccdd, b) 36 call assert_fails('VAR b = 0z1.1') 37 call assert_fails('VAR b = 0z.') 38 call assert_fails('VAR b = 0z001122.') 39 call assert_fails('call get("", 1)', 'E896:') 40 call assert_equal(0, len(v:_null_blob)) 41 call assert_equal(0z, copy(v:_null_blob)) 42 END 43 call CheckLegacyAndVim9Success(lines) 44 endfunc 45 46 " assignment to a blob 47 func Test_blob_assign() 48 let lines =<< trim END 49 VAR b = 0zDEADBEEF 50 VAR b2 = b[1 : 2] 51 call assert_equal(0zADBE, b2) 52 53 VAR bcopy = b[:] 54 call assert_equal(b, bcopy) 55 call assert_false(b is bcopy) 56 57 LET b = 0zDEADBEEF 58 LET b2 = b 59 call assert_true(b is b2) 60 LET b[:] = 0z11223344 61 call assert_equal(0z11223344, b) 62 call assert_equal(0z11223344, b2) 63 call assert_true(b is b2) 64 65 LET b = 0zDEADBEEF 66 LET b[3 :] = 0z66 67 call assert_equal(0zDEADBE66, b) 68 LET b[: 1] = 0z8899 69 call assert_equal(0z8899BE66, b) 70 71 LET b = 0zDEADBEEF 72 LET b += 0z99 73 call assert_equal(0zDEADBEEF99, b) 74 75 VAR l = [0z12] 76 VAR m = deepcopy(l) 77 LET m[0] = 0z34 #" E742 or E741 should not occur. 78 79 VAR blob1 = 0z10 80 LET blob1 += v:_null_blob 81 call assert_equal(0z10, blob1) 82 LET blob1 = v:_null_blob 83 LET blob1 += 0z20 84 call assert_equal(0z20, blob1) 85 END 86 call CheckLegacyAndVim9Success(lines) 87 88 let lines =<< trim END 89 VAR b = 0zDEADBEEF 90 LET b[2 : 3] = 0z112233 91 END 92 call CheckLegacyAndVim9Failure(lines, 'E972:') 93 94 let lines =<< trim END 95 VAR b = 0zDEADBEEF 96 LET b[2 : 3] = 0z11 97 END 98 call CheckLegacyAndVim9Failure(lines, 'E972:') 99 100 let lines =<< trim END 101 VAR b = 0zDEADBEEF 102 LET b[3 : 2] = 0z 103 END 104 call CheckLegacyAndVim9Failure(lines, 'E979:') 105 106 let lines =<< trim END 107 VAR b = 0zDEADBEEF 108 LET b ..= 0z33 109 END 110 call CheckLegacyAndVim9Failure(lines, ['E734:', 'E1019:', 'E734:']) 111 112 let lines =<< trim END 113 VAR b = 0zDEADBEEF 114 LET b ..= "xx" 115 END 116 call CheckLegacyAndVim9Failure(lines, ['E734:', 'E1019:', 'E734:']) 117 118 let lines =<< trim END 119 VAR b = 0zDEADBEEF 120 LET b += "xx" 121 END 122 call CheckLegacyAndVim9Failure(lines, ['E734:', 'E1012:', 'E734:']) 123 124 let lines =<< trim END 125 VAR b = 0zDEADBEEF 126 LET b[1 : 1] ..= 0z55 127 END 128 call CheckLegacyAndVim9Failure(lines, ['E734:', 'E1183:', 'E734:']) 129 130 call assert_fails('let b = readblob("a1b2c3")', 'E484:') 131 endfunc 132 133 func Test_blob_get_range() 134 let lines =<< trim END 135 VAR b = 0z0011223344 136 call assert_equal(0z2233, b[2 : 3]) 137 call assert_equal(0z223344, b[2 : -1]) 138 call assert_equal(0z00, b[0 : -5]) 139 call assert_equal(0z, b[0 : -11]) 140 call assert_equal(0z44, b[-1 :]) 141 call assert_equal(0z0011223344, b[:]) 142 call assert_equal(0z0011223344, b[: -1]) 143 call assert_equal(0z, b[5 : 6]) 144 call assert_equal(0z0011, b[-10 : 1]) 145 END 146 call CheckLegacyAndVim9Success(lines) 147 148 " legacy script white space 149 let b = 0z0011223344 150 call assert_equal(0z2233, b[2:3]) 151 endfunc 152 153 func Test_blob_get() 154 let lines =<< trim END 155 VAR b = 0z0011223344 156 call assert_equal(0x00, get(b, 0)) 157 call assert_equal(0x22, get(b, 2, 999)) 158 call assert_equal(0x44, get(b, 4)) 159 call assert_equal(0x44, get(b, -1)) 160 call assert_equal(-1, get(b, 5)) 161 call assert_equal(999, get(b, 5, 999)) 162 call assert_equal(-1, get(b, -8)) 163 call assert_equal(999, get(b, -8, 999)) 164 call assert_equal(10, get(v:_null_blob, 2, 10)) 165 166 call assert_equal(0x00, b[0]) 167 call assert_equal(0x22, b[2]) 168 call assert_equal(0x44, b[4]) 169 call assert_equal(0x44, b[-1]) 170 END 171 call CheckLegacyAndVim9Success(lines) 172 173 let lines =<< trim END 174 VAR b = 0z0011223344 175 echo b[5] 176 END 177 call CheckLegacyAndVim9Failure(lines, 'E979:') 178 179 let lines =<< trim END 180 VAR b = 0z0011223344 181 echo b[-8] 182 END 183 call CheckLegacyAndVim9Failure(lines, 'E979:') 184 endfunc 185 186 func Test_blob_to_string() 187 let lines =<< trim END 188 VAR b = 0z00112233445566778899aabbccdd 189 call assert_equal('0z00112233.44556677.8899AABB.CCDD', string(b)) 190 call assert_equal(b, eval(string(b))) 191 call remove(b, 4, -1) 192 call assert_equal('0z00112233', string(b)) 193 call remove(b, 0, 3) 194 call assert_equal('0z', string(b)) 195 call assert_equal('0z', string(v:_null_blob)) 196 END 197 call CheckLegacyAndVim9Success(lines) 198 endfunc 199 200 func Test_blob_compare() 201 let lines =<< trim END 202 VAR b1 = 0z0011 203 VAR b2 = 0z1100 204 VAR b3 = 0z001122 205 call assert_true(b1 == b1) 206 call assert_false(b1 == b2) 207 call assert_false(b1 == b3) 208 call assert_true(b1 != b2) 209 call assert_true(b1 != b3) 210 call assert_true(b1 == 0z0011) 211 212 call assert_false(b1 is b2) 213 LET b2 = b1 214 call assert_true(b1 == b2) 215 call assert_true(b1 is b2) 216 LET b2 = copy(b1) 217 call assert_true(b1 == b2) 218 call assert_false(b1 is b2) 219 LET b2 = b1[:] 220 call assert_true(b1 == b2) 221 call assert_false(b1 is b2) 222 call assert_true(b1 isnot b2) 223 call assert_true(0z != 0z10) 224 call assert_true(0z10 != 0z) 225 END 226 call CheckLegacyAndVim9Success(lines) 227 228 let lines =<< trim END 229 VAR b1 = 0z0011 230 echo b1 == 9 231 END 232 call CheckLegacyAndVim9Failure(lines, ['E977:', 'E1072:', 'E1072:']) 233 234 let lines =<< trim END 235 VAR b1 = 0z0011 236 echo b1 != 9 237 END 238 call CheckLegacyAndVim9Failure(lines, ['E977:', 'E1072:', 'E1072:']) 239 240 let lines =<< trim END 241 VAR b1 = 0z0011 242 VAR b2 = 0z1100 243 VAR x = b1 > b2 244 END 245 call CheckLegacyAndVim9Failure(lines, ['E978:', 'E1072:', 'E1072:']) 246 247 let lines =<< trim END 248 VAR b1 = 0z0011 249 VAR b2 = 0z1100 250 VAR x = b1 < b2 251 END 252 call CheckLegacyAndVim9Failure(lines, ['E978:', 'E1072:', 'E1072:']) 253 254 let lines =<< trim END 255 VAR b1 = 0z0011 256 VAR b2 = 0z1100 257 VAR x = b1 - b2 258 END 259 call CheckLegacyAndVim9Failure(lines, ['E974:', 'E1036:', 'E974:']) 260 261 let lines =<< trim END 262 VAR b1 = 0z0011 263 VAR b2 = 0z1100 264 VAR x = b1 / b2 265 END 266 call CheckLegacyAndVim9Failure(lines, ['E974:', 'E1036:', 'E974:']) 267 268 let lines =<< trim END 269 VAR b1 = 0z0011 270 VAR b2 = 0z1100 271 VAR x = b1 * b2 272 END 273 call CheckLegacyAndVim9Failure(lines, ['E974:', 'E1036:', 'E974:']) 274 endfunc 275 276 func Test_blob_index_assign() 277 let lines =<< trim END 278 VAR b = 0z00 279 LET b[1] = 0x11 280 LET b[2] = 0x22 281 LET b[0] = 0x33 282 call assert_equal(0z331122, b) 283 END 284 call CheckLegacyAndVim9Success(lines) 285 286 let lines =<< trim END 287 VAR b = 0z00 288 LET b[2] = 0x33 289 END 290 call CheckLegacyAndVim9Failure(lines, 'E979:') 291 292 let lines =<< trim END 293 VAR b = 0z00 294 LET b[-2] = 0x33 295 END 296 call CheckLegacyAndVim9Failure(lines, 'E979:') 297 298 let lines =<< trim END 299 VAR b = 0z00010203 300 LET b[0 : -1] = 0z33 301 END 302 call CheckLegacyAndVim9Failure(lines, 'E979:') 303 304 let lines =<< trim END 305 VAR b = 0z00010203 306 LET b[3 : 4] = 0z3344 307 END 308 call CheckLegacyAndVim9Failure(lines, 'E979:') 309 endfunc 310 311 func Test_blob_for_loop() 312 let lines =<< trim END 313 VAR blob = 0z00010203 314 VAR i = 0 315 for byte in blob 316 call assert_equal(i, byte) 317 LET i += 1 318 endfor 319 call assert_equal(4, i) 320 321 LET blob = 0z00 322 call remove(blob, 0) 323 call assert_equal(0, len(blob)) 324 for byte in blob 325 call assert_report('loop over empty blob') 326 endfor 327 328 LET blob = 0z0001020304 329 LET i = 0 330 for byte in blob 331 call assert_equal(i, byte) 332 if i == 1 333 call remove(blob, 0) 334 elseif i == 3 335 call remove(blob, 3) 336 endif 337 LET i += 1 338 endfor 339 call assert_equal(5, i) 340 END 341 call CheckLegacyAndVim9Success(lines) 342 343 " Test for skipping the loop var assignment in a for loop 344 let lines =<< trim END 345 VAR blob = 0z998877 346 VAR c = 0 347 for _ in blob 348 LET c += 1 349 endfor 350 call assert_equal(3, c) 351 END 352 call CheckLegacyAndVim9Success(lines) 353 endfunc 354 355 func Test_blob_concatenate() 356 let lines =<< trim END 357 VAR b = 0z0011 358 LET b += 0z2233 359 call assert_equal(0z00112233, b) 360 361 LET b = 0zDEAD + 0zBEEF 362 call assert_equal(0zDEADBEEF, b) 363 END 364 call CheckLegacyAndVim9Success(lines) 365 366 let lines =<< trim END 367 VAR b = 0z0011 368 LET b += "a" 369 END 370 call CheckLegacyAndVim9Failure(lines, ['E734:', 'E1012:', 'E734:']) 371 372 let lines =<< trim END 373 VAR b = 0z0011 374 LET b += 88 375 END 376 call CheckLegacyAndVim9Failure(lines, ['E734:', 'E1012:', 'E734:']) 377 endfunc 378 379 func Test_blob_add() 380 let lines =<< trim END 381 VAR b = 0z0011 382 call add(b, 0x22) 383 call assert_equal(0z001122, b) 384 END 385 call CheckLegacyAndVim9Success(lines) 386 387 " Only works in legacy script 388 let b = 0z0011 389 call add(b, '51') 390 call assert_equal(0z001133, b) 391 call assert_equal(1, add(v:_null_blob, 0x22)) 392 393 let lines =<< trim END 394 VAR b = 0z0011 395 call add(b, [9]) 396 END 397 call CheckLegacyAndVim9Failure(lines, ['E745:', 'E1012:', 'E745:']) 398 399 let lines =<< trim END 400 VAR b = 0z0011 401 call add("", 0x01) 402 END 403 call CheckLegacyAndVim9Failure(lines, 'E897:') 404 405 let lines =<< trim END 406 add(v:_null_blob, 0x22) 407 END 408 call CheckDefExecAndScriptFailure(lines, 'E1131:') 409 410 let lines =<< trim END 411 let b = 0zDEADBEEF 412 lockvar b 413 call add(b, 0) 414 unlockvar b 415 END 416 call CheckScriptFailure(lines, 'E741:') 417 endfunc 418 419 func Test_blob_empty() 420 call assert_false(empty(0z001122)) 421 call assert_true(empty(0z)) 422 call assert_true(empty(v:_null_blob)) 423 endfunc 424 425 " Test removing items in blob 426 func Test_blob_func_remove() 427 let lines =<< trim END 428 #" Test removing 1 element 429 VAR b = 0zDEADBEEF 430 call assert_equal(0xDE, remove(b, 0)) 431 call assert_equal(0zADBEEF, b) 432 433 LET b = 0zDEADBEEF 434 call assert_equal(0xEF, remove(b, -1)) 435 call assert_equal(0zDEADBE, b) 436 437 LET b = 0zDEADBEEF 438 call assert_equal(0xAD, remove(b, 1)) 439 call assert_equal(0zDEBEEF, b) 440 441 #" Test removing range of element(s) 442 LET b = 0zDEADBEEF 443 call assert_equal(0zBE, remove(b, 2, 2)) 444 call assert_equal(0zDEADEF, b) 445 446 LET b = 0zDEADBEEF 447 call assert_equal(0zADBE, remove(b, 1, 2)) 448 call assert_equal(0zDEEF, b) 449 END 450 call CheckLegacyAndVim9Success(lines) 451 452 " Test invalid cases 453 let lines =<< trim END 454 VAR b = 0zDEADBEEF 455 call remove(b, 5) 456 END 457 call CheckLegacyAndVim9Failure(lines, 'E979:') 458 459 let lines =<< trim END 460 VAR b = 0zDEADBEEF 461 call remove(b, 1, 5) 462 END 463 call CheckLegacyAndVim9Failure(lines, 'E979:') 464 465 let lines =<< trim END 466 VAR b = 0zDEADBEEF 467 call remove(b, -10) 468 END 469 call CheckLegacyAndVim9Failure(lines, 'E979:') 470 471 let lines =<< trim END 472 VAR b = 0zDEADBEEF 473 call remove(b, 3, 2) 474 END 475 call CheckLegacyAndVim9Failure(lines, 'E979:') 476 477 let lines =<< trim END 478 VAR b = 0zDEADBEEF 479 call remove(1, 0) 480 END 481 call CheckLegacyAndVim9Failure(lines, 'E896:') 482 483 let lines =<< trim END 484 VAR b = 0zDEADBEEF 485 call remove(b, b) 486 END 487 call CheckLegacyAndVim9Failure(lines, 'E974:') 488 489 let lines =<< trim END 490 VAR b = 0zDEADBEEF 491 call remove(b, 1, []) 492 END 493 call CheckLegacyAndVim9Failure(lines, 'E745:') 494 495 let lines =<< trim END 496 VAR b = 0zDEADBEEF 497 call remove(v:_null_blob, 1, 2) 498 END 499 call CheckLegacyAndVim9Failure(lines, 'E979:') 500 501 let lines =<< trim END 502 let b = 0zDEADBEEF 503 lockvar b 504 call remove(b, 0) 505 unlockvar b 506 END 507 call CheckScriptFailure(lines, 'E741:') 508 509 " can only check at script level, not in a :def function 510 let lines =<< trim END 511 vim9script 512 var b = 0zDEADBEEF 513 lockvar b 514 remove(b, 0) 515 END 516 call CheckScriptFailure(lines, 'E741:') 517 518 call assert_fails('echo remove(0z1020, [])', 'E745:') 519 call assert_fails('echo remove(0z1020, 0, [])', 'E745:') 520 endfunc 521 522 func Test_blob_read_write() 523 let lines =<< trim END 524 VAR b = 0zDEADBEEF 525 call writefile(b, 'Xblob') 526 VAR br = readfile('Xblob', 'B') 527 call assert_equal(b, br) 528 VAR br2 = readblob('Xblob') 529 call assert_equal(b, br2) 530 VAR br3 = readblob('Xblob', 1) 531 call assert_equal(b[1 :], br3) 532 VAR br4 = readblob('Xblob', 1, 2) 533 call assert_equal(b[1 : 2], br4) 534 VAR br5 = readblob('Xblob', -3) 535 call assert_equal(b[-3 :], br5) 536 VAR br6 = readblob('Xblob', -3, 2) 537 call assert_equal(b[-3 : -2], br6) 538 539 #" reading past end of file, empty result 540 VAR br1e = readblob('Xblob', 10000) 541 call assert_equal(0z, br1e) 542 543 #" reading too much, result is truncated 544 VAR blong = readblob('Xblob', -1000) 545 call assert_equal(b, blong) 546 LET blong = readblob('Xblob', -10, 8) 547 call assert_equal(b, blong) 548 LET blong = readblob('Xblob', 0, 10) 549 call assert_equal(b, blong) 550 551 call delete('Xblob') 552 END 553 call CheckLegacyAndVim9Success(lines) 554 555 if filereadable('/dev/random') 556 let b = readblob('/dev/random', 0, 10) 557 call assert_equal(10, len(b)) 558 endif 559 560 call assert_fails("call readblob('notexist')", 'E484:') 561 " TODO: How do we test for the E485 error? 562 563 " This was crashing when calling readfile() with a directory. 564 call assert_fails("call readfile('.', 'B')", 'E17: "." is a directory') 565 endfunc 566 567 " filter() item in blob 568 func Test_blob_filter() 569 let lines =<< trim END 570 call assert_equal(v:_null_blob, filter(v:_null_blob, '0')) 571 call assert_equal(0z, filter(0zDEADBEEF, '0')) 572 call assert_equal(0zADBEEF, filter(0zDEADBEEF, 'v:val != 0xDE')) 573 call assert_equal(0zDEADEF, filter(0zDEADBEEF, 'v:val != 0xBE')) 574 call assert_equal(0zDEADBE, filter(0zDEADBEEF, 'v:val != 0xEF')) 575 call assert_equal(0zDEADBEEF, filter(0zDEADBEEF, '1')) 576 call assert_equal(0z01030103, filter(0z010203010203, 'v:val != 0x02')) 577 call assert_equal(0zADEF, filter(0zDEADBEEF, 'v:key % 2')) 578 END 579 call CheckLegacyAndVim9Success(lines) 580 call assert_fails('echo filter(0z10, "a10")', 'E121:') 581 endfunc 582 583 " map() item in blob 584 func Test_blob_map() 585 let lines =<< trim END 586 call assert_equal(0zDFAEBFF0, map(0zDEADBEEF, 'v:val + 1')) 587 call assert_equal(0z00010203, map(0zDEADBEEF, 'v:key')) 588 call assert_equal(0zDEAEC0F2, map(0zDEADBEEF, 'v:key + v:val')) 589 END 590 call CheckLegacyAndVim9Success(lines) 591 592 let lines =<< trim END 593 call map(0z00, '[9]') 594 END 595 call CheckLegacyAndVim9Failure(lines, 'E978:') 596 call assert_fails('echo map(0z10, "a10")', 'E121:') 597 endfunc 598 599 func Test_blob_index() 600 let lines =<< trim END 601 call assert_equal(2, index(0zDEADBEEF, 0xBE)) 602 call assert_equal(-1, index(0zDEADBEEF, 0)) 603 call assert_equal(2, index(0z11111111, 0x11, 2)) 604 call assert_equal(3, 0z11110111->index(0x11, 2)) 605 call assert_equal(2, index(0z11111111, 0x11, -2)) 606 call assert_equal(3, index(0z11110111, 0x11, -2)) 607 call assert_equal(0, index(0z11110111, 0x11, -10)) 608 call assert_equal(-1, index(v:_null_blob, 1)) 609 END 610 call CheckLegacyAndVim9Success(lines) 611 612 let lines =<< trim END 613 echo index(0z11110111, 0x11, []) 614 END 615 call CheckLegacyAndVim9Failure(lines, 'E745:') 616 617 let lines =<< trim END 618 call index("asdf", 0) 619 END 620 call CheckLegacyAndVim9Failure(lines, 'E897:') 621 endfunc 622 623 func Test_blob_insert() 624 let lines =<< trim END 625 VAR b = 0zDEADBEEF 626 call insert(b, 0x33) 627 call assert_equal(0z33DEADBEEF, b) 628 629 LET b = 0zDEADBEEF 630 call insert(b, 0x33, 2) 631 call assert_equal(0zDEAD33BEEF, b) 632 END 633 call CheckLegacyAndVim9Success(lines) 634 635 " only works in legacy script 636 call assert_equal(0, insert(v:_null_blob, 0x33)) 637 638 let lines =<< trim END 639 VAR b = 0zDEADBEEF 640 call insert(b, -1) 641 END 642 call CheckLegacyAndVim9Failure(lines, 'E475:') 643 644 let lines =<< trim END 645 VAR b = 0zDEADBEEF 646 call insert(b, 257) 647 END 648 call CheckLegacyAndVim9Failure(lines, 'E475:') 649 650 let lines =<< trim END 651 VAR b = 0zDEADBEEF 652 call insert(b, 0, [9]) 653 END 654 call CheckLegacyAndVim9Failure(lines, ['E745:', 'E1013:', 'E745:']) 655 656 let lines =<< trim END 657 VAR b = 0zDEADBEEF 658 call insert(b, 0, -20) 659 END 660 call CheckLegacyAndVim9Failure(lines, 'E475:') 661 662 let lines =<< trim END 663 VAR b = 0zDEADBEEF 664 call insert(b, 0, 20) 665 END 666 call CheckLegacyAndVim9Failure(lines, 'E475:') 667 668 let lines =<< trim END 669 VAR b = 0zDEADBEEF 670 call insert(b, []) 671 END 672 call CheckLegacyAndVim9Failure(lines, ['E745:', 'E1013:', 'E745:']) 673 674 let lines =<< trim END 675 insert(v:_null_blob, 0x33) 676 END 677 call CheckDefExecAndScriptFailure(lines, 'E1131:') 678 679 let lines =<< trim END 680 let b = 0zDEADBEEF 681 lockvar b 682 call insert(b, 3) 683 unlockvar b 684 END 685 call CheckScriptFailure(lines, 'E741:') 686 687 let lines =<< trim END 688 vim9script 689 var b = 0zDEADBEEF 690 lockvar b 691 insert(b, 3) 692 END 693 call CheckScriptFailure(lines, 'E741:') 694 endfunc 695 696 func Test_blob_reverse() 697 let lines =<< trim END 698 call assert_equal(0zEFBEADDE, reverse(0zDEADBEEF)) 699 call assert_equal(0zBEADDE, reverse(0zDEADBE)) 700 call assert_equal(0zADDE, reverse(0zDEAD)) 701 call assert_equal(0zDE, reverse(0zDE)) 702 call assert_equal(0z, reverse(v:_null_blob)) 703 END 704 call CheckLegacyAndVim9Success(lines) 705 endfunc 706 707 func Test_blob_json_encode() 708 let lines =<< trim END 709 #" call assert_equal('[222,173,190,239]', json_encode(0zDEADBEEF)) 710 call assert_equal('[222, 173, 190, 239]', json_encode(0zDEADBEEF)) 711 call assert_equal('[]', json_encode(0z)) 712 END 713 call CheckLegacyAndVim9Success(lines) 714 endfunc 715 716 func Test_blob_lock() 717 let lines =<< trim END 718 let b = 0z112233 719 lockvar b 720 unlockvar b 721 let b = 0z44 722 END 723 call CheckScriptSuccess(lines) 724 725 let lines =<< trim END 726 vim9script 727 var b = 0z112233 728 lockvar b 729 unlockvar b 730 b = 0z44 731 END 732 call CheckScriptSuccess(lines) 733 734 let lines =<< trim END 735 let b = 0z112233 736 lockvar b 737 let b = 0z44 738 END 739 call CheckScriptFailure(lines, 'E741:') 740 741 let lines =<< trim END 742 vim9script 743 var b = 0z112233 744 lockvar b 745 b = 0z44 746 END 747 call CheckScriptFailure(lines, 'E741:') 748 endfunc 749 750 func Test_blob_sort() 751 if has('float') 752 call CheckLegacyAndVim9Failure(['call sort([1.0, 0z11], "f")'], 'E975:') 753 endif 754 call CheckLegacyAndVim9Failure(['call sort([11, 0z11], "N")'], 'E974:') 755 endfunc 756 757 " Tests for the blob2list() function 758 func Test_blob2list() 759 call assert_fails('let v = blob2list(10)', 'E1238: Blob required for argument 1') 760 eval 0zFFFF->blob2list()->assert_equal([255, 255]) 761 let tests = [[0z0102, [1, 2]], 762 \ [0z00, [0]], 763 \ [0z, []], 764 \ [0z00000000, [0, 0, 0, 0]], 765 \ [0zAABB.CCDD, [170, 187, 204, 221]]] 766 for t in tests 767 call assert_equal(t[0]->blob2list(), t[1]) 768 endfor 769 exe 'let v = 0z' .. repeat('000102030405060708090A0B0C0D0E0F', 64) 770 call assert_equal(1024, blob2list(v)->len()) 771 call assert_equal([4, 8, 15], [v[100], v[1000], v[1023]]) 772 call assert_equal([], blob2list(v:_null_blob)) 773 endfunc 774 775 " Tests for the list2blob() function 776 func Test_list2blob() 777 call assert_fails('let b = list2blob(0z10)', 'E1211: List required for argument 1') 778 let tests = [[[1, 2], 0z0102], 779 \ [[0], 0z00], 780 \ [[], 0z], 781 \ [[0, 0, 0, 0], 0z00000000], 782 \ [[255, 255], 0zFFFF], 783 \ [[170, 187, 204, 221], 0zAABB.CCDD], 784 \ ] 785 for t in tests 786 call assert_equal(t[1], t[0]->list2blob()) 787 endfor 788 call assert_fails('let b = list2blob([1, []])', 'E745:') 789 call assert_fails('let b = list2blob([-1])', 'E1239:') 790 call assert_fails('let b = list2blob([256])', 'E1239:') 791 let b = range(16)->repeat(64)->list2blob() 792 call assert_equal(1024, b->len()) 793 call assert_equal([4, 8, 15], [b[100], b[1000], b[1023]]) 794 call assert_equal(0z, list2blob(v:_null_list)) 795 endfunc 796 797 " The following used to cause an out-of-bounds memory access 798 func Test_blob2string() 799 let v = '0z' .. repeat('01010101.', 444) 800 let v ..= '01' 801 exe 'let b = ' .. v 802 call assert_equal(v, string(b)) 803 endfunc 804 805 func Test_blob_repeat() 806 call assert_equal(0z, repeat(0z00, 0)) 807 call assert_equal(0z00, repeat(0z00, 1)) 808 call assert_equal(0z0000, repeat(0z00, 2)) 809 call assert_equal(0z00000000, repeat(0z0000, 2)) 810 811 call assert_equal(0z, repeat(0z12, 0)) 812 call assert_equal(0z, repeat(0z1234, 0)) 813 call assert_equal(0z1234, repeat(0z1234, 1)) 814 call assert_equal(0z12341234, repeat(0z1234, 2)) 815 endfunc 816 817 " Test for blob allocation failure 818 func Test_blob_alloc_failure() 819 CheckFunction test_alloc_fail 820 " blob variable 821 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0) 822 call assert_fails('let v = 0z10', 'E342:') 823 824 " blob slice 825 let v = 0z1020 826 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0) 827 call assert_fails('let x = v[0:0]', 'E342:') 828 call assert_equal(0z1020, x) 829 830 " blob remove() 831 let v = 0z10203040 832 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0) 833 call assert_fails('let x = remove(v, 1, 2)', 'E342:') 834 call assert_equal(0, x) 835 836 " list2blob() 837 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0) 838 call assert_fails('let a = list2blob([1, 2, 4])', 'E342:') 839 call assert_equal(0, a) 840 841 " mapnew() 842 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0) 843 call assert_fails('let x = mapnew(0z1234, {_, v -> 1})', 'E342:') 844 call assert_equal(0, x) 845 846 " copy() 847 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0) 848 call assert_fails('let x = copy(v)', 'E342:') 849 call assert_equal(0z, x) 850 851 " readblob() 852 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0) 853 call assert_fails('let x = readblob("test_blob.vim")', 'E342:') 854 call assert_equal(0, x) 855 endfunc 856 857 " Test for the indexof() function 858 func Test_indexof() 859 let b = 0zdeadbeef 860 call assert_equal(0, indexof(b, {i, v -> v == 0xde})) 861 call assert_equal(3, indexof(b, {i, v -> v == 0xef})) 862 call assert_equal(-1, indexof(b, {i, v -> v == 0x1})) 863 call assert_equal(1, indexof(b, "v:val == 0xad")) 864 call assert_equal(-1, indexof(b, "v:val == 0xff")) 865 call assert_equal(-1, indexof(b, {_, v -> "v == 0xad"})) 866 867 call assert_equal(-1, indexof(0z, "v:val == 0x0")) 868 call assert_equal(-1, indexof(v:_null_blob, "v:val == 0xde")) 869 call assert_equal(-1, indexof(b, v:_null_string)) 870 " Nvim doesn't have null functions 871 " call assert_equal(-1, indexof(b, test_null_function())) 872 call assert_equal(-1, indexof(b, "")) 873 874 let b = 0z01020102 875 call assert_equal(1, indexof(b, "v:val == 0x02", #{startidx: 0})) 876 call assert_equal(2, indexof(b, "v:val == 0x01", #{startidx: -2})) 877 call assert_equal(-1, indexof(b, "v:val == 0x01", #{startidx: 5})) 878 call assert_equal(0, indexof(b, "v:val == 0x01", #{startidx: -5})) 879 call assert_equal(0, indexof(b, "v:val == 0x01", v:_null_dict)) 880 881 " failure cases 882 call assert_fails('let i = indexof(b, "val == 0xde")', 'E121:') 883 call assert_fails('let i = indexof(b, {})', 'E1256:') 884 call assert_fails('let i = indexof(b, " ")', 'E15:') 885 endfunc 886 887 " Test for using the items() function with a blob 888 func Test_blob_items() 889 let lines =<< trim END 890 call assert_equal([[0, 0xAA], [1, 0xBB], [2, 0xCC]], 0zAABBCC->items()) 891 call assert_equal([[0, 0]], 0z00->items()) 892 call assert_equal([], 0z->items()) 893 call assert_equal([], v:_null_blob->items()) 894 END 895 call CheckSourceLegacyAndVim9Success(lines) 896 endfunc 897 898 " Test for setting a byte in a blob with invalid value 899 func Test_blob_byte_set_invalid_value() 900 let lines =<< trim END 901 VAR b = 0zD0C3E4E18E1B 902 LET b[0] = 229539777187355 903 END 904 call CheckSourceLegacyAndVim9Failure(lines, 'E1239: Invalid value for blob:') 905 endfunc 906 907 " vim: shiftwidth=2 sts=2 expandtab