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:', 'E1210:']) 361 362 let lines =<< trim END 363 VAR b = 0z0011 364 call add("", 0x01) 365 END 366 call CheckLegacyAndVim9Failure(lines, ['E897:', 'E1013:', 'E1226:']) 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(test_null_blob(), 1, 2) 429 END 430 call CheckLegacyAndVim9Failure(lines, 'E979:') 431endfunc 432 433func Test_blob_read_write() 434 let lines =<< trim END 435 VAR b = 0zDEADBEEF 436 call writefile(b, 'Xblob') 437 VAR br = readfile('Xblob', 'B') 438 call assert_equal(b, br) 439 call delete('Xblob') 440 END 441 call CheckLegacyAndVim9Success(lines) 442 443 " This was crashing when calling readfile() with a directory. 444 call assert_fails("call readfile('.', 'B')", 'E17: "." is a directory') 445endfunc 446 447" filter() item in blob 448func Test_blob_filter() 449 let lines =<< trim END 450 call assert_equal(test_null_blob(), filter(test_null_blob(), '0')) 451 call assert_equal(0z, filter(0zDEADBEEF, '0')) 452 call assert_equal(0zADBEEF, filter(0zDEADBEEF, 'v:val != 0xDE')) 453 call assert_equal(0zDEADEF, filter(0zDEADBEEF, 'v:val != 0xBE')) 454 call assert_equal(0zDEADBE, filter(0zDEADBEEF, 'v:val != 0xEF')) 455 call assert_equal(0zDEADBEEF, filter(0zDEADBEEF, '1')) 456 call assert_equal(0z01030103, filter(0z010203010203, 'v:val != 0x02')) 457 call assert_equal(0zADEF, filter(0zDEADBEEF, 'v:key % 2')) 458 END 459 call CheckLegacyAndVim9Success(lines) 460endfunc 461 462" map() item in blob 463func Test_blob_map() 464 let lines =<< trim END 465 call assert_equal(0zDFAEBFF0, map(0zDEADBEEF, 'v:val + 1')) 466 call assert_equal(0z00010203, map(0zDEADBEEF, 'v:key')) 467 call assert_equal(0zDEAEC0F2, map(0zDEADBEEF, 'v:key + v:val')) 468 END 469 call CheckLegacyAndVim9Success(lines) 470 471 let lines =<< trim END 472 call map(0z00, '[9]') 473 END 474 call CheckLegacyAndVim9Failure(lines, 'E978:') 475endfunc 476 477func Test_blob_index() 478 let lines =<< trim END 479 call assert_equal(2, index(0zDEADBEEF, 0xBE)) 480 call assert_equal(-1, index(0zDEADBEEF, 0)) 481 call assert_equal(2, index(0z11111111, 0x11, 2)) 482 call assert_equal(3, 0z11110111->index(0x11, 2)) 483 call assert_equal(2, index(0z11111111, 0x11, -2)) 484 call assert_equal(3, index(0z11110111, 0x11, -2)) 485 call assert_equal(0, index(0z11110111, 0x11, -10)) 486 call assert_equal(-1, index(test_null_blob(), 1)) 487 END 488 call CheckLegacyAndVim9Success(lines) 489endfunc 490 491func Test_blob_insert() 492 let lines =<< trim END 493 VAR b = 0zDEADBEEF 494 call insert(b, 0x33) 495 call assert_equal(0z33DEADBEEF, b) 496 497 LET b = 0zDEADBEEF 498 call insert(b, 0x33, 2) 499 call assert_equal(0zDEAD33BEEF, b) 500 END 501 call CheckLegacyAndVim9Success(lines) 502 503 " only works in legacy script 504 call assert_equal(0, insert(test_null_blob(), 0x33)) 505 506 let lines =<< trim END 507 VAR b = 0zDEADBEEF 508 call insert(b, -1) 509 END 510 call CheckLegacyAndVim9Failure(lines, 'E475:') 511 512 let lines =<< trim END 513 VAR b = 0zDEADBEEF 514 call insert(b, 257) 515 END 516 call CheckLegacyAndVim9Failure(lines, 'E475:') 517 518 let lines =<< trim END 519 VAR b = 0zDEADBEEF 520 call insert(b, 0, [9]) 521 END 522 call CheckLegacyAndVim9Failure(lines, ['E745:', 'E1013:', 'E1210:']) 523 524 let lines =<< trim END 525 VAR b = 0zDEADBEEF 526 call insert(b, 0, -20) 527 END 528 call CheckLegacyAndVim9Failure(lines, 'E475:') 529 530 let lines =<< trim END 531 VAR b = 0zDEADBEEF 532 call insert(b, 0, 20) 533 END 534 call CheckLegacyAndVim9Failure(lines, 'E475:') 535 536 let lines =<< trim END 537 VAR b = 0zDEADBEEF 538 call insert(b, []) 539 END 540 call CheckLegacyAndVim9Failure(lines, ['E745:', 'E1013:', 'E1210:']) 541 542 let lines =<< trim END 543 insert(test_null_blob(), 0x33) 544 END 545 call CheckDefExecAndScriptFailure(lines, 'E1131:') 546endfunc 547 548func Test_blob_reverse() 549 let lines =<< trim END 550 call assert_equal(0zEFBEADDE, reverse(0zDEADBEEF)) 551 call assert_equal(0zBEADDE, reverse(0zDEADBE)) 552 call assert_equal(0zADDE, reverse(0zDEAD)) 553 call assert_equal(0zDE, reverse(0zDE)) 554 call assert_equal(0z, reverse(test_null_blob())) 555 END 556 call CheckLegacyAndVim9Success(lines) 557endfunc 558 559func Test_blob_json_encode() 560 let lines =<< trim END 561 call assert_equal('[222,173,190,239]', json_encode(0zDEADBEEF)) 562 call assert_equal('[]', json_encode(0z)) 563 END 564 call CheckLegacyAndVim9Success(lines) 565endfunc 566 567func Test_blob_lock() 568 let lines =<< trim END 569 let b = 0z112233 570 lockvar b 571 unlockvar b 572 let b = 0z44 573 END 574 call CheckScriptSuccess(lines) 575 576 let lines =<< trim END 577 vim9script 578 var b = 0z112233 579 lockvar b 580 unlockvar b 581 b = 0z44 582 END 583 call CheckScriptSuccess(lines) 584 585 let lines =<< trim END 586 let b = 0z112233 587 lockvar b 588 let b = 0z44 589 END 590 call CheckScriptFailure(lines, 'E741:') 591 592 let lines =<< trim END 593 vim9script 594 var b = 0z112233 595 lockvar b 596 b = 0z44 597 END 598 call CheckScriptFailure(lines, 'E741:') 599endfunc 600 601func Test_blob_sort() 602 if has('float') 603 call CheckLegacyAndVim9Failure(['call sort([1.0, 0z11], "f")'], 'E975:') 604 endif 605 call CheckLegacyAndVim9Failure(['call sort([11, 0z11], "N")'], 'E974:') 606endfunc 607 608" vim: shiftwidth=2 sts=2 expandtab 609