/*
 * Copyright (c) 2024 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

var FastBuffer = undefined;

let encodeArr = ['utf8', 'utf-8', 'ucs2', 'ucs-2', 'ascii', 'latin1', 'binary',
    'utf16le', 'utf-16le', 'base64', 'base64url', 'hex'];

const UINT32_MAX = 2 ** 32 - 1; // 表示2^32-1,是uint32能表达的最大值

function normalizeEncoding(enc) {
    enc = enc.toLowerCase();
    if (enc === 'ucs2' || enc === 'ucs-2' || enc === 'utf-16le') {
        enc = 'utf16le';
    }
    if (enc === 'utf-8') {
        enc = 'utf8';
    }
    return enc;
}

if (globalThis["ArkPrivate"] != undefined) {
    let map = new Map();
    FastBuffer = ArkPrivate.Load(ArkPrivate.FastBuffer);
    {
        let buf2 = new FastBuffer(10);
        buf2.fill('F1刘FG', 0, 10, 'ascii');
        let str = buf2.toString("hex");
        map.set("buffer.fill() failed, expect: 46311846474631184647, output: " + str, str === "46311846474631184647");
      
        let buf3 = new FastBuffer(10);
        buf3.fill('F1FG', 0, 10, 'base64');
        str = buf3.toString("hex");
        map.set("buffer.fill() failed, expect: 17514617514617514617, output: " + str, str === "17514617514617514617");
      
        let buf4  = new FastBuffer(10);
        buf4.fill('F1刘FG', 0, 10, 'binary');
        str = buf4.toString("hex");
        map.set("buffer.fill() failed, expect: 46311846474631184647, output: " + str, str === "46311846474631184647");
      
        let buf5 = new FastBuffer(10);
        buf5.fill('F1刘FG', 0, 10, 'latin1');
        str = buf5.toString("hex");
        map.set("buffer.fill() failed, expect: 46311846474631184647, output: " + str, str === "46311846474631184647");
      
        let buf6 = new FastBuffer(10);
        buf6.fill('F1刘FG', 0, 10, normalizeEncoding('ucs2'));
        str = buf6.toString("hex");
        map.set("buffer.fill() failed, expect: 46003100185246004700, output: " + str, str === "46003100185246004700");
      
        let buf7 = new FastBuffer(10);
        buf7.fill('F1刘FG', 0, 10, 'utf8');
        str = buf7.toString("hex");
        map.set("buffer.fill() failed, expect: 4631e5889846474631e5, output: " + str, str === "4631e5889846474631e5");
    }
    {
        let uint8array = new Uint8Array(10).fill(0);
        let buf = new FastBuffer([1, 2, 3, 4, 5, 6, 7]);
        let num = buf.copy(uint8array, 0, 3);
        map.set("buffer.copy() failed, expect num: 4, output: " + num, num === 4);
        let str = uint8array.toString();
        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");
    }
    {
        let latin1str = '¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ';
        let strbuf = new FastBuffer(latin1str, "latin1");
        let toStr = strbuf.toString("latin1");
        map.set("buffer create and tostring latin1 failed, expect: " + latin1str + ", output: " + toStr, toStr === latin1str);
    }
    {
        let buf = new FastBuffer(10);
        let buf1 = new FastBuffer(10);
        buf1.fill('!');
        for (let i = 0; i < 10; i++) {
          buf[i] = i + 97;
        }
        let len = buf.copy(buf1, 0, 4, 10);
        let str = buf1.toString();
        map.set("buffer.copy() failed, expect len: 6, output: " + len, len === 6);
        map.set("buffer.copy() failed, expect str: efghij!!!!, output: " + str, str === "efghij!!!!");
    }
    {
        let buf = new FastBuffer(10);
        for (let i = 0; i < 10; i++) {
          buf[i] = i + 97;
        }
        let len = buf.copy(buf, 2);
        map.set("buffer.copy() failed, expect len: 8, output: " + len, len === 8);
        let str = buf.toString();
        map.set("buffer.copy() failed, expect str: ababcdefgh, output: " + str, str === "ababcdefgh");
    }
    {
        let buf1 = new FastBuffer("123656");
        let buf2 = new FastBuffer("1235");
        let num = buf1.copy(buf2);
        let str = buf2.toString();
        map.set("buffer.copy() failed, expect num: 4, output: " + num, num === 4);
        map.set("buffer.copy() failed, expect str: 1236, output: " + str, str === "1236");
    }
    {
        let buf1 = new FastBuffer("测试一");
        let buf2 = new FastBuffer("测试二");
        let res = buf1.compare(buf2);
        map.set("buffer.comapre() failed, expect res: -1, output: " + res, res === -1);
    }
    {
        let buf1 = new FastBuffer("1236测试");
        let buf2 = new FastBuffer("1236测试");
        let res = buf1.equals(buf2);
        map.set("buffer.equals() failed, expect res: true, output: " + res, res === true);
    }
    {
        let buf1 = new FastBuffer("测试特殊字符$#@!");
        let flag = buf1.includes("#@");
        map.set("buffer.includes() failed, expect flag: true, output: " + flag, flag === true);
        flag = buf1.includes("测试");
        map.set("buffer.includes() failed, expect flag: true, output: " + flag, flag === true);
    }
    {
        let buf1 = new FastBuffer("测试特殊字符$#@!");
        let index = buf1.indexOf("@");
        map.set("buffer.indexOf() failed, expect index: 20, output: " + index, index === 20);
    }
    {
        let buf = new FastBuffer('this buffer is a buffer');
        let index = buf.lastIndexOf('buffer', -4);
        map.set("buffer.indexOf() failed, expect index: 17, output: " + index, index === 17);
        index = buf.lastIndexOf('buffer', -5);
        map.set("buffer.indexOf() failed, expect index: 17, output: " + index, index === 17);
        index = buf.lastIndexOf('buffer', -7);
        map.set("buffer.indexOf() failed, expect index: 5, output: " + index, index === 5);
        index = buf.lastIndexOf('buffer', 1);
        map.set("buffer.indexOf() failed, expect index: -1, output: " + index, index === -1);
        index = buf.lastIndexOf('buffer', 9999);
        map.set("buffer.indexOf() failed, expect index: 17, output: " + index, index === 17);
        index = buf.lastIndexOf('buffer', -999);
        map.set("buffer.indexOf() failed, expect index: -1, output: " + index, index === -1);
        index = buf.lastIndexOf('buffer');
        map.set("buffer.indexOf() failed, expect index: 17, output: " + index, index === 17);
    }
    {
        let uarr = new Uint8Array(4);
        uarr[0] = 0x31;
        uarr[1] = 0x32;
        uarr[2] = 0x33;
        uarr[3] = 0x34;
        let buf1 = new FastBuffer(uarr);
        let keys = buf1.keys();
        let index = 0;
        for (const key of keys) {
          map.set("buffer.keys() failed, expect index: " + key +", output: " + index, index === key);
          index++;
        }
    }
    {
        let uarr = new Uint8Array(4);
        uarr[0] = 0x31;
        uarr[1] = 0x32;
        uarr[2] = 0x33;
        uarr[3] = 0x34;
        let buf1 = new FastBuffer(uarr);
        let values = buf1.values();
        let va = 0x31;
        for (const value of values) {
          map.set("buffer.values() failed, expect value: " + va +", output: " + value, value === va);
          va++;
        }
    }
    {
        let buf1 = new FastBuffer("1234");
        let entries = buf1.entries();
        let va = 49, index = 0;
        for (const [key, value] of entries) {
          map.set("buffer.entries() failed, expect key: " + index +", output: " + key, key === index);
          map.set("buffer.entries() failed, expect value: " + va +", output: " + value, value === va);
          va++;
          index++;
        }
    }
    {
        let buf = new FastBuffer('this buffer is a buffer');
        let res = buf.lastIndexOf('buffer', -4);
        map.set("buffer.lastIndexOf() failed, expect: 17, output: " + res, res === 17);
    }
    {
        let buf = new FastBuffer(8);
        buf.writeUInt8(123);
        let res = buf.readUInt8(0);
        map.set("buffer.writeUInt8() failed, expect: 123, output: " + res, res === 123);
      
        buf.writeUInt16BE(100, 0);
        res = buf.readUInt16BE(0);
        map.set("buffer.readUInt16BE() failed, expect: 100, output: " + res, res === 100);
      
        buf.writeUInt16LE(100, 0);
        res = buf.readUInt16LE(0);
        map.set("buffer.readUInt16LE() failed, expect: 100, output: " + res, res === 100);
      
        buf.writeUInt32BE(100, 0);
        res = buf.readUInt32BE(0);
        map.set("buffer.writeUInt32BE() failed, expect: 100, output: " + res, res === 100);
      
        buf.writeUInt32LE(100, 0);
        res = buf.readUInt32LE(0);
        map.set("buffer.writeUInt32LE() failed, expect: 100, output: " + res, res === 100);
      
        buf.writeUIntBE(100, 2, 6);
        res = buf.readUIntBE(2, 6);
        map.set("buffer.writeUIntBE() failed, expect: 100, output: " + res, res === 100);
      
        buf.writeUIntLE(100, 2, 6);
        res = buf.readUIntLE(2, 6);
        map.set("buffer.writeUIntLE() failed, expect: 100, output: " + res, res === 100);
      
        buf.writeInt8(123);
        res = buf.readInt8(0);
        map.set("buffer.writeInt8() failed, expect: 123, output: " + res, res === 123);
      
        buf.writeInt16BE(100, 0);
        res = buf.readInt16BE(0);
        map.set("buffer.readInt16BE() failed, expect: 100, output: " + res, res === 100);
      
        buf.writeInt16LE(100, 0);
        res = buf.readInt16LE(0);
        map.set("buffer.readInt16LE() failed, expect: 100, output: " + res, res === 100);
      
        buf.writeInt32BE(100, 0);
        res = buf.readInt32BE(0);
        map.set("buffer.writeInt32BE() failed, expect: 100, output: " + res, res === 100);
      
        buf.writeInt32LE(100, 0);
        res = buf.readInt32LE(0);
        map.set("buffer.writeInt32LE() failed, expect: 100, output: " + res, res === 100);
      
        buf.writeIntBE(100, 2, 6);
        res = buf.readIntBE(2, 6);
        map.set("buffer.writeIntBE() failed, expect: 100, output: " + res, res === 100);
      
        buf.writeIntLE(100, 2, 6);
        res = buf.readIntLE(2, 6);
        map.set("buffer.writeIntLE() failed, expect: 100, output: " + res, res === 100);
      
        const eps = 1e-3;
        const eeps = 1e-6;
        buf.writeFloatBE(114.514, 0);
        map.set("buffer.writeFloatBE() failed", Math.abs(buf.readFloatBE(0) - 114.514) < eps);
      
        buf.writeFloatLE(114.514, 0);
        map.set("buffer.writeFloatLE() failed", Math.abs(buf.readFloatLE(0) - 114.514) < eps);
      
        buf.writeDoubleBE(114.5141919, 0);
        map.set("buffer.writeDoubleBE() failed", Math.abs(buf.readDoubleBE(0) - 114.5141919) < eeps);
      
        buf.writeDoubleLE(114.5141919, 0);
        map.set("buffer.writeDoubleLE() failed", Math.abs(buf.readDoubleLE(0) - 114.5141919) < eeps);
    }

    {
        let buf = new FastBuffer(20);
        map.set("buffer.length:", buf.length == 20);
    }
    {
        let buf = new FastBuffer(20);
        buf.fill("abc");
        let flag = true;
        for (let i = 0; i + 3 < buf.length; i += 3) {
            let str = buf.toString("utf8", i, i + 3);
            if (str !== "abc") {
                flag = false;
            }
        }
        map.set("buffer.fill(string):", flag);
    }
    {
        let buf = new FastBuffer(20);
        buf.fill(123);
        let flag = true;
        for (let i = 0; i < buf.length; i ++) {
            if (buf.readInt8(i) !== 123) {
                flag = false;
            }
        }
        map.set("buffer.fill(number):", flag);
    }
    {
        let buf = new FastBuffer(20);
        let buff = new FastBuffer(20);
        buff.fill("abc");
        buf.fill(buff);
        let flag = true;
        for (let i = 0; i + 3 < buf.length; i += 3) {
            let str = buf.toString("utf8", i, i + 3);
            if (str !== "abc") {
                flag = false;
            }
        }
        map.set("buffer.fill(FastBuffer):", flag);
    }
    {
        let buf = new FastBuffer(20);
        let typeArray = new Uint8Array([1,2,3,4,5]);
        buf.fill(typeArray);
        let flag = true;
        for (let i = 0; i < buf.length; i++) {
            if (buf.readInt8(i) !== typeArray[i % 5]) {
                flag = false;
            }
        }
        map.set("buffer.fill(Uint8Array):", flag);
    }
    {
        let buf1 = new FastBuffer("hello world", 'utf8');
        buf1.copy(buf1);
        let buf2 = new FastBuffer(20);
        buf1.copy(buf2);
        map.set("buffer.copy() failed", buf1.compare(buf2, 0, 11) === 0);
    }
    {
        let buf1 = new FastBuffer("hello world", 'utf8');
        let array = new Uint8Array(11);
        buf1.copy(array)
        map.set("buffer.copy() failed", buf1.compare(array, 0, 11) === 0);
        map.set("buffer.equals() failed", buf1.equals(array));
    }
    {
        let buf1 = new FastBuffer("hello world", 'utf8');
        map.set("buffer.includes(string) failed", buf1.includes("hello"));
        let buf2 = new FastBuffer("   hello world", 'utf8');
        map.set("buffer.includes(string) failed", buf2.includes("hello"));
    }
    {
        let buf1 = new FastBuffer(10);
        buf1.writeUInt8(114, 0);
        buf1.writeUInt8(514 & 255, 1);
        map.set("buffer.includes(number) failed", buf1.includes(114));
        map.set("buffer.includes(number) failed", buf1.includes(514 & 255));
    }
    {
        let buf1 = new FastBuffer(10);
        buf1.writeUInt8(114, 0);
        buf1.writeUInt8(514 & 255, 1);
        let buf2 = new FastBuffer(10);
        buf2.writeUInt8(114, 0);
        map.set("buffer.includes(buffer) failed", !buf1.includes(buf2));
        let buf3 = new FastBuffer(1);
        buf3.writeUInt8(114, 0);
        map.set("buffer.includes(buffer) failed", buf1.includes(buf3));
    }
    {
        let temp = new FastBuffer(15);
        temp.write("aGVsbG8gd29ybGQh", 0, 12, "base64");
        let str = temp.toString('utf-8', 0, 12);
        map.set("buffer.write(str, 'base64') failed", str === "hello world!");
        for (const [key, value] of temp.entries()) {
            if (key >= str.length) {
                break;
            }
            if (str[key] != String.fromCharCode(value)) {
                map.set("buffer.entries() failed", false);
                break;
            }
        }
    }
    {
        let temp = new FastBuffer("hello world hello", "utf8");
        let index = temp.indexOf('hello');
        map.set("buffer.indexOf() failed", index === 0);
        index = temp.lastIndexOf('hello');
        map.set("buffer.lastIndexOf() failed", index === 12);
        index = temp.indexOf('www');
        map.set("buffer.indexOf() failed", index === -1);
        index = temp.indexOf('');
        map.set("buffer.indexOf() failed", index === -1);
        let flag = temp.includes("hello");
        map.set("buffer.indexOf() failed", flag);
    }
    {
        let array = [1,2,3,4,5];
        let temp = new FastBuffer(array);
        for (let i = 0; i < array.length; i++) {
            if(temp[i] != array[i]) {
                map.set("buffer.from(array) failed", false);
                break;
            }
        }
    }
    {
        let str = "hello world";
        let temp = new FastBuffer(str, "utf8");
        for (let i = 0; i < str.length; i++) {
            if(String.fromCharCode(temp[i]) != str[i]) {
                map.set("buffer.from(str) failed", false);
                break;
            }
        }
    }
    {
        let typeArray = new Uint8Array([1,2,3,4,5]);
        let temp = new FastBuffer(typeArray);
        map.set("buffer.from(UInt8Array) failed", temp.buffer === typeArray.buffer);
        for (let i = 0; i < temp.length; i++) {
            if(temp[i] != typeArray[i]) {
                map.set("buffer.from(UInt8Array) failed", false);
                break;
            }
        }
    }
    {
        let array = [114,514,1919,810];
        let temp = new FastBuffer(array);
        for (let i = 0; i < array.length; i++) {
            if(temp.readInt8(i) != (array[i] & 255)) {
                map.set("buffer.from(array) failed", false);
                break;
            }
        }
    }
    {
        let buf1 = new FastBuffer("abcd", "utf8");
        let buf2 = new FastBuffer("bcde", "utf8");
        map.set("buffer.compare(target) failed", (buf1.compare(buf2) == -1) == ("abcd" < "bcde"));
        map.set("buffer.compare(target) failed", (buf2.compare(buf1) == 1) == ("abcd" > "bcde"));
        let buf3 = new FastBuffer("abcde", "utf8");
        map.set("buffer.compare(target) failed", (buf1.compare(buf3) == 1) == ("abcd" < "abcde"));
        map.set("buffer.compare(target) failed", (buf1.compare(buf1) == 0) == ("abcd" == "abcd"));
    }
    {
        const buf1 = new FastBuffer('1234', 'utf8');
        const buf2 = new FastBuffer('0123', 'utf8');
        map.set("buffer.compare() failed", buf1.compare(buf2) === 1);
    }
    {
        let buf1 = new FastBuffer("abcd", 'utf8');
        map.set("buffer.toJson() failed", JSON.stringify(buf1) === "{\"0\":97,\"1\":98,\"2\":99,\"3\":100}");
    }

    {
        let buf = new FastBuffer(12);
        let src = "hello world!";
        let srcBase64 = "aGVsbG8gd29ybGQh";
        buf.write(src);
        map.set("buf.toString failed", buf.toString() === src);
        map.set("buf.toString failed", buf.toString("base64") === srcBase64);
    }

    {
        let buf = new FastBuffer(12);
        let src = "hello world!";
        let srcBase64 = "aGVsbG8gd29ybGQh";
        buf.write(srcBase64, 0, 12, 'base64');
        map.set("buf.toString failed", buf.toString() === src);
    }

    {
        let array = new Uint8Array([252,11,3,67,237,118,91,177,43]);
        let buf = new FastBuffer(array);
        let strUrl = buf.toString("base64url");
        let str = buf.toString("base64");
        map.set("create buffer baes64 01 failed", strUrl === "_AsDQ-12W7Er");
        map.set("create buffer baes64 01 failed", str === "/AsDQ+12W7Er");

        array = new Uint8Array([2,192,254,253,5,132,69]);
        buf = new FastBuffer(array);
        strUrl = buf.toString("base64url");
        str= buf.toString("base64");
        map.set("create buffer baes64 02 failed", strUrl === "AsD-_QWERQ");
        map.set("create buffer baes64 02 failed", str === "AsD+/QWERQ==");

        array = new Uint8Array([215,109,211,97,72,142,167,241]);
        buf = new FastBuffer(array);
        strUrl = buf.toString("base64url");
        str = buf.toString("base64");
        map.set("create buffer baes64 03 failed", strUrl === "123TYUiOp_E");
        map.set("create buffer baes64 03 failed", str === "123TYUiOp/E=");

        array = new Uint8Array([252]);
        buf = new FastBuffer(array);
        strUrl = buf.toString("base64url");
        str = buf.toString("base64");
        map.set("create buffer baes64 04 failed", strUrl === "_A");
        map.set("create buffer baes64 04 failed", str === "/A==");

        array = new Uint8Array([252,97]);
        buf = new FastBuffer(array);
        strUrl = buf.toString("base64url");
        str = buf.toString("base64");
        map.set("create buffer baes64 05 failed", strUrl === "_GE");
        map.set("create buffer baes64 05 failed", str === "/GE=");

        array = new Uint8Array([252,97,142]);
        buf  = new FastBuffer(array);
        strUrl = buf.toString("base64url");
        str = buf.toString("base64");
        map.set("create buffer baes64 06 failed", strUrl === "_GGO");
        map.set("create buffer baes64 06 failed", str === "/GGO");
    }

    {
        let ab = new ArrayBuffer(100);
        let buf = new FastBuffer(ab, 9.9, 9.9);
        let res = buf.toString('hex');
        map.set("create buffer not int parameter failed", res === "000000000000000000");
    }

    {
        let buf = new FastBuffer(2);
        buf.writeInt16BE(0x1234, 0);
        try {
          let ref = buf.readInt16LE(1);
        } catch (err) {
          map.set("buffer write out of bounds error failed", err.name === 'BusinessError');
          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');
        }
    }

    {
        let buf = new FastBuffer("测试特殊字符$#@!");
        let len = buf.length;
        map.set("buffer test chinese$#@! failed", len === 22);
    }

    {
        let buf = new FastBuffer([0x12, 0x34, 0x56, 0x78, 0x90, 0xab]);
        let res = buf.readIntBE(0, 6).toString(16);
        map.set("buffer.readIntBE() failed, expect: 1234567890ab, output: " + res, res === '1234567890ab');
    }

    {
        let buf = new FastBuffer([0x12, 0x34, 0x56, 0x78, 0x90, 0xab]);
        let res = buf.readIntLE(0, 6).toString(16);
        map.set("buffer.readIntLE() failed, expect: -546f87a9cbee, output: " + res, res === '-546f87a9cbee');
    }

    {
        let buf = new FastBuffer([0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70,
            0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78]);
        let res = buf.readBigUInt64BE(0).toString();
        map.set("buffer.readBigUInt64BE() failed, expect: 7161960797921896816, output: " + res, res === '7161960797921896816');

        let buf1 = new FastBuffer(8);
        let result = buf1.writeBigUInt64BE(BigInt(0xdecafafecacefade), 0);
        map.set("buffer.readBigUInt64BE() failed, expect: 8, output: " + result, result === 8);
    }
    {
        try{
            let buf = new FastBuffer([undefined]);
        } catch (e) {
            map.set("new buffer from array failed, expect: 401, output: " + e.code, e.code === 401);
        }
    }
    {
        let buf = new FastBuffer(3).fill("$*$");
        let str = buf.toString();
        map.set("testFill0092, expect: $*$, output: " + str, str === "$*$");
    }

    {
        try {
            let buf = new FastBuffer(3).fill("$*$", -1);
        } catch (err) {
            map.set("testFill0093, expect: BusinessError, output: " + err.name, err.name === 'BusinessError');
            let expectMsg = 'The value of "offset" is out of range. It must be >= 0 and <= 3. Received value is: -1';
            map.set("testFill0093, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg);
        }
    }

    {
        try {
            let buf = new FastBuffer(3).fill("$*$", 0, 5);
        } catch (err) {
            map.set("testFill0094, expect: BusinessError, output: " + err.name, err.name === 'BusinessError');
            let expectMsg = 'The value of "end" is out of range. It must be >= 0 and <= 3. Received value is: 5';
            map.set("testFill0094, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg);
        }
    }

    {
    let buf = new FastBuffer(8);
    try {
        let offset = buf.write("abcde", -1);
    } catch (err) {
        map.set("testWrite0105, expect: BusinessError, output: " + err.name, err.name === 'BusinessError');
        let expectMsg = 'The value of "offset" is out of range. It must be >= 0 and <= 7. Received value is: -1';
        map.set("testWrite0105, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg);
    }
    }

    {
    let buf = new FastBuffer(8);
    try {
        let offset = buf.write("abcde", 1, 9);
    } catch (err) {
        map.set("testWrite0106, expect: BusinessError, output: " + err.name, err.name === 'BusinessError');
        let expectMsg = 'The value of "length" is out of range. It must be >= 0 and <= 7. Received value is: 9';
        map.set("testWrite0106, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg);
    }
    }

    {
    let buf1 = new FastBuffer("1236");
    let buf2 = new FastBuffer("1235");
    let res = buf1.compare(buf2);
    map.set("testCompare0110, expect: 1, output: " + res, res === 1);
    }

    {
    let buf1 = new FastBuffer("1236");
    let buf2 = new FastBuffer("1235");
    try {
        let res = buf1.compare(buf2, -1);
    } catch (err) {
        map.set("testCompare0112, expect: BusinessError, output: " + err.name, err.name === 'BusinessError');
        let expectMsg = 'The value of "targetStart" is out of range. It must be >= 0 and <= 4. Received value is: -1';
        map.set("testCompare0112, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg);
    }
    }

    {
    let buf1 = new FastBuffer("1236");
    let buf2 = new FastBuffer("1235");
    let res = buf1.equals(buf2);
    map.set("testEquals0120, expect: false, output: " + res, res === false);
    }

    {
    let buf1 = new FastBuffer("1236测试");
    let buf2 = new FastBuffer("1236测试");
    let res = buf1.equals(buf2);
    map.set("testEquals0121, expect: true, output: " + res, res === true);
    }

    {
    let buf1 = new FastBuffer("O@O");
    let buf2 = new FastBuffer("O^O");
    let res = buf1.equals(buf2);
    map.set("testEquals0122, expect: false, output: " + res, res === false);
    }

    {
    let buf1 = new FastBuffer("1236");
    let buf2 = new FastBuffer("1235");
    let num = buf1.copy(buf2);
    map.set("testCopy0140, expect: 4, output: " + num, num === 4);
    let str = buf2.toString();
    map.set("testCopy0140, expect: 1236, output: " + str, str === "1236");
    }

    {
    let buf1 = new FastBuffer("abcdefg");
    let buf2 = new FastBuffer("1235789");
    let num = buf1.copy(buf2, 2, 1, 3);
    map.set("testCopy0141, expect: 2, output: " + num, num === 2);
    let str = buf2.toString();
    map.set("testCopy0141, expect: 12bc789, output: " + str, str === "12bc789");
    }

    {
    let buf1 = new FastBuffer("123656");
    let buf2 = new FastBuffer("1235");
    let num = buf1.copy(buf2);
    map.set("testCopy0143, expect: 4, output: " + num, num === 4);
    let str = buf2.toString();
    map.set("testCopy0143, expect: 1236, output: " + str, str === "1236");
    }

    {
    let buf1 = new FastBuffer("123656");
    let buf2 = new FastBuffer("1235");
    try {
        let num = buf1.copy(buf2, -1);
    } catch (err) {
        map.set("testCopy0144, expect: BusinessError, output: " + err.name, err.name === 'BusinessError');
        let expectMsg = 'The value of "targetStart" is out of range. It must be >= 0 and <= 4294967295. Received value is: -1';
        map.set("testCopy0144, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg);
    }
    }

    {
    let buf1 = new FastBuffer("ab$#");
    let buf2 = new FastBuffer("123556");
    let num = buf1.copy(buf2);
    map.set("testCopy0146, expect: 4, output: " + num, num === 4);
    let str = buf2.toString();
    map.set("testCopy0146, expect: ab$#56, output: " + str, str === "ab$#56");
    }

    {
    let buf1 = new FastBuffer("1236");
    let str = buf1.toString();
    map.set("testToString0150, expect: 1236, output: " + str, str === "1236");
    }

    {
    let buf1 = new FastBuffer("张三");
    let str = buf1.toString();
    map.set("testToString0151, expect: 张三, output: " + str, str === "张三");
    }

    {
    let buf1 = new FastBuffer("abc");
    let str = buf1.toString("binary");
    map.set("testToString0152, expect: abc, output: " + str, str === "abc");
    }

    {
    let buf1 = new FastBuffer("abc");
    let str = buf1.toString("ascii");
    map.set("testToString0153, expect: abc, output: " + str, str === "abc");
    }

    {
    let buf1 = new FastBuffer("abc");
    let str = buf1.toString("base64");
    map.set("testToString0154, expect: YWJj, output: " + str, str === "YWJj");
    }

    {
    let buf1 = new FastBuffer("abc");
    let str = buf1.toString("hex");
    map.set("testToString0155, expect: 616263, output: " + str, str === "616263");
    }

    {
    let buf1 = new FastBuffer("abc");
    let str = buf1.toString("latin1");
    map.set("testToString0156, expect: abc, output: " + str, str === "abc");
    }

    {
    let buf1 = new FastBuffer("abc");
    let str = buf1.toString("ucs2");
    map.set("testToString0157, expect: 扡, output: " + str, str === "扡");
    }

    {
    let buf1 = new FastBuffer("abc");
    let str = buf1.toString("utf16le");
    map.set("testToString0158, expect: 扡, output: " + str, str === "扡");
    }

    {
    let buf1 = new FastBuffer("!@#$%^&*");
    let str = buf1.toString();
    map.set("testToString0159, expect: !@#$%^&*, output: " + str, str === "!@#$%^&*");
    }

    {
    let buf1 = new FastBuffer("13236");
    let index = buf1.indexOf("3");
    map.set("testIndexOf0170, expect: 1, output: " + index, index === 1);
    }

    {
    let buf1 = new FastBuffer("13236");
    let index = buf1.indexOf("3", 2);
    map.set("testIndexOf0171, expect: 3, output: " + index, index === 3);
    }

    {
    let buf1 = new FastBuffer("13236235");
    let index = buf1.indexOf("23");
    map.set("testIndexOf0173, expect: 2, output: " + index, index === 2);
    }

    {
    let buf1 = new FastBuffer("测试特殊字符$#@!");
    let index = buf1.indexOf("@");
    map.set("testIndexOf0174, expect: 20, output: " + index, index === 20);
    }

    {
    let buf1 = new FastBuffer("13236235");
    let index = buf1.indexOf("23", 3);
    map.set("testIndexOf0175, expect: 5, output: " + index, index === 5);
    }

    {
    let buf1 = new FastBuffer("13236");
    let index = buf1.indexOf("a");
    map.set("testIndexOf0176, expect: -1, output: " + index, index === -1);
    }

    {
    let buf1 = new FastBuffer("13236");
    let index = buf1.lastIndexOf("3");
    map.set("testLastIndexOf0180, expect: 3, output: " + index, index === 3);
    }

    {
    let buf1 = new FastBuffer("13236");
    let index = buf1.lastIndexOf("3", 2);
    map.set("testLastIndexOf0181, expect: 1, output: " + index, index === 1);
    }

    {
    let buf1 = new FastBuffer("13236235");
    let index = buf1.lastIndexOf("23");
    map.set("testLastIndexOf0183, expect: 5, output: " + index, index === 5);
    }

    {
    let buf1 = new FastBuffer("13236235");
    let index = buf1.lastIndexOf("23", 3);
    map.set("testLastIndexOf0184, expect: 2, output: " + index, index === 2);
    }

    {
    let buf1 = new FastBuffer("13236");
    let index = buf1.lastIndexOf("a");
    map.set("testLastIndexOf0186, expect: -1, output: " + index, index === -1);
    }

    {
    let buf1 = new FastBuffer("13236");
    let flag = buf1.includes("3");
    map.set("testIncludes0190, expect: true, output: " + flag, flag === true);
    }

    {
    let buf1 = new FastBuffer("13236");
    let flag = buf1.includes("3", 2);
    map.set("testIncludes0191, expect: true, output: " + flag, flag === true);
    }

    {
    let buf1 = new FastBuffer("13236");
    let flag = buf1.includes("32");
    map.set("testIncludes0193, expect: true, output: " + flag, flag === true);
    }

    {
    let buf1 = new FastBuffer("13236");
    let flag = buf1.includes("32", 2);
    map.set("testIncludes0194, expect: false, output: " + flag, flag === false);
    }

    {
    let buf1 = new FastBuffer("测试特殊字符$#@!");
    let flag = buf1.includes("#@");
    map.set("testIncludes0195, expect: true, output: " + flag, flag === true);
    flag = buf1.includes("测试");
    map.set("testIncludes0195, expect: true, output: " + flag, flag === true);
    }

    {
    let buf1 = new FastBuffer("13236");
    let flag = buf1.includes("abc");
    map.set("testIncludes0196, expect: false, output: " + flag, flag === false);
    }
    {
    let buf1 = new FastBuffer("1234");
    let keys = buf1.keys();
    let index = 0;
    for (const key of keys) {
        map.set("testKeys0230, expect: " + index + ", output: " + key, key === index);
        index++;
    }
    }

    {
    let uarr = new Uint8Array(4);
    uarr[0] = 0x31;
    uarr[1] = 0x32;
    uarr[2] = 0x33;
    uarr[3] = 0x34;
    let buf1 = new FastBuffer(uarr);
    let keys = buf1.keys();
    let index = 0;
    for (const key of keys) {
        map.set("testKeys0235, expect: " + index + ", output: " + key, key === index);
        index++;
    }
    }

    {
    let buf1 = new FastBuffer("1234");
    let keys = buf1.values();
    let va = 49;
    for (const value of keys) {
        map.set("testValues0240, expect: " + va + ", output: " + value, value === va);
        va++;
    }
    }

    {
    let uarr = new Uint8Array(4);
    uarr[0] = 0x31;
    uarr[1] = 0x32;
    uarr[2] = 0x33;
    uarr[3] = 0x34;
    let buf1 = new FastBuffer(uarr);
    let keys = buf1.values();
    let va = 0x31;
    for (const value of keys) {
        map.set("testValues0245, expect: " + va + ", output: " + value, value === va);
        va++;
    }
    }

    {
    let uarr = new Uint8Array(3);
    uarr[0] = 0x12;
    uarr[1] = 0x34;
    uarr[2] = 0x56;
    let buf = new FastBuffer(uarr);
    let str = buf.toString("hex");
    map.set("testfrom0260, expect: 123456, output: " + str, str === "123456");
    }

    {
    const buf = new FastBuffer([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);
    let str = buf.toString("hex");
    map.set("testfrom0261, expect: 627566666572, output: " + str, str === "627566666572");
    }

    {
    const arr = new Uint8Array(2);
    arr[0] = 97;
    arr[1] = 98;
    const buf = new FastBuffer(arr.buffer);
    arr[0] = 99
    buf[1] = 100
    let str = buf.toString("hex");
    map.set("testfrom0262, expect: 6364, output: " + str, str === "6364");
    map.set("testfrom0262, expect: 100, output: " + arr[1], arr[1] === 100);
    }
    {
    const buf1 = new FastBuffer('buffer');
    const buf2 = new FastBuffer(buf1);
    buf1[0] = 0x61;
    let str = buf1.toString();
    map.set("testfrom0264, expect: auffer, output: " + str, str === "auffer");
    str = buf2.toString();
    map.set("testfrom0264, expect: buffer, output: " + str, str === "buffer");
    }

    {
    const buf1 = new FastBuffer('this is a test');
    let str = buf1.toString();
    map.set("testfrom0265, expect: this is a test, output: " + str, str === "this is a test");
    }

    {
    const str = `MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC/OgIQLaulKklB\npZltSaWwM3Cnzcmvh+LoqYFYjCePUxnoJRDusFqy4sjwBx9fn/XSxxJ9A0KxMtXa\nr7YFjwQo3FsIjLZ3+8wS+Kydcg==`;
    const buf = new FastBuffer(str, 'base64');
    let ref = buf.readInt8(buf.length - 1);
    map.set("testfrom0269, expect: 114, output: " + ref, ref === 114);
    }

    {
    let buf = new FastBuffer(4);
    let ref = buf.writeInt32BE(0x12345678, 0);
    map.set("testWriteInt32BE0310, expect: 4, output: " + ref, ref === 4);
    }

    {
    let buf = new FastBuffer(4);
    try {
        let ref = buf.writeInt32BE(0x12345678, -1);
    } catch (err) {
        map.set("testWriteInt32BE0311, expect: BusinessError, output: " + err.name, err.name === 'BusinessError');
        let expectMsg = 'The value of "offset" is out of range. It must be >= 0. Received value is: -1';
        map.set("testWriteInt32BE0311, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg);
    }
    }

    {
    let buf = new FastBuffer(4);
    try {
        let ref = buf.writeInt32BE(0x123456789, 0);
    } catch (err) {
        map.set("testWriteInt32BE0312, expect: BusinessError, output: " + err.name, err.name === 'BusinessError');
        let expectMsg = 'The value of "value" is out of range. It must be >= -2147483648 and <= 2147483647. Received value is: 4886718345';
        map.set("testWriteInt32BE0312, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg);
    }
    }

    {
    let buf = new FastBuffer(4);
    try {
        let ref = buf.writeInt32BE(0x12345678, 1);
    } catch (err) {
        map.set("testWriteInt32BE0313, expect: BusinessError, output: " + err.name, err.name === 'BusinessError');
        let expectMsg = 'The value of "offset" is out of range. It must be >= 0 and <= 0. Received value is: 1';
        map.set("testWriteInt32BE0313, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg);
    }
    }

    {
    let buf = new FastBuffer(4);
    let ref = buf.writeInt32LE(0x12345678, 0);
    map.set("testWriteInt32LE0320, expect: 4, output: " + ref, ref === 4);
    }

    {
    let buf = new FastBuffer(4);
    try {
        let ref = buf.writeInt32LE(0x12345678, -1);
    } catch (err) {
        map.set("testWriteInt32LE0321, expect: BusinessError, output: " + err.name, err.name === 'BusinessError');
        let expectMsg = 'The value of "offset" is out of range. It must be >= 0. Received value is: -1';
        map.set("testWriteInt32LE0321, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg);
    }
    }

    {
    let buf = new FastBuffer(4);
    try {
        let ref = buf.writeInt32LE(0x123456789, 0);
    } catch (err) {
        map.set("testWriteInt32LE0322, expect: BusinessError, output: " + err.name, err.name === 'BusinessError');
        let expectMsg = 'The value of "value" is out of range. It must be >= -2147483648 and <= 2147483647. Received value is: 4886718345';
        map.set("testWriteInt32LE0322, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg);
    }
    }

    {
    let buf = new FastBuffer(4);
    try {
        let ref = buf.writeInt32LE(0x12345678, 1);
    } catch (err) {
        map.set("testWriteInt32LE0323, expect: BusinessError, output: " + err.name, err.name === 'BusinessError');
        let expectMsg = 'The value of "offset" is out of range. It must be >= 0 and <= 0. Received value is: 1';
        map.set("testWriteInt32LE0323, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg);
    }
    }

    {
    let buf = new FastBuffer(2);
    let ref = buf.writeInt16BE(0x7bca, 0);
    map.set("testWriteInt16BE0330, expect: 2, output: " + ref, ref === 2);
    }

    {
    let buf = new FastBuffer(2);
    try {
        let ref = buf.writeInt16BE(0x7bca, -1);
    } catch (err) {
        map.set("testWriteInt16BE0331, expect: BusinessError, output: " + err.name, err.name === 'BusinessError');
        let expectMsg = 'The value of "offset" is out of range. It must be >= 0. Received value is: -1';
        map.set("testWriteInt16BE0331, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg);
    }
    }

    {
    let buf = new FastBuffer(2);
    try {
        let ref = buf.writeInt16BE(0x123456, 0);
    } catch (err) {
        map.set("testWriteInt16BE0332, expect: BusinessError, output: " + err.name, err.name === 'BusinessError');
        let expectMsg = 'The value of "value" is out of range. It must be >= -32768 and <= 32767. Received value is: 1193046';
        map.set("testWriteInt16BE0332, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg);
    }
    }
{
  // 1. Create empty buffer
  let buf = new FastBuffer(0);
  map.set("testConstructorEmpty, expect: 0, output: " + buf.length, buf.length === 0);

  // 2. Initialize with specified size
  buf = new FastBuffer(5);
  map.set("testConstructorSize, expect: 5, output: " + buf.length, buf.length === 5);

  // 3. Initialize with UTF-8 string
  buf = new FastBuffer("Hello");
  map.set("testConstructorString, expect: Hello, output: " + buf.toString(), buf.toString() === "Hello");

  // 4. Initialize from array
  buf = new FastBuffer([0x48, 0x65, 0x6c, 0x6c, 0x6f]); // "Hello"
  map.set("testConstructorArray, expect: Hello, output: " + buf.toString(), buf.toString() === "Hello");

  // 5. Initialize from ArrayBuffer
  let arrBuf = new ArrayBuffer(3);
  new Uint8Array(arrBuf).set([0x41, 0x42, 0x43]); // "ABC"
  buf = new FastBuffer(arrBuf);
  map.set("testConstructorArrayBuffer, expect: ABC, output: " + buf.toString(), buf.toString() === "ABC");

  // 6. Initialize from another FastBuffer (copy)
  let bufSrc = new FastBuffer("Copy");
  buf = new FastBuffer(bufSrc);
  map.set("testConstructorFastBuffer, expect: Copy, output: " + buf.toString(), buf.toString() === "Copy");
}
{
  // 13. Write UInt8 value
  let buf = new FastBuffer(1);
  buf.writeUInt8(0xAB, 0);
  map.set("testWriteUInt8, expect: AB, output: " + buf.toString('hex'), buf.toString('hex') === "ab");

  // 14. Read UInt8 value
  let val = buf.readUInt8(0);
  map.set("testReadUInt8, expect: 171, output: " + val, val === 0xAB);

  // 15. Write UInt16BE (big-endian)
  buf = new FastBuffer(2);
  buf.writeUInt16BE(0xABCD, 0);
  map.set("testWriteUInt16BE, expect: ABCD, output: " + buf.toString('hex'), buf.toString('hex') === "abcd");

  // 16. Read UInt16BE value
  val = buf.readUInt16BE(0);
  map.set("testReadUInt16BE, expect: 43981, output: " + val, val === 0xABCD);

  // 17. Write UInt16LE (little-endian)
  buf.writeUInt16LE(0xABCD, 0);
  map.set("testWriteUInt16LE, expect: CDAB, output: " + buf.toString('hex'), buf.toString('hex') === "cdab");

  // 18. Read UInt16LE value
  val = buf.readUInt16LE(0);
  map.set("testReadUInt16LE, expect: 43981, output: " + val, val === 0xABCD);

  // 19. Write UInt32BE
  buf = new FastBuffer(4);
  buf.writeUInt32BE(0x12345678, 0);
  map.set("testWriteUInt32BE, expect: 12345678, output: " + buf.toString('hex'), buf.toString('hex') === "12345678");

  // 20. Read UInt32BE value
  val = buf.readUInt32BE(0);
  map.set("testReadUInt32BE, expect: 305419896, output: " + val, val === 0x12345678);

  // 21. Write UInt32LE
  buf.writeUInt32LE(0x12345678, 0);
  map.set("testWriteUInt32LE, expect: 78563412, output: " + buf.toString('hex'), buf.toString('hex') === "78563412");

  // 22. Read UInt32LE value
  val = buf.readUInt32LE(0);
  map.set("testReadUInt32LE, expect: 305419896, output: " + val, val === 0x12345678);

  // 23. Write Int8 value
  buf = new FastBuffer(1);
  buf.writeInt8(-85, 0); // -85 = 0xAB (two's complement)
  map.set("testWriteInt8, expect: AB, output: " + buf.toString('hex'), buf.toString('hex') === "ab");

  // 24. Read Int8 value
  val = buf.readInt8(0);
  map.set("testReadInt8, expect: -85, output: " + val, val === -85);

  // 25. Write Int16BE
  buf = new FastBuffer(2);
  buf.writeInt16BE(-21555, 0); // 0xABCD = -21555 (two's complement)
  map.set("testWriteInt16BE, expect: ABCD, output: " + buf.toString('hex'), buf.toString('hex') === "abcd");

  // 26. Read Int16BE value
  val = buf.readInt16BE(0);
  map.set("testReadInt16BE, expect: -21555, output: " + val, val === -21555);

  // 27. Write Int16LE
  buf.writeInt16LE(-21555, 0);
  map.set("testWriteInt16LE, expect: CDAB, output: " + buf.toString('hex'), buf.toString('hex') === "cdab");

  // 28. Read Int16LE value
  val = buf.readInt16LE(0);
  map.set("testReadInt16LE, expect: -21555, output: " + val, val === -21555);

  // 29. Write Int32BE
  buf = new FastBuffer(4);
  buf.writeInt32BE(-19088744, 0); // 0xFEDCBA98 = -19088744 (two's complement)
  map.set("testWriteInt32BE, expect: fedcba98, output: " + buf.toString('hex'), buf.toString('hex') === "fedcba98");

  // 30. Read Int32BE value
  val = buf.readInt32BE(0);
  map.set("testReadInt32BE, expect: -19088744, output: " + val, val === -19088744);

  // 31. Write Int32LE
  buf.writeInt32LE(-19088744, 0);
  map.set("testWriteInt32LE, expect: 98badcfe, output: " + buf.toString('hex'), buf.toString('hex') === "98badcfe");

  // 32. Read Int32LE value
  val = buf.readInt32LE(0);
  map.set("testReadInt32LE, expect: -19088744, output: " + val, val === -19088744);

  // 33. Write FloatBE
  buf = new FastBuffer(4);
  buf.writeFloatBE(123.456, 0);
  let hex = buf.toString('hex');
  map.set("testWriteFloatBE, expect: 42f6e979, output: " + hex, hex === "42f6e979");

  // 34. Read FloatBE value
  let floatVal = buf.readFloatBE(0);
  map.set("testReadFloatBE, expect: 123.456, output: " + floatVal, floatVal.toFixed(3) === "123.456");

  // 35. Write FloatLE
  buf.writeFloatLE(123.456, 0);
  hex = buf.toString('hex');
  map.set("testWriteFloatLE, expect: 79e9f642, output: " + hex, hex === "79e9f642");

  // 36. Read FloatLE value
  floatVal = buf.readFloatLE(0);
  map.set("testReadFloatLE, expect: 123.456, output: " + floatVal, floatVal.toFixed(3) === "123.456");

  // 37. Write DoubleBE
  buf = new FastBuffer(8);
  buf.writeDoubleBE(123.456, 0);
  hex = buf.toString('hex');
  map.set("testWriteDoubleBE, expect: 405edd2f1a9fbe77, output: " + hex, hex === "405edd2f1a9fbe77");

  // 38. Read DoubleBE value
  let doubleVal = buf.readDoubleBE(0);
  map.set("testReadDoubleBE, expect: 123.456, output: " + doubleVal, doubleVal.toFixed(3) === "123.456");

  // 39. Write DoubleLE
  buf.writeDoubleLE(123.456, 0);
  hex = buf.toString('hex');
  map.set("testWriteDoubleLE, expect: 77be9f1a2fdd5e40, output: " + hex, hex === "77be9f1a2fdd5e40");

  // 40. Read DoubleLE value
  doubleVal = buf.readDoubleLE(0);
  map.set("testReadDoubleLE, expect: 123.456, output: " + doubleVal, doubleVal.toFixed(3) === "123.456");
}
{
  // 41. Fill entire buffer
  let buf = new FastBuffer(5);
  buf.fill("A");
  map.set("testFillChar, expect: AAAAA, output: " + buf.toString(), buf.toString() === "AAAAA");

  // 42. Fill partial buffer
  buf.fill("B", 1, 3);
  map.set("testFillPartial, expect: ABBAA, output: " + buf.toString(), buf.toString() === "ABBAA");

  // 43. Compare buffers (less than)
  let buf1 = new FastBuffer("ABC");
  let buf2 = new FastBuffer("ABD");
  let cmp = buf1.compare(buf2);
  map.set("testCompareLess, expect: -1, output: " + cmp, cmp === -1);

  // 44. Compare buffers (equal)
  buf2 = new FastBuffer("ABC");
  cmp = buf1.compare(buf2);
  map.set("testCompareEqual, expect: 0, output: " + cmp, cmp === 0);

  // 45. Compare buffers (greater than)
  buf1 = new FastBuffer("ABD");
  cmp = buf1.compare(buf2);
  map.set("testCompareGreater, expect: 1, output: " + cmp, cmp === 1);

  // 46. Copy between buffers
  buf1 = new FastBuffer("12345");
  buf2 = new FastBuffer("ABCDE");
  buf1.copy(buf2, 1, 1, 3);
  map.set("testCopy, expect: A23DE, output: " + buf2.toString(), buf2.toString() === "A23DE");

  // 48. Convert to string
  buf = new FastBuffer([0x48, 0x65, 0x6c, 0x6c, 0x6f]);
  map.set("testToString, expect: Hello, output: " + buf.toString(), buf.toString() === "Hello");

  // 49. Convert to Base64
  buf = new FastBuffer("A");
  map.set("testToStringBase64, expect: QQ==, output: " + buf.toString('base64'), buf.toString('base64') === "QQ==");

  // 50. Convert to Hex
  buf = new FastBuffer("A");
  map.set("testToStringHex, expect: 41, output: " + buf.toString('hex'), buf.toString('hex') === "41");

  // 51. IndexOf operation
  buf = new FastBuffer("Hello World");
  let idx = buf.indexOf("World");
  map.set("testIndexOf, expect: 6, output: " + idx, idx === 6);

  // 52. LastIndexOf operation
  buf = new FastBuffer("Hello World, World");
  idx = buf.lastIndexOf("World");
  map.set("testLastIndexOf, expect: 13, output: " + idx, idx === 13);

  // 53. Includes check
  buf = new FastBuffer("Hello");
  let has = buf.includes("ell");
  map.set("testIncludes, expect: true, output: " + has, has === true);

  // 54. Equality check
  buf1 = new FastBuffer("ABC");
  buf2 = new FastBuffer("ABC");
  let isEqual = buf1.equals(buf2);
  map.set("testEquals, expect: true, output: " + isEqual, isEqual === true);

  // 58. Iterate keys
  buf = new FastBuffer("AB");
  let keys = Array.from(buf.keys());
  map.set("testKeys, expect: 0,1, output: " + keys.join(','), keys.join(',') === "0,1");

  // 59. Iterate values
  let values = Array.from(buf.values());
  map.set("testValues, expect: 65,66, output: " + values.join(','), values.join(',') === "65,66");
}
{
  // 61. Read out-of-bound (UInt8)
  let buf = new FastBuffer(1);
  try {
    buf.readUInt8(1); // Out-of-bound access
  } catch (err) {
    map.set("testReadUInt8_OutOfRange, expect: BusinessError, output: " + err.name, err.name === 'BusinessError');
  }

  // 62. Write out-of-bound (UInt8)
  try {
    buf.writeUInt8(0, 2); // Out-of-bound access
  } catch (err) {
    map.set("testWriteUInt8_OutOfRange, expect: BusinessError, output: " + err.name, err.name === 'BusinessError');
  }

  // 63. Read insufficient data (UInt16BE)
  try {
    buf.readUInt16BE(0); // Buffer too small (needs 2 bytes)
  } catch (err) {
    map.set("testReadUInt16BE_Insufficient, expect: BusinessError, output: " + err.name, err.name === 'BusinessError');
  }

  // 64. Write out-of-bound (UInt16BE)
  try {
    buf.writeUInt16BE(0xABCD, 1); // Out-of-bound access
  } catch (err) {
    map.set("testWriteUInt16BE_OutOfRange, expect: BusinessError, output: " + err.name, err.name === 'BusinessError');
  }
}

{
  // 1. Create empty FastBuffer and verify length is 0
  let buf = new FastBuffer(0);
  map.set("testConstructorEmpty, expect: 0, output: " + buf.length, buf.length === 0);
}

{
  // 2. Initialize with size 7 and validate length
  let buf = new FastBuffer(7);
  map.set("testConstructorSize, expect: 7, output: " + buf.length, buf.length === 7);
}

{
  // 3. Initialize with UTF-8 string "Γειά σου"
  let buf = new FastBuffer("Γειά σου");
  map.set("testConstructorString, expect: Γειά σου, output: " + buf.toString(), buf.toString() === "Γειά σου");
}

{
  // 4. Initialize from array [0xC0, 0xFF, 0xEE]
  let buf = new FastBuffer([0xC0, 0xFF, 0xEE]);
  let hex = buf.toString('hex');
  map.set("testConstructorArray, expect: c0ffee, output: " + hex, hex === "c0ffee");
}

{
  // 5. Initialize from ArrayBuffer
  let arrBuf = new ArrayBuffer(4);
  new Uint8Array(arrBuf).set([0xDE, 0xAD, 0xBE, 0xEF]);
  let buf = new FastBuffer(arrBuf);
  map.set("testConstructorArrayBuffer, expect: deadbeef, output: " + buf.toString('hex'), buf.toString('hex') === "deadbeef");
}

// ===== READ/WRITE OPERATIONS =====
{
  // 9. Write UInt8 value 0xF0 at offset 0
  let buf = new FastBuffer(1);
  buf.writeUInt8(0xF0, 0);
  map.set("testWriteUInt8, expect: f0, output: " + buf.toString('hex'), buf.toString('hex') === "f0");
}

{
  // 11. Write Int16LE value -32767 at offset 0
  let buf = new FastBuffer(2);
  buf.writeInt16LE(-32767, 0);
  map.set("testWriteInt16LE, expect: 0180, output: " + buf.toString('hex'), buf.toString('hex') === "0180");
}

{
  // 12. Read Int32BE value 0x7FFFFFFF
  let buf = new FastBuffer(4);
  buf.writeInt32BE(0x7FFFFFFF, 0);
  let val = buf.readInt32BE(0);
  map.set("testReadInt32BE, expect: 2147483647, output: " + val, val === 2147483647);
}

{
  // 13. Write FloatLE value -123.456
  let buf = new FastBuffer(4);
  buf.writeFloatLE(-123.456, 0);
  let hex = buf.toString('hex');
  map.set("testWriteFloatLE, expect: 79e9f6c2, output: " + hex, hex === "79e9f6c2"); // IEEE754 representation
}

{
  // 14. Read DoubleBE value 1.7976931348623157e+308 (max double)
  let buf = new FastBuffer(8);
  buf.writeDoubleBE(1.7976931348623157e308, 0);
  let val = buf.readDoubleBE(0);
  map.set("testReadDoubleBE, expect: 1.7976931348623157e+308, output: " + val, val === 1.7976931348623157e308);
}

{
  // 16. Compare buffers "apple" and "zebra"
  let buf1 = new FastBuffer("apple");
  let buf2 = new FastBuffer("zebra");
  let cmp = buf1.compare(buf2);
  map.set("testCompareStrings, expect: -1, output: " + cmp, cmp === -1);
}

// ===== ENCODING CONVERSION =====
{
  // 19. Convert to Base64url encoding
  let buf = new FastBuffer("✓ test");
  let b64url = buf.toString('base64url');
  map.set("testToBase64URL, expect: 4pyTIHRlc3Q, output: " + b64url, b64url === "4pyTIHRlc3Q");
}

{
  // 20. Convert hex string "cafebabe" to buffer
  let buf = new FastBuffer("cafebabe", 'hex');
  map.set("testFromHex, expect: cafebabe, output: " + buf.toString('hex'), buf.toString('hex') === "cafebabe");
}

// ===== ITERATORS & SEARCH =====
{
  // 21. Iterate keys of buffer "XYZ"
  let buf = new FastBuffer("XYZ");
  let keys = Array.from(buf.keys());
  map.set("testKeysIter, expect: 0,1,2, output: " + keys.join(','), keys.join(',') === "0,1,2");
}

{
  // 22. Find last index of "λ" in buffer
  let buf = new FastBuffer("αβγδλθλ");
  let idx = buf.lastIndexOf("λ");
  map.set("testLastIndexOf, expect: 12, output: " + idx, idx === 12);
}

{
  // 23. Write beyond buffer length (should throw)
  let buf = new FastBuffer(3);
  try {
    buf.writeUInt32BE(0x12345678, 0); // Requires 4 bytes
  } catch (err) {
    map.set("testWriteOOB, expect: BusinessError, output: " + err.name, err.name === 'BusinessError');
  }
}

{
  // 49. Write negative integer to Int32LE
  let buf = new FastBuffer(4);
  buf.writeInt32LE(-2147483648, 0); // Min int32
  let val = buf.readInt32LE(0);
  map.set("testWriteMinInt32, expect: -2147483648, output: " + val, val === -2147483648);
}

{
  // 50. Check includes() with partial match
  let buf = new FastBuffer("search_term");
  let found = buf.includes("term");
  map.set("testIncludesPartial, expect: true, output: " + found, found === true);
}

// Test Case 1: Fill entire buffer with pattern "AB"
{
    let buf = new FastBuffer(2).fill("AB");
    let str = buf.toString();
    map.set("testFill0500, expect: AB, output: " + str, str === "AB");
}

// Test Case 2: Attempt fill with negative offset (should throw)
{
    try {
        let buf = new FastBuffer(4).fill("XY", -2);
    } catch (err) {
        map.set("testFill0501, expect: BusinessError, output: " + err.name, err.name === 'BusinessError');
        let expectMsg = 'The value of "offset" is out of range. It must be >= 0 and <= 4. Received value is: -2';
        map.set("testFill0501, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg);
    }
}

// Test Case 3: Attempt fill with end position exceeding buffer length
{
    try {
        let buf = new FastBuffer(3).fill("123", 0, 6);
    } catch (err) {
        map.set("testFill0502, expect: BusinessError, output: " + err.name, err.name === 'BusinessError');
        let expectMsg = 'The value of "end" is out of range. It must be >= 0 and <= 3. Received value is: 6';
        map.set("testFill0502, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg);
    }
}

// Test Case 4: Attempt write with negative offset
{
    let buf = new FastBuffer(5);
    try {
        let offset = buf.write("test", -3);
    } catch (err) {
        map.set("testWrite0503, expect: BusinessError, output: " + err.name, err.name === 'BusinessError');
        let expectMsg = 'The value of "offset" is out of range. It must be >= 0 and <= 4. Received value is: -3';
        map.set("testWrite0503, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg);
    }
}

// Test Case 5: Attempt write with excessive length parameter
{
    let buf = new FastBuffer(6);
    try {
        let offset = buf.write("data", 1, 8);
    } catch (err) {
        map.set("testWrite0504, expect: BusinessError, output: " + err.name, err.name === 'BusinessError');
        let expectMsg = 'The value of "length" is out of range. It must be >= 0 and <= 5. Received value is: 8';
        map.set("testWrite0504, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg);
    }
}

// Test Case 6: Compare buffers with different content
{
    let buf1 = new FastBuffer("apple");
    let buf2 = new FastBuffer("zebra");
    let res = buf1.compare(buf2);
    map.set("testCompare0505, expect: -1, output: " + res, res === -1);
}

// Test Case 7: Attempt compare with invalid targetStart
{
    let buf1 = new FastBuffer("test");
    let buf2 = new FastBuffer("test");
    try {
        let res = buf1.compare(buf2, -5);
    } catch (err) {
        map.set("testCompare0506, expect: BusinessError, output: " + err.name, err.name === 'BusinessError');
        let expectMsg = 'The value of "targetStart" is out of range. It must be >= 0 and <= 4. Received value is: -5';
        map.set("testCompare0506, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg);
    }
}

// Test Case 8: Verify equals() with identical Greek text
{
    let buf1 = new FastBuffer("Γειά σου");
    let buf2 = new FastBuffer("Γειά σου");
    let res = buf1.equals(buf2);
    map.set("testEquals0507, expect: true, output: " + res, res === true);
}

// Test Case 9: Verify equals() with different symbols
{
    let buf1 = new FastBuffer("@#$");
    let buf2 = new FastBuffer("!@#");
    let res = buf1.equals(buf2);
    map.set("testEquals0508, expect: false, output: " + res, res === false);
}

// Test Case 10: Copy entire buffer content
{
    let buf1 = new FastBuffer("source");
    let buf2 = new FastBuffer(6);
    let num = buf1.copy(buf2);
    map.set("testCopy0509, expect: 6, output: " + num, num === 6);
    let str = buf2.toString();
    map.set("testCopy0509, expect: source, output: " + str, str === "source");
}

// Test Case 11: Copy partial content with offsets
{
    let buf1 = new FastBuffer("abcdef");
    let buf2 = new FastBuffer("123456");
    let num = buf1.copy(buf2, 1, 2, 4);
    map.set("testCopy0510, expect: 2, output: " + num, num === 2);
    let str = buf2.toString();
    map.set("testCopy0510, expect: 1cd456, output: " + str, str === "1cd456");
}

// Test Case 12: Attempt copy with invalid targetStart
{
    let buf1 = new FastBuffer("data");
    let buf2 = new FastBuffer("1234");
    try {
        let num = buf1.copy(buf2, -10);
    } catch (err) {
        map.set("testCopy0511, expect: BusinessError, output: " + err.name, err.name === 'BusinessError');
        let expectMsg = 'The value of "targetStart" is out of range. It must be >= 0 and <= 4294967295. Received value is: -10';
        map.set("testCopy0511, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg);
    }
}

// Test Case 13: Convert buffer to UTF-8 string
{
    let buf = new FastBuffer("Hello 世界");
    let str = buf.toString();
    map.set("testToString0512, expect: Hello 世界, output: " + str, str === "Hello 世界");
}

// Test Case 14: Convert buffer to Base64 encoding
{
    let buf = new FastBuffer("base64");
    let str = buf.toString("base64");
    map.set("testToString0513, expect: YmFzZTY0, output: " + str, str === "YmFzZTY0");
}

// Test Case 15: Convert buffer to Hex encoding
{
    let buf = new FastBuffer("hex");
    let str = buf.toString("hex");
    map.set("testToString0514, expect: 686578, output: " + str, str === "686578");
}

// Test Case 17: Find last index of character
{
    let buf = new FastBuffer("a,b,c,d,e");
    let index = buf.lastIndexOf(",");
    map.set("testLastIndexOf0516, expect: 7, output: " + index, index === 7);
}

// Test Case 18: Check if buffer includes substring
{
    let buf = new FastBuffer("search result");
    let flag = buf.includes("result");
    map.set("testIncludes0517, expect: true, output: " + flag, flag === true);
}

// Test Case 19: Iterate buffer keys
{
    let buf = new FastBuffer("ABC");
    let keys = Array.from(buf.keys());
    map.set("testKeys0518, expect: 0,1,2, output: " + keys.join(','), keys.join(',') === "0,1,2");
}

// Test Case 20: Iterate buffer values
{
    let buf = new FastBuffer("ABC");
    let values = Array.from(buf.values());
    map.set("testValues0519, expect: 65,66,67, output: " + values.join(','), values.join(',') === "65,66,67");
}

// Test Case 21: Initialize from array buffer
{
    let arr = new Uint8Array([0x48, 0x65, 0x6c, 0x6c, 0x6f]);
    let buf = new FastBuffer(arr.buffer);
    map.set("testFrom0520, expect: Hello, output: " + buf.toString(), buf.toString() === "Hello");
}

// Test Case 24: Write FloatLE value
{
    let buf = new FastBuffer(4);
    buf.writeFloatLE(-65.432, 0);
    let hex = buf.toString('hex');
    map.set("testWriteFloatLE0523, expect: 2fdd82c2, output: " + hex, hex === "2fdd82c2");
}

// Test Case 25: Read FloatBE value
{
    let buf = new FastBuffer([0x42, 0x8A, 0x3D, 0x71]);
    let val = buf.readFloatBE(0);
    map.set("testReadFloatBE0524, expect: 69.12, output: " + val, val.toFixed(2) === "69.12");
}

// Test Case 26: Create empty buffer
{
    let buf = new FastBuffer(0);
    map.set("testConstructor0525, expect: 0, output: " + buf.length, buf.length === 0);
}

// Test Case 27: Initialize with specific size
{
    let buf = new FastBuffer(10);
    map.set("testConstructor0526, expect: 10, output: " + buf.length, buf.length === 10);
}

// Test Case 28: Initialize with emoji string
{
    let buf = new FastBuffer("🚀🌕");
    map.set("testConstructor0527, expect: 🚀🌕, output: " + buf.toString(), buf.toString() === "🚀🌕");
}

// Test Case 29: Initialize from numeric array
{
    let buf = new FastBuffer([0x31, 0x32, 0x33]);
    map.set("testConstructor0528, expect: 123, output: " + buf.toString(), buf.toString() === "123");
}

// Test Case 30: Copy between buffers with overlap
{
    let buf = new FastBuffer("ABCDEF");
    buf.copy(buf, 2, 0, 3);
    map.set("testCopy0529, expect: ABABCF, output: " + buf.toString(), buf.toString() === "ABABCF");
}

// Test Case 31: Convert to Latin1 encoding
{
    let buf = new FastBuffer([0xC0, 0xFF, 0xEE]);
    let str = buf.toString("latin1");
    map.set("testToString0530, expect: Àÿî, output: " + str, str === "Àÿî");
}

// Test Case 32: Find index with start position
{
    let buf = new FastBuffer("banana");
    let index = buf.indexOf("na", 3);
    map.set("testIndexOf0531, expect: 4, output: " + index, index === 4);
}

// Test Case 33: Check includes with offset
{
    let buf = new FastBuffer("programming");
    let flag = buf.includes("gram", 3);
    map.set("testIncludes0532, expect: true, output: " + flag, flag === true);
}

// Test Case 34: Write UInt16LE value
{
    let buf = new FastBuffer(2);
    buf.writeUInt16LE(0xABCD, 0);
    map.set("testWriteUInt16LE0533, expect: cdab, output: " + buf.toString('hex'), buf.toString('hex') === "cdab");
}

// Test Case 35: Read Int16BE value
{
    let buf = new FastBuffer([0x12, 0x34]);
    let val = buf.readInt16BE(0);
    map.set("testReadInt16BE0534, expect: 4660, output: " + val, val === 4660);
}

// Test Case 39: Create from hex string
{
    let buf = new FastBuffer("cafebabe", "hex");
    map.set("testFromHex0538, expect: cafebabe, output: " + buf.toString('hex'), buf.toString('hex') === "cafebabe");
}

// Test Case 43: Fill buffer with numeric value
{
    let buf = new FastBuffer(3);
    buf.fill(65); // ASCII 'A'
    map.set("testFill0542, expect: AAA, output: " + buf.toString(), buf.toString() === "AAA");
}

// Test Case 46: Find index of non-existent substring
{
    let buf = new FastBuffer("content");
    let index = buf.indexOf("xyz");
    map.set("testIndexOf0545, expect: -1, output: " + index, index === -1);
}

// Test Case 47: Check includes with special characters
{
    let buf = new FastBuffer("100% ✓");
    let flag = buf.includes("% ✓");
    map.set("testIncludes0546, expect: true, output: " + flag, flag === true);
}

// Test Case 48: Iterate buffer entries
{
    let buf = new FastBuffer("AB");
    let entries = Array.from(buf.entries());
    let entriesStr = entries.map(e => e.join(':')).join(';');
    map.set("testEntries0547, expect: 0:65;1:66, output: " + entriesStr, entriesStr === "0:65;1:66");
}

// Test Case 49: Write DoubleLE value
{
    let buf = new FastBuffer(8);
    buf.writeDoubleLE(123.456, 0);
    let hex = buf.toString('hex');
    map.set("testWriteDoubleLE0548, expect: 77be9f1a2fdd5e40, output: " + hex, hex === "77be9f1a2fdd5e40");
}

// Test Case 50: Read UInt32LE value
{
    let buf = new FastBuffer([0x78, 0x56, 0x34, 0x12]);
    let val = buf.readUInt32LE(0);
    map.set("testReadUInt32LE0549, expect: 305419896, output: " + val, val === 305419896);
}

// ===== fill() =====
{
  // 1. Fill with Unicode characters
  let buf = new FastBuffer(12).fill("★");
  let str = buf.toString();
  map.set("testFill1001, expect: ★★★★, output: " + str, str === "★★★★");
}

{
  // 2. Fill partial buffer with multi-byte character
  let buf = new FastBuffer(5).fill("€", 1, 4);
  let str = buf.toString();
  map.set("testFill1002, expect: \0€\0, output: " + str, str === "\0€\0");
}

{
  // 3. Fill empty buffer (no-op)
  let buf = new FastBuffer(0).fill("X");
  map.set("testFill1003, expect: 0, output: " + buf.length, buf.length === 0);
}

// ===== write() =====
{
  // 1. Write with offset exceeding buffer length
  let buf = new FastBuffer(5);
  try {
    buf.write("data", 6);
  } catch (err) {
    let expectMsg = 'The value of "offset" is out of range. It must be >= 0 and <= 4. Received value is: 6';
    map.set("testWrite1004, expect: " + expectMsg + ", output: " + err.message, err.message === expectMsg);
  }
}

{
  // 2. Write partial UTF-8 string
  let buf = new FastBuffer(10);
  buf.write("汉字测试", 2, 3);
  map.set("testWrite1005, expect: 汉, output: " + buf.toString(), buf.toString().includes("汉"));
}

{
  // 3. Write exact buffer capacity
  let buf = new FastBuffer(5);
  let written = buf.write("12345");
  map.set("testWrite1006, expect: 5, output: " + written, written === 5);
}

// ===== compare() =====
{
  // 1. Compare buffers with Unicode equality
  let buf1 = new FastBuffer("αβγ");
  let buf2 = new FastBuffer("αβγ");
  let res = buf1.compare(buf2);
  map.set("testCompare1007, expect: 0, output: " + res, res === 0);
}

{
  // 2. Compare buffers with different lengths
  let buf1 = new FastBuffer("apple");
  let buf2 = new FastBuffer("app");
  let res = buf1.compare(buf2);
  map.set("testCompare1008, expect: 1, output: " + res, res === 1);
}

{
  // 3. Compare buffers with target offset
  let buf1 = new FastBuffer("xyz");
  let buf2 = new FastBuffer("abcxyz");
  let res = buf1.compare(buf2, 3);
  map.set("testCompare1009, expect: 0, output: " + res, res === 0);
}

// ===== equals() =====
{
  // 2. Compare different encoding representations
  let buf1 = new FastBuffer("café", "utf8");
  let buf2 = new FastBuffer("café", "latin1");
  let res = buf1.equals(buf2);
  map.set("testEquals1011, expect: false, output: " + res, res === false);
}

{
  // 3. Compare buffers with same content but different memory
  let buf1 = new FastBuffer("clone");
  let buf2 = new FastBuffer(buf1);
  let res = buf1.equals(buf2);
  map.set("testEquals1012, expect: true, output: " + res, res === true);
}

// ===== copy() =====
{
  // 1. Copy to offset position
  let buf1 = new FastBuffer("XYZ");
  let buf2 = new FastBuffer("ABCDEF");
  buf1.copy(buf2, 2);
  map.set("testCopy1013, expect: ABXYZF, output: " + buf2.toString(), buf2.toString() === "ABXYZF");
}

{
  // 2. Copy with source range
  let buf1 = new FastBuffer("123456");
  let buf2 = new FastBuffer("ABCDEF");
  buf1.copy(buf2, 1, 2, 5);
  map.set("testCopy1014, expect: A345EF, output: " + buf2.toString(), buf2.toString() === "A345EF");
}

{
  // 3. Copy empty buffer
  let buf1 = new FastBuffer("");
  let buf2 = new FastBuffer("test");
  let num = buf1.copy(buf2);
  map.set("testCopy1015, expect: 0, output: " + num, num === 0);
}

// ===== toString() =====
{
  let buf = new FastBuffer("中文");
  let str = buf.toString();
  map.set("testToString1016, expect: 中文, output: " + str, str === "中文");
}

{
  // 2. Convert binary data to hex
  let buf = new FastBuffer([0x48, 0x65, 0x6c, 0x6c, 0x6f]);
  let str = buf.toString("hex");
  map.set("testToString1017, expect: 48656c6c6f, output: " + str, str === "48656c6c6f");
}

{
  // 3. Convert to Base64URL
  let buf = new FastBuffer("safe<>");
  let str = buf.toString("base64url");
  map.set("testToString1018, expect: c2FmZTw-, output: " + str, str === "c2FmZTw-");
}

// ===== indexOf() =====
{
  let buf = new FastBuffer("寻找汉字");
  let idx = buf.indexOf("汉字");
  map.set("testIndexOf1019, expect: 6, output: " + idx, idx === 6);
}

{
  // 2. Search non-existent binary pattern
  let buf = new FastBuffer([0x01, 0x02, 0x03]);
  let idx = buf.indexOf("\x04");
  map.set("testIndexOf1020, expect: -1, output: " + idx, idx === -1);
}

{
  // 3. Search with start position beyond buffer
  let buf = new FastBuffer("test");
  let idx = buf.indexOf("t", 5);
  map.set("testIndexOf1021, expect: -1, output: " + idx, idx === -1);
}

// ===== lastIndexOf() =====
{
  // 1. Find last occurrence in mixed content
  let buf = new FastBuffer("a1b2c3d4e5");
  let idx = buf.lastIndexOf("3");
  map.set("testLastIndexOf1022, expect: 5, output: " + idx, idx === 5);
}

{
  // 2. Multi-byte character search
  let buf = new FastBuffer("€10€20€30");
  let idx = buf.lastIndexOf("€");
  map.set("testLastIndexOf1023, expect: 10, output: " + idx, idx === 10);
}

{
  // 3. Search with negative start position
  let buf = new FastBuffer("test");
  let idx = buf.lastIndexOf("t", -5);
  map.set("testLastIndexOf1024, expect: -1, output: " + idx, idx === -1);
}

// ===== includes() =====
{
  // 2. Check empty buffer
  let buf = new FastBuffer("");
  let flag = buf.includes("data");
  map.set("testIncludes1026, expect: false, output: " + flag, flag === false);
}

{
  // 3. Check partial match at boundary
  let buf = new FastBuffer("boundary");
  let flag = buf.includes("ary", 5);
  map.set("testIncludes1027, expect: true, output: " + flag, flag === true);
}

// ===== keys() =====
{
  // 1. Iterate empty buffer keys
  let buf = new FastBuffer(0);
  let keys = Array.from(buf.keys());
  map.set("testKeys1028, expect: , output: " + keys.join(','), keys.join(',') === "");
}

{
  // 2. Iterate large buffer keys
  let buf = new FastBuffer(1000);
  let keyCount = 0;
  for (const key of buf.keys()) keyCount++;
  map.set("testKeys1029, expect: 1000, output: " + keyCount, keyCount === 1000);
}

{
  // 3. Verify key order
  let buf = new FastBuffer("ABC");
  let keys = Array.from(buf.keys());
  map.set("testKeys1030, expect: 0,1,2, output: " + keys.join(','), keys.join(',') === "0,1,2");
}

// ===== values() =====
{
  // 1. Iterate binary data values
  let buf = new FastBuffer([0x00, 0xFF, 0x7F]);
  let values = Array.from(buf.values());
  map.set("testValues1031, expect: 0,255,127, output: " + values.join(','), values.join(',') === "0,255,127");
}

{
  // 2. Verify Unicode code points
  let buf = new FastBuffer("Ω");
  let values = Array.from(buf.values());
  map.set("testValues1032, expect: 206,169, output: " + values.join(','), values.join(',') === "206,169");
}

{
  // 3. Empty buffer values
  let buf = new FastBuffer(0);
  let values = Array.from(buf.values());
  map.set("testValues1033, expect: , output: " + values.join(','), values.join(',') === "");
}


    {
        let size = 10;
        let buf = new FastBuffer(size);
        map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0001 failed, buffer length:" + buf.length, buf.length === 10);
    }

    {
        try {
            let size = UINT32_MAX + 1;
            let buf = new FastBuffer(size);
            map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0002 failed", false);
        } catch (e) {
            map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0002 failed, error code:" + e.code, e.code === 10200001);
        }
    }

    {
        try {
            let buf = new FastBuffer(null);
            map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0003 failed", false);
        } catch (e) {
            map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0003 failed, error code:" + e.code, e.code === 401);
        }
    }

    {
        try {
            let buf = new FastBuffer(10);
            buf.fill(' ');
            map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0004 failed, buffer length:" + buf.length, buf.length === 10);
        } catch (e) {
            map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0004 failed, error code:" + e.code, false);
        }
    }

    {
        try {
            let buf = new FastBuffer(10);
            buf.fill(null);
            map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0005 failed, buffer length:" + buf.length, buf.length === 10);
        } catch (e) {
            map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0005 failed, error code:" + e.code, false);
        }
    }

    {
        try {
            let buf1 = new FastBuffer(10);
            let buf = new FastBuffer(10);
            buf.fill(buf1);
            map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0006 failed, buffer length:" + buf.length, buf.length === 10);
        } catch (e) {
            map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0006 failed, error code:" + e.code, false);
        }
    }

    {
        try {
            let buf = new FastBuffer(10);
            buf.fill("ab$#", 0, 10, null);
            map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0007 failed, buffer length:" + buf.length, buf.length === 10);
        } catch (e) {
            map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0007 failed, error code:" + e.code, false);
        }
    }

    {
        try {
            let buf = new FastBuffer(0);
            map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0008 failed, buffer length:" + buf.length, buf.length === 0);
        } catch (e) {
            map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0008 failed, error code:" + e.code, false);
        }
    }

    {
        try {
            let buf1 = new FastBuffer(10);
            let buf = new FastBuffer(0);
            buf.fill(buf1);
            let flag = new FastBuffer(0);
            flag.fill(buf);
            map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0009 failed, flag length:" + flag.length, flag.length === 0);
        } catch (e) {
            map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0009 failed, error code:" + e.code, false);
        }
    }

    {
        try {
            let buf = new FastBuffer(-5);
            map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0010 failed", false);
        } catch (e) {
            map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0010 failed, error code:" + e.code, e.code === 10200001);
        }
    }

    {
        try {
            let buf = new FastBuffer(5.5);
            map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0011 failed, buffer length:", buf.length === 5);
        } catch (e) {
            map.set("SUB_COMMONLIBRARY_FASTBUFFER_BASETEST_ALLOC_0011 failed, error code:" + e.code, false);
        }
    }

    {
        var buffer1 = new FastBuffer(0x110);
        var buffer2 = new FastBuffer(buffer1,0,0x40000000); // now buffer2.length is 0x40000000
        // oob read
        try {
            for(let i = 0;i < 0x2000000;i++) {
                let value = buffer2.readUIntLE(i*4,4);
                if(value != 0) {
                    print(`offset 0x${(i*4).toString(16)} : 0x${value.toString(16)}`);
                }
            }
        } catch (e) {
            map.set("FASTBUFFER_OOB_TEST_0001 failed, error code:" + e.code, e.code === 10200001);
        }
    }

    {
        var buffer1 = new FastBuffer(0x110);
        var buffer2 = new FastBuffer(buffer1,0,0x40000000); // now buffer2.length is 0x40000000
        // oob write
        try {
            for(let i = 0;i < 0x1000000;i++) {
                buffer2.writeUIntLE(0xcafebabe, i*4, 4);
            }
        } catch (e) {
            map.set("FASTBUFFER_OOB_TEST_0002 failed, error code:" + e.code, e.code === 10200001);
        }
    }

    {
        let container_obj = new FastBuffer(0x110);
        try {
            container_obj.compare(0x41414141,0,1,0,1);
        } catch (e) {
            map.set("FASTBUFFER_OOB_TEST_0003 failed, error code:" + e.code, e.code === 401);
        }
    }

    {
        let container_obj = new FastBuffer("cdefg");
        let buf = new FastBuffer("abcde");
        map.set("FASTBUFFER_OOB_TEST_0004 failed", container_obj.compare(buf, 3, 2, 3, 2) === 0);
        map.set("FASTBUFFER_OOB_TEST_0004 failed", container_obj.compare(buf, 0, 2, 3, 2) === -1);
        map.set("FASTBUFFER_OOB_TEST_0004 failed", container_obj.compare(buf, 3, 2, 0, 2) === 1);
    }

    {
        let container_obj = new FastBuffer("cdefg");
        let buf = new FastBuffer(container_obj.buffer, 0, 114514);
        map.set("FASTBUFFER_OOB_TEST_0005 failed", buf.length === 5 && buf.toString() === "cdefg");
    }

    {
        let fast_buffer = new FastBuffer("1",0x1122);
        map.set("FASTBUFFER_BAD_PARAMETER_TEST_0001 failed", fast_buffer.toString() === "1");
    }

    let flag = undefined;
    function elements(value, key, map) {
        if (!value) {
            if (!flag) {
                flag = [];
            }
            flag.push(key);
        }
    }
    map.forEach(elements);
    if (!flag) {
        print("Test Buffer success!!!");
    } else {
        print("Test Buffer fail: " + flag);
    }
}
export let bufferRes = "Test Buffer done";