1/* 2 * Copyright (c) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16var FastBuffer = undefined; 17 18let encodeArr = ['utf8', 'utf-8', 'ucs2', 'ucs-2', 'ascii', 'latin1', 'binary', 19 'utf16le', 'utf-16le', 'base64', 'base64url', 'hex']; 20 21const UINT32_MAX = 2 ** 32 - 1; // 表示2^32-1,是uint32能表达的最大值 22 23function normalizeEncoding(enc) { 24 enc = enc.toLowerCase(); 25 if (enc === 'ucs2' || enc === 'ucs-2' || enc === 'utf-16le') { 26 enc = 'utf16le'; 27 } 28 if (enc === 'utf-8') { 29 enc = 'utf8'; 30 } 31 return enc; 32} 33 34if (globalThis["ArkPrivate"] != undefined) { 35 let map = new Map(); 36 FastBuffer = ArkPrivate.Load(ArkPrivate.FastBuffer); 37 { 38 let buf2 = new FastBuffer(10); 39 buf2.fill('F1刘FG', 0, 10, 'ascii'); 40 let str = buf2.toString("hex"); 41 map.set("buffer.fill() failed, expect: 46311846474631184647, output: " + str, str === "46311846474631184647"); 42 43 let buf3 = new FastBuffer(10); 44 buf3.fill('F1FG', 0, 10, 'base64'); 45 str = buf3.toString("hex"); 46 map.set("buffer.fill() failed, expect: 17514617514617514617, output: " + str, str === "17514617514617514617"); 47 48 let buf4 = new FastBuffer(10); 49 buf4.fill('F1刘FG', 0, 10, 'binary'); 50 str = buf4.toString("hex"); 51 map.set("buffer.fill() failed, expect: 46311846474631184647, output: " + str, str === "46311846474631184647"); 52 53 let buf5 = new FastBuffer(10); 54 buf5.fill('F1刘FG', 0, 10, 'latin1'); 55 str = buf5.toString("hex"); 56 map.set("buffer.fill() failed, expect: 46311846474631184647, output: " + str, str === "46311846474631184647"); 57 58 let buf6 = new FastBuffer(10); 59 buf6.fill('F1刘FG', 0, 10, normalizeEncoding('ucs2')); 60 str = buf6.toString("hex"); 61 map.set("buffer.fill() failed, expect: 46003100185246004700, output: " + str, str === "46003100185246004700"); 62 63 let buf7 = new FastBuffer(10); 64 buf7.fill('F1刘FG', 0, 10, 'utf8'); 65 str = buf7.toString("hex"); 66 map.set("buffer.fill() failed, expect: 4631e5889846474631e5, output: " + str, str === "4631e5889846474631e5"); 67 } 68 { 69 let uint8array = new Uint8Array(10).fill(0); 70 let buf = new FastBuffer([1, 2, 3, 4, 5, 6, 7]); 71 let num = buf.copy(uint8array, 0, 3); 72 map.set("buffer.copy() failed, expect num: 4, output: " + num, num === 4); 73 let str = uint8array.toString(); 74 map.set("buffer.copy() failed, expect str: 4,5,6,7,0,0,0,0,0,0, output: " + str, str === "4,5,6,7,0,0,0,0,0,0"); 75 } 76 { 77 let latin1str = '¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'; 78 let strbuf = new FastBuffer(latin1str, "latin1"); 79 let toStr = strbuf.toString("latin1"); 80 map.set("buffer create and tostring latin1 failed, expect: " + latin1str + ", output: " + toStr, toStr === latin1str); 81 } 82 { 83 let buf = new FastBuffer(10); 84 let buf1 = new FastBuffer(10); 85 buf1.fill('!'); 86 for (let i = 0; i < 10; i++) { 87 buf[i] = i + 97; 88 } 89 let len = buf.copy(buf1, 0, 4, 10); 90 let str = buf1.toString(); 91 map.set("buffer.copy() failed, expect len: 6, output: " + len, len === 6); 92 map.set("buffer.copy() failed, expect str: efghij!!!!, output: " + str, str === "efghij!!!!"); 93 } 94 { 95 let buf = new FastBuffer(10); 96 for (let i = 0; i < 10; i++) { 97 buf[i] = i + 97; 98 } 99 let len = buf.copy(buf, 2); 100 map.set("buffer.copy() failed, expect len: 8, output: " + len, len === 8); 101 let str = buf.toString(); 102 map.set("buffer.copy() failed, expect str: ababcdefgh, output: " + str, str === "ababcdefgh"); 103 } 104 { 105 let buf1 = new FastBuffer("123656"); 106 let buf2 = new FastBuffer("1235"); 107 let num = buf1.copy(buf2); 108 let str = buf2.toString(); 109 map.set("buffer.copy() failed, expect num: 4, output: " + num, num === 4); 110 map.set("buffer.copy() failed, expect str: 1236, output: " + str, str === "1236"); 111 } 112 { 113 let buf1 = new FastBuffer("测试一"); 114 let buf2 = new FastBuffer("测试二"); 115 let res = buf1.compare(buf2); 116 map.set("buffer.comapre() failed, expect res: -1, output: " + res, res === -1); 117 } 118 { 119 let buf1 = new FastBuffer("1236测试"); 120 let buf2 = new FastBuffer("1236测试"); 121 let res = buf1.equals(buf2); 122 map.set("buffer.equals() failed, expect res: true, output: " + res, res === true); 123 } 124 { 125 let buf1 = new FastBuffer("测试特殊字符$#@!"); 126 let flag = buf1.includes("#@"); 127 map.set("buffer.includes() failed, expect flag: true, output: " + flag, flag === true); 128 flag = buf1.includes("测试"); 129 map.set("buffer.includes() failed, expect flag: true, output: " + flag, flag === true); 130 } 131 { 132 let buf1 = new FastBuffer("测试特殊字符$#@!"); 133 let index = buf1.indexOf("@"); 134 map.set("buffer.indexOf() failed, expect index: 20, output: " + index, index === 20); 135 } 136 { 137 let buf = new FastBuffer('this buffer is a buffer'); 138 let index = buf.lastIndexOf('buffer', -4); 139 map.set("buffer.indexOf() failed, expect index: 17, output: " + index, index === 17); 140 index = buf.lastIndexOf('buffer', -5); 141 map.set("buffer.indexOf() failed, expect index: 17, output: " + index, index === 17); 142 index = buf.lastIndexOf('buffer', -7); 143 map.set("buffer.indexOf() failed, expect index: 5, output: " + index, index === 5); 144 index = buf.lastIndexOf('buffer', 1); 145 map.set("buffer.indexOf() failed, expect index: -1, output: " + index, index === -1); 146 index = buf.lastIndexOf('buffer', 9999); 147 map.set("buffer.indexOf() failed, expect index: 17, output: " + index, index === 17); 148 index = buf.lastIndexOf('buffer', -999); 149 map.set("buffer.indexOf() failed, expect index: -1, output: " + index, index === -1); 150 index = buf.lastIndexOf('buffer'); 151 map.set("buffer.indexOf() failed, expect index: 17, output: " + index, index === 17); 152 } 153 { 154 let uarr = new Uint8Array(4); 155 uarr[0] = 0x31; 156 uarr[1] = 0x32; 157 uarr[2] = 0x33; 158 uarr[3] = 0x34; 159 let buf1 = new FastBuffer(uarr); 160 let keys = buf1.keys(); 161 let index = 0; 162 for (const key of keys) { 163 map.set("buffer.keys() failed, expect index: " + key +", output: " + index, index === key); 164 index++; 165 } 166 } 167 { 168 let uarr = new Uint8Array(4); 169 uarr[0] = 0x31; 170 uarr[1] = 0x32; 171 uarr[2] = 0x33; 172 uarr[3] = 0x34; 173 let buf1 = new FastBuffer(uarr); 174 let values = buf1.values(); 175 let va = 0x31; 176 for (const value of values) { 177 map.set("buffer.values() failed, expect value: " + va +", output: " + value, value === va); 178 va++; 179 } 180 } 181 { 182 let buf1 = new FastBuffer("1234"); 183 let entries = buf1.entries(); 184 let va = 49, index = 0; 185 for (const [key, value] of entries) { 186 map.set("buffer.entries() failed, expect key: " + index +", output: " + key, key === index); 187 map.set("buffer.entries() failed, expect value: " + va +", output: " + value, value === va); 188 va++; 189 index++; 190 } 191 } 192 { 193 let buf = new FastBuffer('this buffer is a buffer'); 194 let res = buf.lastIndexOf('buffer', -4); 195 map.set("buffer.lastIndexOf() failed, expect: 17, output: " + res, res === 17); 196 } 197 { 198 let buf = new FastBuffer(8); 199 buf.writeUInt8(123); 200 let res = buf.readUInt8(0); 201 map.set("buffer.writeUInt8() failed, expect: 123, output: " + res, res === 123); 202 203 buf.writeUInt16BE(100, 0); 204 res = buf.readUInt16BE(0); 205 map.set("buffer.readUInt16BE() failed, expect: 100, output: " + res, res === 100); 206 207 buf.writeUInt16LE(100, 0); 208 res = buf.readUInt16LE(0); 209 map.set("buffer.readUInt16LE() failed, expect: 100, output: " + res, res === 100); 210 211 buf.writeUInt32BE(100, 0); 212 res = buf.readUInt32BE(0); 213 map.set("buffer.writeUInt32BE() failed, expect: 100, output: " + res, res === 100); 214 215 buf.writeUInt32LE(100, 0); 216 res = buf.readUInt32LE(0); 217 map.set("buffer.writeUInt32LE() failed, expect: 100, output: " + res, res === 100); 218 219 buf.writeUIntBE(100, 2, 6); 220 res = buf.readUIntBE(2, 6); 221 map.set("buffer.writeUIntBE() failed, expect: 100, output: " + res, res === 100); 222 223 buf.writeUIntLE(100, 2, 6); 224 res = buf.readUIntLE(2, 6); 225 map.set("buffer.writeUIntLE() failed, expect: 100, output: " + res, res === 100); 226 227 buf.writeInt8(123); 228 res = buf.readInt8(0); 229 map.set("buffer.writeInt8() failed, expect: 123, output: " + res, res === 123); 230 231 buf.writeInt16BE(100, 0); 232 res = buf.readInt16BE(0); 233 map.set("buffer.readInt16BE() failed, expect: 100, output: " + res, res === 100); 234 235 buf.writeInt16LE(100, 0); 236 res = buf.readInt16LE(0); 237 map.set("buffer.readInt16LE() failed, expect: 100, output: " + res, res === 100); 238 239 buf.writeInt32BE(100, 0); 240 res = buf.readInt32BE(0); 241 map.set("buffer.writeInt32BE() failed, expect: 100, output: " + res, res === 100); 242 243 buf.writeInt32LE(100, 0); 244 res = buf.readInt32LE(0); 245 map.set("buffer.writeInt32LE() failed, expect: 100, output: " + res, res === 100); 246 247 buf.writeIntBE(100, 2, 6); 248 res = buf.readIntBE(2, 6); 249 map.set("buffer.writeIntBE() failed, expect: 100, output: " + res, res === 100); 250 251 buf.writeIntLE(100, 2, 6); 252 res = buf.readIntLE(2, 6); 253 map.set("buffer.writeIntLE() failed, expect: 100, output: " + res, res === 100); 254 255 const eps = 1e-3; 256 const eeps = 1e-6; 257 buf.writeFloatBE(114.514, 0); 258 map.set("buffer.writeFloatBE() failed", Math.abs(buf.readFloatBE(0) - 114.514) < eps); 259 260 buf.writeFloatLE(114.514, 0); 261 map.set("buffer.writeFloatLE() failed", Math.abs(buf.readFloatLE(0) - 114.514) < eps); 262 263 buf.writeDoubleBE(114.5141919, 0); 264 map.set("buffer.writeDoubleBE() failed", Math.abs(buf.readDoubleBE(0) - 114.5141919) < eeps); 265 266 buf.writeDoubleLE(114.5141919, 0); 267 map.set("buffer.writeDoubleLE() failed", Math.abs(buf.readDoubleLE(0) - 114.5141919) < eeps); 268 } 269 270 { 271 let buf = new FastBuffer(20); 272 map.set("buffer.length:", buf.length == 20); 273 } 274 { 275 let buf = new FastBuffer(20); 276 buf.fill("abc"); 277 let flag = true; 278 for (let i = 0; i + 3 < buf.length; i += 3) { 279 let str = buf.toString("utf8", i, i + 3); 280 if (str !== "abc") { 281 flag = false; 282 } 283 } 284 map.set("buffer.fill(string):", flag); 285 } 286 { 287 let buf = new FastBuffer(20); 288 buf.fill(123); 289 let flag = true; 290 for (let i = 0; i < buf.length; i ++) { 291 if (buf.readInt8(i) !== 123) { 292 flag = false; 293 } 294 } 295 map.set("buffer.fill(number):", flag); 296 } 297 { 298 let buf = new FastBuffer(20); 299 let buff = new FastBuffer(20); 300 buff.fill("abc"); 301 buf.fill(buff); 302 let flag = true; 303 for (let i = 0; i + 3 < buf.length; i += 3) { 304 let str = buf.toString("utf8", i, i + 3); 305 if (str !== "abc") { 306 flag = false; 307 } 308 } 309 map.set("buffer.fill(FastBuffer):", flag); 310 } 311 { 312 let buf = new FastBuffer(20); 313 let typeArray = new Uint8Array([1,2,3,4,5]); 314 buf.fill(typeArray); 315 let flag = true; 316 for (let i = 0; i < buf.length; i++) { 317 if (buf.readInt8(i) !== typeArray[i % 5]) { 318 flag = false; 319 } 320 } 321 map.set("buffer.fill(Uint8Array):", flag); 322 } 323 { 324 let buf1 = new FastBuffer("hello world", 'utf8'); 325 buf1.copy(buf1); 326 let buf2 = new FastBuffer(20); 327 buf1.copy(buf2); 328 map.set("buffer.copy() failed", buf1.compare(buf2, 0, 11) === 0); 329 } 330 { 331 let buf1 = new FastBuffer("hello world", 'utf8'); 332 let array = new Uint8Array(11); 333 buf1.copy(array) 334 map.set("buffer.copy() failed", buf1.compare(array, 0, 11) === 0); 335 map.set("buffer.equals() failed", buf1.equals(array)); 336 } 337 { 338 let buf1 = new FastBuffer("hello world", 'utf8'); 339 map.set("buffer.includes(string) failed", buf1.includes("hello")); 340 let buf2 = new FastBuffer(" hello world", 'utf8'); 341 map.set("buffer.includes(string) failed", buf2.includes("hello")); 342 } 343 { 344 let buf1 = new FastBuffer(10); 345 buf1.writeUInt8(114, 0); 346 buf1.writeUInt8(514 & 255, 1); 347 map.set("buffer.includes(number) failed", buf1.includes(114)); 348 map.set("buffer.includes(number) failed", buf1.includes(514 & 255)); 349 } 350 { 351 let buf1 = new FastBuffer(10); 352 buf1.writeUInt8(114, 0); 353 buf1.writeUInt8(514 & 255, 1); 354 let buf2 = new FastBuffer(10); 355 buf2.writeUInt8(114, 0); 356 map.set("buffer.includes(buffer) failed", !buf1.includes(buf2)); 357 let buf3 = new FastBuffer(1); 358 buf3.writeUInt8(114, 0); 359 map.set("buffer.includes(buffer) failed", buf1.includes(buf3)); 360 } 361 { 362 let temp = new FastBuffer(15); 363 temp.write("aGVsbG8gd29ybGQh", 0, 12, "base64"); 364 let str = temp.toString('utf-8', 0, 12); 365 map.set("buffer.write(str, 'base64') failed", str === "hello world!"); 366 for (const [key, value] of temp.entries()) { 367 if (key >= str.length) { 368 break; 369 } 370 if (str[key] != String.fromCharCode(value)) { 371 map.set("buffer.entries() failed", false); 372 break; 373 } 374 } 375 } 376 { 377 let temp = new FastBuffer("hello world hello", "utf8"); 378 let index = temp.indexOf('hello'); 379 map.set("buffer.indexOf() failed", index === 0); 380 index = temp.lastIndexOf('hello'); 381 map.set("buffer.lastIndexOf() failed", index === 12); 382 index = temp.indexOf('www'); 383 map.set("buffer.indexOf() failed", index === -1); 384 let flag = temp.includes("hello"); 385 map.set("buffer.indexOf() failed", flag); 386 } 387 { 388 let array = [1,2,3,4,5]; 389 let temp = new FastBuffer(array); 390 for (let i = 0; i < array.length; i++) { 391 if(temp[i] != array[i]) { 392 map.set("buffer.from(array) failed", false); 393 break; 394 } 395 } 396 } 397 { 398 let str = "hello world"; 399 let temp = new FastBuffer(str, "utf8"); 400 for (let i = 0; i < str.length; i++) { 401 if(String.fromCharCode(temp[i]) != str[i]) { 402 map.set("buffer.from(str) failed", false); 403 break; 404 } 405 } 406 } 407 { 408 let typeArray = new Uint8Array([1,2,3,4,5]); 409 let temp = new FastBuffer(typeArray); 410 map.set("buffer.from(UInt8Array) failed", temp.buffer === typeArray.buffer); 411 for (let i = 0; i < temp.length; i++) { 412 if(temp[i] != typeArray[i]) { 413 map.set("buffer.from(UInt8Array) failed", false); 414 break; 415 } 416 } 417 } 418 { 419 let array = [114,514,1919,810]; 420 let temp = new FastBuffer(array); 421 for (let i = 0; i < array.length; i++) { 422 if(temp.readInt8(i) != (array[i] & 255)) { 423 map.set("buffer.from(array) failed", false); 424 break; 425 } 426 } 427 } 428 { 429 let buf1 = new FastBuffer("abcd", "utf8"); 430 let buf2 = new FastBuffer("bcde", "utf8"); 431 map.set("buffer.compare(target) failed", (buf1.compare(buf2) == -1) == ("abcd" < "bcde")); 432 map.set("buffer.compare(target) failed", (buf2.compare(buf1) == 1) == ("abcd" > "bcde")); 433 let buf3 = new FastBuffer("abcde", "utf8"); 434 map.set("buffer.compare(target) failed", (buf1.compare(buf3) == 1) == ("abcd" < "abcde")); 435 map.set("buffer.compare(target) failed", (buf1.compare(buf1) == 0) == ("abcd" == "abcd")); 436 } 437 { 438 const buf1 = new FastBuffer('1234', 'utf8'); 439 const buf2 = new FastBuffer('0123', 'utf8'); 440 map.set("buffer.compare() failed", buf1.compare(buf2) === 1); 441 } 442 { 443 let buf1 = new FastBuffer("abcd", 'utf8'); 444 map.set("buffer.toJson() failed", JSON.stringify(buf1) === "{\"0\":97,\"1\":98,\"2\":99,\"3\":100}"); 445 } 446 447 { 448 let buf = new FastBuffer(12); 449 let src = "hello world!"; 450 let srcBase64 = "aGVsbG8gd29ybGQh"; 451 buf.write(src); 452 map.set("buf.toString failed", buf.toString() === src); 453 map.set("buf.toString failed", buf.toString("base64") === srcBase64); 454 } 455 456 { 457 let buf = new FastBuffer(12); 458 let src = "hello world!"; 459 let srcBase64 = "aGVsbG8gd29ybGQh"; 460 buf.write(srcBase64, 0, 12, 'base64'); 461 map.set("buf.toString failed", buf.toString() === src); 462 } 463 464 { 465 let array = new Uint8Array([252,11,3,67,237,118,91,177,43]); 466 let buf = new FastBuffer(array); 467 let strUrl = buf.toString("base64url"); 468 let str = buf.toString("base64"); 469 map.set("create buffer baes64 01 failed", strUrl === "_AsDQ-12W7Er"); 470 map.set("create buffer baes64 01 failed", str === "/AsDQ+12W7Er"); 471 472 array = new Uint8Array([2,192,254,253,5,132,69]); 473 buf = new FastBuffer(array); 474 strUrl = buf.toString("base64url"); 475 str= buf.toString("base64"); 476 map.set("create buffer baes64 02 failed", strUrl === "AsD-_QWERQ"); 477 map.set("create buffer baes64 02 failed", str === "AsD+/QWERQ=="); 478 479 array = new Uint8Array([215,109,211,97,72,142,167,241]); 480 buf = new FastBuffer(array); 481 strUrl = buf.toString("base64url"); 482 str = buf.toString("base64"); 483 map.set("create buffer baes64 03 failed", strUrl === "123TYUiOp_E"); 484 map.set("create buffer baes64 03 failed", str === "123TYUiOp/E="); 485 486 array = new Uint8Array([252]); 487 buf = new FastBuffer(array); 488 strUrl = buf.toString("base64url"); 489 str = buf.toString("base64"); 490 map.set("create buffer baes64 04 failed", strUrl === "_A"); 491 map.set("create buffer baes64 04 failed", str === "/A=="); 492 493 array = new Uint8Array([252,97]); 494 buf = new FastBuffer(array); 495 strUrl = buf.toString("base64url"); 496 str = buf.toString("base64"); 497 map.set("create buffer baes64 05 failed", strUrl === "_GE"); 498 map.set("create buffer baes64 05 failed", str === "/GE="); 499 500 array = new Uint8Array([252,97,142]); 501 buf = new FastBuffer(array); 502 strUrl = buf.toString("base64url"); 503 str = buf.toString("base64"); 504 map.set("create buffer baes64 06 failed", strUrl === "_GGO"); 505 map.set("create buffer baes64 06 failed", str === "/GGO"); 506 } 507 508 { 509 let ab = new ArrayBuffer(100); 510 let buf = new FastBuffer(ab, 9.9, 9.9); 511 let res = buf.toString('hex'); 512 map.set("create buffer not int parameter failed", res === "000000000000000000"); 513 } 514 515 { 516 let buf = new FastBuffer(2); 517 buf.writeInt16BE(0x1234, 0); 518 try { 519 let ref = buf.readInt16LE(1); 520 } catch (err) { 521 map.set("buffer write out of bounds error failed", err.name === 'BusinessError'); 522 map.set("buffer write out of bounds error failed", err.message === 'The value of "offset" is out of range. It must be >= 0 and <= 0. Received value is: 1'); 523 } 524 } 525 526 { 527 let buf = new FastBuffer("测试特殊字符$#@!"); 528 let len = buf.length; 529 map.set("buffer test chinese$#@! failed", len === 22); 530 } 531 532 { 533 let buf = new FastBuffer([0x12, 0x34, 0x56, 0x78, 0x90, 0xab]); 534 let res = buf.readIntBE(0, 6).toString(16); 535 map.set("buffer.readIntBE() failed, expect: 1234567890ab, output: " + res, res === '1234567890ab'); 536 } 537 538 { 539 let buf = new FastBuffer([0x12, 0x34, 0x56, 0x78, 0x90, 0xab]); 540 let res = buf.readIntLE(0, 6).toString(16); 541 map.set("buffer.readIntLE() failed, expect: -546f87a9cbee, output: " + res, res === '-546f87a9cbee'); 542 } 543 544 { 545 let buf = new FastBuffer([0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 546 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78]); 547 let res = buf.readBigUInt64BE(0).toString(); 548 map.set("buffer.readBigUInt64BE() failed, expect: 7161960797921896816, output: " + res, res === '7161960797921896816'); 549 550 let buf1 = new FastBuffer(8); 551 let result = buf1.writeBigUInt64BE(BigInt(0xdecafafecacefade), 0); 552 map.set("buffer.readBigUInt64BE() failed, expect: 8, output: " + result, result === 8); 553 } 554 { 555 try{ 556 let buf = new FastBuffer([undefined]); 557 } catch (e) { 558 map.set("new buffer from array failed, expect: 401, output: " + e.code, e.code === 401); 559 } 560 } 561 { 562 let buf = new FastBuffer(3).fill("$*$"); 563 let str = buf.toString(); 564 map.set("testFill0092, expect: $*$, output: " + str, str === "$*$"); 565 } 566 567 { 568 try { 569 let buf = new FastBuffer(3).fill("$*$", -1); 570 } catch (err) { 571 map.set("testFill0093, expect: BusinessError, output: " + err.name, err.name === 'BusinessError'); 572 let expectMsg = 'The value of "offset" is out of range. It must be >= 0 and <= 3. Received value is: -1'; 573 map.set("testFill0093, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg); 574 } 575 } 576 577 { 578 try { 579 let buf = new FastBuffer(3).fill("$*$", 0, 5); 580 } catch (err) { 581 map.set("testFill0094, expect: BusinessError, output: " + err.name, err.name === 'BusinessError'); 582 let expectMsg = 'The value of "end" is out of range. It must be >= 0 and <= 3. Received value is: 5'; 583 map.set("testFill0094, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg); 584 } 585 } 586 587 { 588 let buf = new FastBuffer(8); 589 try { 590 let offset = buf.write("abcde", -1); 591 } catch (err) { 592 map.set("testWrite0105, expect: BusinessError, output: " + err.name, err.name === 'BusinessError'); 593 let expectMsg = 'The value of "offset" is out of range. It must be >= 0 and <= 7. Received value is: -1'; 594 map.set("testWrite0105, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg); 595 } 596 } 597 598 { 599 let buf = new FastBuffer(8); 600 try { 601 let offset = buf.write("abcde", 1, 9); 602 } catch (err) { 603 map.set("testWrite0106, expect: BusinessError, output: " + err.name, err.name === 'BusinessError'); 604 let expectMsg = 'The value of "length" is out of range. It must be >= 0 and <= 7. Received value is: 9'; 605 map.set("testWrite0106, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg); 606 } 607 } 608 609 { 610 let buf1 = new FastBuffer("1236"); 611 let buf2 = new FastBuffer("1235"); 612 let res = buf1.compare(buf2); 613 map.set("testCompare0110, expect: 1, output: " + res, res === 1); 614 } 615 616 { 617 let buf1 = new FastBuffer("1236"); 618 let buf2 = new FastBuffer("1235"); 619 try { 620 let res = buf1.compare(buf2, -1); 621 } catch (err) { 622 map.set("testCompare0112, expect: BusinessError, output: " + err.name, err.name === 'BusinessError'); 623 let expectMsg = 'The value of "targetStart" is out of range. It must be >= 0 and <= 4. Received value is: -1'; 624 map.set("testCompare0112, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg); 625 } 626 } 627 628 { 629 let buf1 = new FastBuffer("1236"); 630 let buf2 = new FastBuffer("1235"); 631 let res = buf1.equals(buf2); 632 map.set("testEquals0120, expect: false, output: " + res, res === false); 633 } 634 635 { 636 let buf1 = new FastBuffer("1236测试"); 637 let buf2 = new FastBuffer("1236测试"); 638 let res = buf1.equals(buf2); 639 map.set("testEquals0121, expect: true, output: " + res, res === true); 640 } 641 642 { 643 let buf1 = new FastBuffer("O@O"); 644 let buf2 = new FastBuffer("O^O"); 645 let res = buf1.equals(buf2); 646 map.set("testEquals0122, expect: false, output: " + res, res === false); 647 } 648 649 { 650 let buf1 = new FastBuffer("1236"); 651 let buf2 = new FastBuffer("1235"); 652 let num = buf1.copy(buf2); 653 map.set("testCopy0140, expect: 4, output: " + num, num === 4); 654 let str = buf2.toString(); 655 map.set("testCopy0140, expect: 1236, output: " + str, str === "1236"); 656 } 657 658 { 659 let buf1 = new FastBuffer("abcdefg"); 660 let buf2 = new FastBuffer("1235789"); 661 let num = buf1.copy(buf2, 2, 1, 3); 662 map.set("testCopy0141, expect: 2, output: " + num, num === 2); 663 let str = buf2.toString(); 664 map.set("testCopy0141, expect: 12bc789, output: " + str, str === "12bc789"); 665 } 666 667 { 668 let buf1 = new FastBuffer("123656"); 669 let buf2 = new FastBuffer("1235"); 670 let num = buf1.copy(buf2); 671 map.set("testCopy0143, expect: 4, output: " + num, num === 4); 672 let str = buf2.toString(); 673 map.set("testCopy0143, expect: 1236, output: " + str, str === "1236"); 674 } 675 676 { 677 let buf1 = new FastBuffer("123656"); 678 let buf2 = new FastBuffer("1235"); 679 try { 680 let num = buf1.copy(buf2, -1); 681 } catch (err) { 682 map.set("testCopy0144, expect: BusinessError, output: " + err.name, err.name === 'BusinessError'); 683 let expectMsg = 'The value of "targetStart" is out of range. It must be >= 0 and <= 4294967295. Received value is: -1'; 684 map.set("testCopy0144, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg); 685 } 686 } 687 688 { 689 let buf1 = new FastBuffer("ab$#"); 690 let buf2 = new FastBuffer("123556"); 691 let num = buf1.copy(buf2); 692 map.set("testCopy0146, expect: 4, output: " + num, num === 4); 693 let str = buf2.toString(); 694 map.set("testCopy0146, expect: ab$#56, output: " + str, str === "ab$#56"); 695 } 696 697 { 698 let buf1 = new FastBuffer("1236"); 699 let str = buf1.toString(); 700 map.set("testToString0150, expect: 1236, output: " + str, str === "1236"); 701 } 702 703 { 704 let buf1 = new FastBuffer("张三"); 705 let str = buf1.toString(); 706 map.set("testToString0151, expect: 张三, output: " + str, str === "张三"); 707 } 708 709 { 710 let buf1 = new FastBuffer("abc"); 711 let str = buf1.toString("binary"); 712 map.set("testToString0152, expect: abc, output: " + str, str === "abc"); 713 } 714 715 { 716 let buf1 = new FastBuffer("abc"); 717 let str = buf1.toString("ascii"); 718 map.set("testToString0153, expect: abc, output: " + str, str === "abc"); 719 } 720 721 { 722 let buf1 = new FastBuffer("abc"); 723 let str = buf1.toString("base64"); 724 map.set("testToString0154, expect: YWJj, output: " + str, str === "YWJj"); 725 } 726 727 { 728 let buf1 = new FastBuffer("abc"); 729 let str = buf1.toString("hex"); 730 map.set("testToString0155, expect: 616263, output: " + str, str === "616263"); 731 } 732 733 { 734 let buf1 = new FastBuffer("abc"); 735 let str = buf1.toString("latin1"); 736 map.set("testToString0156, expect: abc, output: " + str, str === "abc"); 737 } 738 739 { 740 let buf1 = new FastBuffer("abc"); 741 let str = buf1.toString("ucs2"); 742 map.set("testToString0157, expect: 扡, output: " + str, str === "扡"); 743 } 744 745 { 746 let buf1 = new FastBuffer("abc"); 747 let str = buf1.toString("utf16le"); 748 map.set("testToString0158, expect: 扡, output: " + str, str === "扡"); 749 } 750 751 { 752 let buf1 = new FastBuffer("!@#$%^&*"); 753 let str = buf1.toString(); 754 map.set("testToString0159, expect: !@#$%^&*, output: " + str, str === "!@#$%^&*"); 755 } 756 757 { 758 let buf1 = new FastBuffer("13236"); 759 let index = buf1.indexOf("3"); 760 map.set("testIndexOf0170, expect: 1, output: " + index, index === 1); 761 } 762 763 { 764 let buf1 = new FastBuffer("13236"); 765 let index = buf1.indexOf("3", 2); 766 map.set("testIndexOf0171, expect: 3, output: " + index, index === 3); 767 } 768 769 { 770 let buf1 = new FastBuffer("13236235"); 771 let index = buf1.indexOf("23"); 772 map.set("testIndexOf0173, expect: 2, output: " + index, index === 2); 773 } 774 775 { 776 let buf1 = new FastBuffer("测试特殊字符$#@!"); 777 let index = buf1.indexOf("@"); 778 map.set("testIndexOf0174, expect: 20, output: " + index, index === 20); 779 } 780 781 { 782 let buf1 = new FastBuffer("13236235"); 783 let index = buf1.indexOf("23", 3); 784 map.set("testIndexOf0175, expect: 5, output: " + index, index === 5); 785 } 786 787 { 788 let buf1 = new FastBuffer("13236"); 789 let index = buf1.indexOf("a"); 790 map.set("testIndexOf0176, expect: -1, output: " + index, index === -1); 791 } 792 793 { 794 let buf1 = new FastBuffer("13236"); 795 let index = buf1.lastIndexOf("3"); 796 map.set("testLastIndexOf0180, expect: 3, output: " + index, index === 3); 797 } 798 799 { 800 let buf1 = new FastBuffer("13236"); 801 let index = buf1.lastIndexOf("3", 2); 802 map.set("testLastIndexOf0181, expect: 1, output: " + index, index === 1); 803 } 804 805 { 806 let buf1 = new FastBuffer("13236235"); 807 let index = buf1.lastIndexOf("23"); 808 map.set("testLastIndexOf0183, expect: 5, output: " + index, index === 5); 809 } 810 811 { 812 let buf1 = new FastBuffer("13236235"); 813 let index = buf1.lastIndexOf("23", 3); 814 map.set("testLastIndexOf0184, expect: 2, output: " + index, index === 2); 815 } 816 817 { 818 let buf1 = new FastBuffer("13236"); 819 let index = buf1.lastIndexOf("a"); 820 map.set("testLastIndexOf0186, expect: -1, output: " + index, index === -1); 821 } 822 823 { 824 let buf1 = new FastBuffer("13236"); 825 let flag = buf1.includes("3"); 826 map.set("testIncludes0190, expect: true, output: " + flag, flag === true); 827 } 828 829 { 830 let buf1 = new FastBuffer("13236"); 831 let flag = buf1.includes("3", 2); 832 map.set("testIncludes0191, expect: true, output: " + flag, flag === true); 833 } 834 835 { 836 let buf1 = new FastBuffer("13236"); 837 let flag = buf1.includes("32"); 838 map.set("testIncludes0193, expect: true, output: " + flag, flag === true); 839 } 840 841 { 842 let buf1 = new FastBuffer("13236"); 843 let flag = buf1.includes("32", 2); 844 map.set("testIncludes0194, expect: false, output: " + flag, flag === false); 845 } 846 847 { 848 let buf1 = new FastBuffer("测试特殊字符$#@!"); 849 let flag = buf1.includes("#@"); 850 map.set("testIncludes0195, expect: true, output: " + flag, flag === true); 851 flag = buf1.includes("测试"); 852 map.set("testIncludes0195, expect: true, output: " + flag, flag === true); 853 } 854 855 { 856 let buf1 = new FastBuffer("13236"); 857 let flag = buf1.includes("abc"); 858 map.set("testIncludes0196, expect: false, output: " + flag, flag === false); 859 } 860 { 861 let buf1 = new FastBuffer("1234"); 862 let keys = buf1.keys(); 863 let index = 0; 864 for (const key of keys) { 865 map.set("testKeys0230, expect: " + index + ", output: " + key, key === index); 866 index++; 867 } 868 } 869 870 { 871 let uarr = new Uint8Array(4); 872 uarr[0] = 0x31; 873 uarr[1] = 0x32; 874 uarr[2] = 0x33; 875 uarr[3] = 0x34; 876 let buf1 = new FastBuffer(uarr); 877 let keys = buf1.keys(); 878 let index = 0; 879 for (const key of keys) { 880 map.set("testKeys0235, expect: " + index + ", output: " + key, key === index); 881 index++; 882 } 883 } 884 885 { 886 let buf1 = new FastBuffer("1234"); 887 let keys = buf1.values(); 888 let va = 49; 889 for (const value of keys) { 890 map.set("testValues0240, expect: " + va + ", output: " + value, value === va); 891 va++; 892 } 893 } 894 895 { 896 let uarr = new Uint8Array(4); 897 uarr[0] = 0x31; 898 uarr[1] = 0x32; 899 uarr[2] = 0x33; 900 uarr[3] = 0x34; 901 let buf1 = new FastBuffer(uarr); 902 let keys = buf1.values(); 903 let va = 0x31; 904 for (const value of keys) { 905 map.set("testValues0245, expect: " + va + ", output: " + value, value === va); 906 va++; 907 } 908 } 909 910 { 911 let uarr = new Uint8Array(3); 912 uarr[0] = 0x12; 913 uarr[1] = 0x34; 914 uarr[2] = 0x56; 915 let buf = new FastBuffer(uarr); 916 let str = buf.toString("hex"); 917 map.set("testfrom0260, expect: 123456, output: " + str, str === "123456"); 918 } 919 920 { 921 const buf = new FastBuffer([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]); 922 let str = buf.toString("hex"); 923 map.set("testfrom0261, expect: 627566666572, output: " + str, str === "627566666572"); 924 } 925 926 { 927 const arr = new Uint8Array(2); 928 arr[0] = 97; 929 arr[1] = 98; 930 const buf = new FastBuffer(arr.buffer); 931 arr[0] = 99 932 buf[1] = 100 933 let str = buf.toString("hex"); 934 map.set("testfrom0262, expect: 6364, output: " + str, str === "6364"); 935 map.set("testfrom0262, expect: 100, output: " + arr[1], arr[1] === 100); 936 } 937 { 938 const buf1 = new FastBuffer('buffer'); 939 const buf2 = new FastBuffer(buf1); 940 buf1[0] = 0x61; 941 let str = buf1.toString(); 942 map.set("testfrom0264, expect: auffer, output: " + str, str === "auffer"); 943 str = buf2.toString(); 944 map.set("testfrom0264, expect: buffer, output: " + str, str === "buffer"); 945 } 946 947 { 948 const buf1 = new FastBuffer('this is a test'); 949 let str = buf1.toString(); 950 map.set("testfrom0265, expect: this is a test, output: " + str, str === "this is a test"); 951 } 952 953 { 954 const str = `MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC/OgIQLaulKklB\npZltSaWwM3Cnzcmvh+LoqYFYjCePUxnoJRDusFqy4sjwBx9fn/XSxxJ9A0KxMtXa\nr7YFjwQo3FsIjLZ3+8wS+Kydcg==`; 955 const buf = new FastBuffer(str, 'base64'); 956 let ref = buf.readInt8(buf.length - 1); 957 map.set("testfrom0269, expect: 114, output: " + ref, ref === 114); 958 } 959 960 { 961 let buf = new FastBuffer(4); 962 let ref = buf.writeInt32BE(0x12345678, 0); 963 map.set("testWriteInt32BE0310, expect: 4, output: " + ref, ref === 4); 964 } 965 966 { 967 let buf = new FastBuffer(4); 968 try { 969 let ref = buf.writeInt32BE(0x12345678, -1); 970 } catch (err) { 971 map.set("testWriteInt32BE0311, expect: BusinessError, output: " + err.name, err.name === 'BusinessError'); 972 let expectMsg = 'The value of "offset" is out of range. It must be >= 0. Received value is: -1'; 973 map.set("testWriteInt32BE0311, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg); 974 } 975 } 976 977 { 978 let buf = new FastBuffer(4); 979 try { 980 let ref = buf.writeInt32BE(0x123456789, 0); 981 } catch (err) { 982 map.set("testWriteInt32BE0312, expect: BusinessError, output: " + err.name, err.name === 'BusinessError'); 983 let expectMsg = 'The value of "value" is out of range. It must be >= -2147483648 and <= 2147483647. Received value is: 4886718345'; 984 map.set("testWriteInt32BE0312, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg); 985 } 986 } 987 988 { 989 let buf = new FastBuffer(4); 990 try { 991 let ref = buf.writeInt32BE(0x12345678, 1); 992 } catch (err) { 993 map.set("testWriteInt32BE0313, expect: BusinessError, output: " + err.name, err.name === 'BusinessError'); 994 let expectMsg = 'The value of "offset" is out of range. It must be >= 0 and <= 0. Received value is: 1'; 995 map.set("testWriteInt32BE0313, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg); 996 } 997 } 998 999 { 1000 let buf = new FastBuffer(4); 1001 let ref = buf.writeInt32LE(0x12345678, 0); 1002 map.set("testWriteInt32LE0320, expect: 4, output: " + ref, ref === 4); 1003 } 1004 1005 { 1006 let buf = new FastBuffer(4); 1007 try { 1008 let ref = buf.writeInt32LE(0x12345678, -1); 1009 } catch (err) { 1010 map.set("testWriteInt32LE0321, expect: BusinessError, output: " + err.name, err.name === 'BusinessError'); 1011 let expectMsg = 'The value of "offset" is out of range. It must be >= 0. Received value is: -1'; 1012 map.set("testWriteInt32LE0321, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg); 1013 } 1014 } 1015 1016 { 1017 let buf = new FastBuffer(4); 1018 try { 1019 let ref = buf.writeInt32LE(0x123456789, 0); 1020 } catch (err) { 1021 map.set("testWriteInt32LE0322, expect: BusinessError, output: " + err.name, err.name === 'BusinessError'); 1022 let expectMsg = 'The value of "value" is out of range. It must be >= -2147483648 and <= 2147483647. Received value is: 4886718345'; 1023 map.set("testWriteInt32LE0322, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg); 1024 } 1025 } 1026 1027 { 1028 let buf = new FastBuffer(4); 1029 try { 1030 let ref = buf.writeInt32LE(0x12345678, 1); 1031 } catch (err) { 1032 map.set("testWriteInt32LE0323, expect: BusinessError, output: " + err.name, err.name === 'BusinessError'); 1033 let expectMsg = 'The value of "offset" is out of range. It must be >= 0 and <= 0. Received value is: 1'; 1034 map.set("testWriteInt32LE0323, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg); 1035 } 1036 } 1037 1038 { 1039 let buf = new FastBuffer(2); 1040 let ref = buf.writeInt16BE(0x7bca, 0); 1041 map.set("testWriteInt16BE0330, expect: 2, output: " + ref, ref === 2); 1042 } 1043 1044 { 1045 let buf = new FastBuffer(2); 1046 try { 1047 let ref = buf.writeInt16BE(0x7bca, -1); 1048 } catch (err) { 1049 map.set("testWriteInt16BE0331, expect: BusinessError, output: " + err.name, err.name === 'BusinessError'); 1050 let expectMsg = 'The value of "offset" is out of range. It must be >= 0. Received value is: -1'; 1051 map.set("testWriteInt16BE0331, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg); 1052 } 1053 } 1054 1055 { 1056 let buf = new FastBuffer(2); 1057 try { 1058 let ref = buf.writeInt16BE(0x123456, 0); 1059 } catch (err) { 1060 map.set("testWriteInt16BE0332, expect: BusinessError, output: " + err.name, err.name === 'BusinessError'); 1061 let expectMsg = 'The value of "value" is out of range. It must be >= -32768 and <= 32767. Received value is: 1193046'; 1062 map.set("testWriteInt16BE0332, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg); 1063 } 1064 } 1065{ 1066 // 1. Create empty buffer 1067 let buf = new FastBuffer(0); 1068 map.set("testConstructorEmpty, expect: 0, output: " + buf.length, buf.length === 0); 1069 1070 // 2. Initialize with specified size 1071 buf = new FastBuffer(5); 1072 map.set("testConstructorSize, expect: 5, output: " + buf.length, buf.length === 5); 1073 1074 // 3. Initialize with UTF-8 string 1075 buf = new FastBuffer("Hello"); 1076 map.set("testConstructorString, expect: Hello, output: " + buf.toString(), buf.toString() === "Hello"); 1077 1078 // 4. Initialize from array 1079 buf = new FastBuffer([0x48, 0x65, 0x6c, 0x6c, 0x6f]); // "Hello" 1080 map.set("testConstructorArray, expect: Hello, output: " + buf.toString(), buf.toString() === "Hello"); 1081 1082 // 5. Initialize from ArrayBuffer 1083 let arrBuf = new ArrayBuffer(3); 1084 new Uint8Array(arrBuf).set([0x41, 0x42, 0x43]); // "ABC" 1085 buf = new FastBuffer(arrBuf); 1086 map.set("testConstructorArrayBuffer, expect: ABC, output: " + buf.toString(), buf.toString() === "ABC"); 1087 1088 // 6. Initialize from another FastBuffer (copy) 1089 let bufSrc = new FastBuffer("Copy"); 1090 buf = new FastBuffer(bufSrc); 1091 map.set("testConstructorFastBuffer, expect: Copy, output: " + buf.toString(), buf.toString() === "Copy"); 1092} 1093{ 1094 // 13. Write UInt8 value 1095 let buf = new FastBuffer(1); 1096 buf.writeUInt8(0xAB, 0); 1097 map.set("testWriteUInt8, expect: AB, output: " + buf.toString('hex'), buf.toString('hex') === "ab"); 1098 1099 // 14. Read UInt8 value 1100 let val = buf.readUInt8(0); 1101 map.set("testReadUInt8, expect: 171, output: " + val, val === 0xAB); 1102 1103 // 15. Write UInt16BE (big-endian) 1104 buf = new FastBuffer(2); 1105 buf.writeUInt16BE(0xABCD, 0); 1106 map.set("testWriteUInt16BE, expect: ABCD, output: " + buf.toString('hex'), buf.toString('hex') === "abcd"); 1107 1108 // 16. Read UInt16BE value 1109 val = buf.readUInt16BE(0); 1110 map.set("testReadUInt16BE, expect: 43981, output: " + val, val === 0xABCD); 1111 1112 // 17. Write UInt16LE (little-endian) 1113 buf.writeUInt16LE(0xABCD, 0); 1114 map.set("testWriteUInt16LE, expect: CDAB, output: " + buf.toString('hex'), buf.toString('hex') === "cdab"); 1115 1116 // 18. Read UInt16LE value 1117 val = buf.readUInt16LE(0); 1118 map.set("testReadUInt16LE, expect: 43981, output: " + val, val === 0xABCD); 1119 1120 // 19. Write UInt32BE 1121 buf = new FastBuffer(4); 1122 buf.writeUInt32BE(0x12345678, 0); 1123 map.set("testWriteUInt32BE, expect: 12345678, output: " + buf.toString('hex'), buf.toString('hex') === "12345678"); 1124 1125 // 20. Read UInt32BE value 1126 val = buf.readUInt32BE(0); 1127 map.set("testReadUInt32BE, expect: 305419896, output: " + val, val === 0x12345678); 1128 1129 // 21. Write UInt32LE 1130 buf.writeUInt32LE(0x12345678, 0); 1131 map.set("testWriteUInt32LE, expect: 78563412, output: " + buf.toString('hex'), buf.toString('hex') === "78563412"); 1132 1133 // 22. Read UInt32LE value 1134 val = buf.readUInt32LE(0); 1135 map.set("testReadUInt32LE, expect: 305419896, output: " + val, val === 0x12345678); 1136 1137 // 23. Write Int8 value 1138 buf = new FastBuffer(1); 1139 buf.writeInt8(-85, 0); // -85 = 0xAB (two's complement) 1140 map.set("testWriteInt8, expect: AB, output: " + buf.toString('hex'), buf.toString('hex') === "ab"); 1141 1142 // 24. Read Int8 value 1143 val = buf.readInt8(0); 1144 map.set("testReadInt8, expect: -85, output: " + val, val === -85); 1145 1146 // 25. Write Int16BE 1147 buf = new FastBuffer(2); 1148 buf.writeInt16BE(-21555, 0); // 0xABCD = -21555 (two's complement) 1149 map.set("testWriteInt16BE, expect: ABCD, output: " + buf.toString('hex'), buf.toString('hex') === "abcd"); 1150 1151 // 26. Read Int16BE value 1152 val = buf.readInt16BE(0); 1153 map.set("testReadInt16BE, expect: -21555, output: " + val, val === -21555); 1154 1155 // 27. Write Int16LE 1156 buf.writeInt16LE(-21555, 0); 1157 map.set("testWriteInt16LE, expect: CDAB, output: " + buf.toString('hex'), buf.toString('hex') === "cdab"); 1158 1159 // 28. Read Int16LE value 1160 val = buf.readInt16LE(0); 1161 map.set("testReadInt16LE, expect: -21555, output: " + val, val === -21555); 1162 1163 // 29. Write Int32BE 1164 buf = new FastBuffer(4); 1165 buf.writeInt32BE(-19088744, 0); // 0xFEDCBA98 = -19088744 (two's complement) 1166 map.set("testWriteInt32BE, expect: fedcba98, output: " + buf.toString('hex'), buf.toString('hex') === "fedcba98"); 1167 1168 // 30. Read Int32BE value 1169 val = buf.readInt32BE(0); 1170 map.set("testReadInt32BE, expect: -19088744, output: " + val, val === -19088744); 1171 1172 // 31. Write Int32LE 1173 buf.writeInt32LE(-19088744, 0); 1174 map.set("testWriteInt32LE, expect: 98badcfe, output: " + buf.toString('hex'), buf.toString('hex') === "98badcfe"); 1175 1176 // 32. Read Int32LE value 1177 val = buf.readInt32LE(0); 1178 map.set("testReadInt32LE, expect: -19088744, output: " + val, val === -19088744); 1179 1180 // 33. Write FloatBE 1181 buf = new FastBuffer(4); 1182 buf.writeFloatBE(123.456, 0); 1183 let hex = buf.toString('hex'); 1184 map.set("testWriteFloatBE, expect: 42f6e979, output: " + hex, hex === "42f6e979"); 1185 1186 // 34. Read FloatBE value 1187 let floatVal = buf.readFloatBE(0); 1188 map.set("testReadFloatBE, expect: 123.456, output: " + floatVal, floatVal.toFixed(3) === "123.456"); 1189 1190 // 35. Write FloatLE 1191 buf.writeFloatLE(123.456, 0); 1192 hex = buf.toString('hex'); 1193 map.set("testWriteFloatLE, expect: 79e9f642, output: " + hex, hex === "79e9f642"); 1194 1195 // 36. Read FloatLE value 1196 floatVal = buf.readFloatLE(0); 1197 map.set("testReadFloatLE, expect: 123.456, output: " + floatVal, floatVal.toFixed(3) === "123.456"); 1198 1199 // 37. Write DoubleBE 1200 buf = new FastBuffer(8); 1201 buf.writeDoubleBE(123.456, 0); 1202 hex = buf.toString('hex'); 1203 map.set("testWriteDoubleBE, expect: 405edd2f1a9fbe77, output: " + hex, hex === "405edd2f1a9fbe77"); 1204 1205 // 38. Read DoubleBE value 1206 let doubleVal = buf.readDoubleBE(0); 1207 map.set("testReadDoubleBE, expect: 123.456, output: " + doubleVal, doubleVal.toFixed(3) === "123.456"); 1208 1209 // 39. Write DoubleLE 1210 buf.writeDoubleLE(123.456, 0); 1211 hex = buf.toString('hex'); 1212 map.set("testWriteDoubleLE, expect: 77be9f1a2fdd5e40, output: " + hex, hex === "77be9f1a2fdd5e40"); 1213 1214 // 40. Read DoubleLE value 1215 doubleVal = buf.readDoubleLE(0); 1216 map.set("testReadDoubleLE, expect: 123.456, output: " + doubleVal, doubleVal.toFixed(3) === "123.456"); 1217} 1218{ 1219 // 41. Fill entire buffer 1220 let buf = new FastBuffer(5); 1221 buf.fill("A"); 1222 map.set("testFillChar, expect: AAAAA, output: " + buf.toString(), buf.toString() === "AAAAA"); 1223 1224 // 42. Fill partial buffer 1225 buf.fill("B", 1, 3); 1226 map.set("testFillPartial, expect: ABBAA, output: " + buf.toString(), buf.toString() === "ABBAA"); 1227 1228 // 43. Compare buffers (less than) 1229 let buf1 = new FastBuffer("ABC"); 1230 let buf2 = new FastBuffer("ABD"); 1231 let cmp = buf1.compare(buf2); 1232 map.set("testCompareLess, expect: -1, output: " + cmp, cmp === -1); 1233 1234 // 44. Compare buffers (equal) 1235 buf2 = new FastBuffer("ABC"); 1236 cmp = buf1.compare(buf2); 1237 map.set("testCompareEqual, expect: 0, output: " + cmp, cmp === 0); 1238 1239 // 45. Compare buffers (greater than) 1240 buf1 = new FastBuffer("ABD"); 1241 cmp = buf1.compare(buf2); 1242 map.set("testCompareGreater, expect: 1, output: " + cmp, cmp === 1); 1243 1244 // 46. Copy between buffers 1245 buf1 = new FastBuffer("12345"); 1246 buf2 = new FastBuffer("ABCDE"); 1247 buf1.copy(buf2, 1, 1, 3); 1248 map.set("testCopy, expect: A23DE, output: " + buf2.toString(), buf2.toString() === "A23DE"); 1249 1250 // 48. Convert to string 1251 buf = new FastBuffer([0x48, 0x65, 0x6c, 0x6c, 0x6f]); 1252 map.set("testToString, expect: Hello, output: " + buf.toString(), buf.toString() === "Hello"); 1253 1254 // 49. Convert to Base64 1255 buf = new FastBuffer("A"); 1256 map.set("testToStringBase64, expect: QQ==, output: " + buf.toString('base64'), buf.toString('base64') === "QQ=="); 1257 1258 // 50. Convert to Hex 1259 buf = new FastBuffer("A"); 1260 map.set("testToStringHex, expect: 41, output: " + buf.toString('hex'), buf.toString('hex') === "41"); 1261 1262 // 51. IndexOf operation 1263 buf = new FastBuffer("Hello World"); 1264 let idx = buf.indexOf("World"); 1265 map.set("testIndexOf, expect: 6, output: " + idx, idx === 6); 1266 1267 // 52. LastIndexOf operation 1268 buf = new FastBuffer("Hello World, World"); 1269 idx = buf.lastIndexOf("World"); 1270 map.set("testLastIndexOf, expect: 13, output: " + idx, idx === 13); 1271 1272 // 53. Includes check 1273 buf = new FastBuffer("Hello"); 1274 let has = buf.includes("ell"); 1275 map.set("testIncludes, expect: true, output: " + has, has === true); 1276 1277 // 54. Equality check 1278 buf1 = new FastBuffer("ABC"); 1279 buf2 = new FastBuffer("ABC"); 1280 let isEqual = buf1.equals(buf2); 1281 map.set("testEquals, expect: true, output: " + isEqual, isEqual === true); 1282 1283 // 58. Iterate keys 1284 buf = new FastBuffer("AB"); 1285 let keys = Array.from(buf.keys()); 1286 map.set("testKeys, expect: 0,1, output: " + keys.join(','), keys.join(',') === "0,1"); 1287 1288 // 59. Iterate values 1289 let values = Array.from(buf.values()); 1290 map.set("testValues, expect: 65,66, output: " + values.join(','), values.join(',') === "65,66"); 1291} 1292{ 1293 // 61. Read out-of-bound (UInt8) 1294 let buf = new FastBuffer(1); 1295 try { 1296 buf.readUInt8(1); // Out-of-bound access 1297 } catch (err) { 1298 map.set("testReadUInt8_OutOfRange, expect: BusinessError, output: " + err.name, err.name === 'BusinessError'); 1299 } 1300 1301 // 62. Write out-of-bound (UInt8) 1302 try { 1303 buf.writeUInt8(0, 2); // Out-of-bound access 1304 } catch (err) { 1305 map.set("testWriteUInt8_OutOfRange, expect: BusinessError, output: " + err.name, err.name === 'BusinessError'); 1306 } 1307 1308 // 63. Read insufficient data (UInt16BE) 1309 try { 1310 buf.readUInt16BE(0); // Buffer too small (needs 2 bytes) 1311 } catch (err) { 1312 map.set("testReadUInt16BE_Insufficient, expect: BusinessError, output: " + err.name, err.name === 'BusinessError'); 1313 } 1314 1315 // 64. Write out-of-bound (UInt16BE) 1316 try { 1317 buf.writeUInt16BE(0xABCD, 1); // Out-of-bound access 1318 } catch (err) { 1319 map.set("testWriteUInt16BE_OutOfRange, expect: BusinessError, output: " + err.name, err.name === 'BusinessError'); 1320 } 1321} 1322 1323{ 1324 // 1. Create empty FastBuffer and verify length is 0 1325 let buf = new FastBuffer(0); 1326 map.set("testConstructorEmpty, expect: 0, output: " + buf.length, buf.length === 0); 1327} 1328 1329{ 1330 // 2. Initialize with size 7 and validate length 1331 let buf = new FastBuffer(7); 1332 map.set("testConstructorSize, expect: 7, output: " + buf.length, buf.length === 7); 1333} 1334 1335{ 1336 // 3. Initialize with UTF-8 string "Γειά σου" 1337 let buf = new FastBuffer("Γειά σου"); 1338 map.set("testConstructorString, expect: Γειά σου, output: " + buf.toString(), buf.toString() === "Γειά σου"); 1339} 1340 1341{ 1342 // 4. Initialize from array [0xC0, 0xFF, 0xEE] 1343 let buf = new FastBuffer([0xC0, 0xFF, 0xEE]); 1344 let hex = buf.toString('hex'); 1345 map.set("testConstructorArray, expect: c0ffee, output: " + hex, hex === "c0ffee"); 1346} 1347 1348{ 1349 // 5. Initialize from ArrayBuffer 1350 let arrBuf = new ArrayBuffer(4); 1351 new Uint8Array(arrBuf).set([0xDE, 0xAD, 0xBE, 0xEF]); 1352 let buf = new FastBuffer(arrBuf); 1353 map.set("testConstructorArrayBuffer, expect: deadbeef, output: " + buf.toString('hex'), buf.toString('hex') === "deadbeef"); 1354} 1355 1356// ===== READ/WRITE OPERATIONS ===== 1357{ 1358 // 9. Write UInt8 value 0xF0 at offset 0 1359 let buf = new FastBuffer(1); 1360 buf.writeUInt8(0xF0, 0); 1361 map.set("testWriteUInt8, expect: f0, output: " + buf.toString('hex'), buf.toString('hex') === "f0"); 1362} 1363 1364{ 1365 // 11. Write Int16LE value -32767 at offset 0 1366 let buf = new FastBuffer(2); 1367 buf.writeInt16LE(-32767, 0); 1368 map.set("testWriteInt16LE, expect: 0180, output: " + buf.toString('hex'), buf.toString('hex') === "0180"); 1369} 1370 1371{ 1372 // 12. Read Int32BE value 0x7FFFFFFF 1373 let buf = new FastBuffer(4); 1374 buf.writeInt32BE(0x7FFFFFFF, 0); 1375 let val = buf.readInt32BE(0); 1376 map.set("testReadInt32BE, expect: 2147483647, output: " + val, val === 2147483647); 1377} 1378 1379{ 1380 // 13. Write FloatLE value -123.456 1381 let buf = new FastBuffer(4); 1382 buf.writeFloatLE(-123.456, 0); 1383 let hex = buf.toString('hex'); 1384 map.set("testWriteFloatLE, expect: 79e9f6c2, output: " + hex, hex === "79e9f6c2"); // IEEE754 representation 1385} 1386 1387{ 1388 // 14. Read DoubleBE value 1.7976931348623157e+308 (max double) 1389 let buf = new FastBuffer(8); 1390 buf.writeDoubleBE(1.7976931348623157e308, 0); 1391 let val = buf.readDoubleBE(0); 1392 map.set("testReadDoubleBE, expect: 1.7976931348623157e+308, output: " + val, val === 1.7976931348623157e308); 1393} 1394 1395{ 1396 // 16. Compare buffers "apple" and "zebra" 1397 let buf1 = new FastBuffer("apple"); 1398 let buf2 = new FastBuffer("zebra"); 1399 let cmp = buf1.compare(buf2); 1400 map.set("testCompareStrings, expect: -1, output: " + cmp, cmp === -1); 1401} 1402 1403// ===== ENCODING CONVERSION ===== 1404{ 1405 // 19. Convert to Base64url encoding 1406 let buf = new FastBuffer("✓ test"); 1407 let b64url = buf.toString('base64url'); 1408 map.set("testToBase64URL, expect: 4pyTIHRlc3Q, output: " + b64url, b64url === "4pyTIHRlc3Q"); 1409} 1410 1411{ 1412 // 20. Convert hex string "cafebabe" to buffer 1413 let buf = new FastBuffer("cafebabe", 'hex'); 1414 map.set("testFromHex, expect: cafebabe, output: " + buf.toString('hex'), buf.toString('hex') === "cafebabe"); 1415} 1416 1417// ===== ITERATORS & SEARCH ===== 1418{ 1419 // 21. Iterate keys of buffer "XYZ" 1420 let buf = new FastBuffer("XYZ"); 1421 let keys = Array.from(buf.keys()); 1422 map.set("testKeysIter, expect: 0,1,2, output: " + keys.join(','), keys.join(',') === "0,1,2"); 1423} 1424 1425{ 1426 // 22. Find last index of "λ" in buffer 1427 let buf = new FastBuffer("αβγδλθλ"); 1428 let idx = buf.lastIndexOf("λ"); 1429 map.set("testLastIndexOf, expect: 12, output: " + idx, idx === 12); 1430} 1431 1432{ 1433 // 23. Write beyond buffer length (should throw) 1434 let buf = new FastBuffer(3); 1435 try { 1436 buf.writeUInt32BE(0x12345678, 0); // Requires 4 bytes 1437 } catch (err) { 1438 map.set("testWriteOOB, expect: BusinessError, output: " + err.name, err.name === 'BusinessError'); 1439 } 1440} 1441 1442{ 1443 // 49. Write negative integer to Int32LE 1444 let buf = new FastBuffer(4); 1445 buf.writeInt32LE(-2147483648, 0); // Min int32 1446 let val = buf.readInt32LE(0); 1447 map.set("testWriteMinInt32, expect: -2147483648, output: " + val, val === -2147483648); 1448} 1449 1450{ 1451 // 50. Check includes() with partial match 1452 let buf = new FastBuffer("search_term"); 1453 let found = buf.includes("term"); 1454 map.set("testIncludesPartial, expect: true, output: " + found, found === true); 1455} 1456 1457// Test Case 1: Fill entire buffer with pattern "AB" 1458{ 1459 let buf = new FastBuffer(2).fill("AB"); 1460 let str = buf.toString(); 1461 map.set("testFill0500, expect: AB, output: " + str, str === "AB"); 1462} 1463 1464// Test Case 2: Attempt fill with negative offset (should throw) 1465{ 1466 try { 1467 let buf = new FastBuffer(4).fill("XY", -2); 1468 } catch (err) { 1469 map.set("testFill0501, expect: BusinessError, output: " + err.name, err.name === 'BusinessError'); 1470 let expectMsg = 'The value of "offset" is out of range. It must be >= 0 and <= 4. Received value is: -2'; 1471 map.set("testFill0501, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg); 1472 } 1473} 1474 1475// Test Case 3: Attempt fill with end position exceeding buffer length 1476{ 1477 try { 1478 let buf = new FastBuffer(3).fill("123", 0, 6); 1479 } catch (err) { 1480 map.set("testFill0502, expect: BusinessError, output: " + err.name, err.name === 'BusinessError'); 1481 let expectMsg = 'The value of "end" is out of range. It must be >= 0 and <= 3. Received value is: 6'; 1482 map.set("testFill0502, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg); 1483 } 1484} 1485 1486// Test Case 4: Attempt write with negative offset 1487{ 1488 let buf = new FastBuffer(5); 1489 try { 1490 let offset = buf.write("test", -3); 1491 } catch (err) { 1492 map.set("testWrite0503, expect: BusinessError, output: " + err.name, err.name === 'BusinessError'); 1493 let expectMsg = 'The value of "offset" is out of range. It must be >= 0 and <= 4. Received value is: -3'; 1494 map.set("testWrite0503, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg); 1495 } 1496} 1497 1498// Test Case 5: Attempt write with excessive length parameter 1499{ 1500 let buf = new FastBuffer(6); 1501 try { 1502 let offset = buf.write("data", 1, 8); 1503 } catch (err) { 1504 map.set("testWrite0504, expect: BusinessError, output: " + err.name, err.name === 'BusinessError'); 1505 let expectMsg = 'The value of "length" is out of range. It must be >= 0 and <= 5. Received value is: 8'; 1506 map.set("testWrite0504, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg); 1507 } 1508} 1509 1510// Test Case 6: Compare buffers with different content 1511{ 1512 let buf1 = new FastBuffer("apple"); 1513 let buf2 = new FastBuffer("zebra"); 1514 let res = buf1.compare(buf2); 1515 map.set("testCompare0505, expect: -1, output: " + res, res === -1); 1516} 1517 1518// Test Case 7: Attempt compare with invalid targetStart 1519{ 1520 let buf1 = new FastBuffer("test"); 1521 let buf2 = new FastBuffer("test"); 1522 try { 1523 let res = buf1.compare(buf2, -5); 1524 } catch (err) { 1525 map.set("testCompare0506, expect: BusinessError, output: " + err.name, err.name === 'BusinessError'); 1526 let expectMsg = 'The value of "targetStart" is out of range. It must be >= 0 and <= 4. Received value is: -5'; 1527 map.set("testCompare0506, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg); 1528 } 1529} 1530 1531// Test Case 8: Verify equals() with identical Greek text 1532{ 1533 let buf1 = new FastBuffer("Γειά σου"); 1534 let buf2 = new FastBuffer("Γειά σου"); 1535 let res = buf1.equals(buf2); 1536 map.set("testEquals0507, expect: true, output: " + res, res === true); 1537} 1538 1539// Test Case 9: Verify equals() with different symbols 1540{ 1541 let buf1 = new FastBuffer("@#$"); 1542 let buf2 = new FastBuffer("!@#"); 1543 let res = buf1.equals(buf2); 1544 map.set("testEquals0508, expect: false, output: " + res, res === false); 1545} 1546 1547// Test Case 10: Copy entire buffer content 1548{ 1549 let buf1 = new FastBuffer("source"); 1550 let buf2 = new FastBuffer(6); 1551 let num = buf1.copy(buf2); 1552 map.set("testCopy0509, expect: 6, output: " + num, num === 6); 1553 let str = buf2.toString(); 1554 map.set("testCopy0509, expect: source, output: " + str, str === "source"); 1555} 1556 1557// Test Case 11: Copy partial content with offsets 1558{ 1559 let buf1 = new FastBuffer("abcdef"); 1560 let buf2 = new FastBuffer("123456"); 1561 let num = buf1.copy(buf2, 1, 2, 4); 1562 map.set("testCopy0510, expect: 2, output: " + num, num === 2); 1563 let str = buf2.toString(); 1564 map.set("testCopy0510, expect: 1cd456, output: " + str, str === "1cd456"); 1565} 1566 1567// Test Case 12: Attempt copy with invalid targetStart 1568{ 1569 let buf1 = new FastBuffer("data"); 1570 let buf2 = new FastBuffer("1234"); 1571 try { 1572 let num = buf1.copy(buf2, -10); 1573 } catch (err) { 1574 map.set("testCopy0511, expect: BusinessError, output: " + err.name, err.name === 'BusinessError'); 1575 let expectMsg = 'The value of "targetStart" is out of range. It must be >= 0 and <= 4294967295. Received value is: -10'; 1576 map.set("testCopy0511, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg); 1577 } 1578} 1579 1580// Test Case 13: Convert buffer to UTF-8 string 1581{ 1582 let buf = new FastBuffer("Hello 世界"); 1583 let str = buf.toString(); 1584 map.set("testToString0512, expect: Hello 世界, output: " + str, str === "Hello 世界"); 1585} 1586 1587// Test Case 14: Convert buffer to Base64 encoding 1588{ 1589 let buf = new FastBuffer("base64"); 1590 let str = buf.toString("base64"); 1591 map.set("testToString0513, expect: YmFzZTY0, output: " + str, str === "YmFzZTY0"); 1592} 1593 1594// Test Case 15: Convert buffer to Hex encoding 1595{ 1596 let buf = new FastBuffer("hex"); 1597 let str = buf.toString("hex"); 1598 map.set("testToString0514, expect: 686578, output: " + str, str === "686578"); 1599} 1600 1601// Test Case 17: Find last index of character 1602{ 1603 let buf = new FastBuffer("a,b,c,d,e"); 1604 let index = buf.lastIndexOf(","); 1605 map.set("testLastIndexOf0516, expect: 7, output: " + index, index === 7); 1606} 1607 1608// Test Case 18: Check if buffer includes substring 1609{ 1610 let buf = new FastBuffer("search result"); 1611 let flag = buf.includes("result"); 1612 map.set("testIncludes0517, expect: true, output: " + flag, flag === true); 1613} 1614 1615// Test Case 19: Iterate buffer keys 1616{ 1617 let buf = new FastBuffer("ABC"); 1618 let keys = Array.from(buf.keys()); 1619 map.set("testKeys0518, expect: 0,1,2, output: " + keys.join(','), keys.join(',') === "0,1,2"); 1620} 1621 1622// Test Case 20: Iterate buffer values 1623{ 1624 let buf = new FastBuffer("ABC"); 1625 let values = Array.from(buf.values()); 1626 map.set("testValues0519, expect: 65,66,67, output: " + values.join(','), values.join(',') === "65,66,67"); 1627} 1628 1629// Test Case 21: Initialize from array buffer 1630{ 1631 let arr = new Uint8Array([0x48, 0x65, 0x6c, 0x6c, 0x6f]); 1632 let buf = new FastBuffer(arr.buffer); 1633 map.set("testFrom0520, expect: Hello, output: " + buf.toString(), buf.toString() === "Hello"); 1634} 1635 1636// Test Case 24: Write FloatLE value 1637{ 1638 let buf = new FastBuffer(4); 1639 buf.writeFloatLE(-65.432, 0); 1640 let hex = buf.toString('hex'); 1641 map.set("testWriteFloatLE0523, expect: 2fdd82c2, output: " + hex, hex === "2fdd82c2"); 1642} 1643 1644// Test Case 25: Read FloatBE value 1645{ 1646 let buf = new FastBuffer([0x42, 0x8A, 0x3D, 0x71]); 1647 let val = buf.readFloatBE(0); 1648 map.set("testReadFloatBE0524, expect: 69.12, output: " + val, val.toFixed(2) === "69.12"); 1649} 1650 1651// Test Case 26: Create empty buffer 1652{ 1653 let buf = new FastBuffer(0); 1654 map.set("testConstructor0525, expect: 0, output: " + buf.length, buf.length === 0); 1655} 1656 1657// Test Case 27: Initialize with specific size 1658{ 1659 let buf = new FastBuffer(10); 1660 map.set("testConstructor0526, expect: 10, output: " + buf.length, buf.length === 10); 1661} 1662 1663// Test Case 28: Initialize with emoji string 1664{ 1665 let buf = new FastBuffer(""); 1666 map.set("testConstructor0527, expect: , output: " + buf.toString(), buf.toString() === ""); 1667} 1668 1669// Test Case 29: Initialize from numeric array 1670{ 1671 let buf = new FastBuffer([0x31, 0x32, 0x33]); 1672 map.set("testConstructor0528, expect: 123, output: " + buf.toString(), buf.toString() === "123"); 1673} 1674 1675// Test Case 30: Copy between buffers with overlap 1676{ 1677 let buf = new FastBuffer("ABCDEF"); 1678 buf.copy(buf, 2, 0, 3); 1679 map.set("testCopy0529, expect: ABABCF, output: " + buf.toString(), buf.toString() === "ABABCF"); 1680} 1681 1682// Test Case 31: Convert to Latin1 encoding 1683{ 1684 let buf = new FastBuffer([0xC0, 0xFF, 0xEE]); 1685 let str = buf.toString("latin1"); 1686 map.set("testToString0530, expect: Àÿî, output: " + str, str === "Àÿî"); 1687} 1688 1689// Test Case 32: Find index with start position 1690{ 1691 let buf = new FastBuffer("banana"); 1692 let index = buf.indexOf("na", 3); 1693 map.set("testIndexOf0531, expect: 4, output: " + index, index === 4); 1694} 1695 1696// Test Case 33: Check includes with offset 1697{ 1698 let buf = new FastBuffer("programming"); 1699 let flag = buf.includes("gram", 3); 1700 map.set("testIncludes0532, expect: true, output: " + flag, flag === true); 1701} 1702 1703// Test Case 34: Write UInt16LE value 1704{ 1705 let buf = new FastBuffer(2); 1706 buf.writeUInt16LE(0xABCD, 0); 1707 map.set("testWriteUInt16LE0533, expect: cdab, output: " + buf.toString('hex'), buf.toString('hex') === "cdab"); 1708} 1709 1710// Test Case 35: Read Int16BE value 1711{ 1712 let buf = new FastBuffer([0x12, 0x34]); 1713 let val = buf.readInt16BE(0); 1714 map.set("testReadInt16BE0534, expect: 4660, output: " + val, val === 4660); 1715} 1716 1717// Test Case 39: Create from hex string 1718{ 1719 let buf = new FastBuffer("cafebabe", "hex"); 1720 map.set("testFromHex0538, expect: cafebabe, output: " + buf.toString('hex'), buf.toString('hex') === "cafebabe"); 1721} 1722 1723// Test Case 43: Fill buffer with numeric value 1724{ 1725 let buf = new FastBuffer(3); 1726 buf.fill(65); // ASCII 'A' 1727 map.set("testFill0542, expect: AAA, output: " + buf.toString(), buf.toString() === "AAA"); 1728} 1729 1730// Test Case 46: Find index of non-existent substring 1731{ 1732 let buf = new FastBuffer("content"); 1733 let index = buf.indexOf("xyz"); 1734 map.set("testIndexOf0545, expect: -1, output: " + index, index === -1); 1735} 1736 1737// Test Case 47: Check includes with special characters 1738{ 1739 let buf = new FastBuffer("100% ✓"); 1740 let flag = buf.includes("% ✓"); 1741 map.set("testIncludes0546, expect: true, output: " + flag, flag === true); 1742} 1743 1744// Test Case 48: Iterate buffer entries 1745{ 1746 let buf = new FastBuffer("AB"); 1747 let entries = Array.from(buf.entries()); 1748 let entriesStr = entries.map(e => e.join(':')).join(';'); 1749 map.set("testEntries0547, expect: 0:65;1:66, output: " + entriesStr, entriesStr === "0:65;1:66"); 1750} 1751 1752// Test Case 49: Write DoubleLE value 1753{ 1754 let buf = new FastBuffer(8); 1755 buf.writeDoubleLE(123.456, 0); 1756 let hex = buf.toString('hex'); 1757 map.set("testWriteDoubleLE0548, expect: 77be9f1a2fdd5e40, output: " + hex, hex === "77be9f1a2fdd5e40"); 1758} 1759 1760// Test Case 50: Read UInt32LE value 1761{ 1762 let buf = new FastBuffer([0x78, 0x56, 0x34, 0x12]); 1763 let val = buf.readUInt32LE(0); 1764 map.set("testReadUInt32LE0549, expect: 305419896, output: " + val, val === 305419896); 1765} 1766 1767// ===== fill() ===== 1768{ 1769 // 1. Fill with Unicode characters 1770 let buf = new FastBuffer(12).fill("★"); 1771 let str = buf.toString(); 1772 map.set("testFill1001, expect: ★★★★, output: " + str, str === "★★★★"); 1773} 1774 1775{ 1776 // 2. Fill partial buffer with multi-byte character 1777 let buf = new FastBuffer(5).fill("€", 1, 4); 1778 let str = buf.toString(); 1779 map.set("testFill1002, expect: \0€\0, output: " + str, str === "\0€\0"); 1780} 1781 1782{ 1783 // 3. Fill empty buffer (no-op) 1784 let buf = new FastBuffer(0).fill("X"); 1785 map.set("testFill1003, expect: 0, output: " + buf.length, buf.length === 0); 1786} 1787 1788// ===== write() ===== 1789{ 1790 // 1. Write with offset exceeding buffer length 1791 let buf = new FastBuffer(5); 1792 try { 1793 buf.write("data", 6); 1794 } catch (err) { 1795 let expectMsg = 'The value of "offset" is out of range. It must be >= 0 and <= 4. Received value is: 6'; 1796 map.set("testWrite1004, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg); 1797 } 1798} 1799 1800{ 1801 // 2. Write partial UTF-8 string 1802 let buf = new FastBuffer(10); 1803 buf.write("汉字测试", 2, 3); 1804 map.set("testWrite1005, expect: 汉, output: " + buf.toString(), buf.toString().includes("汉")); 1805} 1806 1807{ 1808 // 3. Write exact buffer capacity 1809 let buf = new FastBuffer(5); 1810 let written = buf.write("12345"); 1811 map.set("testWrite1006, expect: 5, output: " + written, written === 5); 1812} 1813 1814// ===== compare() ===== 1815{ 1816 // 1. Compare buffers with Unicode equality 1817 let buf1 = new FastBuffer("αβγ"); 1818 let buf2 = new FastBuffer("αβγ"); 1819 let res = buf1.compare(buf2); 1820 map.set("testCompare1007, expect: 0, output: " + res, res === 0); 1821} 1822 1823{ 1824 // 2. Compare buffers with different lengths 1825 let buf1 = new FastBuffer("apple"); 1826 let buf2 = new FastBuffer("app"); 1827 let res = buf1.compare(buf2); 1828 map.set("testCompare1008, expect: 1, output: " + res, res === 1); 1829} 1830 1831{ 1832 // 3. Compare buffers with target offset 1833 let buf1 = new FastBuffer("xyz"); 1834 let buf2 = new FastBuffer("abcxyz"); 1835 let res = buf1.compare(buf2, 3); 1836 map.set("testCompare1009, expect: 0, output: " + res, res === 0); 1837} 1838 1839// ===== equals() ===== 1840{ 1841 // 2. Compare different encoding representations 1842 let buf1 = new FastBuffer("café", "utf8"); 1843 let buf2 = new FastBuffer("café", "latin1"); 1844 let res = buf1.equals(buf2); 1845 map.set("testEquals1011, expect: false, output: " + res, res === false); 1846} 1847 1848{ 1849 // 3. Compare buffers with same content but different memory 1850 let buf1 = new FastBuffer("clone"); 1851 let buf2 = new FastBuffer(buf1); 1852 let res = buf1.equals(buf2); 1853 map.set("testEquals1012, expect: true, output: " + res, res === true); 1854} 1855 1856// ===== copy() ===== 1857{ 1858 // 1. Copy to offset position 1859 let buf1 = new FastBuffer("XYZ"); 1860 let buf2 = new FastBuffer("ABCDEF"); 1861 buf1.copy(buf2, 2); 1862 map.set("testCopy1013, expect: ABXYZF, output: " + buf2.toString(), buf2.toString() === "ABXYZF"); 1863} 1864 1865{ 1866 // 2. Copy with source range 1867 let buf1 = new FastBuffer("123456"); 1868 let buf2 = new FastBuffer("ABCDEF"); 1869 buf1.copy(buf2, 1, 2, 5); 1870 map.set("testCopy1014, expect: A345EF, output: " + buf2.toString(), buf2.toString() === "A345EF"); 1871} 1872 1873{ 1874 // 3. Copy empty buffer 1875 let buf1 = new FastBuffer(""); 1876 let buf2 = new FastBuffer("test"); 1877 let num = buf1.copy(buf2); 1878 map.set("testCopy1015, expect: 0, output: " + num, num === 0); 1879} 1880 1881// ===== toString() ===== 1882{ 1883 let buf = new FastBuffer("中文"); 1884 let str = buf.toString(); 1885 map.set("testToString1016, expect: 中文, output: " + str, str === "中文"); 1886} 1887 1888{ 1889 // 2. Convert binary data to hex 1890 let buf = new FastBuffer([0x48, 0x65, 0x6c, 0x6c, 0x6f]); 1891 let str = buf.toString("hex"); 1892 map.set("testToString1017, expect: 48656c6c6f, output: " + str, str === "48656c6c6f"); 1893} 1894 1895{ 1896 // 3. Convert to Base64URL 1897 let buf = new FastBuffer("safe<>"); 1898 let str = buf.toString("base64url"); 1899 map.set("testToString1018, expect: c2FmZTw-, output: " + str, str === "c2FmZTw-"); 1900} 1901 1902// ===== indexOf() ===== 1903{ 1904 let buf = new FastBuffer("寻找汉字"); 1905 let idx = buf.indexOf("汉字"); 1906 map.set("testIndexOf1019, expect: 6, output: " + idx, idx === 6); 1907} 1908 1909{ 1910 // 2. Search non-existent binary pattern 1911 let buf = new FastBuffer([0x01, 0x02, 0x03]); 1912 let idx = buf.indexOf("\x04"); 1913 map.set("testIndexOf1020, expect: -1, output: " + idx, idx === -1); 1914} 1915 1916{ 1917 // 3. Search with start position beyond buffer 1918 let buf = new FastBuffer("test"); 1919 let idx = buf.indexOf("t", 5); 1920 map.set("testIndexOf1021, expect: -1, output: " + idx, idx === -1); 1921} 1922 1923// ===== lastIndexOf() ===== 1924{ 1925 // 1. Find last occurrence in mixed content 1926 let buf = new FastBuffer("a1b2c3d4e5"); 1927 let idx = buf.lastIndexOf("3"); 1928 map.set("testLastIndexOf1022, expect: 5, output: " + idx, idx === 5); 1929} 1930 1931{ 1932 // 2. Multi-byte character search 1933 let buf = new FastBuffer("€10€20€30"); 1934 let idx = buf.lastIndexOf("€"); 1935 map.set("testLastIndexOf1023, expect: 10, output: " + idx, idx === 10); 1936} 1937 1938{ 1939 // 3. Search with negative start position 1940 let buf = new FastBuffer("test"); 1941 let idx = buf.lastIndexOf("t", -5); 1942 map.set("testLastIndexOf1024, expect: -1, output: " + idx, idx === -1); 1943} 1944 1945// ===== includes() ===== 1946{ 1947 // 2. Check empty buffer 1948 let buf = new FastBuffer(""); 1949 let flag = buf.includes("data"); 1950 map.set("testIncludes1026, expect: false, output: " + flag, flag === false); 1951} 1952 1953{ 1954 // 3. Check partial match at boundary 1955 let buf = new FastBuffer("boundary"); 1956 let flag = buf.includes("ary", 5); 1957 map.set("testIncludes1027, expect: true, output: " + flag, flag === true); 1958} 1959 1960// ===== keys() ===== 1961{ 1962 // 1. Iterate empty buffer keys 1963 let buf = new FastBuffer(0); 1964 let keys = Array.from(buf.keys()); 1965 map.set("testKeys1028, expect: , output: " + keys.join(','), keys.join(',') === ""); 1966} 1967 1968{ 1969 // 2. Iterate large buffer keys 1970 let buf = new FastBuffer(1000); 1971 let keyCount = 0; 1972 for (const key of buf.keys()) keyCount++; 1973 map.set("testKeys1029, expect: 1000, output: " + keyCount, keyCount === 1000); 1974} 1975 1976{ 1977 // 3. Verify key order 1978 let buf = new FastBuffer("ABC"); 1979 let keys = Array.from(buf.keys()); 1980 map.set("testKeys1030, expect: 0,1,2, output: " + keys.join(','), keys.join(',') === "0,1,2"); 1981} 1982 1983// ===== values() ===== 1984{ 1985 // 1. Iterate binary data values 1986 let buf = new FastBuffer([0x00, 0xFF, 0x7F]); 1987 let values = Array.from(buf.values()); 1988 map.set("testValues1031, expect: 0,255,127, output: " + values.join(','), values.join(',') === "0,255,127"); 1989} 1990 1991{ 1992 // 2. Verify Unicode code points 1993 let buf = new FastBuffer("Ω"); 1994 let values = Array.from(buf.values()); 1995 map.set("testValues1032, expect: 206,169, output: " + values.join(','), values.join(',') === "206,169"); 1996} 1997 1998{ 1999 // 3. Empty buffer values 2000 let buf = new FastBuffer(0); 2001 let values = Array.from(buf.values()); 2002 map.set("testValues1033, expect: , output: " + values.join(','), values.join(',') === ""); 2003} 2004 2005 2006 { 2007 let size = 10; 2008 let buf = new FastBuffer(size); 2009 map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0001 failed, buffer length:" + buf.length, buf.length === 10); 2010 } 2011 2012 { 2013 try { 2014 let size = UINT32_MAX + 1; 2015 let buf = new FastBuffer(size); 2016 map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0002 failed", false); 2017 } catch (e) { 2018 map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0002 failed, error code:" + e.code, e.code === 10200001); 2019 } 2020 } 2021 2022 { 2023 try { 2024 let buf = new FastBuffer(null); 2025 map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0003 failed", false); 2026 } catch (e) { 2027 map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0003 failed, error code:" + e.code, e.code === 401); 2028 } 2029 } 2030 2031 { 2032 try { 2033 let buf = new FastBuffer(10); 2034 buf.fill(' '); 2035 map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0004 failed, buffer length:" + buf.length, buf.length === 10); 2036 } catch (e) { 2037 map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0004 failed, error code:" + e.code, false); 2038 } 2039 } 2040 2041 { 2042 try { 2043 let buf = new FastBuffer(10); 2044 buf.fill(null); 2045 map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0005 failed, buffer length:" + buf.length, buf.length === 10); 2046 } catch (e) { 2047 map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0005 failed, error code:" + e.code, false); 2048 } 2049 } 2050 2051 { 2052 try { 2053 let buf1 = new FastBuffer(10); 2054 let buf = new FastBuffer(10); 2055 buf.fill(buf1); 2056 map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0006 failed, buffer length:" + buf.length, buf.length === 10); 2057 } catch (e) { 2058 map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0006 failed, error code:" + e.code, false); 2059 } 2060 } 2061 2062 { 2063 try { 2064 let buf = new FastBuffer(10); 2065 buf.fill("ab$#", 0, 10, null); 2066 map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0007 failed, buffer length:" + buf.length, buf.length === 10); 2067 } catch (e) { 2068 map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0007 failed, error code:" + e.code, false); 2069 } 2070 } 2071 2072 { 2073 try { 2074 let buf = new FastBuffer(0); 2075 map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0008 failed, buffer length:" + buf.length, buf.length === 0); 2076 } catch (e) { 2077 map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0008 failed, error code:" + e.code, false); 2078 } 2079 } 2080 2081 { 2082 try { 2083 let buf1 = new FastBuffer(10); 2084 let buf = new FastBuffer(0); 2085 buf.fill(buf1); 2086 let flag = new FastBuffer(0); 2087 flag.fill(buf); 2088 map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0009 failed, flag length:" + flag.length, flag.length === 0); 2089 } catch (e) { 2090 map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0009 failed, error code:" + e.code, false); 2091 } 2092 } 2093 2094 { 2095 try { 2096 let buf = new FastBuffer(-5); 2097 map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0010 failed", false); 2098 } catch (e) { 2099 map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0010 failed, error code:" + e.code, e.code === 10200001); 2100 } 2101 } 2102 2103 { 2104 try { 2105 let buf = new FastBuffer(5.5); 2106 map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0011 failed, buffer length:", buf.length === 5); 2107 } catch (e) { 2108 map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0011 failed, error code:" + e.code, false); 2109 } 2110 } 2111 2112 let flag = undefined; 2113 function elements(value, key, map) { 2114 if (!value) { 2115 if (!flag) { 2116 flag = []; 2117 } 2118 flag.push(key); 2119 } 2120 } 2121 map.forEach(elements); 2122 if (!flag) { 2123 print("Test Buffer success!!!"); 2124 } else { 2125 print("Test Buffer fail: " + flag); 2126 } 2127} 2128export let bufferRes = "Test Buffer done"; 2129