diff options
Diffstat (limited to 'test/js/node/buffer.test.js')
-rw-r--r-- | test/js/node/buffer.test.js | 5068 |
1 files changed, 2533 insertions, 2535 deletions
diff --git a/test/js/node/buffer.test.js b/test/js/node/buffer.test.js index e7b59113e..863f3129c 100644 --- a/test/js/node/buffer.test.js +++ b/test/js/node/buffer.test.js @@ -1,2540 +1,2538 @@ -// import { Buffer, SlowBuffer, isAscii, isUtf8 } from "buffer"; +import { Buffer, SlowBuffer, isAscii, isUtf8 } from "buffer"; import { describe, it, expect, beforeEach, afterEach } from "bun:test"; import { gc } from "harness"; -// console.log("0"); -// const BufferModule = await import("buffer"); -console.log("1"); -// beforeEach(() => gc()); -// afterEach(() => gc()); +const BufferModule = await import("buffer"); +beforeEach(() => gc()); +afterEach(() => gc()); it("isAscii", () => { - // expect(isAscii(new Buffer("abc"))).toBeTrue(); - // expect(isAscii(new Buffer(""))).toBeTrue(); - // expect(isAscii(new Buffer([32, 32, 128]))).toBeFalse(); - // expect(isAscii(new Buffer("What did the π¦ say?"))).toBeFalse(); - // expect(isAscii(new Buffer("").buffer)).toBeTrue(); - // expect(isAscii(new Buffer([32, 32, 128]).buffer)).toBeFalse(); -}); - -// it("isUtf8", () => { -// expect(isUtf8(new Buffer("abc"))).toBeTrue(); -// expect(isAscii(new Buffer(""))).toBeTrue(); -// expect(isUtf8(new Buffer("What did the π¦ say?"))).toBeTrue(); -// expect(isUtf8(new Buffer([129, 129, 129]))).toBeFalse(); - -// expect(isUtf8(new Buffer("abc").buffer)).toBeTrue(); -// expect(isAscii(new Buffer("").buffer)).toBeTrue(); -// expect(isUtf8(new Buffer("What did the π¦ say?").buffer)).toBeTrue(); -// expect(isUtf8(new Buffer([129, 129, 129]).buffer)).toBeFalse(); -// }); - -// // https://github.com/oven-sh/bun/issues/2052 -// it("Buffer global is settable", () => { -// var prevBuffer = globalThis.Buffer; -// globalThis.Buffer = 42; -// expect(globalThis.Buffer).toBe(42); -// globalThis.Buffer = prevBuffer; -// expect(globalThis.Buffer).toBe(BufferModule.Buffer); -// expect(globalThis.Buffer).toBe(prevBuffer); -// }); - -// it("length overflow", () => { -// // Verify the maximum Uint8Array size. There is no concrete limit by spec. The -// // internal limits should be updated if this fails. -// expect(() => new Uint8Array(2 ** 32 + 1)).toThrow(/length/); -// }); - -// it("truncate input values", () => { -// const b = Buffer.allocUnsafe(1024); -// expect(b.length).toBe(1024); - -// b[0] = -1; -// expect(b[0]).toBe(255); - -// for (let i = 0; i < 1024; i++) { -// b[i] = i; -// } - -// for (let i = 0; i < 1024; i++) { -// expect(i % 256).toBe(b[i]); -// } -// }); - -// it("Buffer.allocUnsafe()", () => { -// const c = Buffer.allocUnsafe(512); -// expect(c.length).toBe(512); -// }); - -// it("Buffer.from()", () => { -// const d = Buffer.from([]); -// expect(d.length).toBe(0); -// }); - -// it("offset properties", () => { -// const b = Buffer.alloc(128); -// expect(b.length).toBe(128); -// expect(b.byteOffset).toBe(0); -// expect(b.offset).toBe(0); -// }); - -// it("creating a Buffer from a Uint32Array", () => { -// const ui32 = new Uint32Array(4).fill(42); -// const e = Buffer.from(ui32); -// for (const [index, value] of e.entries()) { -// expect(value).toBe(ui32[index]); -// } -// }); - -// it("creating a Buffer from a Uint32Array (old constructor)", () => { -// const ui32 = new Uint32Array(4).fill(42); -// const e = Buffer(ui32); -// for (const [key, value] of e.entries()) { -// expect(value).toBe(ui32[key]); -// } -// }); - -// it("invalid encoding", () => { -// const b = Buffer.allocUnsafe(64); -// // Test invalid encoding for Buffer.toString -// expect(() => b.toString("invalid")).toThrow(/encoding/); -// // Invalid encoding for Buffer.write -// expect(() => b.write("test string", 0, 5, "invalid")).toThrow(/encoding/); -// // Unsupported arguments for Buffer.write -// expect(() => b.write("test", "utf8", 0)).toThrow(/invalid/i); -// }); - -// it("create 0-length buffers", () => { -// Buffer.from(""); -// Buffer.from("", "ascii"); -// Buffer.from("", "latin1"); -// Buffer.alloc(0); -// Buffer.allocUnsafe(0); -// new Buffer(""); -// new Buffer("", "ascii"); -// new Buffer("", "latin1"); -// new Buffer("", "binary"); -// Buffer(0); -// }); - -// it("write() beyond end of buffer", () => { -// const b = Buffer.allocUnsafe(64); -// // Try to write a 0-length string beyond the end of b -// expect(() => b.write("", 2048)).toThrow(RangeError); -// // Throw when writing to negative offset -// expect(() => b.write("a", -1)).toThrow(RangeError); -// // Throw when writing past bounds from the pool -// expect(() => b.write("a", 2048)).toThrow(RangeError); -// // Throw when writing to negative offset -// expect(() => b.write("a", -1)).toThrow(RangeError); -// // Offset points to the end of the buffer and does not throw. -// // (see https://github.com/nodejs/node/issues/8127). -// Buffer.alloc(1).write("", 1, 0); -// }); - -// it("copy() beyond end of buffer", () => { -// const b = Buffer.allocUnsafe(64); -// // Try to copy 0 bytes worth of data into an empty buffer -// b.copy(Buffer.alloc(0), 0, 0, 0); -// // Try to copy 0 bytes past the end of the target buffer -// b.copy(Buffer.alloc(0), 1, 1, 1); -// b.copy(Buffer.alloc(1), 1, 1, 1); -// // Try to copy 0 bytes from past the end of the source buffer -// b.copy(Buffer.alloc(1), 0, 2048, 2048); -// }); - -// it("smart defaults and ability to pass string values as offset", () => { -// const writeTest = Buffer.from("abcdes"); -// writeTest.write("n", "ascii"); -// expect(() => writeTest.write("o", "1", "ascii")).toThrow(/offset/); -// writeTest.write("o", 1, "ascii"); -// writeTest.write("d", 2, "ascii"); -// writeTest.write("e", 3, "ascii"); -// writeTest.write("j", 4, "ascii"); -// expect(writeTest.toString()).toBe("nodejs"); -// }); - -// it("ASCII slice", () => { -// const buf = Buffer.allocUnsafe(256); -// const str = "hello world"; -// for (let i = 0; i < str.length; i++) { -// buf[i] = str.charCodeAt(i); -// } -// expect(buf.toString("ascii", 0, str.length)).toBe(str); - -// const offset = 100; -// expect(buf.write(str, offset, "ascii")).toBe(str.length); -// expect(buf.toString("ascii", offset, offset + str.length)).toBe(str); - -// const slice1 = buf.slice(offset, offset + str.length); -// const slice2 = buf.slice(offset, offset + str.length); -// for (let i = 0; i < str.length; i++) { -// expect(slice1[i]).toBe(slice2[i]); -// } -// }); - -// it("UTF-8 slice", () => { -// const b = Buffer.allocUnsafe(256); -// const utf8String = "Β‘hΞllΓ³ wΓ΄rld!"; -// const offset = 100; - -// b.write(utf8String, 0, Buffer.byteLength(utf8String), "utf8"); -// expect(b.toString("utf8", 0, Buffer.byteLength(utf8String))).toBe(utf8String); - -// expect(b.write(utf8String, offset, "utf8")).toBe(Buffer.byteLength(utf8String)); -// expect(b.toString("utf8", offset, offset + Buffer.byteLength(utf8String))).toBe(utf8String); - -// const sliceA = b.slice(offset, offset + Buffer.byteLength(utf8String)); -// const sliceB = b.slice(offset, offset + Buffer.byteLength(utf8String)); -// for (let i = 0; i < Buffer.byteLength(utf8String); i++) { -// expect(sliceA[i]).toBe(sliceB[i]); -// } - -// const slice = b.slice(100, 150); -// expect(slice.length).toBe(50); -// for (let i = 0; i < 50; i++) { -// expect(b[100 + i]).toBe(slice[i]); -// } -// }); - -// it("only top level parent propagates from allocPool", () => { -// const b = Buffer.allocUnsafe(5); -// const c = b.slice(0, 4); -// const d = c.slice(0, 2); -// expect(b.parent).toBe(c.parent); -// expect(b.parent).toBe(d.parent); -// }); - -// it("only top level parent propagates from a non-pooled instance", () => { -// const b = Buffer.allocUnsafeSlow(5); -// const c = b.slice(0, 4); -// const d = c.slice(0, 2); -// expect(c.parent).toBe(d.parent); -// }); - -// it("UTF-8 write() & slice()", () => { -// const testValue = "\u00F6\u65E5\u672C\u8A9E"; // ΓΆζ₯ζ¬θͺ -// const buffer = Buffer.allocUnsafe(32); -// const size = buffer.write(testValue, 0, "utf8"); -// const slice = buffer.toString("utf8", 0, size); -// expect(slice).toBe(testValue); -// }); - -// it("triple slice", () => { -// const a = Buffer.allocUnsafe(8); -// for (let i = 0; i < 8; i++) a[i] = i; -// const b = a.slice(4, 8); -// expect(b[0]).toBe(4); -// expect(b[1]).toBe(5); -// expect(b[2]).toBe(6); -// expect(b[3]).toBe(7); -// const c = b.slice(2, 4); -// expect(c[0]).toBe(6); -// expect(c[1]).toBe(7); -// }); - -// it("Buffer.from() with encoding", () => { -// const b = Buffer.from([23, 42, 255]); -// expect(b.length).toBe(3); -// expect(b[0]).toBe(23); -// expect(b[1]).toBe(42); -// expect(b[2]).toBe(255); -// expect(Buffer.from(b)).toStrictEqual(b); - -// // Test for proper UTF-8 Encoding -// expect(Buffer.from("ΓΌber")).toStrictEqual(Buffer.from([195, 188, 98, 101, 114])); - -// // Test for proper ascii Encoding, length should be 4 -// expect(Buffer.from("ΓΌber", "ascii")).toStrictEqual(Buffer.from([252, 98, 101, 114])); - -// ["ucs2", "ucs-2", "utf16le", "utf-16le"].forEach(encoding => { -// // Test for proper UTF16LE encoding, length should be 8 -// expect(Buffer.from("ΓΌber", encoding)).toStrictEqual(Buffer.from([252, 0, 98, 0, 101, 0, 114, 0])); - -// // Length should be 12 -// const b = Buffer.from("ΠΏΡΠΈΠ²Π΅Ρ", encoding); -// expect(b).toStrictEqual(Buffer.from([63, 4, 64, 4, 56, 4, 50, 4, 53, 4, 66, 4])); -// expect(b.toString(encoding)).toBe("ΠΏΡΠΈΠ²Π΅Ρ"); - -// const c = Buffer.from([0, 0, 0, 0, 0]); -// expect(c.length).toBe(5); -// expect(c.write("γγγγγ", encoding)).toBe(4); -// expect(c).toStrictEqual(Buffer.from([0x42, 0x30, 0x44, 0x30, 0x00])); -// }); - -// const c = Buffer.from("\uD83D\uDC4D", "utf-16le"); // THUMBS UP SIGN (U+1F44D) -// expect(c.length).toBe(4); -// expect(c).toStrictEqual(Buffer.from("3DD84DDC", "hex")); -// }); - -// it("construction from arrayish object", () => { -// const arrayIsh = { 0: 0, 1: 1, 2: 2, 3: 3, length: 4 }; -// expect(Buffer.from(arrayIsh)).toStrictEqual(Buffer.from([0, 1, 2, 3])); -// const strArrayIsh = { 0: "0", 1: "1", 2: "2", 3: "3", length: 4 }; -// expect(Buffer.from(strArrayIsh)).toStrictEqual(Buffer.from([0, 1, 2, 3])); -// }); - -// it("toString('base64')", () => { -// expect(Buffer.from("Man").toString("base64")).toBe("TWFu"); -// expect(Buffer.from("Woman").toString("base64")).toBe("V29tYW4="); -// }); - -// it("toString('base64url')", () => { -// expect(Buffer.from("Man").toString("base64url")).toBe("TWFu"); -// expect(Buffer.from("Woman").toString("base64url")).toBe("V29tYW4"); -// }); - -// it("regular and URL-safe base64 work both ways", () => { -// const expected = [0xff, 0xff, 0xbe, 0xff, 0xef, 0xbf, 0xfb, 0xef, 0xff]; -// expect(Buffer.from("//++/++/++//", "base64")).toStrictEqual(Buffer.from(expected)); -// expect(Buffer.from("__--_--_--__", "base64")).toStrictEqual(Buffer.from(expected)); -// expect(Buffer.from("//++/++/++//", "base64url")).toStrictEqual(Buffer.from(expected)); -// expect(Buffer.from("__--_--_--__", "base64url")).toStrictEqual(Buffer.from(expected)); -// }); - -// it("regular and URL-safe base64 work both ways with padding", () => { -// const expected = [0xff, 0xff, 0xbe, 0xff, 0xef, 0xbf, 0xfb, 0xef, 0xff, 0xfb]; -// expect(Buffer.from("//++/++/++//+w==", "base64")).toStrictEqual(Buffer.from(expected)); -// expect(Buffer.from("//++/++/++//+w==", "base64")).toStrictEqual(Buffer.from(expected)); -// expect(Buffer.from("//++/++/++//+w==", "base64url")).toStrictEqual(Buffer.from(expected)); -// expect(Buffer.from("//++/++/++//+w==", "base64url")).toStrictEqual(Buffer.from(expected)); -// }); - -// it("big example (base64 & base64url)", () => { -// const quote = -// "Man is distinguished, not only by his reason, but by this " + -// "singular passion from other animals, which is a lust " + -// "of the mind, that by a perseverance of delight in the " + -// "continued and indefatigable generation of knowledge, " + -// "exceeds the short vehemence of any carnal pleasure."; -// const expected = -// "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb" + -// "24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlci" + -// "BhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQ" + -// "gYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu" + -// "dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZ" + -// "GdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm" + -// "5hbCBwbGVhc3VyZS4="; - -// expect(Buffer.from(quote).toString("base64")).toBe(expected); -// expect(Buffer.from(quote).toString("base64url")).toBe( -// expected.replaceAll("+", "-").replaceAll("/", "_").replaceAll("=", ""), -// ); -// }); - -// function forEachBase64(label, test) { -// ["base64", "base64url"].forEach(encoding => it(`${label} (${encoding})`, test.bind(null, encoding))); -// } - -// forEachBase64("big example", encoding => { -// const quote = -// "Man is distinguished, not only by his reason, but by this " + -// "singular passion from other animals, which is a lust " + -// "of the mind, that by a perseverance of delight in the " + -// "continued and indefatigable generation of knowledge, " + -// "exceeds the short vehemence of any carnal pleasure."; -// const expected = -// "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb" + -// "24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlci" + -// "BhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQ" + -// "gYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu" + -// "dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZ" + -// "GdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm" + -// "5hbCBwbGVhc3VyZS4="; - -// const b = Buffer.allocUnsafe(1024); -// expect(b.write(expected, 0, encoding)).toBe(quote.length); -// expect(b.toString("ascii", 0, quote.length)).toBe(quote); - -// // Check that the base64 decoder ignores whitespace -// const white = -// `${expected.slice(0, 60)} \n` + -// `${expected.slice(60, 120)} \n` + -// `${expected.slice(120, 180)} \n` + -// `${expected.slice(180, 240)} \n` + -// `${expected.slice(240, 300)}\n` + -// `${expected.slice(300, 360)}\n`; -// const c = Buffer.allocUnsafe(1024); -// expect(c.write(white, 0, encoding)).toBe(quote.length); -// expect(c.toString("ascii", 0, quote.length)).toBe(quote); - -// // Check that the base64 decoder on the constructor works -// // even in the presence of whitespace. -// const d = Buffer.from(white, encoding); -// expect(d.length).toBe(quote.length); -// expect(d.toString("ascii", 0, quote.length)).toBe(quote); - -// // Check that the base64 decoder ignores illegal chars -// const illegal = -// expected.slice(0, 60) + -// " \x80" + -// expected.slice(60, 120) + -// " \xff" + -// expected.slice(120, 180) + -// " \x00" + -// expected.slice(180, 240) + -// " \x98" + -// expected.slice(240, 300) + -// "\x03" + -// expected.slice(300, 360); -// const e = Buffer.from(illegal, encoding); -// expect(e.length).toBe(quote.length); -// expect(e.toString("ascii", 0, quote.length)).toBe(quote); -// }); - -// forEachBase64("padding", encoding => { -// expect(Buffer.from("", encoding).toString()).toBe(""); -// expect(Buffer.from("K", encoding).toString()).toBe(""); -// // multiple-of-4 with padding -// expect(Buffer.from("Kg==", encoding).toString()).toBe("*"); -// expect(Buffer.from("Kio=", encoding).toString()).toBe("*".repeat(2)); -// expect(Buffer.from("Kioq", encoding).toString()).toBe("*".repeat(3)); -// expect(Buffer.from("KioqKg==", encoding).toString()).toBe("*".repeat(4)); -// expect(Buffer.from("KioqKio=", encoding).toString()).toBe("*".repeat(5)); -// expect(Buffer.from("KioqKioq", encoding).toString()).toBe("*".repeat(6)); -// expect(Buffer.from("KioqKioqKg==", encoding).toString()).toBe("*".repeat(7)); -// expect(Buffer.from("KioqKioqKio=", encoding).toString()).toBe("*".repeat(8)); -// expect(Buffer.from("KioqKioqKioq", encoding).toString()).toBe("*".repeat(9)); -// expect(Buffer.from("KioqKioqKioqKg==", encoding).toString()).toBe("*".repeat(10)); -// expect(Buffer.from("KioqKioqKioqKio=", encoding).toString()).toBe("*".repeat(11)); -// expect(Buffer.from("KioqKioqKioqKioq", encoding).toString()).toBe("*".repeat(12)); -// expect(Buffer.from("KioqKioqKioqKioqKg==", encoding).toString()).toBe("*".repeat(13)); -// expect(Buffer.from("KioqKioqKioqKioqKio=", encoding).toString()).toBe("*".repeat(14)); -// expect(Buffer.from("KioqKioqKioqKioqKioq", encoding).toString()).toBe("*".repeat(15)); -// expect(Buffer.from("KioqKioqKioqKioqKioqKg==", encoding).toString()).toBe("*".repeat(16)); -// expect(Buffer.from("KioqKioqKioqKioqKioqKio=", encoding).toString()).toBe("*".repeat(17)); -// expect(Buffer.from("KioqKioqKioqKioqKioqKioq", encoding).toString()).toBe("*".repeat(18)); -// expect(Buffer.from("KioqKioqKioqKioqKioqKioqKg==", encoding).toString()).toBe("*".repeat(19)); -// expect(Buffer.from("KioqKioqKioqKioqKioqKioqKio=", encoding).toString()).toBe("*".repeat(20)); -// // No padding, not a multiple of 4 -// expect(Buffer.from("Kg", encoding).toString()).toBe("*"); -// expect(Buffer.from("Kio", encoding).toString()).toBe("*".repeat(2)); -// expect(Buffer.from("KioqKg", encoding).toString()).toBe("*".repeat(4)); -// expect(Buffer.from("KioqKio", encoding).toString()).toBe("*".repeat(5)); -// expect(Buffer.from("KioqKioqKg", encoding).toString()).toBe("*".repeat(7)); -// expect(Buffer.from("KioqKioqKio", encoding).toString()).toBe("*".repeat(8)); -// expect(Buffer.from("KioqKioqKioqKg", encoding).toString()).toBe("*".repeat(10)); -// expect(Buffer.from("KioqKioqKioqKio", encoding).toString()).toBe("*".repeat(11)); -// expect(Buffer.from("KioqKioqKioqKioqKg", encoding).toString()).toBe("*".repeat(13)); -// expect(Buffer.from("KioqKioqKioqKioqKio", encoding).toString()).toBe("*".repeat(14)); -// expect(Buffer.from("KioqKioqKioqKioqKioqKg", encoding).toString()).toBe("*".repeat(16)); -// expect(Buffer.from("KioqKioqKioqKioqKioqKio", encoding).toString()).toBe("*".repeat(17)); -// expect(Buffer.from("KioqKioqKioqKioqKioqKioqKg", encoding).toString()).toBe("*".repeat(19)); -// expect(Buffer.from("KioqKioqKioqKioqKioqKioqKio", encoding).toString()).toBe("*".repeat(20)); -// // Handle padding graciously, multiple-of-4 or not -// expect(Buffer.from("72INjkR5fchcxk9+VgdGPFJDxUBFR5/rMFsghgxADiw==", encoding).length).toBe(32); -// expect(Buffer.from("72INjkR5fchcxk9-VgdGPFJDxUBFR5_rMFsghgxADiw==", encoding).length).toBe(32); -// expect(Buffer.from("72INjkR5fchcxk9+VgdGPFJDxUBFR5/rMFsghgxADiw=", encoding).length).toBe(32); -// expect(Buffer.from("72INjkR5fchcxk9-VgdGPFJDxUBFR5_rMFsghgxADiw=", encoding).length).toBe(32); -// expect(Buffer.from("72INjkR5fchcxk9+VgdGPFJDxUBFR5/rMFsghgxADiw", encoding).length).toBe(32); -// expect(Buffer.from("72INjkR5fchcxk9-VgdGPFJDxUBFR5_rMFsghgxADiw", encoding).length).toBe(32); -// expect(Buffer.from("w69jACy6BgZmaFvv96HG6MYksWytuZu3T1FvGnulPg==", encoding).length).toBe(31); -// expect(Buffer.from("w69jACy6BgZmaFvv96HG6MYksWytuZu3T1FvGnulPg=", encoding).length).toBe(31); -// expect(Buffer.from("w69jACy6BgZmaFvv96HG6MYksWytuZu3T1FvGnulPg", encoding).length).toBe(31); -// }); - -// it("encodes single '.' character in UTF-16", () => { -// const padded = Buffer.from("//4uAA==", "base64"); -// expect(padded[0]).toBe(0xff); -// expect(padded[1]).toBe(0xfe); -// expect(padded[2]).toBe(0x2e); -// expect(padded[3]).toBe(0x00); -// expect(padded.toString("base64")).toBe("//4uAA=="); - -// const dot = Buffer.from("//4uAA", "base64url"); -// expect(dot[0]).toBe(0xff); -// expect(dot[1]).toBe(0xfe); -// expect(dot[2]).toBe(0x2e); -// expect(dot[3]).toBe(0x00); -// expect(dot.toString("base64url")).toBe("__4uAA"); -// }); - -// // https://github.com/joyent/node/issues/402 -// it("writing base64 at a position > 0 should not mangle the result", () => { -// const segments = ["TWFkbmVzcz8h", "IFRoaXM=", "IGlz", "IG5vZGUuanMh"]; -// const b = Buffer.allocUnsafe(64); -// let pos = 0; - -// for (let i = 0; i < segments.length; ++i) { -// pos += b.write(segments[i], pos, "base64"); -// } -// expect(b.toString("latin1", 0, pos)).toBe("Madness?! This is node.js!"); -// }); - -// // https://github.com/joyent/node/issues/402 -// it("writing base64url at a position > 0 should not mangle the result", () => { -// const segments = ["TWFkbmVzcz8h", "IFRoaXM", "IGlz", "IG5vZGUuanMh"]; -// const b = Buffer.allocUnsafe(64); -// let pos = 0; - -// for (let i = 0; i < segments.length; ++i) { -// pos += b.write(segments[i], pos, "base64url"); -// } -// expect(b.toString("latin1", 0, pos)).toBe("Madness?! This is node.js!"); -// }); - -// it("regression tests from Node.js", () => { -// // Regression test for https://github.com/nodejs/node/issues/3496. -// expect(Buffer.from("=bad".repeat(1e4), "base64").length).toBe(0); -// // Regression test for https://github.com/nodejs/node/issues/11987. -// expect(Buffer.from("w0 ", "base64")).toStrictEqual(Buffer.from("w0", "base64")); -// // Regression test for https://github.com/nodejs/node/issues/13657. -// expect(Buffer.from(" YWJvcnVtLg", "base64")).toStrictEqual(Buffer.from("YWJvcnVtLg", "base64")); -// // issue GH-3416 -// Buffer.from(Buffer.allocUnsafe(0), 0, 0); -// // Regression test for https://github.com/nodejs/node-v0.x-archive/issues/5482: -// // should throw but not assert in C++ land. -// expect(() => Buffer.from("", "buffer")).toThrow(/encoding/); -// }); - -// it("creating buffers larger than pool size", () => { -// const l = Buffer.poolSize + 5; -// const s = "h".repeat(l); -// const b = Buffer.from(s); - -// for (let i = 0; i < l; i++) { -// expect(b[i]).toBe("h".charCodeAt(0)); -// } - -// const sb = b.toString(); -// expect(sb.length).toBe(s.length); -// expect(sb).toBe(s); -// }); - -// it("hex toString()", () => { -// const hexb = Buffer.allocUnsafe(256); -// for (let i = 0; i < 256; i++) { -// hexb[i] = i; -// } -// const hexStr = hexb.toString("hex"); -// expect(hexStr).toBe( -// "000102030405060708090a0b0c0d0e0f" + -// "101112131415161718191a1b1c1d1e1f" + -// "202122232425262728292a2b2c2d2e2f" + -// "303132333435363738393a3b3c3d3e3f" + -// "404142434445464748494a4b4c4d4e4f" + -// "505152535455565758595a5b5c5d5e5f" + -// "606162636465666768696a6b6c6d6e6f" + -// "707172737475767778797a7b7c7d7e7f" + -// "808182838485868788898a8b8c8d8e8f" + -// "909192939495969798999a9b9c9d9e9f" + -// "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf" + -// "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf" + -// "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf" + -// "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf" + -// "e0e1e2e3e4e5e6e7e8e9eaebecedeeef" + -// "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", -// ); - -// const hexb2 = Buffer.from(hexStr, "hex"); -// for (let i = 0; i < 256; i++) { -// expect(hexb2[i]).toBe(hexb[i]); -// } -// }); - -// it("single hex character is discarded", () => { -// expect(Buffer.from("A", "hex").length).toBe(0); -// }); - -// it("if a trailing character is discarded, rest of string is processed", () => { -// expect(Buffer.from("Abx", "hex")).toEqual(Buffer.from("Ab", "hex")); -// }); - -// it("single base64 char encodes as 0", () => { -// expect(Buffer.from("A", "base64").length).toBe(0); -// }); - -// it("invalid slice end", () => { -// const b = Buffer.from([1, 2, 3, 4, 5]); -// const b2 = b.toString("hex", 1, 10000); -// const b3 = b.toString("hex", 1, 5); -// const b4 = b.toString("hex", 1); -// expect(b2).toBe(b3); -// expect(b2).toBe(b4); -// }); - -// it("slice()", () => { -// function buildBuffer(data) { -// if (Array.isArray(data)) { -// const buffer = Buffer.allocUnsafe(data.length); -// data.forEach((v, k) => (buffer[k] = v)); -// return buffer; -// } -// return null; -// } - -// const x = buildBuffer([0x81, 0xa3, 0x66, 0x6f, 0x6f, 0xa3, 0x62, 0x61, 0x72]); -// expect(x).toStrictEqual(Buffer.from([0x81, 0xa3, 0x66, 0x6f, 0x6f, 0xa3, 0x62, 0x61, 0x72])); - -// const a = x.slice(4); -// expect(a.length).toBe(5); -// expect(a[0]).toBe(0x6f); -// expect(a[1]).toBe(0xa3); -// expect(a[2]).toBe(0x62); -// expect(a[3]).toBe(0x61); -// expect(a[4]).toBe(0x72); - -// const b = x.slice(0); -// expect(b.length).toBe(x.length); - -// const c = x.slice(0, 4); -// expect(c.length).toBe(4); -// expect(c[0]).toBe(0x81); -// expect(c[1]).toBe(0xa3); - -// const d = x.slice(0, 9); -// expect(d.length).toBe(9); - -// const e = x.slice(1, 4); -// expect(e.length).toBe(3); -// expect(e[0]).toBe(0xa3); - -// const f = x.slice(2, 4); -// expect(f.length).toBe(2); -// expect(f[0]).toBe(0x66); -// expect(f[1]).toBe(0x6f); -// }); - -// function forEachUnicode(label, test) { -// ["ucs2", "ucs-2", "utf16le", "utf-16le"].forEach(encoding => it(`${label} (${encoding})`, test.bind(null, encoding))); -// } - -// forEachUnicode("write()", encoding => { -// const b = Buffer.allocUnsafe(10); -// b.write("γγγγγ", encoding); -// expect(b.toString(encoding)).toBe("γγγγγ"); -// }); - -// forEachUnicode("write() with offset", encoding => { -// const b = Buffer.allocUnsafe(11); -// b.write("γγγγγ", 1, encoding); -// expect(b.toString(encoding, 1)).toBe("γγγγγ"); -// }); - -// it("latin1 encoding should write only one byte per character", () => { -// const b = Buffer.from([0xde, 0xad, 0xbe, 0xef]); -// b.write(String.fromCharCode(0xffff), 0, "latin1"); -// expect(b[0]).toBe(0xff); -// expect(b[1]).toBe(0xad); -// expect(b[2]).toBe(0xbe); -// expect(b[3]).toBe(0xef); -// b.write(String.fromCharCode(0xaaee), 0, "latin1"); -// expect(b[0]).toBe(0xee); -// expect(b[1]).toBe(0xad); -// expect(b[2]).toBe(0xbe); -// expect(b[3]).toBe(0xef); -// }); - -// it("binary encoding should write only one byte per character", () => { -// const b = Buffer.from([0xde, 0xad, 0xbe, 0xef]); -// b.write(String.fromCharCode(0xffff), 0, "latin1"); -// expect(b[0]).toBe(0xff); -// expect(b[1]).toBe(0xad); -// expect(b[2]).toBe(0xbe); -// expect(b[3]).toBe(0xef); -// b.write(String.fromCharCode(0xaaee), 0, "latin1"); -// expect(b[0]).toBe(0xee); -// expect(b[1]).toBe(0xad); -// expect(b[2]).toBe(0xbe); -// expect(b[3]).toBe(0xef); -// }); - -// it("UTF-8 string includes null character", () => { -// // https://github.com/nodejs/node-v0.x-archive/pull/1210 -// expect(Buffer.from("\0").length).toBe(1); -// expect(Buffer.from("\0\0").length).toBe(2); -// }); - -// it("truncate write() at character boundary", () => { -// const buf = Buffer.allocUnsafe(2); -// expect(buf.write("")).toBe(0); // 0bytes -// expect(buf.write("\0")).toBe(1); // 1byte (v8 adds null terminator) -// expect(buf.write("a\0")).toBe(2); // 1byte * 2 -// expect(buf.write("γ")).toBe(0); // 3bytes -// expect(buf.write("\0γ")).toBe(1); // 1byte + 3bytes -// expect(buf.write("\0\0γ")).toBe(2); // 1byte * 2 + 3bytes - -// const buf2 = Buffer.allocUnsafe(10); -// expect(buf2.write("γγγ")).toBe(9); // 3bytes * 3 (v8 adds null term.) -// expect(buf2.write("γγγ\0")).toBe(10); // 3bytes * 3 + 1byte -// }); - -// it("write() with maxLength", () => { -// // https://github.com/nodejs/node-v0.x-archive/issues/243 -// const buf = Buffer.allocUnsafe(4); -// buf.fill(0xff); -// expect(buf.write("abcd", 1, 2, "utf8")).toBe(2); -// expect(buf[0]).toBe(0xff); -// expect(buf[1]).toBe(0x61); -// expect(buf[2]).toBe(0x62); -// expect(buf[3]).toBe(0xff); - -// buf.fill(0xff); -// expect(buf.write("abcd", 1, 4)).toBe(3); -// expect(buf[0]).toBe(0xff); -// expect(buf[1]).toBe(0x61); -// expect(buf[2]).toBe(0x62); -// expect(buf[3]).toBe(0x63); - -// buf.fill(0xff); -// expect(buf.write("abcd", 1, 2, "utf8")).toBe(2); -// expect(buf[0]).toBe(0xff); -// expect(buf[1]).toBe(0x61); -// expect(buf[2]).toBe(0x62); -// expect(buf[3]).toBe(0xff); - -// buf.fill(0xff); -// expect(buf.write("abcdef", 1, 2, "hex")).toBe(2); -// expect(buf[0]).toBe(0xff); -// expect(buf[1]).toBe(0xab); -// expect(buf[2]).toBe(0xcd); -// expect(buf[3]).toBe(0xff); - -// ["ucs2", "ucs-2", "utf16le", "utf-16le"].forEach(encoding => { -// buf.fill(0xff); -// expect(buf.write("abcd", 0, 2, encoding)).toBe(2); -// expect(buf[0]).toBe(0x61); -// expect(buf[1]).toBe(0x00); -// expect(buf[2]).toBe(0xff); -// expect(buf[3]).toBe(0xff); -// }); -// }); - -// it("offset returns are correct", () => { -// const b = Buffer.allocUnsafe(16); -// expect(b.writeUInt32LE(0, 0)).toBe(4); -// expect(b.writeUInt16LE(0, 4)).toBe(6); -// expect(b.writeUInt8(0, 6)).toBe(7); -// expect(b.writeInt8(0, 7)).toBe(8); -// expect(b.writeDoubleLE(0, 8)).toBe(16); -// }); - -// it("unmatched surrogates should not produce invalid utf8 output", () => { -// // ef bf bd = utf-8 representation of unicode replacement character -// // see https://codereview.chromium.org/121173009/ -// let buf = Buffer.from("ab\ud800cd", "utf8"); -// expect(buf[0]).toBe(0x61); -// expect(buf[1]).toBe(0x62); -// expect(buf[2]).toBe(0xef); -// expect(buf[3]).toBe(0xbf); -// expect(buf[4]).toBe(0xbd); -// expect(buf[5]).toBe(0x63); -// expect(buf[6]).toBe(0x64); - -// buf = Buffer.from("abcd\ud800", "utf8"); -// expect(buf[0]).toBe(0x61); -// expect(buf[1]).toBe(0x62); -// expect(buf[2]).toBe(0x63); -// expect(buf[3]).toBe(0x64); -// expect(buf[4]).toBe(0xef); -// expect(buf[5]).toBe(0xbf); -// expect(buf[6]).toBe(0xbd); - -// buf = Buffer.from("\ud800abcd", "utf8"); -// expect(buf[0]).toBe(0xef); -// expect(buf[1]).toBe(0xbf); -// expect(buf[2]).toBe(0xbd); -// expect(buf[3]).toBe(0x61); -// expect(buf[4]).toBe(0x62); -// expect(buf[5]).toBe(0x63); -// expect(buf[6]).toBe(0x64); -// }); - -// it("buffer overrun", () => { -// const buf = Buffer.from([0, 0, 0, 0, 0]); // length: 5 -// const sub = buf.slice(0, 4); // length: 4 -// expect(sub.write("12345", "latin1")).toBe(4); -// expect(buf[4]).toBe(0); -// expect(sub.write("12345", "binary")).toBe(4); -// expect(buf[4]).toBe(0); -// }); - -// it("alloc with fill option", () => { -// const buf = Buffer.alloc(5, "800A", "hex"); -// expect(buf[0]).toBe(128); -// expect(buf[1]).toBe(10); -// expect(buf[2]).toBe(128); -// expect(buf[3]).toBe(10); -// expect(buf[4]).toBe(128); -// }); - -// // https://github.com/joyent/node/issues/1758 -// it("check for fractional length args, junk length args, etc.", () => { -// // Call .fill() first, stops valgrind warning about uninitialized memory reads. -// Buffer.allocUnsafe(3.3).fill().toString(); -// // Throws bad argument error in commit 43cb4ec -// Buffer.alloc(3.3).fill().toString(); -// expect(Buffer.allocUnsafe(3.3).length).toBe(3); -// expect(Buffer.from({ length: 3.3 }).length).toBe(3); -// expect(Buffer.from({ length: "BAM" }).length).toBe(0); -// // Make sure that strings are not coerced to numbers. -// expect(Buffer.from("99").length).toBe(2); -// expect(Buffer.from("13.37").length).toBe(5); -// // Ensure that the length argument is respected. -// ["ascii", "utf8", "hex", "base64", "latin1", "binary"].forEach(enc => { -// expect(Buffer.allocUnsafe(1).write("aaaaaa", 0, 1, enc)).toBe(1); -// }); -// // Regression test, guard against buffer overrun in the base64 decoder. -// const a = Buffer.allocUnsafe(3); -// const b = Buffer.from("xxx"); -// a.write("aaaaaaaa", "base64"); -// expect(b.toString()).toBe("xxx"); -// }); - -// it("buffer overflow", () => { -// // issue GH-5587 -// expect(() => Buffer.alloc(8).writeFloatLE(0, 5)).toThrow(RangeError); -// expect(() => Buffer.alloc(16).writeDoubleLE(0, 9)).toThrow(RangeError); -// // Attempt to overflow buffers, similar to previous bug in array buffers -// expect(() => Buffer.allocUnsafe(8).writeFloatLE(0.0, 0xffffffff)).toThrow(RangeError); -// expect(() => Buffer.allocUnsafe(8).writeFloatLE(0.0, 0xffffffff)).toThrow(RangeError); -// // Ensure negative values can't get past offset -// expect(() => Buffer.allocUnsafe(8).writeFloatLE(0.0, -1)).toThrow(RangeError); -// expect(() => Buffer.allocUnsafe(8).writeFloatLE(0.0, -1)).toThrow(RangeError); -// }); - -// it("common write{U}IntLE/BE()", () => { -// let buf = Buffer.allocUnsafe(3); -// buf.writeUIntLE(0x123456, 0, 3); -// expect(buf.toJSON().data).toEqual([0x56, 0x34, 0x12]); -// expect(buf.readUIntLE(0, 3)).toBe(0x123456); - -// buf.fill(0xff); -// buf.writeUIntBE(0x123456, 0, 3); -// expect(buf.toJSON().data).toEqual([0x12, 0x34, 0x56]); -// expect(buf.readUIntBE(0, 3)).toBe(0x123456); - -// buf.fill(0xff); -// buf.writeIntLE(0x123456, 0, 3); -// expect(buf.toJSON().data).toEqual([0x56, 0x34, 0x12]); -// expect(buf.readIntLE(0, 3)).toBe(0x123456); - -// buf.fill(0xff); -// buf.writeIntBE(0x123456, 0, 3); -// expect(buf.toJSON().data).toEqual([0x12, 0x34, 0x56]); -// expect(buf.readIntBE(0, 3)).toBe(0x123456); - -// buf.fill(0xff); -// buf.writeIntLE(-0x123456, 0, 3); -// expect(buf.toJSON().data).toEqual([0xaa, 0xcb, 0xed]); -// expect(buf.readIntLE(0, 3)).toBe(-0x123456); - -// buf.fill(0xff); -// buf.writeIntBE(-0x123456, 0, 3); -// expect(buf.toJSON().data).toEqual([0xed, 0xcb, 0xaa]); -// expect(buf.readIntBE(0, 3)).toBe(-0x123456); - -// buf.fill(0xff); -// buf.writeIntLE(-0x123400, 0, 3); -// expect(buf.toJSON().data).toEqual([0x00, 0xcc, 0xed]); -// expect(buf.readIntLE(0, 3)).toBe(-0x123400); - -// buf.fill(0xff); -// buf.writeIntBE(-0x123400, 0, 3); -// expect(buf.toJSON().data).toEqual([0xed, 0xcc, 0x00]); -// expect(buf.readIntBE(0, 3)).toBe(-0x123400); - -// buf.fill(0xff); -// buf.writeIntLE(-0x120000, 0, 3); -// expect(buf.toJSON().data).toEqual([0x00, 0x00, 0xee]); -// expect(buf.readIntLE(0, 3)).toBe(-0x120000); - -// buf.fill(0xff); -// buf.writeIntBE(-0x120000, 0, 3); -// expect(buf.toJSON().data).toEqual([0xee, 0x00, 0x00]); -// expect(buf.readIntBE(0, 3)).toBe(-0x120000); - -// buf = Buffer.allocUnsafe(5); -// buf.writeUIntLE(0x1234567890, 0, 5); -// expect(buf.toJSON().data).toEqual([0x90, 0x78, 0x56, 0x34, 0x12]); -// expect(buf.readUIntLE(0, 5)).toBe(0x1234567890); - -// buf.fill(0xff); -// buf.writeUIntBE(0x1234567890, 0, 5); -// expect(buf.toJSON().data).toEqual([0x12, 0x34, 0x56, 0x78, 0x90]); -// expect(buf.readUIntBE(0, 5)).toBe(0x1234567890); - -// buf.fill(0xff); -// buf.writeIntLE(0x1234567890, 0, 5); -// expect(buf.toJSON().data).toEqual([0x90, 0x78, 0x56, 0x34, 0x12]); -// expect(buf.readIntLE(0, 5)).toBe(0x1234567890); - -// buf.fill(0xff); -// buf.writeIntBE(0x1234567890, 0, 5); -// expect(buf.toJSON().data).toEqual([0x12, 0x34, 0x56, 0x78, 0x90]); -// expect(buf.readIntBE(0, 5)).toBe(0x1234567890); - -// buf.fill(0xff); -// buf.writeIntLE(-0x1234567890, 0, 5); -// expect(buf.toJSON().data).toEqual([0x70, 0x87, 0xa9, 0xcb, 0xed]); -// expect(buf.readIntLE(0, 5)).toBe(-0x1234567890); - -// buf.fill(0xff); -// buf.writeIntBE(-0x1234567890, 0, 5); -// expect(buf.toJSON().data).toEqual([0xed, 0xcb, 0xa9, 0x87, 0x70]); -// expect(buf.readIntBE(0, 5)).toBe(-0x1234567890); - -// buf.fill(0xff); -// buf.writeIntLE(-0x0012000000, 0, 5); -// expect(buf.toJSON().data).toEqual([0x00, 0x00, 0x00, 0xee, 0xff]); -// expect(buf.readIntLE(0, 5)).toBe(-0x0012000000); - -// buf.fill(0xff); -// buf.writeIntBE(-0x0012000000, 0, 5); -// expect(buf.toJSON().data).toEqual([0xff, 0xee, 0x00, 0x00, 0x00]); -// expect(buf.readIntBE(0, 5)).toBe(-0x0012000000); -// }); - -// it("construct buffer from buffer", () => { -// // Regression test for https://github.com/nodejs/node-v0.x-archive/issues/6111. -// // Constructing a buffer from another buffer should a) work, and b) not corrupt -// // the source buffer. -// const a = [...Array(128).keys()]; // [0, 1, 2, 3, ... 126, 127] -// const b = Buffer.from(a); -// const c = Buffer.from(b); -// expect(b.length).toBe(a.length); -// expect(c.length).toBe(a.length); -// for (let i = 0, k = a.length; i < k; ++i) { -// expect(a[i]).toBe(i); -// expect(b[i]).toBe(i); -// expect(c[i]).toBe(i); -// } -// }); - -// it("truncation after decode", () => { -// const crypto = require("crypto"); - -// expect(crypto.createHash("sha1").update(Buffer.from("YW55=======", "base64")).digest("hex")).toBe( -// crypto.createHash("sha1").update(Buffer.from("YW55", "base64")).digest("hex"), -// ); -// }); - -// it("Buffer,poolSize", () => { -// const ps = Buffer.poolSize; -// Buffer.poolSize = 0; -// expect(Buffer.allocUnsafe(1).parent instanceof ArrayBuffer).toBe(true); -// Buffer.poolSize = ps; - -// expect(() => Buffer.allocUnsafe(10).copy()).toThrow(TypeError); - -// expect(() => Buffer.from()).toThrow(TypeError); -// expect(() => Buffer.from(null)).toThrow(TypeError); -// }); - -// it("prototype getters should not throw", () => { -// expect(Buffer.prototype.parent).toBeUndefined(); -// expect(Buffer.prototype.offset).toBeUndefined(); -// expect(SlowBuffer.prototype.parent).toBeUndefined(); -// expect(SlowBuffer.prototype.offset).toBeUndefined(); -// }); - -// it("large negative Buffer length inputs should not affect pool offset", () => { -// // Use the fromArrayLike() variant here because it's more lenient -// // about its input and passes the length directly to allocate(). -// expect(Buffer.from({ length: -Buffer.poolSize })).toStrictEqual(Buffer.from("")); -// expect(Buffer.from({ length: -100 })).toStrictEqual(Buffer.from("")); - -// // Check pool offset after that by trying to write string into the pool. -// Buffer.from("abc"); -// }); - -// it("ParseArrayIndex() should handle full uint32", () => { -// expect(() => Buffer.from(new ArrayBuffer(0), -1 >>> 0)).toThrow(RangeError); -// }); - -// it("ParseArrayIndex() should reject values that don't fit in a 32 bits size_t", () => { -// expect(() => { -// const a = Buffer.alloc(1); -// const b = Buffer.alloc(1); -// a.copy(b, 0, 0x100000000, 0x100000001); -// }).toThrow(RangeError); -// }); - -// it("unpooled buffer (replaces SlowBuffer)", () => { -// const ubuf = Buffer.allocUnsafeSlow(10); -// expect(ubuf).toBeTruthy(); -// expect(ubuf.buffer).toBeTruthy(); -// expect(ubuf.buffer.byteLength).toBe(10); -// }); - -// it("verify that an empty ArrayBuffer does not throw", () => { -// Buffer.from(new ArrayBuffer()); -// }); - -// it("alloc() should throw on non-numeric size", () => { -// expect(() => Buffer.alloc({ valueOf: () => 1 })).toThrow(TypeError); -// expect(() => Buffer.alloc({ valueOf: () => -1 })).toThrow(TypeError); -// }); - -// it("toLocaleString()", () => { -// const buf = Buffer.from("test"); -// expect(buf.toLocaleString()).toBe(buf.toString()); -// // expect(Buffer.prototype.toLocaleString).toBe(Buffer.prototype.toString); -// }); - -// it("alloc() should throw on invalid data", () => { -// expect(() => Buffer.alloc(0x1000, "This is not correctly encoded", "hex")).toThrow(TypeError); -// expect(() => Buffer.alloc(0x1000, "c", "hex")).toThrow(TypeError); -// expect(() => Buffer.alloc(1, Buffer.alloc(0))).toThrow(TypeError); -// expect(() => Buffer.alloc(40, "x", 20)).toThrow(TypeError); -// }); - -// it("Buffer.toJSON()", () => { -// expect(JSON.stringify(Buffer.from("hello"))).toBe( -// JSON.stringify({ -// type: "Buffer", -// data: [104, 101, 108, 108, 111], -// }), -// ); -// }); - -// it("buffer", () => { -// var buf = new Buffer(20); -// gc(); -// // if this fails or infinitely loops, it means there is a memory issue with the JSC::Structure object -// expect(Object.keys(buf).length > 0).toBe(true); -// gc(); -// expect(buf.write("hello world ")).toBe(12); -// expect(buf.write("hello world ", "utf8")).toBe(12); - -// gc(); -// expect(buf.toString("utf8", 0, "hello world ".length)).toBe("hello world "); -// gc(); -// expect(buf.toString("base64url", 0, "hello world ".length)).toBe(btoa("hello world ")); -// gc(); -// expect(buf instanceof Uint8Array).toBe(true); -// gc(); -// expect(buf instanceof Buffer).toBe(true); -// gc(); -// expect(buf.slice() instanceof Uint8Array).toBe(true); -// gc(); -// expect(buf.slice(0, 1) instanceof Buffer).toBe(true); -// gc(); -// expect(buf.slice(0, 1) instanceof Uint8Array).toBe(true); -// gc(); -// expect(buf.slice(0, 1) instanceof Buffer).toBe(true); -// gc(); -// expect(buf.slice(0, 0).length).toBe(0); -// }); - -// it("Buffer", () => { -// var inputs = ["hello world", "hello world".repeat(100), `π Get Emoji β All Emojis to βοΈ Copy and π Paste π`]; -// var good = inputs.map(a => new TextEncoder().encode(a)); -// for (let i = 0; i < inputs.length; i++) { -// var input = inputs[i]; -// expect(new Buffer(input).toString("utf8")).toBe(inputs[i]); -// gc(); -// expect(Array.from(new Buffer(input)).join(",")).toBe(good[i].join(",")); -// gc(); -// expect(Buffer.byteLength(input)).toBe(good[i].length); -// gc(); -// expect(Buffer.from(input).byteLength).toBe(Buffer.byteLength(input)); -// } -// }); - -// it("Buffer.byteLength", () => { -// expect(Buffer.byteLength("ππππππ
ππ€£βΊοΈπππ")).toBe( -// new TextEncoder().encode("ππππππ
ππ€£βΊοΈπππ").byteLength, -// ); -// }); - -// it("Buffer.isBuffer", () => { -// expect(Buffer.isBuffer(new Buffer(1))).toBe(true); -// gc(); -// expect(Buffer.isBuffer(new Buffer(0))).toBe(true); -// gc(); -// expect(Buffer.isBuffer(new Uint8Array(0))).toBe(false); -// gc(); -// expect(Buffer.isBuffer(new Uint8Array(1))).toBe(false); -// gc(); -// var a = new Uint8Array(1); -// gc(); -// expect(Buffer.isBuffer(a)).toBe(false); -// gc(); -// a = new Buffer(a.buffer); -// gc(); -// expect(Buffer.isBuffer(a)).toBe(true); -// gc(); -// expect(a instanceof Buffer).toBe(true); -// expect(a instanceof Uint8Array).toBe(true); -// expect(new Uint8Array(0) instanceof Buffer).toBe(false); - -// // DOMJIT -// for (let i = 0; i < 9000; i++) { -// if (!Buffer.isBuffer(a)) { -// throw new Error("Buffer.isBuffer failed"); -// } - -// if (Buffer.isBuffer("wat")) { -// throw new Error("Buffer.isBuffer failed"); -// } -// } -// }); - -// it("writeInt", () => { -// var buf = new Buffer(1024); -// var data = new DataView(buf.buffer); -// buf.writeInt32BE(100); -// expect(data.getInt32(0, false)).toBe(100); -// buf.writeInt32BE(100); -// expect(data.getInt32(0, false)).toBe(100); -// var childBuf = buf.subarray(0, 4); -// expect(data.getInt32(0, false)).toBe(100); -// expect(childBuf.readInt32BE(0, false)).toBe(100); -// }); - -// it("Buffer.from", () => { -// expect(Buffer.from("hello world").toString("utf8")).toBe("hello world"); -// expect(Buffer.from("hello world", "ascii").toString("utf8")).toBe("hello world"); -// expect(Buffer.from("hello world", "latin1").toString("utf8")).toBe("hello world"); -// gc(); -// expect(Buffer.from([254]).join(",")).toBe("254"); - -// expect(Buffer.from([254], "utf8").join(",")).toBe("254"); -// expect(Buffer.from([254], "utf-8").join(",")).toBe("254"); -// expect(Buffer.from([254], "latin").join(",")).toBe("254"); -// expect(Buffer.from([254], "uc2").join(",")).toBe("254"); -// expect(Buffer.from([254], "utf16").join(",")).toBe("254"); -// expect(Buffer.isBuffer(Buffer.from([254], "utf16"))).toBe(true); - -// expect(() => Buffer.from(123).join(",")).toThrow(); - -// expect(Buffer.from({ length: 124 }).join(",")).toBe(Uint8Array.from({ length: 124 }).join(",")); - -// expect(Buffer.from(new ArrayBuffer(1024), 0, 512).join(",")).toBe(new Uint8Array(512).join(",")); - -// expect(Buffer.from(new Buffer(new ArrayBuffer(1024), 0, 512)).join(",")).toBe(new Uint8Array(512).join(",")); -// gc(); -// }); - -// it("Buffer.from latin1 vs ascii", () => { -// const simpleBuffer = Buffer.from("\xa4", "binary"); -// expect(simpleBuffer.toString("latin1")).toBe("Β€"); -// expect(simpleBuffer.toString("ascii")).toBe("$"); -// gc(); -// const asciiBuffer = Buffer.from("\xa4", "ascii"); -// expect(asciiBuffer.toString("latin1")).toBe("Β€"); -// expect(asciiBuffer.toString("ascii")).toBe("$"); -// gc(); -// }); - -// it("Buffer.equals", () => { -// var a = new Uint8Array(10); -// a[2] = 1; -// var b = new Uint8Array(10); -// b[2] = 1; -// a = new Buffer(a.buffer); -// b = new Buffer(b.buffer); -// expect(a.equals(b)).toBe(true); -// b[2] = 0; -// expect(a.equals(b)).toBe(false); -// }); - -// it("Buffer.compare", () => { -// var a = new Uint8Array(10); -// a[2] = 1; -// var b = new Uint8Array(10); -// b[2] = 1; -// a = new Buffer(a.buffer); -// b = new Buffer(b.buffer); -// expect(a.compare(b)).toBe(0); -// b[2] = 0; -// expect(a.compare(b)).toBe(1); -// expect(b.compare(a)).toBe(-1); - -// const buf = Buffer.from("0123456789", "utf8"); -// const expectedSameBufs = [ -// [buf.slice(-10, 10), Buffer.from("0123456789", "utf8")], -// [buf.slice(-20, 10), Buffer.from("0123456789", "utf8")], -// [buf.slice(-20, -10), Buffer.from("", "utf8")], -// [buf.slice(), Buffer.from("0123456789", "utf8")], -// [buf.slice(0), Buffer.from("0123456789", "utf8")], -// [buf.slice(0, 0), Buffer.from("", "utf8")], -// [buf.slice(undefined), Buffer.from("0123456789", "utf8")], -// [buf.slice("foobar"), Buffer.from("0123456789", "utf8")], -// [buf.slice(undefined, undefined), Buffer.from("0123456789", "utf8")], -// [buf.slice(2), Buffer.from("23456789", "utf8")], -// [buf.slice(5), Buffer.from("56789", "utf8")], -// [buf.slice(10), Buffer.from("", "utf8")], -// [buf.slice(5, 8), Buffer.from("567", "utf8")], -// [buf.slice(8, -1), Buffer.from("8", "utf8")], -// [buf.slice(-10), Buffer.from("0123456789", "utf8")], -// [buf.slice(0, -9), Buffer.from("0", "utf8")], -// [buf.slice(0, -10), Buffer.from("", "utf8")], -// [buf.slice(0, -1), Buffer.from("012345678", "utf8")], -// [buf.slice(2, -2), Buffer.from("234567", "utf8")], -// [buf.slice(0, 65536), Buffer.from("0123456789", "utf8")], -// [buf.slice(65536, 0), Buffer.from("", "utf8")], -// [buf.slice(-5, -8), Buffer.from("", "utf8")], -// [buf.slice(-5, -3), Buffer.from("56", "utf8")], -// [buf.slice(-10, 10), Buffer.from("0123456789", "utf8")], -// [buf.slice("0", "1"), Buffer.from("0", "utf8")], -// [buf.slice("-5", "10"), Buffer.from("56789", "utf8")], -// [buf.slice("-10", "10"), Buffer.from("0123456789", "utf8")], -// [buf.slice("-10", "-5"), Buffer.from("01234", "utf8")], -// [buf.slice("-10", "-0"), Buffer.from("", "utf8")], -// [buf.slice("111"), Buffer.from("", "utf8")], -// [buf.slice("0", "-111"), Buffer.from("", "utf8")], -// ]; - -// for (let i = 0, s = buf.toString(); i < buf.length; ++i) { -// expectedSameBufs.push( -// [buf.slice(i), Buffer.from(s.slice(i))], -// [buf.slice(0, i), Buffer.from(s.slice(0, i))], -// [buf.slice(-i), Buffer.from(s.slice(-i))], -// [buf.slice(0, -i), Buffer.from(s.slice(0, -i))], -// ); -// } - -// expectedSameBufs.forEach(([buf1, buf2]) => { -// expect(Buffer.compare(buf1, buf2)).toBe(0); -// }); - -// { -// const buf = Buffer.from([ -// 1, 29, 0, 0, 1, 143, 216, 162, 92, 254, 248, 63, 0, 0, 0, 18, 184, 6, 0, 175, 29, 0, 8, 11, 1, 0, 0, -// ]); -// const chunk1 = Buffer.from([1, 29, 0, 0, 1, 143, 216, 162, 92, 254, 248, 63, 0]); -// const chunk2 = Buffer.from([0, 0, 18, 184, 6, 0, 175, 29, 0, 8, 11, 1, 0, 0]); -// const middle = buf.length / 2; - -// expect(JSON.stringify(buf.slice(0, middle))).toBe(JSON.stringify(chunk1)); -// expect(JSON.stringify(buf.slice(middle))).toBe(JSON.stringify(chunk2)); -// } -// }); - -// it("Buffer.copy", () => { -// var array1 = new Uint8Array(128); -// array1.fill(100); -// array1 = new Buffer(array1.buffer); -// var array2 = new Uint8Array(128); -// array2.fill(200); -// array2 = new Buffer(array2.buffer); -// var array3 = new Uint8Array(128); -// array3 = new Buffer(array3.buffer); -// gc(); -// expect(array1.copy(array2)).toBe(128); -// expect(array1.join("")).toBe(array2.join("")); - -// { -// // Create two `Buffer` instances. -// const buf1 = Buffer.allocUnsafe(26); -// const buf2 = Buffer.allocUnsafe(26).fill("!"); - -// for (let i = 0; i < 26; i++) { -// // 97 is the decimal ASCII value for 'a'. -// buf1[i] = i + 97; -// } - -// // Copy `buf1` bytes 16 through 19 into `buf2` starting at byte 8 of `buf2`. -// buf1.copy(buf2, 8, 16, 20); -// expect(buf2.toString("ascii", 0, 25)).toBe("!!!!!!!!qrst!!!!!!!!!!!!!"); -// } - -// { -// const buf = Buffer.allocUnsafe(26); - -// for (let i = 0; i < 26; i++) { -// // 97 is the decimal ASCII value for 'a'. -// buf[i] = i + 97; -// } - -// buf.copy(buf, 0, 4, 10); -// expect(buf.toString()).toBe("efghijghijklmnopqrstuvwxyz"); -// } -// }); - -// export function fillRepeating(dstBuffer, start, end) { -// let len = dstBuffer.length, // important: use indices length, not byte-length -// sLen = end - start, -// p = sLen; // set initial position = source sequence length - -// // step 2: copy existing data doubling segment length per iteration -// while (p < len) { -// if (p + sLen > len) sLen = len - p; // if not power of 2, truncate last segment -// dstBuffer.copyWithin(p, start, sLen); // internal copy -// p += sLen; // add current length to offset -// sLen <<= 1; // double length for next segment -// } -// } - -// describe("Buffer.fill string", () => { -// for (let text of ["hello world", "1234567890", "\uD83D\uDE00", "ππππππ
ππ€£βΊοΈπππ"]) { -// it(text, () => { -// var input = new Buffer(1024); -// input.fill(text); -// var demo = new Uint8Array(1024); -// var encoded = new TextEncoder().encode(text); - -// demo.set(encoded); -// fillRepeating(demo, 0, encoded.length); -// expect(input.join("")).toBe(demo.join("")); -// }); -// } -// }); - -// it("Buffer.fill 1 char string", () => { -// var input = new Buffer(1024); -// input.fill("h"); -// var demo = new Uint8Array(1024); -// var encoded = new TextEncoder().encode("h"); - -// demo.set(encoded); -// fillRepeating(demo, 0, encoded.length); -// expect(input.join("")).toBe(demo.join("")); -// }); - -// it("Buffer.concat", () => { -// var array1 = new Uint8Array(128); -// array1.fill(100); -// var array2 = new Uint8Array(128); -// array2.fill(200); -// var array3 = new Uint8Array(128); -// array3.fill(300); -// gc(); -// expect(Buffer.concat([array1, array2, array3]).join("")).toBe(array1.join("") + array2.join("") + array3.join("")); -// expect(Buffer.concat([array1, array2, array3], 222).length).toBe(222); -// expect(Buffer.concat([array1, array2, array3], 222).subarray(0, 128).join("")).toBe("100".repeat(128)); -// expect(Buffer.concat([array1, array2, array3], 222).subarray(129, 222).join("")).toBe("200".repeat(222 - 129)); -// }); - -// it("read", () => { -// var buf = new Buffer(1024); -// var data = new DataView(buf.buffer); -// function reset() { -// new Uint8Array(buf.buffer).fill(0); -// } -// data.setBigInt64(0, BigInt(1000), false); -// expect(buf.readBigInt64BE(0)).toBe(BigInt(1000)); -// reset(); - -// data.setBigInt64(0, BigInt(1000), true); -// expect(buf.readBigInt64LE(0)).toBe(BigInt(1000)); -// reset(); - -// data.setBigUint64(0, BigInt(1000), false); -// expect(buf.readBigUInt64BE(0)).toBe(BigInt(1000)); -// reset(); - -// data.setBigUint64(0, BigInt(1000), true); -// expect(buf.readBigUInt64LE(0)).toBe(BigInt(1000)); -// reset(); - -// data.setFloat64(0, 1000, false); -// expect(buf.readDoubleBE(0)).toBe(1000); -// reset(); - -// data.setFloat64(0, 1000, true); -// expect(buf.readDoubleLE(0)).toBe(1000); -// reset(); - -// data.setFloat32(0, 1000, false); -// expect(buf.readFloatBE(0)).toBe(1000); -// reset(); - -// data.setFloat32(0, 1000, true); -// expect(buf.readFloatLE(0)).toBe(1000); -// reset(); - -// data.setInt16(0, 1000, false); -// expect(buf.readInt16BE(0)).toBe(1000); -// reset(); - -// data.setInt16(0, 1000, true); -// expect(buf.readInt16LE(0)).toBe(1000); -// reset(); - -// data.setInt32(0, 1000, false); -// expect(buf.readInt32BE(0)).toBe(1000); -// reset(); - -// data.setInt32(0, 1000, true); -// expect(buf.readInt32LE(0)).toBe(1000); -// reset(); - -// data.setInt8(0, 100, false); -// expect(buf.readInt8(0)).toBe(100); -// reset(); - -// data.setUint16(0, 1000, false); -// expect(buf.readUInt16BE(0)).toBe(1000); -// reset(); - -// data.setUint16(0, 1000, true); -// expect(buf.readUInt16LE(0)).toBe(1000); -// reset(); - -// data.setUint32(0, 1000, false); -// expect(buf.readUInt32BE(0)).toBe(1000); -// reset(); - -// data.setUint32(0, 1000, true); -// expect(buf.readUInt32LE(0)).toBe(1000); -// reset(); - -// data.setUint8(0, 255, false); -// expect(buf.readUInt8(0)).toBe(255); -// reset(); - -// data.setUint8(0, 255, false); -// expect(buf.readUInt8(0)).toBe(255); -// reset(); -// }); - -// // this is for checking the simd code path -// it("write long utf16 string works", () => { -// const long = "ππππππ
ππ€£βΊοΈπππ".repeat(200); -// const buf = Buffer.alloc(long.length * 2); -// buf.write(long, 0, "utf16le"); -// expect(buf.toString("utf16le")).toBe(long); -// for (let offset = 0; offset < long.length; offset += 48) { -// expect(buf.toString("utf16le", offset, offset + 4)).toBe("π"); -// expect(buf.toString("utf16le", offset, offset + 8)).toBe("ππ"); -// expect(buf.toString("utf16le", offset, offset + 12)).toBe("πππ"); -// expect(buf.toString("utf16le", offset, offset + 16)).toBe("ππππ"); -// expect(buf.toString("utf16le", offset, offset + 20)).toBe("πππππ"); -// expect(buf.toString("utf16le", offset, offset + 24)).toBe("ππππππ
"); -// expect(buf.toString("utf16le", offset, offset + 28)).toBe("ππππππ
π"); -// expect(buf.toString("utf16le", offset, offset + 32)).toBe("ππππππ
ππ€£"); -// expect(buf.toString("utf16le", offset, offset + 36)).toBe("ππππππ
ππ€£βΊοΈ"); -// expect(buf.toString("utf16le", offset, offset + 40)).toBe("ππππππ
ππ€£βΊοΈπ"); -// expect(buf.toString("utf16le", offset, offset + 44)).toBe("ππππππ
ππ€£βΊοΈππ"); -// expect(buf.toString("utf16le", offset, offset + 48)).toBe("ππππππ
ππ€£βΊοΈπππ"); -// } -// }); - -// it("write", () => { -// const resultMap = new Map([ -// ["utf8", Buffer.from([102, 111, 111, 0, 0, 0, 0, 0, 0])], -// ["ucs2", Buffer.from([102, 0, 111, 0, 111, 0, 0, 0, 0])], -// ["ascii", Buffer.from([102, 111, 111, 0, 0, 0, 0, 0, 0])], -// ["latin1", Buffer.from([102, 111, 111, 0, 0, 0, 0, 0, 0])], -// ["binary", Buffer.from([102, 111, 111, 0, 0, 0, 0, 0, 0])], -// ["utf16le", Buffer.from([102, 0, 111, 0, 111, 0, 0, 0, 0])], -// ["base64", Buffer.from([102, 111, 111, 0, 0, 0, 0, 0, 0])], -// ["base64url", Buffer.from([102, 111, 111, 0, 0, 0, 0, 0, 0])], -// ["hex", Buffer.from([102, 111, 111, 0, 0, 0, 0, 0, 0])], -// ]); - -// let buf = Buffer.alloc(9); -// function reset() { -// new Uint8Array(buf.buffer).fill(0); -// } - -// // utf8, ucs2, ascii, latin1, utf16le -// const encodings = ["utf8", "utf-8", "ucs2", "ucs-2", "ascii", "latin1", "binary", "utf16le", "utf-16le"]; - -// encodings -// .reduce((es, e) => es.concat(e, e.toUpperCase()), []) -// .forEach(encoding => { -// reset(); - -// const len = Buffer.byteLength("foo", encoding); -// expect(buf.write("foo", 0, len, encoding)).toBe(len); - -// if (encoding.includes("-")) encoding = encoding.replace("-", ""); - -// expect(buf).toStrictEqual(resultMap.get(encoding.toLowerCase())); -// }); - -// // base64 -// ["base64", "BASE64", "base64url", "BASE64URL"].forEach(encoding => { -// reset(); - -// const len = Buffer.byteLength("Zm9v", encoding); - -// expect(buf.write("Zm9v", 0, len, encoding)).toBe(len); -// expect(buf).toStrictEqual(resultMap.get(encoding.toLowerCase())); -// }); - -// // hex -// ["hex", "HEX"].forEach(encoding => { -// reset(); -// const len = Buffer.byteLength("666f6f", encoding); - -// expect(buf.write("666f6f", 0, len, encoding)).toBe(len); -// expect(buf).toStrictEqual(resultMap.get(encoding.toLowerCase())); -// }); - -// // UCS-2 overflow CVE-2018-12115 -// for (let i = 1; i < 4; i++) { -// // Allocate two Buffers sequentially off the pool. Run more than once in case -// // we hit the end of the pool and don't get sequential allocations -// const x = Buffer.allocUnsafe(4).fill(0); -// const y = Buffer.allocUnsafe(4).fill(1); -// // Should not write anything, pos 3 doesn't have enough room for a 16-bit char -// expect(x.write("ΡΡΡΡΡΡ", 3, "ucs2")).toBe(0); -// // CVE-2018-12115 experienced via buffer overrun to next block in the pool -// expect(Buffer.compare(y, Buffer.alloc(4, 1))).toBe(0); -// } - -// // // Should not write any data when there is no space for 16-bit chars -// const z = Buffer.alloc(4, 0); -// expect(z.write("\u0001", 3, "ucs2")).toBe(0); -// expect(Buffer.compare(z, Buffer.alloc(4, 0))).toBe(0); -// // Make sure longer strings are written up to the buffer end. -// expect(z.write("abcd", 2)).toBe(2); -// expect([...z]).toStrictEqual([0, 0, 0x61, 0x62]); - -// //Large overrun could corrupt the process with utf8 -// expect(Buffer.alloc(4).write("a".repeat(100), 3, "utf8")).toBe(1); - -// // Large overrun could corrupt the process -// expect(Buffer.alloc(4).write("ΡΡΡΡΡΡ".repeat(100), 3, "utf16le")).toBe(0); - -// { -// // .write() does not affect the byte after the written-to slice of the Buffer. -// // Refs: https://github.com/nodejs/node/issues/26422 -// const buf = Buffer.alloc(8); -// expect(buf.write("ΡΡ", 1, "utf16le")).toBe(4); -// expect([...buf]).toStrictEqual([0, 0x4b, 0x04, 0x4b, 0x04, 0, 0, 0]); -// } -// }); - -// it("includes", () => { -// const buf = Buffer.from("this is a buffer"); - -// expect(buf.includes("this")).toBe(true); -// expect(buf.includes("is")).toBe(true); -// expect(buf.includes(Buffer.from("a buffer"))).toBe(true); -// expect(buf.includes(97)).toBe(true); -// expect(buf.includes(Buffer.from("a buffer example"))).toBe(false); -// expect(buf.includes(Buffer.from("a buffer example").slice(0, 8))).toBe(true); -// expect(buf.includes("this", 4)).toBe(false); -// }); - -// it("indexOf", () => { -// const buf = Buffer.from("this is a buffer"); - -// expect(buf.indexOf("this")).toBe(0); -// expect(buf.indexOf("is")).toBe(2); -// expect(buf.indexOf(Buffer.from("a buffer"))).toBe(8); -// expect(buf.indexOf(97)).toBe(8); -// expect(buf.indexOf(Buffer.from("a buffer example"))).toBe(-1); -// expect(buf.indexOf(Buffer.from("a buffer example").slice(0, 8))).toBe(8); - -// const utf16Buffer = Buffer.from("\u039a\u0391\u03a3\u03a3\u0395", "utf16le"); - -// expect(utf16Buffer.indexOf("\u03a3", 0, "utf16le")).toBe(4); -// expect(utf16Buffer.indexOf("\u03a3", -4, "utf16le")).toBe(6); - -// const b = Buffer.from("abcdef"); - -// // Passing a value that's a number, but not a valid byte. -// // Prints: 2, equivalent to searching for 99 or 'c'. -// expect(b.indexOf(99.9)).toBe(2); -// expect(b.indexOf(256 + 99)).toBe(2); - -// // Passing a byteOffset that coerces to NaN or 0. -// // Prints: 1, searching the whole buffer. -// expect(b.indexOf("b", undefined)).toBe(1); -// expect(b.indexOf("b", {})).toBe(1); -// expect(b.indexOf("b", null)).toBe(1); -// expect(b.indexOf("b", [])).toBe(1); -// }); - -// it("lastIndexOf", () => { -// const buf = Buffer.from("this buffer is a buffer"); - -// expect(buf.lastIndexOf("this")).toBe(0); -// expect(buf.lastIndexOf("this", 0)).toBe(0); -// expect(buf.lastIndexOf("this", -1000)).toBe(-1); -// expect(buf.lastIndexOf("buffer")).toBe(17); -// expect(buf.lastIndexOf(Buffer.from("buffer"))).toBe(17); -// expect(buf.lastIndexOf(97)).toBe(15); -// expect(buf.lastIndexOf(Buffer.from("yolo"))).toBe(-1); -// expect(buf.lastIndexOf("buffer", 5)).toBe(5); -// expect(buf.lastIndexOf("buffer", 4)).toBe(-1); - -// const utf16Buffer = Buffer.from("\u039a\u0391\u03a3\u03a3\u0395", "utf16le"); - -// expect(utf16Buffer.lastIndexOf("\u03a3", undefined, "utf16le")).toBe(6); -// expect(utf16Buffer.lastIndexOf("\u03a3", -5, "utf16le")).toBe(4); - -// const b = Buffer.from("abcdef"); - -// // Passing a value that's a number, but not a valid byte. -// // Prints: 2, equivalent to searching for 99 or 'c'. -// expect(b.lastIndexOf(99.9)).toBe(2); -// expect(b.lastIndexOf(256 + 99)).toBe(2); - -// // Passing a byteOffset that coerces to NaN or 0. -// // Prints: 1, searching the whole buffer. -// expect(b.lastIndexOf("b", undefined)).toBe(1); -// expect(b.lastIndexOf("b", {})).toBe(1); - -// // Passing a byteOffset that coerces to 0. -// // Prints: -1, equivalent to passing 0. -// expect(b.lastIndexOf("b", null)).toBe(-1); -// expect(b.lastIndexOf("b", [])).toBe(-1); -// }); - -// for (let fn of [Buffer.prototype.slice, Buffer.prototype.subarray]) { -// it(`Buffer.${fn.name}`, () => { -// const buf = new Buffer("buffer"); -// const slice = fn.call(buf, 1, 3); -// expect(slice.toString()).toBe("uf"); -// const slice2 = fn.call(slice, 100); -// expect(slice2.toString()).toBe(""); - -// const slice3 = fn.call(slice, -1); -// expect(slice3.toString()).toBe("f"); -// }); -// } - -// it("Buffer.from(base64)", () => { -// const buf = Buffer.from("aGVsbG8gd29ybGQ=", "base64"); -// expect(buf.toString()).toBe("hello world"); - -// expect(Buffer.from(btoa('console.log("hello world")\n'), "base64").toString()).toBe('console.log("hello world")\n'); -// }); - -// it("Buffer.swap16", () => { -// const examples = [ -// ["", ""], -// ["a1", "1a"], -// ["a1b2", "1a2b"], -// ]; - -// for (let i = 0; i < examples.length; i++) { -// const input = examples[i][0]; -// const output = examples[i][1]; -// const buf = Buffer.from(input, "utf-8"); - -// const ref = buf.swap16(); -// expect(ref instanceof Buffer).toBe(true); -// expect(buf.toString()).toBe(output); -// } - -// const buf = Buffer.from("123", "utf-8"); -// try { -// buf.swap16(); -// expect(false).toBe(true); -// } catch (exception) { -// expect(exception.message).toBe("Buffer size must be a multiple of 16-bits"); -// } -// }); - -// it("Buffer.swap32", () => { -// const examples = [ -// ["", ""], -// ["a1b2", "2b1a"], -// ["a1b2c3d4", "2b1a4d3c"], -// ]; - -// for (let i = 0; i < examples.length; i++) { -// const input = examples[i][0]; -// const output = examples[i][1]; -// const buf = Buffer.from(input, "utf-8"); - -// const ref = buf.swap32(); -// expect(ref instanceof Buffer).toBe(true); -// expect(buf.toString()).toBe(output); -// } - -// const buf = Buffer.from("12345", "utf-8"); -// try { -// buf.swap32(); -// expect(false).toBe(true); -// } catch (exception) { -// expect(exception.message).toBe("Buffer size must be a multiple of 32-bits"); -// } -// }); - -// it("Buffer.swap64", () => { -// const examples = [ -// ["", ""], -// ["a1b2c3d4", "4d3c2b1a"], -// ["a1b2c3d4e5f6g7h8", "4d3c2b1a8h7g6f5e"], -// ]; - -// for (let i = 0; i < examples.length; i++) { -// const input = examples[i][0]; -// const output = examples[i][1]; -// const buf = Buffer.from(input, "utf-8"); - -// const ref = buf.swap64(); -// expect(ref instanceof Buffer).toBe(true); -// expect(buf.toString()).toBe(output); -// } - -// const buf = Buffer.from("123456789", "utf-8"); -// try { -// buf.swap64(); -// expect(false).toBe(true); -// } catch (exception) { -// expect(exception.message).toBe("Buffer size must be a multiple of 64-bits"); -// } -// }); - -// it("Buffer.toString regessions", () => { -// expect( -// Buffer.from([65, 0]) -// .toString("utf16le") -// .split("") -// .map(x => x.charCodeAt(0)), -// ).toEqual([65]); -// expect(Buffer.from([65, 0]).toString("base64")).toBe("QQA="); -// expect(Buffer.from('{"alg":"RS256","typ":"JWT"}', "latin1").toString("latin1")).toBe('{"alg":"RS256","typ":"JWT"}'); -// expect(Buffer.from('{"alg":"RS256","typ":"JWT"}', "utf8").toString("utf8")).toBe('{"alg":"RS256","typ":"JWT"}'); -// }); - -// it("Buffer.toString(utf16le)", () => { -// const buf = Buffer.from("hello world", "utf16le"); -// expect(buf.toString("utf16le")).toBe("hello world"); -// expect(buf.toString("utf16le", 0, 5)).toBe("he"); -// }); - -// it("Buffer.toString(binary)", () => { -// var x = Buffer.from("<?xm", "binary"); -// expect(x.toString("binary")).toBe("<?xm"); -// }); - -// it("Buffer.toString(base64)", () => { -// { -// const buf = Buffer.from("hello world"); -// expect(buf.toString("base64")).toBe("aGVsbG8gd29ybGQ="); -// } - -// { -// expect(Buffer.from(`console.log("hello world")\n`).toString("base64")).toBe(btoa('console.log("hello world")\n')); -// } -// }); - -// it("Buffer can be mocked", () => { -// function MockBuffer() { -// const noop = function () {}; -// const res = Buffer.alloc(0); -// for (const op in Buffer.prototype) { -// if (typeof res[op] === "function") { -// res[op] = noop; -// } -// } -// return res; -// } - -// const buf = MockBuffer(); - -// expect(() => { -// buf.write("hello world"); -// buf.writeUint16BE(0); -// buf.writeUint32BE(0); -// buf.writeBigInt64BE(0); -// buf.writeBigUInt64BE(0); -// buf.writeBigInt64LE(0); -// buf.writeBigUInt64LE(0); -// }).not.toThrow(); -// }); - -// it("constants", () => { -// expect(BufferModule.constants.MAX_LENGTH).toBe(4294967296); -// expect(BufferModule.constants.MAX_STRING_LENGTH).toBe(536870888); -// expect(BufferModule.default.constants.MAX_LENGTH).toBe(4294967296); -// expect(BufferModule.default.constants.MAX_STRING_LENGTH).toBe(536870888); -// }); - -// it("File", () => { -// expect(BufferModule.File).toBe(Blob); -// }); - -// it("transcode", () => { -// expect(typeof BufferModule.transcode).toBe("undefined"); - -// // This is a masqueradesAsUndefined function -// expect(() => BufferModule.transcode()).toThrow("Not implemented"); -// }); - -// it("Buffer.from (Node.js test/test-buffer-from.js)", () => { -// const checkString = "test"; - -// const check = Buffer.from(checkString); - -// class MyString extends String { -// constructor() { -// super(checkString); -// } -// } - -// class MyPrimitive { -// [Symbol.toPrimitive]() { -// return checkString; -// } -// } - -// class MyBadPrimitive { -// [Symbol.toPrimitive]() { -// return 1; -// } -// } - -// expect(Buffer.from(new String(checkString))).toStrictEqual(check); -// expect(Buffer.from(new MyString())).toStrictEqual(check); -// expect(Buffer.from(new MyPrimitive())).toStrictEqual(check); - -// [ -// {}, -// new Boolean(true), -// { -// valueOf() { -// return null; -// }, -// }, -// { -// valueOf() { -// return undefined; -// }, -// }, -// { valueOf: null }, -// Object.create(null), -// new Number(true), -// new MyBadPrimitive(), -// Symbol(), -// 5n, -// (one, two, three) => {}, -// undefined, -// null, -// ].forEach(input => { -// expect(() => Buffer.from(input)).toThrow(); -// expect(() => Buffer.from(input, "hex")).toThrow(); -// }); - -// expect(() => Buffer.allocUnsafe(10)).not.toThrow(); // Should not throw. -// expect(() => Buffer.from("deadbeaf", "hex")).not.toThrow(); // Should not throw. -// }); - -// it("new Buffer() (Node.js test/test-buffer-new.js)", () => { -// const LENGTH = 16; - -// const ab = new ArrayBuffer(LENGTH); -// const dv = new DataView(ab); -// const ui = new Uint8Array(ab); -// const buf = Buffer.from(ab); - -// expect(buf instanceof Buffer).toBe(true); -// // expect(buf.parent, buf.buffer); -// expect(buf.buffer).toBe(ab); -// expect(buf.length).toBe(ab.byteLength); - -// buf.fill(0xc); -// for (let i = 0; i < LENGTH; i++) { -// expect(ui[i]).toBe(0xc); -// ui[i] = 0xf; -// expect(buf[i]).toBe(0xf); -// } - -// buf.writeUInt32LE(0xf00, 0); -// buf.writeUInt32BE(0xb47, 4); -// buf.writeDoubleLE(3.1415, 8); -// expect(dv.getUint32(0, true)).toBe(0xf00); -// expect(dv.getUint32(4)).toBe(0xb47); -// expect(dv.getFloat64(8, true)).toBe(3.1415); - -// // Now test protecting users from doing stupid things - -// // expect(function () { -// // function AB() {} -// // Object.setPrototypeOf(AB, ArrayBuffer); -// // Object.setPrototypeOf(AB.prototype, ArrayBuffer.prototype); -// // // Buffer.from(new AB()); -// // }).toThrow(); -// // console.log(origAB !== ab); - -// // Test the byteOffset and length arguments -// { -// const ab = new Uint8Array(5); -// ab[0] = 1; -// ab[1] = 2; -// ab[2] = 3; -// ab[3] = 4; -// ab[4] = 5; -// const buf = Buffer.from(ab.buffer, 1, 3); -// expect(buf.length).toBe(3); -// expect(buf[0]).toBe(2); -// expect(buf[1]).toBe(3); -// expect(buf[2]).toBe(4); -// buf[0] = 9; -// expect(ab[1]).toBe(9); - -// expect(() => Buffer.from(ab.buffer, 6)).toThrow(); -// expect(() => Buffer.from(ab.buffer, 3, 6)).toThrow(); -// } - -// // Test the deprecated Buffer() version also -// { -// const ab = new Uint8Array(5); -// ab[0] = 1; -// ab[1] = 2; -// ab[2] = 3; -// ab[3] = 4; -// ab[4] = 5; -// const buf = Buffer(ab.buffer, 1, 3); -// expect(buf.length).toBe(3); -// expect(buf[0]).toBe(2); -// expect(buf[1]).toBe(3); -// expect(buf[2]).toBe(4); -// buf[0] = 9; -// expect(ab[1]).toBe(9); - -// expect(() => Buffer(ab.buffer, 6)).toThrow(); -// expect(() => Buffer(ab.buffer, 3, 6)).toThrow(); -// } - -// { -// // If byteOffset is not numeric, it defaults to 0. -// const ab = new ArrayBuffer(10); -// const expected = Buffer.from(ab, 0); -// expect(Buffer.from(ab, "fhqwhgads")).toStrictEqual(expected); -// expect(Buffer.from(ab, NaN)).toStrictEqual(expected); -// expect(Buffer.from(ab, {})).toStrictEqual(expected); -// expect(Buffer.from(ab, [])).toStrictEqual(expected); - -// // If byteOffset can be converted to a number, it will be. -// expect(Buffer.from(ab, [1])).toStrictEqual(Buffer.from(ab, 1)); - -// // If byteOffset is Infinity, throw. -// expect(() => { -// Buffer.from(ab, Infinity); -// }).toThrow(); -// } - -// { -// // If length is not numeric, it defaults to 0. -// const ab = new ArrayBuffer(10); -// const expected = Buffer.from(ab, 0, 0); -// expect(Buffer.from(ab, 0, "fhqwhgads")).toStrictEqual(expected); -// expect(Buffer.from(ab, 0, NaN)).toStrictEqual(expected); -// expect(Buffer.from(ab, 0, {})).toStrictEqual(expected); -// expect(Buffer.from(ab, 0, [])).toStrictEqual(expected); - -// // If length can be converted to a number, it will be. -// expect(Buffer.from(ab, 0, [1])).toStrictEqual(Buffer.from(ab, 0, 1)); - -// // If length is Infinity, throw. -// expect(() => Buffer.from(ab, 0, Infinity)).toThrow(); -// } - -// // Test an array like entry with the length set to NaN. -// expect(Buffer.from({ length: NaN })).toStrictEqual(Buffer.alloc(0)); -// }); - -// it("Buffer.fill (Node.js tests)", () => { -// "use strict"; -// const SIZE = 28; - -// const buf1 = Buffer.allocUnsafe(SIZE); -// const buf2 = Buffer.allocUnsafe(SIZE); - -// function bufReset() { -// buf1.fill(0); -// buf2.fill(0); -// } - -// // This is mostly accurate. Except write() won't write partial bytes to the -// // string while fill() blindly copies bytes into memory. To account for that an -// // error will be thrown if not all the data can be written, and the SIZE has -// // been massaged to work with the input characters. -// function writeToFill(string, offset, end, encoding) { -// if (typeof offset === "string") { -// encoding = offset; -// offset = 0; -// end = buf2.length; -// } else if (typeof end === "string") { -// encoding = end; -// end = buf2.length; -// } else if (end === undefined) { -// end = buf2.length; -// } - -// // Should never be reached. -// if (offset < 0 || end > buf2.length) throw new ERR_OUT_OF_RANGE(); - -// if (end <= offset) return buf2; - -// offset >>>= 0; -// end >>>= 0; -// expect(offset <= buf2.length).toBe(true); - -// // Convert "end" to "length" (which write understands). -// const length = end - offset < 0 ? 0 : end - offset; - -// let wasZero = false; -// do { -// const written = buf2.write(string, offset, length, encoding); -// offset += written; -// // Safety check in case write falls into infinite loop. -// if (written === 0) { -// if (wasZero) throw new Error("Could not write all data to Buffer at " + offset); -// else wasZero = true; -// } -// } while (offset < buf2.length); - -// return buf2; -// } - -// function testBufs(string, offset, length, encoding) { -// bufReset(); -// buf1.fill.apply(buf1, arguments); -// // Swap bytes on BE archs for ucs2 encoding. -// expect(buf1.fill.apply(buf1, arguments)).toStrictEqual(writeToFill.apply(null, arguments)); -// } - -// // Default encoding -// testBufs("abc"); -// testBufs("\u0222aa"); -// testBufs("a\u0234b\u0235c\u0236"); -// testBufs("abc", 4); -// testBufs("abc", 5); -// testBufs("abc", SIZE); -// testBufs("\u0222aa", 2); -// testBufs("\u0222aa", 8); -// testBufs("a\u0234b\u0235c\u0236", 4); -// testBufs("a\u0234b\u0235c\u0236", 12); -// testBufs("abc", 4, 1); -// testBufs("abc", 5, 1); -// testBufs("\u0222aa", 8, 1); -// testBufs("a\u0234b\u0235c\u0236", 4, 1); -// testBufs("a\u0234b\u0235c\u0236", 12, 1); - -// // UTF8 -// testBufs("abc", "utf8"); -// testBufs("\u0222aa", "utf8"); -// testBufs("a\u0234b\u0235c\u0236", "utf8"); -// testBufs("abc", 4, "utf8"); -// testBufs("abc", 5, "utf8"); -// testBufs("abc", SIZE, "utf8"); -// testBufs("\u0222aa", 2, "utf8"); -// testBufs("\u0222aa", 8, "utf8"); -// testBufs("a\u0234b\u0235c\u0236", 4, "utf8"); -// testBufs("a\u0234b\u0235c\u0236", 12, "utf8"); -// testBufs("abc", 4, 1, "utf8"); -// testBufs("abc", 5, 1, "utf8"); -// testBufs("\u0222aa", 8, 1, "utf8"); -// testBufs("a\u0234b\u0235c\u0236", 4, 1, "utf8"); -// testBufs("a\u0234b\u0235c\u0236", 12, 1, "utf8"); -// expect(Buffer.allocUnsafe(1).fill(0).fill("\u0222")[0]).toBe(0xc8); - -// // BINARY -// testBufs("abc", "binary"); -// testBufs("\u0222aa", "binary"); -// testBufs("a\u0234b\u0235c\u0236", "binary"); -// testBufs("abc", 4, "binary"); -// testBufs("abc", 5, "binary"); -// testBufs("abc", SIZE, "binary"); -// testBufs("\u0222aa", 2, "binary"); -// testBufs("\u0222aa", 8, "binary"); -// testBufs("a\u0234b\u0235c\u0236", 4, "binary"); -// testBufs("a\u0234b\u0235c\u0236", 12, "binary"); -// testBufs("abc", 4, 1, "binary"); -// testBufs("abc", 5, 1, "binary"); -// testBufs("\u0222aa", 8, 1, "binary"); -// testBufs("a\u0234b\u0235c\u0236", 4, 1, "binary"); -// testBufs("a\u0234b\u0235c\u0236", 12, 1, "binary"); - -// // LATIN1 -// testBufs("abc", "latin1"); -// testBufs("\u0222aa", "latin1"); -// testBufs("a\u0234b\u0235c\u0236", "latin1"); -// testBufs("abc", 4, "latin1"); -// testBufs("abc", 5, "latin1"); -// testBufs("abc", SIZE, "latin1"); -// testBufs("\u0222aa", 2, "latin1"); -// testBufs("\u0222aa", 8, "latin1"); -// testBufs("a\u0234b\u0235c\u0236", 4, "latin1"); -// testBufs("a\u0234b\u0235c\u0236", 12, "latin1"); -// testBufs("abc", 4, 1, "latin1"); -// testBufs("abc", 5, 1, "latin1"); -// testBufs("\u0222aa", 8, 1, "latin1"); -// testBufs("a\u0234b\u0235c\u0236", 4, 1, "latin1"); -// testBufs("a\u0234b\u0235c\u0236", 12, 1, "latin1"); - -// // UCS2 -// testBufs("abc", "ucs2"); -// testBufs("\u0222aa", "ucs2"); -// testBufs("a\u0234b\u0235c\u0236", "ucs2"); -// testBufs("abc", 4, "ucs2"); -// testBufs("abc", SIZE, "ucs2"); -// testBufs("\u0222aa", 2, "ucs2"); -// testBufs("\u0222aa", 8, "ucs2"); -// testBufs("a\u0234b\u0235c\u0236", 4, "ucs2"); -// testBufs("a\u0234b\u0235c\u0236", 12, "ucs2"); -// testBufs("abc", 4, 1, "ucs2"); -// testBufs("abc", 5, 1, "ucs2"); -// testBufs("\u0222aa", 8, 1, "ucs2"); -// testBufs("a\u0234b\u0235c\u0236", 4, 1, "ucs2"); -// testBufs("a\u0234b\u0235c\u0236", 12, 1, "ucs2"); -// expect(Buffer.allocUnsafe(1).fill("\u0222", "ucs2")[0]).toBe(0x22); - -// // HEX -// testBufs("616263", "hex"); -// testBufs("c8a26161", "hex"); -// testBufs("61c8b462c8b563c8b6", "hex"); -// testBufs("616263", 4, "hex"); -// testBufs("616263", 5, "hex"); -// testBufs("616263", SIZE, "hex"); -// testBufs("c8a26161", 2, "hex"); -// testBufs("c8a26161", 8, "hex"); -// testBufs("61c8b462c8b563c8b6", 4, "hex"); -// testBufs("61c8b462c8b563c8b6", 12, "hex"); -// testBufs("616263", 4, 1, "hex"); -// testBufs("616263", 5, 1, "hex"); -// testBufs("c8a26161", 8, 1, "hex"); -// testBufs("61c8b462c8b563c8b6", 4, 1, "hex"); -// testBufs("61c8b462c8b563c8b6", 12, 1, "hex"); - -// expect(() => { -// const buf = Buffer.allocUnsafe(SIZE); - -// buf.fill("yKJh", "hex"); -// }).toThrow(); - -// expect(() => { -// const buf = Buffer.allocUnsafe(SIZE); - -// buf.fill("\u0222", "hex"); -// }).toThrow(); - -// // BASE64 -// testBufs("YWJj", "base64"); -// testBufs("yKJhYQ==", "base64"); -// testBufs("Yci0Ysi1Y8i2", "base64"); -// testBufs("YWJj", 4, "base64"); -// testBufs("YWJj", SIZE, "base64"); -// testBufs("yKJhYQ==", 2, "base64"); -// testBufs("yKJhYQ==", 8, "base64"); -// testBufs("Yci0Ysi1Y8i2", 4, "base64"); -// testBufs("Yci0Ysi1Y8i2", 12, "base64"); -// testBufs("YWJj", 4, 1, "base64"); -// testBufs("YWJj", 5, 1, "base64"); -// testBufs("yKJhYQ==", 8, 1, "base64"); -// testBufs("Yci0Ysi1Y8i2", 4, 1, "base64"); -// testBufs("Yci0Ysi1Y8i2", 12, 1, "base64"); - -// // BASE64URL -// testBufs("YWJj", "base64url"); -// testBufs("yKJhYQ", "base64url"); -// testBufs("Yci0Ysi1Y8i2", "base64url"); -// testBufs("YWJj", 4, "base64url"); -// testBufs("YWJj", SIZE, "base64url"); -// testBufs("yKJhYQ", 2, "base64url"); -// testBufs("yKJhYQ", 8, "base64url"); -// testBufs("Yci0Ysi1Y8i2", 4, "base64url"); -// testBufs("Yci0Ysi1Y8i2", 12, "base64url"); -// testBufs("YWJj", 4, 1, "base64url"); -// testBufs("YWJj", 5, 1, "base64url"); -// testBufs("yKJhYQ", 8, 1, "base64url"); -// testBufs("Yci0Ysi1Y8i2", 4, 1, "base64url"); -// testBufs("Yci0Ysi1Y8i2", 12, 1, "base64url"); -// }); - -// it("fill() repeat pattern", () => { -// function genBuffer(size, args) { -// const b = Buffer.allocUnsafe(size); -// return b.fill(0).fill.apply(b, args); -// } - -// const buf2Fill = Buffer.allocUnsafe(1).fill(2); -// expect(genBuffer(4, [buf2Fill])).toStrictEqual(Buffer.from([2, 2, 2, 2])); -// expect(genBuffer(4, [buf2Fill, 1])).toStrictEqual(Buffer.from([0, 2, 2, 2])); -// expect(genBuffer(4, [buf2Fill, 1, 3])).toStrictEqual(Buffer.from([0, 2, 2, 0])); -// expect(genBuffer(4, [buf2Fill, 1, 1])).toStrictEqual(Buffer.from([0, 0, 0, 0])); -// const hexBufFill = Buffer.allocUnsafe(2).fill(0).fill("0102", "hex"); -// expect(genBuffer(4, [hexBufFill])).toStrictEqual(Buffer.from([1, 2, 1, 2])); -// expect(genBuffer(4, [hexBufFill, 1])).toStrictEqual(Buffer.from([0, 1, 2, 1])); -// expect(genBuffer(4, [hexBufFill, 1, 3])).toStrictEqual(Buffer.from([0, 1, 2, 0])); -// expect(genBuffer(4, [hexBufFill, 1, 1])).toStrictEqual(Buffer.from([0, 0, 0, 0])); -// }); - -// it("fill() should throw on invalid arguments", () => { -// // Check exceptions -// const buf = Buffer.allocUnsafe(16); -// expect(() => buf.fill(0, -1)).toThrow(RangeError); -// expect(() => buf.fill(0, 0, buf.length + 1)).toThrow(RangeError); -// expect(() => buf.fill("", -1)).toThrow(RangeError); -// expect(() => buf.fill("", 0, buf.length + 1)).toThrow(RangeError); -// expect(() => buf.fill("", 1, -1)).toThrow(RangeError); -// expect(() => buf.fill("a", 0, buf.length, "node rocks!")).toThrow(TypeError); -// expect(() => buf.fill("a", 0, 0, NaN)).toThrow(TypeError); -// expect(() => buf.fill("a", 0, 0, false)).toThrow(TypeError); -// expect(() => buf.fill("a", 0, 0, "foo")).toThrow(TypeError); - -// // Make sure these throw. -// expect(() => Buffer.allocUnsafe(8).fill("a", -1)).toThrow(); -// expect(() => Buffer.allocUnsafe(8).fill("a", 0, 9)).toThrow(); -// }); - -// it("fill() should not hang indefinitely", () => { -// // Make sure this doesn't hang indefinitely. -// Buffer.allocUnsafe(8).fill(""); -// Buffer.alloc(8, ""); -// }); - -// it("fill() repeat byte", () => { -// const buf = Buffer.alloc(64, 10); -// for (let i = 0; i < buf.length; i++) expect(buf[i]).toBe(10); - -// buf.fill(11, 0, buf.length >> 1); -// for (let i = 0; i < buf.length >> 1; i++) expect(buf[i]).toBe(11); -// for (let i = (buf.length >> 1) + 1; i < buf.length; i++) expect(buf[i]).toBe(10); - -// buf.fill("h"); -// for (let i = 0; i < buf.length; i++) expect(buf[i]).toBe("h".charCodeAt(0)); - -// buf.fill(0); -// for (let i = 0; i < buf.length; i++) expect(buf[i]).toBe(0); - -// buf.fill(null); -// for (let i = 0; i < buf.length; i++) expect(buf[i]).toBe(0); - -// buf.fill(1, 16, 32); -// for (let i = 0; i < 16; i++) expect(buf[i]).toBe(0); -// for (let i = 16; i < 32; i++) expect(buf[i]).toBe(1); -// for (let i = 32; i < buf.length; i++) expect(buf[i]).toBe(0); -// }); - -// it("alloc() repeat pattern", () => { -// const buf = Buffer.alloc(10, "abc"); -// expect(buf.toString()).toBe("abcabcabca"); -// buf.fill("Υ§"); -// expect(buf.toString()).toBe("Υ§Υ§Υ§Υ§Υ§"); -// }); - -// it("fill() should properly check `start` & `end`", () => { -// // // Testing process.binding. Make sure "start" is properly checked for range -// // // errors. -// // expect(() => internalBinding("buffer").fill(Buffer.alloc(1), 1, -1, 0, 1)).toThrow(RangeError); - -// // Make sure "end" is properly checked, even if it's magically mangled using -// // Symbol.toPrimitive. -// expect(() => { -// const end = { -// [Symbol.toPrimitive]() { -// return 1; -// }, -// }; -// Buffer.alloc(1).fill(Buffer.alloc(1), 0, end); -// }).toThrow(TypeError); - -// // Testing process.binding. Make sure "end" is properly checked for range -// // errors. -// // expect(() => internalBinding("buffer").fill(Buffer.alloc(1), 1, 1, -2, 1)).toThrow(RangeError); -// }); - -// it("bypassing `length` should not cause an abort", () => { -// const buf = Buffer.from("w00t"); -// expect(buf).toStrictEqual(Buffer.from([119, 48, 48, 116])); -// Object.defineProperty(buf, "length", { -// value: 1337, -// enumerable: true, -// }); -// // Node.js throws here, but we can handle it just fine -// buf.fill(""); -// expect(buf).toStrictEqual(Buffer.from([0, 0, 0, 0])); -// }); - -// it("allocUnsafeSlow().fill()", () => { -// expect(Buffer.allocUnsafeSlow(16).fill("ab", "utf16le")).toStrictEqual( -// Buffer.from("61006200610062006100620061006200", "hex"), -// ); - -// expect(Buffer.allocUnsafeSlow(15).fill("ab", "utf16le")).toStrictEqual( -// Buffer.from("610062006100620061006200610062", "hex"), -// ); - -// expect(Buffer.allocUnsafeSlow(16).fill("ab", "utf16le")).toStrictEqual( -// Buffer.from("61006200610062006100620061006200", "hex"), -// ); -// expect(Buffer.allocUnsafeSlow(16).fill("a", "utf16le")).toStrictEqual( -// Buffer.from("61006100610061006100610061006100", "hex"), -// ); - -// expect(Buffer.allocUnsafeSlow(16).fill("a", "utf16le").toString("utf16le")).toBe("a".repeat(8)); -// expect(Buffer.allocUnsafeSlow(16).fill("a", "latin1").toString("latin1")).toBe("a".repeat(16)); -// expect(Buffer.allocUnsafeSlow(16).fill("a", "utf8").toString("utf8")).toBe("a".repeat(16)); - -// expect(Buffer.allocUnsafeSlow(16).fill("Π", "utf16le").toString("utf16le")).toBe("Π".repeat(8)); -// expect(Buffer.allocUnsafeSlow(16).fill("Π", "latin1").toString("latin1")).toBe("\t".repeat(16)); -// expect(Buffer.allocUnsafeSlow(16).fill("Π", "utf8").toString("utf8")).toBe("Π".repeat(8)); - -// expect(() => { -// const buf = Buffer.from("a".repeat(1000)); - -// buf.fill("This is not correctly encoded", "hex"); -// }).toThrow(); -// }); - -// it("ArrayBuffer.isView()", () => { -// expect(ArrayBuffer.isView(new Buffer(10))).toBe(true); -// expect(ArrayBuffer.isView(new SlowBuffer(10))).toBe(true); -// expect(ArrayBuffer.isView(Buffer.alloc(10))).toBe(true); -// expect(ArrayBuffer.isView(Buffer.allocUnsafe(10))).toBe(true); -// expect(ArrayBuffer.isView(Buffer.allocUnsafeSlow(10))).toBe(true); -// expect(ArrayBuffer.isView(Buffer.from(""))).toBe(true); -// }); - -// it("Buffer.byteLength()", () => { -// expect(() => Buffer.byteLength(32, "latin1")).toThrow(TypeError); -// expect(() => Buffer.byteLength(NaN, "utf8")).toThrow(TypeError); -// expect(() => Buffer.byteLength({}, "latin1")).toThrow(TypeError); -// expect(() => Buffer.byteLength()).toThrow(TypeError); - -// expect(Buffer.byteLength("", undefined, true)).toBe(0); - -// // buffer -// const incomplete = Buffer.from([0xe4, 0xb8, 0xad, 0xe6, 0x96]); -// expect(Buffer.byteLength(incomplete)).toBe(5); -// const ascii = Buffer.from("abc"); -// expect(Buffer.byteLength(ascii)).toBe(3); - -// // ArrayBuffer -// const buffer = new ArrayBuffer(8); -// expect(Buffer.byteLength(buffer)).toBe(8); - -// // TypedArray -// const int8 = new Int8Array(8); -// expect(Buffer.byteLength(int8)).toBe(8); -// const uint8 = new Uint8Array(8); -// expect(Buffer.byteLength(uint8)).toBe(8); -// const uintc8 = new Uint8ClampedArray(2); -// expect(Buffer.byteLength(uintc8)).toBe(2); -// const int16 = new Int16Array(8); -// expect(Buffer.byteLength(int16)).toBe(16); -// const uint16 = new Uint16Array(8); -// expect(Buffer.byteLength(uint16)).toBe(16); -// const int32 = new Int32Array(8); -// expect(Buffer.byteLength(int32)).toBe(32); -// const uint32 = new Uint32Array(8); -// expect(Buffer.byteLength(uint32)).toBe(32); -// const float32 = new Float32Array(8); -// expect(Buffer.byteLength(float32)).toBe(32); -// const float64 = new Float64Array(8); -// expect(Buffer.byteLength(float64)).toBe(64); - -// // DataView -// const dv = new DataView(new ArrayBuffer(2)); -// expect(Buffer.byteLength(dv)).toBe(2); - -// // Special case: zero length string -// expect(Buffer.byteLength("", "ascii")).toBe(0); -// expect(Buffer.byteLength("", "HeX")).toBe(0); - -// // utf8 -// expect(Buffer.byteLength("βΓ©llΓΆ wΓΈrlβ!", "utf-8")).toBe(19); -// expect(Buffer.byteLength("κλμνξο", "utf8")).toBe(12); -// expect(Buffer.byteLength("ζ΅ζΆζ·ζΈζΉ", "utf-8")).toBe(15); -// expect(Buffer.byteLength("π Ήπ ±π ±Έ", "UTF8")).toBe(12); -// // Without an encoding, utf8 should be assumed -// expect(Buffer.byteLength("hey there")).toBe(9); -// expect(Buffer.byteLength("π ±ΈζΆΞ½ΞΎ#xx :)")).toBe(17); -// expect(Buffer.byteLength("hello world", "")).toBe(11); -// // It should also be assumed with unrecognized encoding -// expect(Buffer.byteLength("hello world", "abc")).toBe(11); -// expect(Buffer.byteLength("ΓΕββ", "unkn0wn enc0ding")).toBe(10); - -// // base64 -// expect(Buffer.byteLength("aGVsbG8gd29ybGQ=", "base64")).toBe(11); -// expect(Buffer.byteLength("aGVsbG8gd29ybGQ=", "BASE64")).toBe(11); -// expect(Buffer.byteLength("bm9kZS5qcyByb2NrcyE=", "base64")).toBe(14); -// expect(Buffer.byteLength("aGkk", "base64")).toBe(3); -// expect(Buffer.byteLength("bHNrZGZsa3NqZmtsc2xrZmFqc2RsZmtqcw==", "base64")).toBe(25); -// // base64url -// expect(Buffer.byteLength("aGVsbG8gd29ybGQ", "base64url")).toBe(11); -// expect(Buffer.byteLength("aGVsbG8gd29ybGQ", "BASE64URL")).toBe(11); -// expect(Buffer.byteLength("bm9kZS5qcyByb2NrcyE", "base64url")).toBe(14); -// expect(Buffer.byteLength("aGkk", "base64url")).toBe(3); -// expect(Buffer.byteLength("bHNrZGZsa3NqZmtsc2xrZmFqc2RsZmtqcw", "base64url")).toBe(25); -// // special padding -// expect(Buffer.byteLength("aaa=", "base64")).toBe(2); -// expect(Buffer.byteLength("aaaa==", "base64")).toBe(3); -// expect(Buffer.byteLength("aaa=", "base64url")).toBe(2); -// expect(Buffer.byteLength("aaaa==", "base64url")).toBe(3); -// expect(Buffer.byteLength("Il Γ©tait tuΓ©", "utf8")).toBe(14); -// expect(Buffer.byteLength("Il Γ©tait tuΓ©")).toBe(14); - -// ["ascii", "latin1", "binary"] -// .reduce((es, e) => es.concat(e, e.toUpperCase()), []) -// .forEach(encoding => { -// expect(Buffer.byteLength("Il Γ©tait tuΓ©", encoding)).toBe(12); -// }); - -// ["ucs2", "ucs-2", "utf16le", "utf-16le"] -// .reduce((es, e) => es.concat(e, e.toUpperCase()), []) -// .forEach(encoding => { -// expect(Buffer.byteLength("Il Γ©tait tuΓ©", encoding)).toBe(24); -// }); - -// // Test that ArrayBuffer from a different context is detected correctly -// // const arrayBuf = vm.runInNewContext("new ArrayBuffer()"); -// // expect(Buffer.byteLength(arrayBuf)).toBe(0); - -// // Verify that invalid encodings are treated as utf8 -// for (let i = 1; i < 10; i++) { -// const encoding = String(i).repeat(i); - -// expect(Buffer.isEncoding(encoding)).toBe(false); -// expect(Buffer.byteLength("foo", encoding)).toBe(Buffer.byteLength("foo", "utf8")); -// } -// }); - -// it("Buffer.toString(encoding, start, end)", () => { -// const buf = Buffer.from("0123456789", "utf8"); - -// expect(buf.toString()).toStrictEqual("0123456789"); -// expect(buf.toString("utf8")).toStrictEqual("0123456789"); -// expect(buf.toString("utf8", 3)).toStrictEqual("3456789"); -// expect(buf.toString("utf8", 3, 4)).toStrictEqual("3"); - -// expect(buf.toString("utf8", 3, 100)).toStrictEqual("3456789"); -// expect(buf.toString("utf8", 3, 1)).toStrictEqual(""); -// expect(buf.toString("utf8", 100, 200)).toStrictEqual(""); -// expect(buf.toString("utf8", 100, 1)).toStrictEqual(""); -// }); - -// it("Buffer.toString(offset, length, encoding)", () => { -// const buf = Buffer.from("0123456789", "utf8"); - -// expect(buf.toString(3, 6, "utf8")).toStrictEqual("345678"); -// expect(buf.toString(3, 100, "utf8")).toStrictEqual("3456789"); -// expect(buf.toString(100, 200, "utf8")).toStrictEqual(""); -// expect(buf.toString(100, 50, "utf8")).toStrictEqual(""); -// }); - -// it("Buffer.asciiSlice())", () => { -// const buf = Buffer.from("0123456789", "ascii"); - -// expect(buf.asciiSlice()).toStrictEqual("0123456789"); -// expect(buf.asciiSlice(3)).toStrictEqual("3456789"); -// expect(buf.asciiSlice(3, 4)).toStrictEqual("3"); -// }); - -// it("Buffer.latin1Slice()", () => { -// const buf = Buffer.from("Òéâ", "latin1"); - -// expect(buf.latin1Slice()).toStrictEqual("Òéâ"); -// expect(buf.latin1Slice(1)).toStrictEqual("éâ"); -// expect(buf.latin1Slice(1, 2)).toStrictEqual("Γ©"); -// }); - -// it("Buffer.utf8Slice()", () => { -// const buf = Buffer.from("γγγγγ", "utf8"); - -// expect(buf.utf8Slice()).toStrictEqual("γγγγγ"); -// expect(buf.utf8Slice(3)).toStrictEqual("γγγγ"); -// expect(buf.utf8Slice(3, 6)).toStrictEqual("γ"); -// }); - -// it("Buffer.hexSlice()", () => { -// const buf = Buffer.from("0123456789", "utf8"); - -// expect(buf.hexSlice()).toStrictEqual("30313233343536373839"); -// expect(buf.hexSlice(3)).toStrictEqual("33343536373839"); -// expect(buf.hexSlice(3, 4)).toStrictEqual("33"); -// }); - -// it("Buffer.ucs2Slice()", () => { -// const buf = Buffer.from("γγγγγ", "ucs2"); - -// expect(buf.ucs2Slice()).toStrictEqual("γγγγγ"); -// expect(buf.ucs2Slice(2)).toStrictEqual("γγγγ"); -// expect(buf.ucs2Slice(2, 6)).toStrictEqual("γγ"); -// }); - -// it("Buffer.base64Slice()", () => { -// const buf = Buffer.from("0123456789", "utf8"); - -// expect(buf.base64Slice()).toStrictEqual("MDEyMzQ1Njc4OQ=="); -// expect(buf.base64Slice(3)).toStrictEqual("MzQ1Njc4OQ=="); -// expect(buf.base64Slice(3, 4)).toStrictEqual("Mw=="); -// }); - -// it("Buffer.base64urlSlice()", () => { -// const buf = Buffer.from("0123456789", "utf8"); - -// expect(buf.base64urlSlice()).toStrictEqual("MDEyMzQ1Njc4OQ"); -// expect(buf.base64urlSlice(3)).toStrictEqual("MzQ1Njc4OQ"); -// expect(buf.base64urlSlice(3, 4)).toStrictEqual("Mw"); -// }); - -// it("should not crash on invalid UTF-8 byte sequence", () => { -// const buf = Buffer.from([0xc0, 0xfd]); -// expect(buf.length).toBe(2); -// const str = buf.toString(); -// expect(str.length).toBe(2); -// expect(str).toBe("\uFFFD\uFFFD"); -// }); - -// it("should not crash on invalid UTF-8 byte sequence with ASCII head", () => { -// const buf = Buffer.from([0x42, 0xc0, 0xfd]); -// expect(buf.length).toBe(3); -// const str = buf.toString(); -// expect(str.length).toBe(3); -// expect(str).toBe("B\uFFFD\uFFFD"); -// }); - -// it("should not perform out-of-bound access on invalid UTF-8 byte sequence", () => { -// const buf = Buffer.from([0x01, 0x9a, 0x84, 0x13, 0x12, 0x11, 0x10, 0x09]).subarray(2); -// expect(buf.length).toBe(6); -// const str = buf.toString(); -// expect(str.length).toBe(6); -// expect(str).toBe("\uFFFD\x13\x12\x11\x10\x09"); -// }); - -// it("repro #2063", () => { -// const buf = Buffer.from( -// "eyJlbWFpbCI6Ijg3MTg4NDYxN0BxcS5jb20iLCJpZCI6OCwicm9sZSI6Im5vcm1hbCIsImlhdCI6MTY3NjI4NDQyMSwiZXhwIjoxNjc2ODg5MjIxfQ", -// "base64", -// ); -// expect(buf.length).toBe(85); -// expect(buf[82]).toBe(50); -// expect(buf[83]).toBe(49); -// expect(buf[84]).toBe(125); -// }); - -// it("inspect() should exist", () => { -// expect(Buffer.prototype.inspect).toBeInstanceOf(Function); -// expect(new Buffer("123").inspect()).toBe(Bun.inspect(new Buffer("123"))); -// }); - -// it("read alias", () => { -// var buf = new Buffer(1024); -// var data = new DataView(buf.buffer); - -// data.setUint8(0, 200, false); - -// expect(buf.readUint8(0)).toBe(buf.readUInt8(0)); -// expect(buf.readUintBE(0, 4)).toBe(buf.readUIntBE(0, 4)); -// expect(buf.readUintLE(0, 4)).toBe(buf.readUIntLE(0, 4)); -// expect(buf.readUint16BE(0)).toBe(buf.readUInt16BE(0)); -// expect(buf.readUint16LE(0)).toBe(buf.readUInt16LE(0)); -// expect(buf.readUint32BE(0)).toBe(buf.readUInt32BE(0)); -// expect(buf.readUint32LE(0)).toBe(buf.readUInt32LE(0)); -// expect(buf.readBigUint64BE(0)).toBe(buf.readBigUInt64BE(0)); -// expect(buf.readBigUint64LE(0)).toBe(buf.readBigUInt64LE(0)); -// }); - -// it("write alias", () => { -// var buf = new Buffer(1024); -// var buf2 = new Buffer(1024); - -// function reset() { -// new Uint8Array(buf.buffer).fill(0); -// new Uint8Array(buf2.buffer).fill(0); -// } - -// function shouldBeSame(name, name2, ...args) { -// buf[name].call(buf, ...args); -// buf2[name2].call(buf2, ...args); - -// expect(buf).toStrictEqual(buf2); -// reset(); -// } - -// shouldBeSame("writeUint8", "writeUInt8", 10); -// shouldBeSame("writeUintBE", "writeUIntBE", 10, 0, 4); -// shouldBeSame("writeUintLE", "writeUIntLE", 10, 0, 4); -// shouldBeSame("writeUint16BE", "writeUInt16BE", 1000); -// shouldBeSame("writeUint16LE", "writeUInt16LE", 1000); -// shouldBeSame("writeUint32BE", "writeUInt32BE", 1000); -// shouldBeSame("writeUint32LE", "writeUInt32LE", 1000); -// shouldBeSame("writeBigUint64BE", "writeBigUInt64BE", BigInt(1000)); -// shouldBeSame("writeBigUint64LE", "writeBigUInt64LE", BigInt(1000)); -// }); + expect(isAscii(new Buffer("abc"))).toBeTrue(); + expect(isAscii(new Buffer(""))).toBeTrue(); + expect(isAscii(new Buffer([32, 32, 128]))).toBeFalse(); + expect(isAscii(new Buffer("What did the π¦ say?"))).toBeFalse(); + expect(isAscii(new Buffer("").buffer)).toBeTrue(); + expect(isAscii(new Buffer([32, 32, 128]).buffer)).toBeFalse(); +}); + +it("isUtf8", () => { + expect(isUtf8(new Buffer("abc"))).toBeTrue(); + expect(isAscii(new Buffer(""))).toBeTrue(); + expect(isUtf8(new Buffer("What did the π¦ say?"))).toBeTrue(); + expect(isUtf8(new Buffer([129, 129, 129]))).toBeFalse(); + + expect(isUtf8(new Buffer("abc").buffer)).toBeTrue(); + expect(isAscii(new Buffer("").buffer)).toBeTrue(); + expect(isUtf8(new Buffer("What did the π¦ say?").buffer)).toBeTrue(); + expect(isUtf8(new Buffer([129, 129, 129]).buffer)).toBeFalse(); +}); + +// https://github.com/oven-sh/bun/issues/2052 +it("Buffer global is settable", () => { + var prevBuffer = globalThis.Buffer; + globalThis.Buffer = 42; + expect(globalThis.Buffer).toBe(42); + globalThis.Buffer = prevBuffer; + expect(globalThis.Buffer).toBe(BufferModule.Buffer); + expect(globalThis.Buffer).toBe(prevBuffer); +}); + +it("length overflow", () => { + // Verify the maximum Uint8Array size. There is no concrete limit by spec. The + // internal limits should be updated if this fails. + expect(() => new Uint8Array(2 ** 32 + 1)).toThrow(/length/); +}); + +it("truncate input values", () => { + const b = Buffer.allocUnsafe(1024); + expect(b.length).toBe(1024); + + b[0] = -1; + expect(b[0]).toBe(255); + + for (let i = 0; i < 1024; i++) { + b[i] = i; + } + + for (let i = 0; i < 1024; i++) { + expect(i % 256).toBe(b[i]); + } +}); + +it("Buffer.allocUnsafe()", () => { + const c = Buffer.allocUnsafe(512); + expect(c.length).toBe(512); +}); + +it("Buffer.from()", () => { + const d = Buffer.from([]); + expect(d.length).toBe(0); +}); + +it("offset properties", () => { + const b = Buffer.alloc(128); + expect(b.length).toBe(128); + expect(b.byteOffset).toBe(0); + expect(b.offset).toBe(0); +}); + +it("creating a Buffer from a Uint32Array", () => { + const ui32 = new Uint32Array(4).fill(42); + const e = Buffer.from(ui32); + for (const [index, value] of e.entries()) { + expect(value).toBe(ui32[index]); + } +}); + +it("creating a Buffer from a Uint32Array (old constructor)", () => { + const ui32 = new Uint32Array(4).fill(42); + const e = Buffer(ui32); + for (const [key, value] of e.entries()) { + expect(value).toBe(ui32[key]); + } +}); + +it("invalid encoding", () => { + const b = Buffer.allocUnsafe(64); + // Test invalid encoding for Buffer.toString + expect(() => b.toString("invalid")).toThrow(/encoding/); + // Invalid encoding for Buffer.write + expect(() => b.write("test string", 0, 5, "invalid")).toThrow(/encoding/); + // Unsupported arguments for Buffer.write + expect(() => b.write("test", "utf8", 0)).toThrow(/invalid/i); +}); + +it("create 0-length buffers", () => { + Buffer.from(""); + Buffer.from("", "ascii"); + Buffer.from("", "latin1"); + Buffer.alloc(0); + Buffer.allocUnsafe(0); + new Buffer(""); + new Buffer("", "ascii"); + new Buffer("", "latin1"); + new Buffer("", "binary"); + Buffer(0); +}); + +it("write() beyond end of buffer", () => { + const b = Buffer.allocUnsafe(64); + // Try to write a 0-length string beyond the end of b + expect(() => b.write("", 2048)).toThrow(RangeError); + // Throw when writing to negative offset + expect(() => b.write("a", -1)).toThrow(RangeError); + // Throw when writing past bounds from the pool + expect(() => b.write("a", 2048)).toThrow(RangeError); + // Throw when writing to negative offset + expect(() => b.write("a", -1)).toThrow(RangeError); + // Offset points to the end of the buffer and does not throw. + // (see https://github.com/nodejs/node/issues/8127). + Buffer.alloc(1).write("", 1, 0); +}); + +it("copy() beyond end of buffer", () => { + const b = Buffer.allocUnsafe(64); + // Try to copy 0 bytes worth of data into an empty buffer + b.copy(Buffer.alloc(0), 0, 0, 0); + // Try to copy 0 bytes past the end of the target buffer + b.copy(Buffer.alloc(0), 1, 1, 1); + b.copy(Buffer.alloc(1), 1, 1, 1); + // Try to copy 0 bytes from past the end of the source buffer + b.copy(Buffer.alloc(1), 0, 2048, 2048); +}); + +it("smart defaults and ability to pass string values as offset", () => { + const writeTest = Buffer.from("abcdes"); + writeTest.write("n", "ascii"); + expect(() => writeTest.write("o", "1", "ascii")).toThrow(/offset/); + writeTest.write("o", 1, "ascii"); + writeTest.write("d", 2, "ascii"); + writeTest.write("e", 3, "ascii"); + writeTest.write("j", 4, "ascii"); + expect(writeTest.toString()).toBe("nodejs"); +}); + +it("ASCII slice", () => { + const buf = Buffer.allocUnsafe(256); + const str = "hello world"; + for (let i = 0; i < str.length; i++) { + buf[i] = str.charCodeAt(i); + } + expect(buf.toString("ascii", 0, str.length)).toBe(str); + + const offset = 100; + expect(buf.write(str, offset, "ascii")).toBe(str.length); + expect(buf.toString("ascii", offset, offset + str.length)).toBe(str); + + const slice1 = buf.slice(offset, offset + str.length); + const slice2 = buf.slice(offset, offset + str.length); + for (let i = 0; i < str.length; i++) { + expect(slice1[i]).toBe(slice2[i]); + } +}); + +it("UTF-8 slice", () => { + const b = Buffer.allocUnsafe(256); + const utf8String = "Β‘hΞllΓ³ wΓ΄rld!"; + const offset = 100; + + b.write(utf8String, 0, Buffer.byteLength(utf8String), "utf8"); + expect(b.toString("utf8", 0, Buffer.byteLength(utf8String))).toBe(utf8String); + + expect(b.write(utf8String, offset, "utf8")).toBe(Buffer.byteLength(utf8String)); + expect(b.toString("utf8", offset, offset + Buffer.byteLength(utf8String))).toBe(utf8String); + + const sliceA = b.slice(offset, offset + Buffer.byteLength(utf8String)); + const sliceB = b.slice(offset, offset + Buffer.byteLength(utf8String)); + for (let i = 0; i < Buffer.byteLength(utf8String); i++) { + expect(sliceA[i]).toBe(sliceB[i]); + } + + const slice = b.slice(100, 150); + expect(slice.length).toBe(50); + for (let i = 0; i < 50; i++) { + expect(b[100 + i]).toBe(slice[i]); + } +}); + +it("only top level parent propagates from allocPool", () => { + const b = Buffer.allocUnsafe(5); + const c = b.slice(0, 4); + const d = c.slice(0, 2); + expect(b.parent).toBe(c.parent); + expect(b.parent).toBe(d.parent); +}); + +it("only top level parent propagates from a non-pooled instance", () => { + const b = Buffer.allocUnsafeSlow(5); + const c = b.slice(0, 4); + const d = c.slice(0, 2); + expect(c.parent).toBe(d.parent); +}); + +it("UTF-8 write() & slice()", () => { + const testValue = "\u00F6\u65E5\u672C\u8A9E"; // ΓΆζ₯ζ¬θͺ + const buffer = Buffer.allocUnsafe(32); + const size = buffer.write(testValue, 0, "utf8"); + const slice = buffer.toString("utf8", 0, size); + expect(slice).toBe(testValue); +}); + +it("triple slice", () => { + const a = Buffer.allocUnsafe(8); + for (let i = 0; i < 8; i++) a[i] = i; + const b = a.slice(4, 8); + expect(b[0]).toBe(4); + expect(b[1]).toBe(5); + expect(b[2]).toBe(6); + expect(b[3]).toBe(7); + const c = b.slice(2, 4); + expect(c[0]).toBe(6); + expect(c[1]).toBe(7); +}); + +it("Buffer.from() with encoding", () => { + const b = Buffer.from([23, 42, 255]); + expect(b.length).toBe(3); + expect(b[0]).toBe(23); + expect(b[1]).toBe(42); + expect(b[2]).toBe(255); + expect(Buffer.from(b)).toStrictEqual(b); + + // Test for proper UTF-8 Encoding + expect(Buffer.from("ΓΌber")).toStrictEqual(Buffer.from([195, 188, 98, 101, 114])); + + // Test for proper ascii Encoding, length should be 4 + expect(Buffer.from("ΓΌber", "ascii")).toStrictEqual(Buffer.from([252, 98, 101, 114])); + + ["ucs2", "ucs-2", "utf16le", "utf-16le"].forEach(encoding => { + // Test for proper UTF16LE encoding, length should be 8 + expect(Buffer.from("ΓΌber", encoding)).toStrictEqual(Buffer.from([252, 0, 98, 0, 101, 0, 114, 0])); + + // Length should be 12 + const b = Buffer.from("ΠΏΡΠΈΠ²Π΅Ρ", encoding); + expect(b).toStrictEqual(Buffer.from([63, 4, 64, 4, 56, 4, 50, 4, 53, 4, 66, 4])); + expect(b.toString(encoding)).toBe("ΠΏΡΠΈΠ²Π΅Ρ"); + + const c = Buffer.from([0, 0, 0, 0, 0]); + expect(c.length).toBe(5); + expect(c.write("γγγγγ", encoding)).toBe(4); + expect(c).toStrictEqual(Buffer.from([0x42, 0x30, 0x44, 0x30, 0x00])); + }); + + const c = Buffer.from("\uD83D\uDC4D", "utf-16le"); // THUMBS UP SIGN (U+1F44D) + expect(c.length).toBe(4); + expect(c).toStrictEqual(Buffer.from("3DD84DDC", "hex")); +}); + +it("construction from arrayish object", () => { + const arrayIsh = { 0: 0, 1: 1, 2: 2, 3: 3, length: 4 }; + expect(Buffer.from(arrayIsh)).toStrictEqual(Buffer.from([0, 1, 2, 3])); + const strArrayIsh = { 0: "0", 1: "1", 2: "2", 3: "3", length: 4 }; + expect(Buffer.from(strArrayIsh)).toStrictEqual(Buffer.from([0, 1, 2, 3])); +}); + +it("toString('base64')", () => { + expect(Buffer.from("Man").toString("base64")).toBe("TWFu"); + expect(Buffer.from("Woman").toString("base64")).toBe("V29tYW4="); +}); + +it("toString('base64url')", () => { + expect(Buffer.from("Man").toString("base64url")).toBe("TWFu"); + expect(Buffer.from("Woman").toString("base64url")).toBe("V29tYW4"); +}); + +it("regular and URL-safe base64 work both ways", () => { + const expected = [0xff, 0xff, 0xbe, 0xff, 0xef, 0xbf, 0xfb, 0xef, 0xff]; + expect(Buffer.from("//++/++/++//", "base64")).toStrictEqual(Buffer.from(expected)); + expect(Buffer.from("__--_--_--__", "base64")).toStrictEqual(Buffer.from(expected)); + expect(Buffer.from("//++/++/++//", "base64url")).toStrictEqual(Buffer.from(expected)); + expect(Buffer.from("__--_--_--__", "base64url")).toStrictEqual(Buffer.from(expected)); +}); + +it("regular and URL-safe base64 work both ways with padding", () => { + const expected = [0xff, 0xff, 0xbe, 0xff, 0xef, 0xbf, 0xfb, 0xef, 0xff, 0xfb]; + expect(Buffer.from("//++/++/++//+w==", "base64")).toStrictEqual(Buffer.from(expected)); + expect(Buffer.from("//++/++/++//+w==", "base64")).toStrictEqual(Buffer.from(expected)); + expect(Buffer.from("//++/++/++//+w==", "base64url")).toStrictEqual(Buffer.from(expected)); + expect(Buffer.from("//++/++/++//+w==", "base64url")).toStrictEqual(Buffer.from(expected)); +}); + +it("big example (base64 & base64url)", () => { + const quote = + "Man is distinguished, not only by his reason, but by this " + + "singular passion from other animals, which is a lust " + + "of the mind, that by a perseverance of delight in the " + + "continued and indefatigable generation of knowledge, " + + "exceeds the short vehemence of any carnal pleasure."; + const expected = + "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb" + + "24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlci" + + "BhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQ" + + "gYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu" + + "dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZ" + + "GdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm" + + "5hbCBwbGVhc3VyZS4="; + + expect(Buffer.from(quote).toString("base64")).toBe(expected); + expect(Buffer.from(quote).toString("base64url")).toBe( + expected.replaceAll("+", "-").replaceAll("/", "_").replaceAll("=", ""), + ); +}); + +function forEachBase64(label, test) { + ["base64", "base64url"].forEach(encoding => it(`${label} (${encoding})`, test.bind(null, encoding))); +} + +forEachBase64("big example", encoding => { + const quote = + "Man is distinguished, not only by his reason, but by this " + + "singular passion from other animals, which is a lust " + + "of the mind, that by a perseverance of delight in the " + + "continued and indefatigable generation of knowledge, " + + "exceeds the short vehemence of any carnal pleasure."; + const expected = + "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb" + + "24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlci" + + "BhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQ" + + "gYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu" + + "dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZ" + + "GdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm" + + "5hbCBwbGVhc3VyZS4="; + + const b = Buffer.allocUnsafe(1024); + expect(b.write(expected, 0, encoding)).toBe(quote.length); + expect(b.toString("ascii", 0, quote.length)).toBe(quote); + + // Check that the base64 decoder ignores whitespace + const white = + `${expected.slice(0, 60)} \n` + + `${expected.slice(60, 120)} \n` + + `${expected.slice(120, 180)} \n` + + `${expected.slice(180, 240)} \n` + + `${expected.slice(240, 300)}\n` + + `${expected.slice(300, 360)}\n`; + const c = Buffer.allocUnsafe(1024); + expect(c.write(white, 0, encoding)).toBe(quote.length); + expect(c.toString("ascii", 0, quote.length)).toBe(quote); + + // Check that the base64 decoder on the constructor works + // even in the presence of whitespace. + const d = Buffer.from(white, encoding); + expect(d.length).toBe(quote.length); + expect(d.toString("ascii", 0, quote.length)).toBe(quote); + + // Check that the base64 decoder ignores illegal chars + const illegal = + expected.slice(0, 60) + + " \x80" + + expected.slice(60, 120) + + " \xff" + + expected.slice(120, 180) + + " \x00" + + expected.slice(180, 240) + + " \x98" + + expected.slice(240, 300) + + "\x03" + + expected.slice(300, 360); + const e = Buffer.from(illegal, encoding); + expect(e.length).toBe(quote.length); + expect(e.toString("ascii", 0, quote.length)).toBe(quote); +}); + +forEachBase64("padding", encoding => { + expect(Buffer.from("", encoding).toString()).toBe(""); + expect(Buffer.from("K", encoding).toString()).toBe(""); + // multiple-of-4 with padding + expect(Buffer.from("Kg==", encoding).toString()).toBe("*"); + expect(Buffer.from("Kio=", encoding).toString()).toBe("*".repeat(2)); + expect(Buffer.from("Kioq", encoding).toString()).toBe("*".repeat(3)); + expect(Buffer.from("KioqKg==", encoding).toString()).toBe("*".repeat(4)); + expect(Buffer.from("KioqKio=", encoding).toString()).toBe("*".repeat(5)); + expect(Buffer.from("KioqKioq", encoding).toString()).toBe("*".repeat(6)); + expect(Buffer.from("KioqKioqKg==", encoding).toString()).toBe("*".repeat(7)); + expect(Buffer.from("KioqKioqKio=", encoding).toString()).toBe("*".repeat(8)); + expect(Buffer.from("KioqKioqKioq", encoding).toString()).toBe("*".repeat(9)); + expect(Buffer.from("KioqKioqKioqKg==", encoding).toString()).toBe("*".repeat(10)); + expect(Buffer.from("KioqKioqKioqKio=", encoding).toString()).toBe("*".repeat(11)); + expect(Buffer.from("KioqKioqKioqKioq", encoding).toString()).toBe("*".repeat(12)); + expect(Buffer.from("KioqKioqKioqKioqKg==", encoding).toString()).toBe("*".repeat(13)); + expect(Buffer.from("KioqKioqKioqKioqKio=", encoding).toString()).toBe("*".repeat(14)); + expect(Buffer.from("KioqKioqKioqKioqKioq", encoding).toString()).toBe("*".repeat(15)); + expect(Buffer.from("KioqKioqKioqKioqKioqKg==", encoding).toString()).toBe("*".repeat(16)); + expect(Buffer.from("KioqKioqKioqKioqKioqKio=", encoding).toString()).toBe("*".repeat(17)); + expect(Buffer.from("KioqKioqKioqKioqKioqKioq", encoding).toString()).toBe("*".repeat(18)); + expect(Buffer.from("KioqKioqKioqKioqKioqKioqKg==", encoding).toString()).toBe("*".repeat(19)); + expect(Buffer.from("KioqKioqKioqKioqKioqKioqKio=", encoding).toString()).toBe("*".repeat(20)); + // No padding, not a multiple of 4 + expect(Buffer.from("Kg", encoding).toString()).toBe("*"); + expect(Buffer.from("Kio", encoding).toString()).toBe("*".repeat(2)); + expect(Buffer.from("KioqKg", encoding).toString()).toBe("*".repeat(4)); + expect(Buffer.from("KioqKio", encoding).toString()).toBe("*".repeat(5)); + expect(Buffer.from("KioqKioqKg", encoding).toString()).toBe("*".repeat(7)); + expect(Buffer.from("KioqKioqKio", encoding).toString()).toBe("*".repeat(8)); + expect(Buffer.from("KioqKioqKioqKg", encoding).toString()).toBe("*".repeat(10)); + expect(Buffer.from("KioqKioqKioqKio", encoding).toString()).toBe("*".repeat(11)); + expect(Buffer.from("KioqKioqKioqKioqKg", encoding).toString()).toBe("*".repeat(13)); + expect(Buffer.from("KioqKioqKioqKioqKio", encoding).toString()).toBe("*".repeat(14)); + expect(Buffer.from("KioqKioqKioqKioqKioqKg", encoding).toString()).toBe("*".repeat(16)); + expect(Buffer.from("KioqKioqKioqKioqKioqKio", encoding).toString()).toBe("*".repeat(17)); + expect(Buffer.from("KioqKioqKioqKioqKioqKioqKg", encoding).toString()).toBe("*".repeat(19)); + expect(Buffer.from("KioqKioqKioqKioqKioqKioqKio", encoding).toString()).toBe("*".repeat(20)); + // Handle padding graciously, multiple-of-4 or not + expect(Buffer.from("72INjkR5fchcxk9+VgdGPFJDxUBFR5/rMFsghgxADiw==", encoding).length).toBe(32); + expect(Buffer.from("72INjkR5fchcxk9-VgdGPFJDxUBFR5_rMFsghgxADiw==", encoding).length).toBe(32); + expect(Buffer.from("72INjkR5fchcxk9+VgdGPFJDxUBFR5/rMFsghgxADiw=", encoding).length).toBe(32); + expect(Buffer.from("72INjkR5fchcxk9-VgdGPFJDxUBFR5_rMFsghgxADiw=", encoding).length).toBe(32); + expect(Buffer.from("72INjkR5fchcxk9+VgdGPFJDxUBFR5/rMFsghgxADiw", encoding).length).toBe(32); + expect(Buffer.from("72INjkR5fchcxk9-VgdGPFJDxUBFR5_rMFsghgxADiw", encoding).length).toBe(32); + expect(Buffer.from("w69jACy6BgZmaFvv96HG6MYksWytuZu3T1FvGnulPg==", encoding).length).toBe(31); + expect(Buffer.from("w69jACy6BgZmaFvv96HG6MYksWytuZu3T1FvGnulPg=", encoding).length).toBe(31); + expect(Buffer.from("w69jACy6BgZmaFvv96HG6MYksWytuZu3T1FvGnulPg", encoding).length).toBe(31); +}); + +it("encodes single '.' character in UTF-16", () => { + const padded = Buffer.from("//4uAA==", "base64"); + expect(padded[0]).toBe(0xff); + expect(padded[1]).toBe(0xfe); + expect(padded[2]).toBe(0x2e); + expect(padded[3]).toBe(0x00); + expect(padded.toString("base64")).toBe("//4uAA=="); + + const dot = Buffer.from("//4uAA", "base64url"); + expect(dot[0]).toBe(0xff); + expect(dot[1]).toBe(0xfe); + expect(dot[2]).toBe(0x2e); + expect(dot[3]).toBe(0x00); + expect(dot.toString("base64url")).toBe("__4uAA"); +}); + +// https://github.com/joyent/node/issues/402 +it("writing base64 at a position > 0 should not mangle the result", () => { + const segments = ["TWFkbmVzcz8h", "IFRoaXM=", "IGlz", "IG5vZGUuanMh"]; + const b = Buffer.allocUnsafe(64); + let pos = 0; + + for (let i = 0; i < segments.length; ++i) { + pos += b.write(segments[i], pos, "base64"); + } + expect(b.toString("latin1", 0, pos)).toBe("Madness?! This is node.js!"); +}); + +// https://github.com/joyent/node/issues/402 +it("writing base64url at a position > 0 should not mangle the result", () => { + const segments = ["TWFkbmVzcz8h", "IFRoaXM", "IGlz", "IG5vZGUuanMh"]; + const b = Buffer.allocUnsafe(64); + let pos = 0; + + for (let i = 0; i < segments.length; ++i) { + pos += b.write(segments[i], pos, "base64url"); + } + expect(b.toString("latin1", 0, pos)).toBe("Madness?! This is node.js!"); +}); + +it("regression tests from Node.js", () => { + // Regression test for https://github.com/nodejs/node/issues/3496. + expect(Buffer.from("=bad".repeat(1e4), "base64").length).toBe(0); + // Regression test for https://github.com/nodejs/node/issues/11987. + expect(Buffer.from("w0 ", "base64")).toStrictEqual(Buffer.from("w0", "base64")); + // Regression test for https://github.com/nodejs/node/issues/13657. + expect(Buffer.from(" YWJvcnVtLg", "base64")).toStrictEqual(Buffer.from("YWJvcnVtLg", "base64")); + // issue GH-3416 + Buffer.from(Buffer.allocUnsafe(0), 0, 0); + // Regression test for https://github.com/nodejs/node-v0.x-archive/issues/5482: + // should throw but not assert in C++ land. + expect(() => Buffer.from("", "buffer")).toThrow(/encoding/); +}); + +it("creating buffers larger than pool size", () => { + const l = Buffer.poolSize + 5; + const s = "h".repeat(l); + const b = Buffer.from(s); + + for (let i = 0; i < l; i++) { + expect(b[i]).toBe("h".charCodeAt(0)); + } + + const sb = b.toString(); + expect(sb.length).toBe(s.length); + expect(sb).toBe(s); +}); + +it("hex toString()", () => { + const hexb = Buffer.allocUnsafe(256); + for (let i = 0; i < 256; i++) { + hexb[i] = i; + } + const hexStr = hexb.toString("hex"); + expect(hexStr).toBe( + "000102030405060708090a0b0c0d0e0f" + + "101112131415161718191a1b1c1d1e1f" + + "202122232425262728292a2b2c2d2e2f" + + "303132333435363738393a3b3c3d3e3f" + + "404142434445464748494a4b4c4d4e4f" + + "505152535455565758595a5b5c5d5e5f" + + "606162636465666768696a6b6c6d6e6f" + + "707172737475767778797a7b7c7d7e7f" + + "808182838485868788898a8b8c8d8e8f" + + "909192939495969798999a9b9c9d9e9f" + + "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf" + + "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf" + + "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf" + + "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf" + + "e0e1e2e3e4e5e6e7e8e9eaebecedeeef" + + "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", + ); + + const hexb2 = Buffer.from(hexStr, "hex"); + for (let i = 0; i < 256; i++) { + expect(hexb2[i]).toBe(hexb[i]); + } +}); + +it("single hex character is discarded", () => { + expect(Buffer.from("A", "hex").length).toBe(0); +}); + +it("if a trailing character is discarded, rest of string is processed", () => { + expect(Buffer.from("Abx", "hex")).toEqual(Buffer.from("Ab", "hex")); +}); + +it("single base64 char encodes as 0", () => { + expect(Buffer.from("A", "base64").length).toBe(0); +}); + +it("invalid slice end", () => { + const b = Buffer.from([1, 2, 3, 4, 5]); + const b2 = b.toString("hex", 1, 10000); + const b3 = b.toString("hex", 1, 5); + const b4 = b.toString("hex", 1); + expect(b2).toBe(b3); + expect(b2).toBe(b4); +}); + +it("slice()", () => { + function buildBuffer(data) { + if (Array.isArray(data)) { + const buffer = Buffer.allocUnsafe(data.length); + data.forEach((v, k) => (buffer[k] = v)); + return buffer; + } + return null; + } + + const x = buildBuffer([0x81, 0xa3, 0x66, 0x6f, 0x6f, 0xa3, 0x62, 0x61, 0x72]); + expect(x).toStrictEqual(Buffer.from([0x81, 0xa3, 0x66, 0x6f, 0x6f, 0xa3, 0x62, 0x61, 0x72])); + + const a = x.slice(4); + expect(a.length).toBe(5); + expect(a[0]).toBe(0x6f); + expect(a[1]).toBe(0xa3); + expect(a[2]).toBe(0x62); + expect(a[3]).toBe(0x61); + expect(a[4]).toBe(0x72); + + const b = x.slice(0); + expect(b.length).toBe(x.length); + + const c = x.slice(0, 4); + expect(c.length).toBe(4); + expect(c[0]).toBe(0x81); + expect(c[1]).toBe(0xa3); + + const d = x.slice(0, 9); + expect(d.length).toBe(9); + + const e = x.slice(1, 4); + expect(e.length).toBe(3); + expect(e[0]).toBe(0xa3); + + const f = x.slice(2, 4); + expect(f.length).toBe(2); + expect(f[0]).toBe(0x66); + expect(f[1]).toBe(0x6f); +}); + +function forEachUnicode(label, test) { + ["ucs2", "ucs-2", "utf16le", "utf-16le"].forEach(encoding => it(`${label} (${encoding})`, test.bind(null, encoding))); +} + +forEachUnicode("write()", encoding => { + const b = Buffer.allocUnsafe(10); + b.write("γγγγγ", encoding); + expect(b.toString(encoding)).toBe("γγγγγ"); +}); + +forEachUnicode("write() with offset", encoding => { + const b = Buffer.allocUnsafe(11); + b.write("γγγγγ", 1, encoding); + expect(b.toString(encoding, 1)).toBe("γγγγγ"); +}); + +it("latin1 encoding should write only one byte per character", () => { + const b = Buffer.from([0xde, 0xad, 0xbe, 0xef]); + b.write(String.fromCharCode(0xffff), 0, "latin1"); + expect(b[0]).toBe(0xff); + expect(b[1]).toBe(0xad); + expect(b[2]).toBe(0xbe); + expect(b[3]).toBe(0xef); + b.write(String.fromCharCode(0xaaee), 0, "latin1"); + expect(b[0]).toBe(0xee); + expect(b[1]).toBe(0xad); + expect(b[2]).toBe(0xbe); + expect(b[3]).toBe(0xef); +}); + +it("binary encoding should write only one byte per character", () => { + const b = Buffer.from([0xde, 0xad, 0xbe, 0xef]); + b.write(String.fromCharCode(0xffff), 0, "latin1"); + expect(b[0]).toBe(0xff); + expect(b[1]).toBe(0xad); + expect(b[2]).toBe(0xbe); + expect(b[3]).toBe(0xef); + b.write(String.fromCharCode(0xaaee), 0, "latin1"); + expect(b[0]).toBe(0xee); + expect(b[1]).toBe(0xad); + expect(b[2]).toBe(0xbe); + expect(b[3]).toBe(0xef); +}); + +it("UTF-8 string includes null character", () => { + // https://github.com/nodejs/node-v0.x-archive/pull/1210 + expect(Buffer.from("\0").length).toBe(1); + expect(Buffer.from("\0\0").length).toBe(2); +}); + +it("truncate write() at character boundary", () => { + const buf = Buffer.allocUnsafe(2); + expect(buf.write("")).toBe(0); // 0bytes + expect(buf.write("\0")).toBe(1); // 1byte (v8 adds null terminator) + expect(buf.write("a\0")).toBe(2); // 1byte * 2 + expect(buf.write("γ")).toBe(0); // 3bytes + expect(buf.write("\0γ")).toBe(1); // 1byte + 3bytes + expect(buf.write("\0\0γ")).toBe(2); // 1byte * 2 + 3bytes + + const buf2 = Buffer.allocUnsafe(10); + expect(buf2.write("γγγ")).toBe(9); // 3bytes * 3 (v8 adds null term.) + expect(buf2.write("γγγ\0")).toBe(10); // 3bytes * 3 + 1byte +}); + +it("write() with maxLength", () => { + // https://github.com/nodejs/node-v0.x-archive/issues/243 + const buf = Buffer.allocUnsafe(4); + buf.fill(0xff); + expect(buf.write("abcd", 1, 2, "utf8")).toBe(2); + expect(buf[0]).toBe(0xff); + expect(buf[1]).toBe(0x61); + expect(buf[2]).toBe(0x62); + expect(buf[3]).toBe(0xff); + + buf.fill(0xff); + expect(buf.write("abcd", 1, 4)).toBe(3); + expect(buf[0]).toBe(0xff); + expect(buf[1]).toBe(0x61); + expect(buf[2]).toBe(0x62); + expect(buf[3]).toBe(0x63); + + buf.fill(0xff); + expect(buf.write("abcd", 1, 2, "utf8")).toBe(2); + expect(buf[0]).toBe(0xff); + expect(buf[1]).toBe(0x61); + expect(buf[2]).toBe(0x62); + expect(buf[3]).toBe(0xff); + + buf.fill(0xff); + expect(buf.write("abcdef", 1, 2, "hex")).toBe(2); + expect(buf[0]).toBe(0xff); + expect(buf[1]).toBe(0xab); + expect(buf[2]).toBe(0xcd); + expect(buf[3]).toBe(0xff); + + ["ucs2", "ucs-2", "utf16le", "utf-16le"].forEach(encoding => { + buf.fill(0xff); + expect(buf.write("abcd", 0, 2, encoding)).toBe(2); + expect(buf[0]).toBe(0x61); + expect(buf[1]).toBe(0x00); + expect(buf[2]).toBe(0xff); + expect(buf[3]).toBe(0xff); + }); +}); + +it("offset returns are correct", () => { + const b = Buffer.allocUnsafe(16); + expect(b.writeUInt32LE(0, 0)).toBe(4); + expect(b.writeUInt16LE(0, 4)).toBe(6); + expect(b.writeUInt8(0, 6)).toBe(7); + expect(b.writeInt8(0, 7)).toBe(8); + expect(b.writeDoubleLE(0, 8)).toBe(16); +}); + +it("unmatched surrogates should not produce invalid utf8 output", () => { + // ef bf bd = utf-8 representation of unicode replacement character + // see https://codereview.chromium.org/121173009/ + let buf = Buffer.from("ab\ud800cd", "utf8"); + expect(buf[0]).toBe(0x61); + expect(buf[1]).toBe(0x62); + expect(buf[2]).toBe(0xef); + expect(buf[3]).toBe(0xbf); + expect(buf[4]).toBe(0xbd); + expect(buf[5]).toBe(0x63); + expect(buf[6]).toBe(0x64); + + buf = Buffer.from("abcd\ud800", "utf8"); + expect(buf[0]).toBe(0x61); + expect(buf[1]).toBe(0x62); + expect(buf[2]).toBe(0x63); + expect(buf[3]).toBe(0x64); + expect(buf[4]).toBe(0xef); + expect(buf[5]).toBe(0xbf); + expect(buf[6]).toBe(0xbd); + + buf = Buffer.from("\ud800abcd", "utf8"); + expect(buf[0]).toBe(0xef); + expect(buf[1]).toBe(0xbf); + expect(buf[2]).toBe(0xbd); + expect(buf[3]).toBe(0x61); + expect(buf[4]).toBe(0x62); + expect(buf[5]).toBe(0x63); + expect(buf[6]).toBe(0x64); +}); + +it("buffer overrun", () => { + const buf = Buffer.from([0, 0, 0, 0, 0]); // length: 5 + const sub = buf.slice(0, 4); // length: 4 + expect(sub.write("12345", "latin1")).toBe(4); + expect(buf[4]).toBe(0); + expect(sub.write("12345", "binary")).toBe(4); + expect(buf[4]).toBe(0); +}); + +it("alloc with fill option", () => { + const buf = Buffer.alloc(5, "800A", "hex"); + expect(buf[0]).toBe(128); + expect(buf[1]).toBe(10); + expect(buf[2]).toBe(128); + expect(buf[3]).toBe(10); + expect(buf[4]).toBe(128); +}); + +// https://github.com/joyent/node/issues/1758 +it("check for fractional length args, junk length args, etc.", () => { + // Call .fill() first, stops valgrind warning about uninitialized memory reads. + Buffer.allocUnsafe(3.3).fill().toString(); + // Throws bad argument error in commit 43cb4ec + Buffer.alloc(3.3).fill().toString(); + expect(Buffer.allocUnsafe(3.3).length).toBe(3); + expect(Buffer.from({ length: 3.3 }).length).toBe(3); + expect(Buffer.from({ length: "BAM" }).length).toBe(0); + // Make sure that strings are not coerced to numbers. + expect(Buffer.from("99").length).toBe(2); + expect(Buffer.from("13.37").length).toBe(5); + // Ensure that the length argument is respected. + ["ascii", "utf8", "hex", "base64", "latin1", "binary"].forEach(enc => { + expect(Buffer.allocUnsafe(1).write("aaaaaa", 0, 1, enc)).toBe(1); + }); + // Regression test, guard against buffer overrun in the base64 decoder. + const a = Buffer.allocUnsafe(3); + const b = Buffer.from("xxx"); + a.write("aaaaaaaa", "base64"); + expect(b.toString()).toBe("xxx"); +}); + +it("buffer overflow", () => { + // issue GH-5587 + expect(() => Buffer.alloc(8).writeFloatLE(0, 5)).toThrow(RangeError); + expect(() => Buffer.alloc(16).writeDoubleLE(0, 9)).toThrow(RangeError); + // Attempt to overflow buffers, similar to previous bug in array buffers + expect(() => Buffer.allocUnsafe(8).writeFloatLE(0.0, 0xffffffff)).toThrow(RangeError); + expect(() => Buffer.allocUnsafe(8).writeFloatLE(0.0, 0xffffffff)).toThrow(RangeError); + // Ensure negative values can't get past offset + expect(() => Buffer.allocUnsafe(8).writeFloatLE(0.0, -1)).toThrow(RangeError); + expect(() => Buffer.allocUnsafe(8).writeFloatLE(0.0, -1)).toThrow(RangeError); +}); + +it("common write{U}IntLE/BE()", () => { + let buf = Buffer.allocUnsafe(3); + buf.writeUIntLE(0x123456, 0, 3); + expect(buf.toJSON().data).toEqual([0x56, 0x34, 0x12]); + expect(buf.readUIntLE(0, 3)).toBe(0x123456); + + buf.fill(0xff); + buf.writeUIntBE(0x123456, 0, 3); + expect(buf.toJSON().data).toEqual([0x12, 0x34, 0x56]); + expect(buf.readUIntBE(0, 3)).toBe(0x123456); + + buf.fill(0xff); + buf.writeIntLE(0x123456, 0, 3); + expect(buf.toJSON().data).toEqual([0x56, 0x34, 0x12]); + expect(buf.readIntLE(0, 3)).toBe(0x123456); + + buf.fill(0xff); + buf.writeIntBE(0x123456, 0, 3); + expect(buf.toJSON().data).toEqual([0x12, 0x34, 0x56]); + expect(buf.readIntBE(0, 3)).toBe(0x123456); + + buf.fill(0xff); + buf.writeIntLE(-0x123456, 0, 3); + expect(buf.toJSON().data).toEqual([0xaa, 0xcb, 0xed]); + expect(buf.readIntLE(0, 3)).toBe(-0x123456); + + buf.fill(0xff); + buf.writeIntBE(-0x123456, 0, 3); + expect(buf.toJSON().data).toEqual([0xed, 0xcb, 0xaa]); + expect(buf.readIntBE(0, 3)).toBe(-0x123456); + + buf.fill(0xff); + buf.writeIntLE(-0x123400, 0, 3); + expect(buf.toJSON().data).toEqual([0x00, 0xcc, 0xed]); + expect(buf.readIntLE(0, 3)).toBe(-0x123400); + + buf.fill(0xff); + buf.writeIntBE(-0x123400, 0, 3); + expect(buf.toJSON().data).toEqual([0xed, 0xcc, 0x00]); + expect(buf.readIntBE(0, 3)).toBe(-0x123400); + + buf.fill(0xff); + buf.writeIntLE(-0x120000, 0, 3); + expect(buf.toJSON().data).toEqual([0x00, 0x00, 0xee]); + expect(buf.readIntLE(0, 3)).toBe(-0x120000); + + buf.fill(0xff); + buf.writeIntBE(-0x120000, 0, 3); + expect(buf.toJSON().data).toEqual([0xee, 0x00, 0x00]); + expect(buf.readIntBE(0, 3)).toBe(-0x120000); + + buf = Buffer.allocUnsafe(5); + buf.writeUIntLE(0x1234567890, 0, 5); + expect(buf.toJSON().data).toEqual([0x90, 0x78, 0x56, 0x34, 0x12]); + expect(buf.readUIntLE(0, 5)).toBe(0x1234567890); + + buf.fill(0xff); + buf.writeUIntBE(0x1234567890, 0, 5); + expect(buf.toJSON().data).toEqual([0x12, 0x34, 0x56, 0x78, 0x90]); + expect(buf.readUIntBE(0, 5)).toBe(0x1234567890); + + buf.fill(0xff); + buf.writeIntLE(0x1234567890, 0, 5); + expect(buf.toJSON().data).toEqual([0x90, 0x78, 0x56, 0x34, 0x12]); + expect(buf.readIntLE(0, 5)).toBe(0x1234567890); + + buf.fill(0xff); + buf.writeIntBE(0x1234567890, 0, 5); + expect(buf.toJSON().data).toEqual([0x12, 0x34, 0x56, 0x78, 0x90]); + expect(buf.readIntBE(0, 5)).toBe(0x1234567890); + + buf.fill(0xff); + buf.writeIntLE(-0x1234567890, 0, 5); + expect(buf.toJSON().data).toEqual([0x70, 0x87, 0xa9, 0xcb, 0xed]); + expect(buf.readIntLE(0, 5)).toBe(-0x1234567890); + + buf.fill(0xff); + buf.writeIntBE(-0x1234567890, 0, 5); + expect(buf.toJSON().data).toEqual([0xed, 0xcb, 0xa9, 0x87, 0x70]); + expect(buf.readIntBE(0, 5)).toBe(-0x1234567890); + + buf.fill(0xff); + buf.writeIntLE(-0x0012000000, 0, 5); + expect(buf.toJSON().data).toEqual([0x00, 0x00, 0x00, 0xee, 0xff]); + expect(buf.readIntLE(0, 5)).toBe(-0x0012000000); + + buf.fill(0xff); + buf.writeIntBE(-0x0012000000, 0, 5); + expect(buf.toJSON().data).toEqual([0xff, 0xee, 0x00, 0x00, 0x00]); + expect(buf.readIntBE(0, 5)).toBe(-0x0012000000); +}); + +it("construct buffer from buffer", () => { + // Regression test for https://github.com/nodejs/node-v0.x-archive/issues/6111. + // Constructing a buffer from another buffer should a) work, and b) not corrupt + // the source buffer. + const a = [...Array(128).keys()]; // [0, 1, 2, 3, ... 126, 127] + const b = Buffer.from(a); + const c = Buffer.from(b); + expect(b.length).toBe(a.length); + expect(c.length).toBe(a.length); + for (let i = 0, k = a.length; i < k; ++i) { + expect(a[i]).toBe(i); + expect(b[i]).toBe(i); + expect(c[i]).toBe(i); + } +}); + +it("truncation after decode", () => { + const crypto = require("crypto"); + + expect(crypto.createHash("sha1").update(Buffer.from("YW55=======", "base64")).digest("hex")).toBe( + crypto.createHash("sha1").update(Buffer.from("YW55", "base64")).digest("hex"), + ); +}); + +it("Buffer,poolSize", () => { + const ps = Buffer.poolSize; + Buffer.poolSize = 0; + expect(Buffer.allocUnsafe(1).parent instanceof ArrayBuffer).toBe(true); + Buffer.poolSize = ps; + + expect(() => Buffer.allocUnsafe(10).copy()).toThrow(TypeError); + + expect(() => Buffer.from()).toThrow(TypeError); + expect(() => Buffer.from(null)).toThrow(TypeError); +}); + +it("prototype getters should not throw", () => { + expect(Buffer.prototype.parent).toBeUndefined(); + expect(Buffer.prototype.offset).toBeUndefined(); + expect(SlowBuffer.prototype.parent).toBeUndefined(); + expect(SlowBuffer.prototype.offset).toBeUndefined(); +}); + +it("large negative Buffer length inputs should not affect pool offset", () => { + // Use the fromArrayLike() variant here because it's more lenient + // about its input and passes the length directly to allocate(). + expect(Buffer.from({ length: -Buffer.poolSize })).toStrictEqual(Buffer.from("")); + expect(Buffer.from({ length: -100 })).toStrictEqual(Buffer.from("")); + + // Check pool offset after that by trying to write string into the pool. + Buffer.from("abc"); +}); + +it("ParseArrayIndex() should handle full uint32", () => { + expect(() => Buffer.from(new ArrayBuffer(0), -1 >>> 0)).toThrow(RangeError); +}); + +it("ParseArrayIndex() should reject values that don't fit in a 32 bits size_t", () => { + expect(() => { + const a = Buffer.alloc(1); + const b = Buffer.alloc(1); + a.copy(b, 0, 0x100000000, 0x100000001); + }).toThrow(RangeError); +}); + +it("unpooled buffer (replaces SlowBuffer)", () => { + const ubuf = Buffer.allocUnsafeSlow(10); + expect(ubuf).toBeTruthy(); + expect(ubuf.buffer).toBeTruthy(); + expect(ubuf.buffer.byteLength).toBe(10); +}); + +it("verify that an empty ArrayBuffer does not throw", () => { + Buffer.from(new ArrayBuffer()); +}); + +it("alloc() should throw on non-numeric size", () => { + expect(() => Buffer.alloc({ valueOf: () => 1 })).toThrow(TypeError); + expect(() => Buffer.alloc({ valueOf: () => -1 })).toThrow(TypeError); +}); + +it("toLocaleString()", () => { + const buf = Buffer.from("test"); + expect(buf.toLocaleString()).toBe(buf.toString()); + // expect(Buffer.prototype.toLocaleString).toBe(Buffer.prototype.toString); +}); + +it("alloc() should throw on invalid data", () => { + expect(() => Buffer.alloc(0x1000, "This is not correctly encoded", "hex")).toThrow(TypeError); + expect(() => Buffer.alloc(0x1000, "c", "hex")).toThrow(TypeError); + expect(() => Buffer.alloc(1, Buffer.alloc(0))).toThrow(TypeError); + expect(() => Buffer.alloc(40, "x", 20)).toThrow(TypeError); +}); + +it("Buffer.toJSON()", () => { + expect(JSON.stringify(Buffer.from("hello"))).toBe( + JSON.stringify({ + type: "Buffer", + data: [104, 101, 108, 108, 111], + }), + ); +}); + +it("buffer", () => { + var buf = new Buffer(20); + gc(); + // if this fails or infinitely loops, it means there is a memory issue with the JSC::Structure object + expect(Object.keys(buf).length > 0).toBe(true); + gc(); + expect(buf.write("hello world ")).toBe(12); + expect(buf.write("hello world ", "utf8")).toBe(12); + + gc(); + expect(buf.toString("utf8", 0, "hello world ".length)).toBe("hello world "); + gc(); + expect(buf.toString("base64url", 0, "hello world ".length)).toBe(btoa("hello world ")); + gc(); + expect(buf instanceof Uint8Array).toBe(true); + gc(); + expect(buf instanceof Buffer).toBe(true); + gc(); + expect(buf.slice() instanceof Uint8Array).toBe(true); + gc(); + expect(buf.slice(0, 1) instanceof Buffer).toBe(true); + gc(); + expect(buf.slice(0, 1) instanceof Uint8Array).toBe(true); + gc(); + expect(buf.slice(0, 1) instanceof Buffer).toBe(true); + gc(); + expect(buf.slice(0, 0).length).toBe(0); +}); + +it("Buffer", () => { + var inputs = ["hello world", "hello world".repeat(100), `π Get Emoji β All Emojis to βοΈ Copy and π Paste π`]; + var good = inputs.map(a => new TextEncoder().encode(a)); + for (let i = 0; i < inputs.length; i++) { + var input = inputs[i]; + expect(new Buffer(input).toString("utf8")).toBe(inputs[i]); + gc(); + expect(Array.from(new Buffer(input)).join(",")).toBe(good[i].join(",")); + gc(); + expect(Buffer.byteLength(input)).toBe(good[i].length); + gc(); + expect(Buffer.from(input).byteLength).toBe(Buffer.byteLength(input)); + } +}); + +it("Buffer.byteLength", () => { + expect(Buffer.byteLength("ππππππ
ππ€£βΊοΈπππ")).toBe( + new TextEncoder().encode("ππππππ
ππ€£βΊοΈπππ").byteLength, + ); +}); + +it("Buffer.isBuffer", () => { + expect(Buffer.isBuffer(new Buffer(1))).toBe(true); + gc(); + expect(Buffer.isBuffer(new Buffer(0))).toBe(true); + gc(); + expect(Buffer.isBuffer(new Uint8Array(0))).toBe(false); + gc(); + expect(Buffer.isBuffer(new Uint8Array(1))).toBe(false); + gc(); + var a = new Uint8Array(1); + gc(); + expect(Buffer.isBuffer(a)).toBe(false); + gc(); + a = new Buffer(a.buffer); + gc(); + expect(Buffer.isBuffer(a)).toBe(true); + gc(); + expect(a instanceof Buffer).toBe(true); + expect(a instanceof Uint8Array).toBe(true); + expect(new Uint8Array(0) instanceof Buffer).toBe(false); + + // DOMJIT + for (let i = 0; i < 9000; i++) { + if (!Buffer.isBuffer(a)) { + throw new Error("Buffer.isBuffer failed"); + } + + if (Buffer.isBuffer("wat")) { + throw new Error("Buffer.isBuffer failed"); + } + } +}); + +it("writeInt", () => { + var buf = new Buffer(1024); + var data = new DataView(buf.buffer); + buf.writeInt32BE(100); + expect(data.getInt32(0, false)).toBe(100); + buf.writeInt32BE(100); + expect(data.getInt32(0, false)).toBe(100); + var childBuf = buf.subarray(0, 4); + expect(data.getInt32(0, false)).toBe(100); + expect(childBuf.readInt32BE(0, false)).toBe(100); +}); + +it("Buffer.from", () => { + expect(Buffer.from("hello world").toString("utf8")).toBe("hello world"); + expect(Buffer.from("hello world", "ascii").toString("utf8")).toBe("hello world"); + expect(Buffer.from("hello world", "latin1").toString("utf8")).toBe("hello world"); + gc(); + expect(Buffer.from([254]).join(",")).toBe("254"); + + expect(Buffer.from([254], "utf8").join(",")).toBe("254"); + expect(Buffer.from([254], "utf-8").join(",")).toBe("254"); + expect(Buffer.from([254], "latin").join(",")).toBe("254"); + expect(Buffer.from([254], "uc2").join(",")).toBe("254"); + expect(Buffer.from([254], "utf16").join(",")).toBe("254"); + expect(Buffer.isBuffer(Buffer.from([254], "utf16"))).toBe(true); + + expect(() => Buffer.from(123).join(",")).toThrow(); + + expect(Buffer.from({ length: 124 }).join(",")).toBe(Uint8Array.from({ length: 124 }).join(",")); + + expect(Buffer.from(new ArrayBuffer(1024), 0, 512).join(",")).toBe(new Uint8Array(512).join(",")); + + expect(Buffer.from(new Buffer(new ArrayBuffer(1024), 0, 512)).join(",")).toBe(new Uint8Array(512).join(",")); + gc(); +}); + +it("Buffer.from latin1 vs ascii", () => { + const simpleBuffer = Buffer.from("\xa4", "binary"); + expect(simpleBuffer.toString("latin1")).toBe("Β€"); + expect(simpleBuffer.toString("ascii")).toBe("$"); + gc(); + const asciiBuffer = Buffer.from("\xa4", "ascii"); + expect(asciiBuffer.toString("latin1")).toBe("Β€"); + expect(asciiBuffer.toString("ascii")).toBe("$"); + gc(); +}); + +it("Buffer.equals", () => { + var a = new Uint8Array(10); + a[2] = 1; + var b = new Uint8Array(10); + b[2] = 1; + a = new Buffer(a.buffer); + b = new Buffer(b.buffer); + expect(a.equals(b)).toBe(true); + b[2] = 0; + expect(a.equals(b)).toBe(false); +}); + +it("Buffer.compare", () => { + var a = new Uint8Array(10); + a[2] = 1; + var b = new Uint8Array(10); + b[2] = 1; + a = new Buffer(a.buffer); + b = new Buffer(b.buffer); + expect(a.compare(b)).toBe(0); + b[2] = 0; + expect(a.compare(b)).toBe(1); + expect(b.compare(a)).toBe(-1); + + const buf = Buffer.from("0123456789", "utf8"); + const expectedSameBufs = [ + [buf.slice(-10, 10), Buffer.from("0123456789", "utf8")], + [buf.slice(-20, 10), Buffer.from("0123456789", "utf8")], + [buf.slice(-20, -10), Buffer.from("", "utf8")], + [buf.slice(), Buffer.from("0123456789", "utf8")], + [buf.slice(0), Buffer.from("0123456789", "utf8")], + [buf.slice(0, 0), Buffer.from("", "utf8")], + [buf.slice(undefined), Buffer.from("0123456789", "utf8")], + [buf.slice("foobar"), Buffer.from("0123456789", "utf8")], + [buf.slice(undefined, undefined), Buffer.from("0123456789", "utf8")], + [buf.slice(2), Buffer.from("23456789", "utf8")], + [buf.slice(5), Buffer.from("56789", "utf8")], + [buf.slice(10), Buffer.from("", "utf8")], + [buf.slice(5, 8), Buffer.from("567", "utf8")], + [buf.slice(8, -1), Buffer.from("8", "utf8")], + [buf.slice(-10), Buffer.from("0123456789", "utf8")], + [buf.slice(0, -9), Buffer.from("0", "utf8")], + [buf.slice(0, -10), Buffer.from("", "utf8")], + [buf.slice(0, -1), Buffer.from("012345678", "utf8")], + [buf.slice(2, -2), Buffer.from("234567", "utf8")], + [buf.slice(0, 65536), Buffer.from("0123456789", "utf8")], + [buf.slice(65536, 0), Buffer.from("", "utf8")], + [buf.slice(-5, -8), Buffer.from("", "utf8")], + [buf.slice(-5, -3), Buffer.from("56", "utf8")], + [buf.slice(-10, 10), Buffer.from("0123456789", "utf8")], + [buf.slice("0", "1"), Buffer.from("0", "utf8")], + [buf.slice("-5", "10"), Buffer.from("56789", "utf8")], + [buf.slice("-10", "10"), Buffer.from("0123456789", "utf8")], + [buf.slice("-10", "-5"), Buffer.from("01234", "utf8")], + [buf.slice("-10", "-0"), Buffer.from("", "utf8")], + [buf.slice("111"), Buffer.from("", "utf8")], + [buf.slice("0", "-111"), Buffer.from("", "utf8")], + ]; + + for (let i = 0, s = buf.toString(); i < buf.length; ++i) { + expectedSameBufs.push( + [buf.slice(i), Buffer.from(s.slice(i))], + [buf.slice(0, i), Buffer.from(s.slice(0, i))], + [buf.slice(-i), Buffer.from(s.slice(-i))], + [buf.slice(0, -i), Buffer.from(s.slice(0, -i))], + ); + } + + expectedSameBufs.forEach(([buf1, buf2]) => { + expect(Buffer.compare(buf1, buf2)).toBe(0); + }); + + { + const buf = Buffer.from([ + 1, 29, 0, 0, 1, 143, 216, 162, 92, 254, 248, 63, 0, 0, 0, 18, 184, 6, 0, 175, 29, 0, 8, 11, 1, 0, 0, + ]); + const chunk1 = Buffer.from([1, 29, 0, 0, 1, 143, 216, 162, 92, 254, 248, 63, 0]); + const chunk2 = Buffer.from([0, 0, 18, 184, 6, 0, 175, 29, 0, 8, 11, 1, 0, 0]); + const middle = buf.length / 2; + + expect(JSON.stringify(buf.slice(0, middle))).toBe(JSON.stringify(chunk1)); + expect(JSON.stringify(buf.slice(middle))).toBe(JSON.stringify(chunk2)); + } +}); + +it("Buffer.copy", () => { + var array1 = new Uint8Array(128); + array1.fill(100); + array1 = new Buffer(array1.buffer); + var array2 = new Uint8Array(128); + array2.fill(200); + array2 = new Buffer(array2.buffer); + var array3 = new Uint8Array(128); + array3 = new Buffer(array3.buffer); + gc(); + expect(array1.copy(array2)).toBe(128); + expect(array1.join("")).toBe(array2.join("")); + + { + // Create two `Buffer` instances. + const buf1 = Buffer.allocUnsafe(26); + const buf2 = Buffer.allocUnsafe(26).fill("!"); + + for (let i = 0; i < 26; i++) { + // 97 is the decimal ASCII value for 'a'. + buf1[i] = i + 97; + } + + // Copy `buf1` bytes 16 through 19 into `buf2` starting at byte 8 of `buf2`. + buf1.copy(buf2, 8, 16, 20); + expect(buf2.toString("ascii", 0, 25)).toBe("!!!!!!!!qrst!!!!!!!!!!!!!"); + } + + { + const buf = Buffer.allocUnsafe(26); + + for (let i = 0; i < 26; i++) { + // 97 is the decimal ASCII value for 'a'. + buf[i] = i + 97; + } + + buf.copy(buf, 0, 4, 10); + expect(buf.toString()).toBe("efghijghijklmnopqrstuvwxyz"); + } +}); + +export function fillRepeating(dstBuffer, start, end) { + let len = dstBuffer.length, // important: use indices length, not byte-length + sLen = end - start, + p = sLen; // set initial position = source sequence length + + // step 2: copy existing data doubling segment length per iteration + while (p < len) { + if (p + sLen > len) sLen = len - p; // if not power of 2, truncate last segment + dstBuffer.copyWithin(p, start, sLen); // internal copy + p += sLen; // add current length to offset + sLen <<= 1; // double length for next segment + } +} + +describe("Buffer.fill string", () => { + for (let text of ["hello world", "1234567890", "\uD83D\uDE00", "ππππππ
ππ€£βΊοΈπππ"]) { + it(text, () => { + var input = new Buffer(1024); + input.fill(text); + var demo = new Uint8Array(1024); + var encoded = new TextEncoder().encode(text); + + demo.set(encoded); + fillRepeating(demo, 0, encoded.length); + expect(input.join("")).toBe(demo.join("")); + }); + } +}); + +it("Buffer.fill 1 char string", () => { + var input = new Buffer(1024); + input.fill("h"); + var demo = new Uint8Array(1024); + var encoded = new TextEncoder().encode("h"); + + demo.set(encoded); + fillRepeating(demo, 0, encoded.length); + expect(input.join("")).toBe(demo.join("")); +}); + +it("Buffer.concat", () => { + var array1 = new Uint8Array(128); + array1.fill(100); + var array2 = new Uint8Array(128); + array2.fill(200); + var array3 = new Uint8Array(128); + array3.fill(300); + gc(); + expect(Buffer.concat([array1, array2, array3]).join("")).toBe(array1.join("") + array2.join("") + array3.join("")); + expect(Buffer.concat([array1, array2, array3], 222).length).toBe(222); + expect(Buffer.concat([array1, array2, array3], 222).subarray(0, 128).join("")).toBe("100".repeat(128)); + expect(Buffer.concat([array1, array2, array3], 222).subarray(129, 222).join("")).toBe("200".repeat(222 - 129)); +}); + +it("read", () => { + var buf = new Buffer(1024); + var data = new DataView(buf.buffer); + function reset() { + new Uint8Array(buf.buffer).fill(0); + } + data.setBigInt64(0, BigInt(1000), false); + expect(buf.readBigInt64BE(0)).toBe(BigInt(1000)); + reset(); + + data.setBigInt64(0, BigInt(1000), true); + expect(buf.readBigInt64LE(0)).toBe(BigInt(1000)); + reset(); + + data.setBigUint64(0, BigInt(1000), false); + expect(buf.readBigUInt64BE(0)).toBe(BigInt(1000)); + reset(); + + data.setBigUint64(0, BigInt(1000), true); + expect(buf.readBigUInt64LE(0)).toBe(BigInt(1000)); + reset(); + + data.setFloat64(0, 1000, false); + expect(buf.readDoubleBE(0)).toBe(1000); + reset(); + + data.setFloat64(0, 1000, true); + expect(buf.readDoubleLE(0)).toBe(1000); + reset(); + + data.setFloat32(0, 1000, false); + expect(buf.readFloatBE(0)).toBe(1000); + reset(); + + data.setFloat32(0, 1000, true); + expect(buf.readFloatLE(0)).toBe(1000); + reset(); + + data.setInt16(0, 1000, false); + expect(buf.readInt16BE(0)).toBe(1000); + reset(); + + data.setInt16(0, 1000, true); + expect(buf.readInt16LE(0)).toBe(1000); + reset(); + + data.setInt32(0, 1000, false); + expect(buf.readInt32BE(0)).toBe(1000); + reset(); + + data.setInt32(0, 1000, true); + expect(buf.readInt32LE(0)).toBe(1000); + reset(); + + data.setInt8(0, 100, false); + expect(buf.readInt8(0)).toBe(100); + reset(); + + data.setUint16(0, 1000, false); + expect(buf.readUInt16BE(0)).toBe(1000); + reset(); + + data.setUint16(0, 1000, true); + expect(buf.readUInt16LE(0)).toBe(1000); + reset(); + + data.setUint32(0, 1000, false); + expect(buf.readUInt32BE(0)).toBe(1000); + reset(); + + data.setUint32(0, 1000, true); + expect(buf.readUInt32LE(0)).toBe(1000); + reset(); + + data.setUint8(0, 255, false); + expect(buf.readUInt8(0)).toBe(255); + reset(); + + data.setUint8(0, 255, false); + expect(buf.readUInt8(0)).toBe(255); + reset(); +}); + +// this is for checking the simd code path +it("write long utf16 string works", () => { + const long = "ππππππ
ππ€£βΊοΈπππ".repeat(200); + const buf = Buffer.alloc(long.length * 2); + buf.write(long, 0, "utf16le"); + expect(buf.toString("utf16le")).toBe(long); + for (let offset = 0; offset < long.length; offset += 48) { + expect(buf.toString("utf16le", offset, offset + 4)).toBe("π"); + expect(buf.toString("utf16le", offset, offset + 8)).toBe("ππ"); + expect(buf.toString("utf16le", offset, offset + 12)).toBe("πππ"); + expect(buf.toString("utf16le", offset, offset + 16)).toBe("ππππ"); + expect(buf.toString("utf16le", offset, offset + 20)).toBe("πππππ"); + expect(buf.toString("utf16le", offset, offset + 24)).toBe("ππππππ
"); + expect(buf.toString("utf16le", offset, offset + 28)).toBe("ππππππ
π"); + expect(buf.toString("utf16le", offset, offset + 32)).toBe("ππππππ
ππ€£"); + expect(buf.toString("utf16le", offset, offset + 36)).toBe("ππππππ
ππ€£βΊοΈ"); + expect(buf.toString("utf16le", offset, offset + 40)).toBe("ππππππ
ππ€£βΊοΈπ"); + expect(buf.toString("utf16le", offset, offset + 44)).toBe("ππππππ
ππ€£βΊοΈππ"); + expect(buf.toString("utf16le", offset, offset + 48)).toBe("ππππππ
ππ€£βΊοΈπππ"); + } +}); + +it("write", () => { + const resultMap = new Map([ + ["utf8", Buffer.from([102, 111, 111, 0, 0, 0, 0, 0, 0])], + ["ucs2", Buffer.from([102, 0, 111, 0, 111, 0, 0, 0, 0])], + ["ascii", Buffer.from([102, 111, 111, 0, 0, 0, 0, 0, 0])], + ["latin1", Buffer.from([102, 111, 111, 0, 0, 0, 0, 0, 0])], + ["binary", Buffer.from([102, 111, 111, 0, 0, 0, 0, 0, 0])], + ["utf16le", Buffer.from([102, 0, 111, 0, 111, 0, 0, 0, 0])], + ["base64", Buffer.from([102, 111, 111, 0, 0, 0, 0, 0, 0])], + ["base64url", Buffer.from([102, 111, 111, 0, 0, 0, 0, 0, 0])], + ["hex", Buffer.from([102, 111, 111, 0, 0, 0, 0, 0, 0])], + ]); + + let buf = Buffer.alloc(9); + function reset() { + new Uint8Array(buf.buffer).fill(0); + } + + // utf8, ucs2, ascii, latin1, utf16le + const encodings = ["utf8", "utf-8", "ucs2", "ucs-2", "ascii", "latin1", "binary", "utf16le", "utf-16le"]; + + encodings + .reduce((es, e) => es.concat(e, e.toUpperCase()), []) + .forEach(encoding => { + reset(); + + const len = Buffer.byteLength("foo", encoding); + expect(buf.write("foo", 0, len, encoding)).toBe(len); + + if (encoding.includes("-")) encoding = encoding.replace("-", ""); + + expect(buf).toStrictEqual(resultMap.get(encoding.toLowerCase())); + }); + + // base64 + ["base64", "BASE64", "base64url", "BASE64URL"].forEach(encoding => { + reset(); + + const len = Buffer.byteLength("Zm9v", encoding); + + expect(buf.write("Zm9v", 0, len, encoding)).toBe(len); + expect(buf).toStrictEqual(resultMap.get(encoding.toLowerCase())); + }); + + // hex + ["hex", "HEX"].forEach(encoding => { + reset(); + const len = Buffer.byteLength("666f6f", encoding); + + expect(buf.write("666f6f", 0, len, encoding)).toBe(len); + expect(buf).toStrictEqual(resultMap.get(encoding.toLowerCase())); + }); + + // UCS-2 overflow CVE-2018-12115 + for (let i = 1; i < 4; i++) { + // Allocate two Buffers sequentially off the pool. Run more than once in case + // we hit the end of the pool and don't get sequential allocations + const x = Buffer.allocUnsafe(4).fill(0); + const y = Buffer.allocUnsafe(4).fill(1); + // Should not write anything, pos 3 doesn't have enough room for a 16-bit char + expect(x.write("ΡΡΡΡΡΡ", 3, "ucs2")).toBe(0); + // CVE-2018-12115 experienced via buffer overrun to next block in the pool + expect(Buffer.compare(y, Buffer.alloc(4, 1))).toBe(0); + } + + // // Should not write any data when there is no space for 16-bit chars + const z = Buffer.alloc(4, 0); + expect(z.write("\u0001", 3, "ucs2")).toBe(0); + expect(Buffer.compare(z, Buffer.alloc(4, 0))).toBe(0); + // Make sure longer strings are written up to the buffer end. + expect(z.write("abcd", 2)).toBe(2); + expect([...z]).toStrictEqual([0, 0, 0x61, 0x62]); + + //Large overrun could corrupt the process with utf8 + expect(Buffer.alloc(4).write("a".repeat(100), 3, "utf8")).toBe(1); + + // Large overrun could corrupt the process + expect(Buffer.alloc(4).write("ΡΡΡΡΡΡ".repeat(100), 3, "utf16le")).toBe(0); + + { + // .write() does not affect the byte after the written-to slice of the Buffer. + // Refs: https://github.com/nodejs/node/issues/26422 + const buf = Buffer.alloc(8); + expect(buf.write("ΡΡ", 1, "utf16le")).toBe(4); + expect([...buf]).toStrictEqual([0, 0x4b, 0x04, 0x4b, 0x04, 0, 0, 0]); + } +}); + +it("includes", () => { + const buf = Buffer.from("this is a buffer"); + + expect(buf.includes("this")).toBe(true); + expect(buf.includes("is")).toBe(true); + expect(buf.includes(Buffer.from("a buffer"))).toBe(true); + expect(buf.includes(97)).toBe(true); + expect(buf.includes(Buffer.from("a buffer example"))).toBe(false); + expect(buf.includes(Buffer.from("a buffer example").slice(0, 8))).toBe(true); + expect(buf.includes("this", 4)).toBe(false); +}); + +it("indexOf", () => { + const buf = Buffer.from("this is a buffer"); + + expect(buf.indexOf("this")).toBe(0); + expect(buf.indexOf("is")).toBe(2); + expect(buf.indexOf(Buffer.from("a buffer"))).toBe(8); + expect(buf.indexOf(97)).toBe(8); + expect(buf.indexOf(Buffer.from("a buffer example"))).toBe(-1); + expect(buf.indexOf(Buffer.from("a buffer example").slice(0, 8))).toBe(8); + + const utf16Buffer = Buffer.from("\u039a\u0391\u03a3\u03a3\u0395", "utf16le"); + + expect(utf16Buffer.indexOf("\u03a3", 0, "utf16le")).toBe(4); + expect(utf16Buffer.indexOf("\u03a3", -4, "utf16le")).toBe(6); + + const b = Buffer.from("abcdef"); + + // Passing a value that's a number, but not a valid byte. + // Prints: 2, equivalent to searching for 99 or 'c'. + expect(b.indexOf(99.9)).toBe(2); + expect(b.indexOf(256 + 99)).toBe(2); + + // Passing a byteOffset that coerces to NaN or 0. + // Prints: 1, searching the whole buffer. + expect(b.indexOf("b", undefined)).toBe(1); + expect(b.indexOf("b", {})).toBe(1); + expect(b.indexOf("b", null)).toBe(1); + expect(b.indexOf("b", [])).toBe(1); +}); + +it("lastIndexOf", () => { + const buf = Buffer.from("this buffer is a buffer"); + + expect(buf.lastIndexOf("this")).toBe(0); + expect(buf.lastIndexOf("this", 0)).toBe(0); + expect(buf.lastIndexOf("this", -1000)).toBe(-1); + expect(buf.lastIndexOf("buffer")).toBe(17); + expect(buf.lastIndexOf(Buffer.from("buffer"))).toBe(17); + expect(buf.lastIndexOf(97)).toBe(15); + expect(buf.lastIndexOf(Buffer.from("yolo"))).toBe(-1); + expect(buf.lastIndexOf("buffer", 5)).toBe(5); + expect(buf.lastIndexOf("buffer", 4)).toBe(-1); + + const utf16Buffer = Buffer.from("\u039a\u0391\u03a3\u03a3\u0395", "utf16le"); + + expect(utf16Buffer.lastIndexOf("\u03a3", undefined, "utf16le")).toBe(6); + expect(utf16Buffer.lastIndexOf("\u03a3", -5, "utf16le")).toBe(4); + + const b = Buffer.from("abcdef"); + + // Passing a value that's a number, but not a valid byte. + // Prints: 2, equivalent to searching for 99 or 'c'. + expect(b.lastIndexOf(99.9)).toBe(2); + expect(b.lastIndexOf(256 + 99)).toBe(2); + + // Passing a byteOffset that coerces to NaN or 0. + // Prints: 1, searching the whole buffer. + expect(b.lastIndexOf("b", undefined)).toBe(1); + expect(b.lastIndexOf("b", {})).toBe(1); + + // Passing a byteOffset that coerces to 0. + // Prints: -1, equivalent to passing 0. + expect(b.lastIndexOf("b", null)).toBe(-1); + expect(b.lastIndexOf("b", [])).toBe(-1); +}); + +for (let fn of [Buffer.prototype.slice, Buffer.prototype.subarray]) { + it(`Buffer.${fn.name}`, () => { + const buf = new Buffer("buffer"); + const slice = fn.call(buf, 1, 3); + expect(slice.toString()).toBe("uf"); + const slice2 = fn.call(slice, 100); + expect(slice2.toString()).toBe(""); + + const slice3 = fn.call(slice, -1); + expect(slice3.toString()).toBe("f"); + }); +} + +it("Buffer.from(base64)", () => { + const buf = Buffer.from("aGVsbG8gd29ybGQ=", "base64"); + expect(buf.toString()).toBe("hello world"); + + expect(Buffer.from(btoa('console.log("hello world")\n'), "base64").toString()).toBe('console.log("hello world")\n'); +}); + +it("Buffer.swap16", () => { + const examples = [ + ["", ""], + ["a1", "1a"], + ["a1b2", "1a2b"], + ]; + + for (let i = 0; i < examples.length; i++) { + const input = examples[i][0]; + const output = examples[i][1]; + const buf = Buffer.from(input, "utf-8"); + + const ref = buf.swap16(); + expect(ref instanceof Buffer).toBe(true); + expect(buf.toString()).toBe(output); + } + + const buf = Buffer.from("123", "utf-8"); + try { + buf.swap16(); + expect(false).toBe(true); + } catch (exception) { + expect(exception.message).toBe("Buffer size must be a multiple of 16-bits"); + } +}); + +it("Buffer.swap32", () => { + const examples = [ + ["", ""], + ["a1b2", "2b1a"], + ["a1b2c3d4", "2b1a4d3c"], + ]; + + for (let i = 0; i < examples.length; i++) { + const input = examples[i][0]; + const output = examples[i][1]; + const buf = Buffer.from(input, "utf-8"); + + const ref = buf.swap32(); + expect(ref instanceof Buffer).toBe(true); + expect(buf.toString()).toBe(output); + } + + const buf = Buffer.from("12345", "utf-8"); + try { + buf.swap32(); + expect(false).toBe(true); + } catch (exception) { + expect(exception.message).toBe("Buffer size must be a multiple of 32-bits"); + } +}); + +it("Buffer.swap64", () => { + const examples = [ + ["", ""], + ["a1b2c3d4", "4d3c2b1a"], + ["a1b2c3d4e5f6g7h8", "4d3c2b1a8h7g6f5e"], + ]; + + for (let i = 0; i < examples.length; i++) { + const input = examples[i][0]; + const output = examples[i][1]; + const buf = Buffer.from(input, "utf-8"); + + const ref = buf.swap64(); + expect(ref instanceof Buffer).toBe(true); + expect(buf.toString()).toBe(output); + } + + const buf = Buffer.from("123456789", "utf-8"); + try { + buf.swap64(); + expect(false).toBe(true); + } catch (exception) { + expect(exception.message).toBe("Buffer size must be a multiple of 64-bits"); + } +}); + +it("Buffer.toString regessions", () => { + expect( + Buffer.from([65, 0]) + .toString("utf16le") + .split("") + .map(x => x.charCodeAt(0)), + ).toEqual([65]); + expect(Buffer.from([65, 0]).toString("base64")).toBe("QQA="); + expect(Buffer.from('{"alg":"RS256","typ":"JWT"}', "latin1").toString("latin1")).toBe('{"alg":"RS256","typ":"JWT"}'); + expect(Buffer.from('{"alg":"RS256","typ":"JWT"}', "utf8").toString("utf8")).toBe('{"alg":"RS256","typ":"JWT"}'); +}); + +it("Buffer.toString(utf16le)", () => { + const buf = Buffer.from("hello world", "utf16le"); + expect(buf.toString("utf16le")).toBe("hello world"); + expect(buf.toString("utf16le", 0, 5)).toBe("he"); +}); + +it("Buffer.toString(binary)", () => { + var x = Buffer.from("<?xm", "binary"); + expect(x.toString("binary")).toBe("<?xm"); +}); + +it("Buffer.toString(base64)", () => { + { + const buf = Buffer.from("hello world"); + expect(buf.toString("base64")).toBe("aGVsbG8gd29ybGQ="); + } + + { + expect(Buffer.from(`console.log("hello world")\n`).toString("base64")).toBe(btoa('console.log("hello world")\n')); + } +}); + +it("Buffer can be mocked", () => { + function MockBuffer() { + const noop = function () {}; + const res = Buffer.alloc(0); + for (const op in Buffer.prototype) { + if (typeof res[op] === "function") { + res[op] = noop; + } + } + return res; + } + + const buf = MockBuffer(); + + expect(() => { + buf.write("hello world"); + buf.writeUint16BE(0); + buf.writeUint32BE(0); + buf.writeBigInt64BE(0); + buf.writeBigUInt64BE(0); + buf.writeBigInt64LE(0); + buf.writeBigUInt64LE(0); + }).not.toThrow(); +}); + +it("constants", () => { + expect(BufferModule.constants.MAX_LENGTH).toBe(4294967296); + expect(BufferModule.constants.MAX_STRING_LENGTH).toBe(536870888); + expect(BufferModule.default.constants.MAX_LENGTH).toBe(4294967296); + expect(BufferModule.default.constants.MAX_STRING_LENGTH).toBe(536870888); +}); + +it("File", () => { + expect(BufferModule.File).toBe(Blob); +}); + +it("transcode", () => { + expect(typeof BufferModule.transcode).toBe("undefined"); + + // This is a masqueradesAsUndefined function + expect(() => BufferModule.transcode()).toThrow("Not implemented"); +}); + +it("Buffer.from (Node.js test/test-buffer-from.js)", () => { + const checkString = "test"; + + const check = Buffer.from(checkString); + + class MyString extends String { + constructor() { + super(checkString); + } + } + + class MyPrimitive { + [Symbol.toPrimitive]() { + return checkString; + } + } + + class MyBadPrimitive { + [Symbol.toPrimitive]() { + return 1; + } + } + + expect(Buffer.from(new String(checkString))).toStrictEqual(check); + expect(Buffer.from(new MyString())).toStrictEqual(check); + expect(Buffer.from(new MyPrimitive())).toStrictEqual(check); + + [ + {}, + new Boolean(true), + { + valueOf() { + return null; + }, + }, + { + valueOf() { + return undefined; + }, + }, + { valueOf: null }, + Object.create(null), + new Number(true), + new MyBadPrimitive(), + Symbol(), + 5n, + (one, two, three) => {}, + undefined, + null, + ].forEach(input => { + expect(() => Buffer.from(input)).toThrow(); + expect(() => Buffer.from(input, "hex")).toThrow(); + }); + + expect(() => Buffer.allocUnsafe(10)).not.toThrow(); // Should not throw. + expect(() => Buffer.from("deadbeaf", "hex")).not.toThrow(); // Should not throw. +}); + +it("new Buffer() (Node.js test/test-buffer-new.js)", () => { + const LENGTH = 16; + + const ab = new ArrayBuffer(LENGTH); + const dv = new DataView(ab); + const ui = new Uint8Array(ab); + const buf = Buffer.from(ab); + + expect(buf instanceof Buffer).toBe(true); + // expect(buf.parent, buf.buffer); + expect(buf.buffer).toBe(ab); + expect(buf.length).toBe(ab.byteLength); + + buf.fill(0xc); + for (let i = 0; i < LENGTH; i++) { + expect(ui[i]).toBe(0xc); + ui[i] = 0xf; + expect(buf[i]).toBe(0xf); + } + + buf.writeUInt32LE(0xf00, 0); + buf.writeUInt32BE(0xb47, 4); + buf.writeDoubleLE(3.1415, 8); + expect(dv.getUint32(0, true)).toBe(0xf00); + expect(dv.getUint32(4)).toBe(0xb47); + expect(dv.getFloat64(8, true)).toBe(3.1415); + + // Now test protecting users from doing stupid things + + // expect(function () { + // function AB() {} + // Object.setPrototypeOf(AB, ArrayBuffer); + // Object.setPrototypeOf(AB.prototype, ArrayBuffer.prototype); + // // Buffer.from(new AB()); + // }).toThrow(); + // console.log(origAB !== ab); + + // Test the byteOffset and length arguments + { + const ab = new Uint8Array(5); + ab[0] = 1; + ab[1] = 2; + ab[2] = 3; + ab[3] = 4; + ab[4] = 5; + const buf = Buffer.from(ab.buffer, 1, 3); + expect(buf.length).toBe(3); + expect(buf[0]).toBe(2); + expect(buf[1]).toBe(3); + expect(buf[2]).toBe(4); + buf[0] = 9; + expect(ab[1]).toBe(9); + + expect(() => Buffer.from(ab.buffer, 6)).toThrow(); + expect(() => Buffer.from(ab.buffer, 3, 6)).toThrow(); + } + + // Test the deprecated Buffer() version also + { + const ab = new Uint8Array(5); + ab[0] = 1; + ab[1] = 2; + ab[2] = 3; + ab[3] = 4; + ab[4] = 5; + const buf = Buffer(ab.buffer, 1, 3); + expect(buf.length).toBe(3); + expect(buf[0]).toBe(2); + expect(buf[1]).toBe(3); + expect(buf[2]).toBe(4); + buf[0] = 9; + expect(ab[1]).toBe(9); + + expect(() => Buffer(ab.buffer, 6)).toThrow(); + expect(() => Buffer(ab.buffer, 3, 6)).toThrow(); + } + + { + // If byteOffset is not numeric, it defaults to 0. + const ab = new ArrayBuffer(10); + const expected = Buffer.from(ab, 0); + expect(Buffer.from(ab, "fhqwhgads")).toStrictEqual(expected); + expect(Buffer.from(ab, NaN)).toStrictEqual(expected); + expect(Buffer.from(ab, {})).toStrictEqual(expected); + expect(Buffer.from(ab, [])).toStrictEqual(expected); + + // If byteOffset can be converted to a number, it will be. + expect(Buffer.from(ab, [1])).toStrictEqual(Buffer.from(ab, 1)); + + // If byteOffset is Infinity, throw. + expect(() => { + Buffer.from(ab, Infinity); + }).toThrow(); + } + + { + // If length is not numeric, it defaults to 0. + const ab = new ArrayBuffer(10); + const expected = Buffer.from(ab, 0, 0); + expect(Buffer.from(ab, 0, "fhqwhgads")).toStrictEqual(expected); + expect(Buffer.from(ab, 0, NaN)).toStrictEqual(expected); + expect(Buffer.from(ab, 0, {})).toStrictEqual(expected); + expect(Buffer.from(ab, 0, [])).toStrictEqual(expected); + + // If length can be converted to a number, it will be. + expect(Buffer.from(ab, 0, [1])).toStrictEqual(Buffer.from(ab, 0, 1)); + + // If length is Infinity, throw. + expect(() => Buffer.from(ab, 0, Infinity)).toThrow(); + } + + // Test an array like entry with the length set to NaN. + expect(Buffer.from({ length: NaN })).toStrictEqual(Buffer.alloc(0)); +}); + +it("Buffer.fill (Node.js tests)", () => { + "use strict"; + const SIZE = 28; + + const buf1 = Buffer.allocUnsafe(SIZE); + const buf2 = Buffer.allocUnsafe(SIZE); + + function bufReset() { + buf1.fill(0); + buf2.fill(0); + } + + // This is mostly accurate. Except write() won't write partial bytes to the + // string while fill() blindly copies bytes into memory. To account for that an + // error will be thrown if not all the data can be written, and the SIZE has + // been massaged to work with the input characters. + function writeToFill(string, offset, end, encoding) { + if (typeof offset === "string") { + encoding = offset; + offset = 0; + end = buf2.length; + } else if (typeof end === "string") { + encoding = end; + end = buf2.length; + } else if (end === undefined) { + end = buf2.length; + } + + // Should never be reached. + if (offset < 0 || end > buf2.length) throw new ERR_OUT_OF_RANGE(); + + if (end <= offset) return buf2; + + offset >>>= 0; + end >>>= 0; + expect(offset <= buf2.length).toBe(true); + + // Convert "end" to "length" (which write understands). + const length = end - offset < 0 ? 0 : end - offset; + + let wasZero = false; + do { + const written = buf2.write(string, offset, length, encoding); + offset += written; + // Safety check in case write falls into infinite loop. + if (written === 0) { + if (wasZero) throw new Error("Could not write all data to Buffer at " + offset); + else wasZero = true; + } + } while (offset < buf2.length); + + return buf2; + } + + function testBufs(string, offset, length, encoding) { + bufReset(); + buf1.fill.apply(buf1, arguments); + // Swap bytes on BE archs for ucs2 encoding. + expect(buf1.fill.apply(buf1, arguments)).toStrictEqual(writeToFill.apply(null, arguments)); + } + + // Default encoding + testBufs("abc"); + testBufs("\u0222aa"); + testBufs("a\u0234b\u0235c\u0236"); + testBufs("abc", 4); + testBufs("abc", 5); + testBufs("abc", SIZE); + testBufs("\u0222aa", 2); + testBufs("\u0222aa", 8); + testBufs("a\u0234b\u0235c\u0236", 4); + testBufs("a\u0234b\u0235c\u0236", 12); + testBufs("abc", 4, 1); + testBufs("abc", 5, 1); + testBufs("\u0222aa", 8, 1); + testBufs("a\u0234b\u0235c\u0236", 4, 1); + testBufs("a\u0234b\u0235c\u0236", 12, 1); + + // UTF8 + testBufs("abc", "utf8"); + testBufs("\u0222aa", "utf8"); + testBufs("a\u0234b\u0235c\u0236", "utf8"); + testBufs("abc", 4, "utf8"); + testBufs("abc", 5, "utf8"); + testBufs("abc", SIZE, "utf8"); + testBufs("\u0222aa", 2, "utf8"); + testBufs("\u0222aa", 8, "utf8"); + testBufs("a\u0234b\u0235c\u0236", 4, "utf8"); + testBufs("a\u0234b\u0235c\u0236", 12, "utf8"); + testBufs("abc", 4, 1, "utf8"); + testBufs("abc", 5, 1, "utf8"); + testBufs("\u0222aa", 8, 1, "utf8"); + testBufs("a\u0234b\u0235c\u0236", 4, 1, "utf8"); + testBufs("a\u0234b\u0235c\u0236", 12, 1, "utf8"); + expect(Buffer.allocUnsafe(1).fill(0).fill("\u0222")[0]).toBe(0xc8); + + // BINARY + testBufs("abc", "binary"); + testBufs("\u0222aa", "binary"); + testBufs("a\u0234b\u0235c\u0236", "binary"); + testBufs("abc", 4, "binary"); + testBufs("abc", 5, "binary"); + testBufs("abc", SIZE, "binary"); + testBufs("\u0222aa", 2, "binary"); + testBufs("\u0222aa", 8, "binary"); + testBufs("a\u0234b\u0235c\u0236", 4, "binary"); + testBufs("a\u0234b\u0235c\u0236", 12, "binary"); + testBufs("abc", 4, 1, "binary"); + testBufs("abc", 5, 1, "binary"); + testBufs("\u0222aa", 8, 1, "binary"); + testBufs("a\u0234b\u0235c\u0236", 4, 1, "binary"); + testBufs("a\u0234b\u0235c\u0236", 12, 1, "binary"); + + // LATIN1 + testBufs("abc", "latin1"); + testBufs("\u0222aa", "latin1"); + testBufs("a\u0234b\u0235c\u0236", "latin1"); + testBufs("abc", 4, "latin1"); + testBufs("abc", 5, "latin1"); + testBufs("abc", SIZE, "latin1"); + testBufs("\u0222aa", 2, "latin1"); + testBufs("\u0222aa", 8, "latin1"); + testBufs("a\u0234b\u0235c\u0236", 4, "latin1"); + testBufs("a\u0234b\u0235c\u0236", 12, "latin1"); + testBufs("abc", 4, 1, "latin1"); + testBufs("abc", 5, 1, "latin1"); + testBufs("\u0222aa", 8, 1, "latin1"); + testBufs("a\u0234b\u0235c\u0236", 4, 1, "latin1"); + testBufs("a\u0234b\u0235c\u0236", 12, 1, "latin1"); + + // UCS2 + testBufs("abc", "ucs2"); + testBufs("\u0222aa", "ucs2"); + testBufs("a\u0234b\u0235c\u0236", "ucs2"); + testBufs("abc", 4, "ucs2"); + testBufs("abc", SIZE, "ucs2"); + testBufs("\u0222aa", 2, "ucs2"); + testBufs("\u0222aa", 8, "ucs2"); + testBufs("a\u0234b\u0235c\u0236", 4, "ucs2"); + testBufs("a\u0234b\u0235c\u0236", 12, "ucs2"); + testBufs("abc", 4, 1, "ucs2"); + testBufs("abc", 5, 1, "ucs2"); + testBufs("\u0222aa", 8, 1, "ucs2"); + testBufs("a\u0234b\u0235c\u0236", 4, 1, "ucs2"); + testBufs("a\u0234b\u0235c\u0236", 12, 1, "ucs2"); + expect(Buffer.allocUnsafe(1).fill("\u0222", "ucs2")[0]).toBe(0x22); + + // HEX + testBufs("616263", "hex"); + testBufs("c8a26161", "hex"); + testBufs("61c8b462c8b563c8b6", "hex"); + testBufs("616263", 4, "hex"); + testBufs("616263", 5, "hex"); + testBufs("616263", SIZE, "hex"); + testBufs("c8a26161", 2, "hex"); + testBufs("c8a26161", 8, "hex"); + testBufs("61c8b462c8b563c8b6", 4, "hex"); + testBufs("61c8b462c8b563c8b6", 12, "hex"); + testBufs("616263", 4, 1, "hex"); + testBufs("616263", 5, 1, "hex"); + testBufs("c8a26161", 8, 1, "hex"); + testBufs("61c8b462c8b563c8b6", 4, 1, "hex"); + testBufs("61c8b462c8b563c8b6", 12, 1, "hex"); + + expect(() => { + const buf = Buffer.allocUnsafe(SIZE); + + buf.fill("yKJh", "hex"); + }).toThrow(); + + expect(() => { + const buf = Buffer.allocUnsafe(SIZE); + + buf.fill("\u0222", "hex"); + }).toThrow(); + + // BASE64 + testBufs("YWJj", "base64"); + testBufs("yKJhYQ==", "base64"); + testBufs("Yci0Ysi1Y8i2", "base64"); + testBufs("YWJj", 4, "base64"); + testBufs("YWJj", SIZE, "base64"); + testBufs("yKJhYQ==", 2, "base64"); + testBufs("yKJhYQ==", 8, "base64"); + testBufs("Yci0Ysi1Y8i2", 4, "base64"); + testBufs("Yci0Ysi1Y8i2", 12, "base64"); + testBufs("YWJj", 4, 1, "base64"); + testBufs("YWJj", 5, 1, "base64"); + testBufs("yKJhYQ==", 8, 1, "base64"); + testBufs("Yci0Ysi1Y8i2", 4, 1, "base64"); + testBufs("Yci0Ysi1Y8i2", 12, 1, "base64"); + + // BASE64URL + testBufs("YWJj", "base64url"); + testBufs("yKJhYQ", "base64url"); + testBufs("Yci0Ysi1Y8i2", "base64url"); + testBufs("YWJj", 4, "base64url"); + testBufs("YWJj", SIZE, "base64url"); + testBufs("yKJhYQ", 2, "base64url"); + testBufs("yKJhYQ", 8, "base64url"); + testBufs("Yci0Ysi1Y8i2", 4, "base64url"); + testBufs("Yci0Ysi1Y8i2", 12, "base64url"); + testBufs("YWJj", 4, 1, "base64url"); + testBufs("YWJj", 5, 1, "base64url"); + testBufs("yKJhYQ", 8, 1, "base64url"); + testBufs("Yci0Ysi1Y8i2", 4, 1, "base64url"); + testBufs("Yci0Ysi1Y8i2", 12, 1, "base64url"); +}); + +it("fill() repeat pattern", () => { + function genBuffer(size, args) { + const b = Buffer.allocUnsafe(size); + return b.fill(0).fill.apply(b, args); + } + + const buf2Fill = Buffer.allocUnsafe(1).fill(2); + expect(genBuffer(4, [buf2Fill])).toStrictEqual(Buffer.from([2, 2, 2, 2])); + expect(genBuffer(4, [buf2Fill, 1])).toStrictEqual(Buffer.from([0, 2, 2, 2])); + expect(genBuffer(4, [buf2Fill, 1, 3])).toStrictEqual(Buffer.from([0, 2, 2, 0])); + expect(genBuffer(4, [buf2Fill, 1, 1])).toStrictEqual(Buffer.from([0, 0, 0, 0])); + const hexBufFill = Buffer.allocUnsafe(2).fill(0).fill("0102", "hex"); + expect(genBuffer(4, [hexBufFill])).toStrictEqual(Buffer.from([1, 2, 1, 2])); + expect(genBuffer(4, [hexBufFill, 1])).toStrictEqual(Buffer.from([0, 1, 2, 1])); + expect(genBuffer(4, [hexBufFill, 1, 3])).toStrictEqual(Buffer.from([0, 1, 2, 0])); + expect(genBuffer(4, [hexBufFill, 1, 1])).toStrictEqual(Buffer.from([0, 0, 0, 0])); +}); + +it("fill() should throw on invalid arguments", () => { + // Check exceptions + const buf = Buffer.allocUnsafe(16); + expect(() => buf.fill(0, -1)).toThrow(RangeError); + expect(() => buf.fill(0, 0, buf.length + 1)).toThrow(RangeError); + expect(() => buf.fill("", -1)).toThrow(RangeError); + expect(() => buf.fill("", 0, buf.length + 1)).toThrow(RangeError); + expect(() => buf.fill("", 1, -1)).toThrow(RangeError); + expect(() => buf.fill("a", 0, buf.length, "node rocks!")).toThrow(TypeError); + expect(() => buf.fill("a", 0, 0, NaN)).toThrow(TypeError); + expect(() => buf.fill("a", 0, 0, false)).toThrow(TypeError); + expect(() => buf.fill("a", 0, 0, "foo")).toThrow(TypeError); + + // Make sure these throw. + expect(() => Buffer.allocUnsafe(8).fill("a", -1)).toThrow(); + expect(() => Buffer.allocUnsafe(8).fill("a", 0, 9)).toThrow(); +}); + +it("fill() should not hang indefinitely", () => { + // Make sure this doesn't hang indefinitely. + Buffer.allocUnsafe(8).fill(""); + Buffer.alloc(8, ""); +}); + +it("fill() repeat byte", () => { + const buf = Buffer.alloc(64, 10); + for (let i = 0; i < buf.length; i++) expect(buf[i]).toBe(10); + + buf.fill(11, 0, buf.length >> 1); + for (let i = 0; i < buf.length >> 1; i++) expect(buf[i]).toBe(11); + for (let i = (buf.length >> 1) + 1; i < buf.length; i++) expect(buf[i]).toBe(10); + + buf.fill("h"); + for (let i = 0; i < buf.length; i++) expect(buf[i]).toBe("h".charCodeAt(0)); + + buf.fill(0); + for (let i = 0; i < buf.length; i++) expect(buf[i]).toBe(0); + + buf.fill(null); + for (let i = 0; i < buf.length; i++) expect(buf[i]).toBe(0); + + buf.fill(1, 16, 32); + for (let i = 0; i < 16; i++) expect(buf[i]).toBe(0); + for (let i = 16; i < 32; i++) expect(buf[i]).toBe(1); + for (let i = 32; i < buf.length; i++) expect(buf[i]).toBe(0); +}); + +it("alloc() repeat pattern", () => { + const buf = Buffer.alloc(10, "abc"); + expect(buf.toString()).toBe("abcabcabca"); + buf.fill("Υ§"); + expect(buf.toString()).toBe("Υ§Υ§Υ§Υ§Υ§"); +}); + +it("fill() should properly check `start` & `end`", () => { + // // Testing process.binding. Make sure "start" is properly checked for range + // // errors. + // expect(() => internalBinding("buffer").fill(Buffer.alloc(1), 1, -1, 0, 1)).toThrow(RangeError); + + // Make sure "end" is properly checked, even if it's magically mangled using + // Symbol.toPrimitive. + expect(() => { + const end = { + [Symbol.toPrimitive]() { + return 1; + }, + }; + Buffer.alloc(1).fill(Buffer.alloc(1), 0, end); + }).toThrow(TypeError); + + // Testing process.binding. Make sure "end" is properly checked for range + // errors. + // expect(() => internalBinding("buffer").fill(Buffer.alloc(1), 1, 1, -2, 1)).toThrow(RangeError); +}); + +it("bypassing `length` should not cause an abort", () => { + const buf = Buffer.from("w00t"); + expect(buf).toStrictEqual(Buffer.from([119, 48, 48, 116])); + Object.defineProperty(buf, "length", { + value: 1337, + enumerable: true, + }); + // Node.js throws here, but we can handle it just fine + buf.fill(""); + expect(buf).toStrictEqual(Buffer.from([0, 0, 0, 0])); +}); + +it("allocUnsafeSlow().fill()", () => { + expect(Buffer.allocUnsafeSlow(16).fill("ab", "utf16le")).toStrictEqual( + Buffer.from("61006200610062006100620061006200", "hex"), + ); + + expect(Buffer.allocUnsafeSlow(15).fill("ab", "utf16le")).toStrictEqual( + Buffer.from("610062006100620061006200610062", "hex"), + ); + + expect(Buffer.allocUnsafeSlow(16).fill("ab", "utf16le")).toStrictEqual( + Buffer.from("61006200610062006100620061006200", "hex"), + ); + expect(Buffer.allocUnsafeSlow(16).fill("a", "utf16le")).toStrictEqual( + Buffer.from("61006100610061006100610061006100", "hex"), + ); + + expect(Buffer.allocUnsafeSlow(16).fill("a", "utf16le").toString("utf16le")).toBe("a".repeat(8)); + expect(Buffer.allocUnsafeSlow(16).fill("a", "latin1").toString("latin1")).toBe("a".repeat(16)); + expect(Buffer.allocUnsafeSlow(16).fill("a", "utf8").toString("utf8")).toBe("a".repeat(16)); + + expect(Buffer.allocUnsafeSlow(16).fill("Π", "utf16le").toString("utf16le")).toBe("Π".repeat(8)); + expect(Buffer.allocUnsafeSlow(16).fill("Π", "latin1").toString("latin1")).toBe("\t".repeat(16)); + expect(Buffer.allocUnsafeSlow(16).fill("Π", "utf8").toString("utf8")).toBe("Π".repeat(8)); + + expect(() => { + const buf = Buffer.from("a".repeat(1000)); + + buf.fill("This is not correctly encoded", "hex"); + }).toThrow(); +}); + +it("ArrayBuffer.isView()", () => { + expect(ArrayBuffer.isView(new Buffer(10))).toBe(true); + expect(ArrayBuffer.isView(new SlowBuffer(10))).toBe(true); + expect(ArrayBuffer.isView(Buffer.alloc(10))).toBe(true); + expect(ArrayBuffer.isView(Buffer.allocUnsafe(10))).toBe(true); + expect(ArrayBuffer.isView(Buffer.allocUnsafeSlow(10))).toBe(true); + expect(ArrayBuffer.isView(Buffer.from(""))).toBe(true); +}); + +it("Buffer.byteLength()", () => { + expect(() => Buffer.byteLength(32, "latin1")).toThrow(TypeError); + expect(() => Buffer.byteLength(NaN, "utf8")).toThrow(TypeError); + expect(() => Buffer.byteLength({}, "latin1")).toThrow(TypeError); + expect(() => Buffer.byteLength()).toThrow(TypeError); + + expect(Buffer.byteLength("", undefined, true)).toBe(0); + + // buffer + const incomplete = Buffer.from([0xe4, 0xb8, 0xad, 0xe6, 0x96]); + expect(Buffer.byteLength(incomplete)).toBe(5); + const ascii = Buffer.from("abc"); + expect(Buffer.byteLength(ascii)).toBe(3); + + // ArrayBuffer + const buffer = new ArrayBuffer(8); + expect(Buffer.byteLength(buffer)).toBe(8); + + // TypedArray + const int8 = new Int8Array(8); + expect(Buffer.byteLength(int8)).toBe(8); + const uint8 = new Uint8Array(8); + expect(Buffer.byteLength(uint8)).toBe(8); + const uintc8 = new Uint8ClampedArray(2); + expect(Buffer.byteLength(uintc8)).toBe(2); + const int16 = new Int16Array(8); + expect(Buffer.byteLength(int16)).toBe(16); + const uint16 = new Uint16Array(8); + expect(Buffer.byteLength(uint16)).toBe(16); + const int32 = new Int32Array(8); + expect(Buffer.byteLength(int32)).toBe(32); + const uint32 = new Uint32Array(8); + expect(Buffer.byteLength(uint32)).toBe(32); + const float32 = new Float32Array(8); + expect(Buffer.byteLength(float32)).toBe(32); + const float64 = new Float64Array(8); + expect(Buffer.byteLength(float64)).toBe(64); + + // DataView + const dv = new DataView(new ArrayBuffer(2)); + expect(Buffer.byteLength(dv)).toBe(2); + + // Special case: zero length string + expect(Buffer.byteLength("", "ascii")).toBe(0); + expect(Buffer.byteLength("", "HeX")).toBe(0); + + // utf8 + expect(Buffer.byteLength("βΓ©llΓΆ wΓΈrlβ!", "utf-8")).toBe(19); + expect(Buffer.byteLength("κλμνξο", "utf8")).toBe(12); + expect(Buffer.byteLength("ζ΅ζΆζ·ζΈζΉ", "utf-8")).toBe(15); + expect(Buffer.byteLength("π Ήπ ±π ±Έ", "UTF8")).toBe(12); + // Without an encoding, utf8 should be assumed + expect(Buffer.byteLength("hey there")).toBe(9); + expect(Buffer.byteLength("π ±ΈζΆΞ½ΞΎ#xx :)")).toBe(17); + expect(Buffer.byteLength("hello world", "")).toBe(11); + // It should also be assumed with unrecognized encoding + expect(Buffer.byteLength("hello world", "abc")).toBe(11); + expect(Buffer.byteLength("ΓΕββ", "unkn0wn enc0ding")).toBe(10); + + // base64 + expect(Buffer.byteLength("aGVsbG8gd29ybGQ=", "base64")).toBe(11); + expect(Buffer.byteLength("aGVsbG8gd29ybGQ=", "BASE64")).toBe(11); + expect(Buffer.byteLength("bm9kZS5qcyByb2NrcyE=", "base64")).toBe(14); + expect(Buffer.byteLength("aGkk", "base64")).toBe(3); + expect(Buffer.byteLength("bHNrZGZsa3NqZmtsc2xrZmFqc2RsZmtqcw==", "base64")).toBe(25); + // base64url + expect(Buffer.byteLength("aGVsbG8gd29ybGQ", "base64url")).toBe(11); + expect(Buffer.byteLength("aGVsbG8gd29ybGQ", "BASE64URL")).toBe(11); + expect(Buffer.byteLength("bm9kZS5qcyByb2NrcyE", "base64url")).toBe(14); + expect(Buffer.byteLength("aGkk", "base64url")).toBe(3); + expect(Buffer.byteLength("bHNrZGZsa3NqZmtsc2xrZmFqc2RsZmtqcw", "base64url")).toBe(25); + // special padding + expect(Buffer.byteLength("aaa=", "base64")).toBe(2); + expect(Buffer.byteLength("aaaa==", "base64")).toBe(3); + expect(Buffer.byteLength("aaa=", "base64url")).toBe(2); + expect(Buffer.byteLength("aaaa==", "base64url")).toBe(3); + expect(Buffer.byteLength("Il Γ©tait tuΓ©", "utf8")).toBe(14); + expect(Buffer.byteLength("Il Γ©tait tuΓ©")).toBe(14); + + ["ascii", "latin1", "binary"] + .reduce((es, e) => es.concat(e, e.toUpperCase()), []) + .forEach(encoding => { + expect(Buffer.byteLength("Il Γ©tait tuΓ©", encoding)).toBe(12); + }); + + ["ucs2", "ucs-2", "utf16le", "utf-16le"] + .reduce((es, e) => es.concat(e, e.toUpperCase()), []) + .forEach(encoding => { + expect(Buffer.byteLength("Il Γ©tait tuΓ©", encoding)).toBe(24); + }); + + // Test that ArrayBuffer from a different context is detected correctly + // const arrayBuf = vm.runInNewContext("new ArrayBuffer()"); + // expect(Buffer.byteLength(arrayBuf)).toBe(0); + + // Verify that invalid encodings are treated as utf8 + for (let i = 1; i < 10; i++) { + const encoding = String(i).repeat(i); + + expect(Buffer.isEncoding(encoding)).toBe(false); + expect(Buffer.byteLength("foo", encoding)).toBe(Buffer.byteLength("foo", "utf8")); + } +}); + +it("Buffer.toString(encoding, start, end)", () => { + const buf = Buffer.from("0123456789", "utf8"); + + expect(buf.toString()).toStrictEqual("0123456789"); + expect(buf.toString("utf8")).toStrictEqual("0123456789"); + expect(buf.toString("utf8", 3)).toStrictEqual("3456789"); + expect(buf.toString("utf8", 3, 4)).toStrictEqual("3"); + + expect(buf.toString("utf8", 3, 100)).toStrictEqual("3456789"); + expect(buf.toString("utf8", 3, 1)).toStrictEqual(""); + expect(buf.toString("utf8", 100, 200)).toStrictEqual(""); + expect(buf.toString("utf8", 100, 1)).toStrictEqual(""); +}); + +it("Buffer.toString(offset, length, encoding)", () => { + const buf = Buffer.from("0123456789", "utf8"); + + expect(buf.toString(3, 6, "utf8")).toStrictEqual("345678"); + expect(buf.toString(3, 100, "utf8")).toStrictEqual("3456789"); + expect(buf.toString(100, 200, "utf8")).toStrictEqual(""); + expect(buf.toString(100, 50, "utf8")).toStrictEqual(""); +}); + +it("Buffer.asciiSlice())", () => { + const buf = Buffer.from("0123456789", "ascii"); + + expect(buf.asciiSlice()).toStrictEqual("0123456789"); + expect(buf.asciiSlice(3)).toStrictEqual("3456789"); + expect(buf.asciiSlice(3, 4)).toStrictEqual("3"); +}); + +it("Buffer.latin1Slice()", () => { + const buf = Buffer.from("Òéâ", "latin1"); + + expect(buf.latin1Slice()).toStrictEqual("Òéâ"); + expect(buf.latin1Slice(1)).toStrictEqual("éâ"); + expect(buf.latin1Slice(1, 2)).toStrictEqual("Γ©"); +}); + +it("Buffer.utf8Slice()", () => { + const buf = Buffer.from("γγγγγ", "utf8"); + + expect(buf.utf8Slice()).toStrictEqual("γγγγγ"); + expect(buf.utf8Slice(3)).toStrictEqual("γγγγ"); + expect(buf.utf8Slice(3, 6)).toStrictEqual("γ"); +}); + +it("Buffer.hexSlice()", () => { + const buf = Buffer.from("0123456789", "utf8"); + + expect(buf.hexSlice()).toStrictEqual("30313233343536373839"); + expect(buf.hexSlice(3)).toStrictEqual("33343536373839"); + expect(buf.hexSlice(3, 4)).toStrictEqual("33"); +}); + +it("Buffer.ucs2Slice()", () => { + const buf = Buffer.from("γγγγγ", "ucs2"); + + expect(buf.ucs2Slice()).toStrictEqual("γγγγγ"); + expect(buf.ucs2Slice(2)).toStrictEqual("γγγγ"); + expect(buf.ucs2Slice(2, 6)).toStrictEqual("γγ"); +}); + +it("Buffer.base64Slice()", () => { + const buf = Buffer.from("0123456789", "utf8"); + + expect(buf.base64Slice()).toStrictEqual("MDEyMzQ1Njc4OQ=="); + expect(buf.base64Slice(3)).toStrictEqual("MzQ1Njc4OQ=="); + expect(buf.base64Slice(3, 4)).toStrictEqual("Mw=="); +}); + +it("Buffer.base64urlSlice()", () => { + const buf = Buffer.from("0123456789", "utf8"); + + expect(buf.base64urlSlice()).toStrictEqual("MDEyMzQ1Njc4OQ"); + expect(buf.base64urlSlice(3)).toStrictEqual("MzQ1Njc4OQ"); + expect(buf.base64urlSlice(3, 4)).toStrictEqual("Mw"); +}); + +it("should not crash on invalid UTF-8 byte sequence", () => { + const buf = Buffer.from([0xc0, 0xfd]); + expect(buf.length).toBe(2); + const str = buf.toString(); + expect(str.length).toBe(2); + expect(str).toBe("\uFFFD\uFFFD"); +}); + +it("should not crash on invalid UTF-8 byte sequence with ASCII head", () => { + const buf = Buffer.from([0x42, 0xc0, 0xfd]); + expect(buf.length).toBe(3); + const str = buf.toString(); + expect(str.length).toBe(3); + expect(str).toBe("B\uFFFD\uFFFD"); +}); + +it("should not perform out-of-bound access on invalid UTF-8 byte sequence", () => { + const buf = Buffer.from([0x01, 0x9a, 0x84, 0x13, 0x12, 0x11, 0x10, 0x09]).subarray(2); + expect(buf.length).toBe(6); + const str = buf.toString(); + expect(str.length).toBe(6); + expect(str).toBe("\uFFFD\x13\x12\x11\x10\x09"); +}); + +it("repro #2063", () => { + const buf = Buffer.from( + "eyJlbWFpbCI6Ijg3MTg4NDYxN0BxcS5jb20iLCJpZCI6OCwicm9sZSI6Im5vcm1hbCIsImlhdCI6MTY3NjI4NDQyMSwiZXhwIjoxNjc2ODg5MjIxfQ", + "base64", + ); + expect(buf.length).toBe(85); + expect(buf[82]).toBe(50); + expect(buf[83]).toBe(49); + expect(buf[84]).toBe(125); +}); + +it("inspect() should exist", () => { + expect(Buffer.prototype.inspect).toBeInstanceOf(Function); + expect(new Buffer("123").inspect()).toBe(Bun.inspect(new Buffer("123"))); +}); + +it("read alias", () => { + var buf = new Buffer(1024); + var data = new DataView(buf.buffer); + + data.setUint8(0, 200, false); + + expect(buf.readUint8(0)).toBe(buf.readUInt8(0)); + expect(buf.readUintBE(0, 4)).toBe(buf.readUIntBE(0, 4)); + expect(buf.readUintLE(0, 4)).toBe(buf.readUIntLE(0, 4)); + expect(buf.readUint16BE(0)).toBe(buf.readUInt16BE(0)); + expect(buf.readUint16LE(0)).toBe(buf.readUInt16LE(0)); + expect(buf.readUint32BE(0)).toBe(buf.readUInt32BE(0)); + expect(buf.readUint32LE(0)).toBe(buf.readUInt32LE(0)); + expect(buf.readBigUint64BE(0)).toBe(buf.readBigUInt64BE(0)); + expect(buf.readBigUint64LE(0)).toBe(buf.readBigUInt64LE(0)); +}); + +it("write alias", () => { + var buf = new Buffer(1024); + var buf2 = new Buffer(1024); + + function reset() { + new Uint8Array(buf.buffer).fill(0); + new Uint8Array(buf2.buffer).fill(0); + } + + function shouldBeSame(name, name2, ...args) { + buf[name].call(buf, ...args); + buf2[name2].call(buf2, ...args); + + expect(buf).toStrictEqual(buf2); + reset(); + } + + shouldBeSame("writeUint8", "writeUInt8", 10); + shouldBeSame("writeUintBE", "writeUIntBE", 10, 0, 4); + shouldBeSame("writeUintLE", "writeUIntLE", 10, 0, 4); + shouldBeSame("writeUint16BE", "writeUInt16BE", 1000); + shouldBeSame("writeUint16LE", "writeUInt16LE", 1000); + shouldBeSame("writeUint32BE", "writeUInt32BE", 1000); + shouldBeSame("writeUint32LE", "writeUInt32LE", 1000); + shouldBeSame("writeBigUint64BE", "writeBigUInt64BE", BigInt(1000)); + shouldBeSame("writeBigUint64LE", "writeBigUInt64LE", BigInt(1000)); +}); |