UNPKG

@webbuf/rw

Version:

Read and write buffers, optimized with Rust/WASM for the web, node.js, deno, and bun.

255 lines (207 loc) 8.68 kB
import { describe, expect, test, beforeEach } from "vitest"; import { BufReader } from "../src/buf-reader.js"; import { WebBuf } from "@webbuf/webbuf"; import fs from "node:fs"; import path from "node:path"; import { U16BE, U32BE, U64BE } from "@webbuf/numbers"; describe("BufReader", () => { let bufferReader: BufReader; let testEbxBuf: WebBuf; beforeEach(() => { testEbxBuf = WebBuf.from([1, 2, 3, 4, 5, 6, 7, 8]); bufferReader = new BufReader(testEbxBuf); }); test("constructor sets buffer and position", () => { expect(bufferReader.buf.toHex()).toEqual(testEbxBuf.toHex()); expect(bufferReader.pos).toBe(0); }); test("read returns correct subarray", () => { const len = 4; const result = bufferReader.read(len); expect(result).toEqual(testEbxBuf.subarray(0, len)); }); test("read updates position", () => { const len = 4; bufferReader.read(len); expect(bufferReader.pos).toBe(len); }); test("readUint8 returns correct value and updates position", () => { const result = bufferReader.readU8(); expect(result.n).toBe(1); expect(bufferReader.pos).toBe(1); }); test("readUint16BE returns correct value and updates position", () => { const result = bufferReader.readU16BE(); expect(result.n).toBe(U16BE.fromHex("0102").n); expect(bufferReader.pos).toBe(2); }); test("readUint32BE returns correct value and updates position", () => { const result = bufferReader.readU32BE(); // expect(result.n).toBe(WebBuf.from([1, 2, 3, 4]).readUint32BE()); expect(result.n).toBe(U32BE.fromHex("01020304").n); expect(bufferReader.pos).toBe(4); }); test("readUint64BEBigInt returns correct value and updates position", () => { // Create a EbxBufReader with a buffer that contains the 64-bit unsigned integer 0x0123456789ABCDEF bufferReader = new BufReader( WebBuf.from([0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef]), ); const result = bufferReader.readU64BE(); // Check that the method returns the correct BigInt expect(result.bn).toEqual(BigInt("0x0123456789ABCDEF")); // Check that the position has been updated correctly expect(bufferReader.pos).toBe(8); }); test("readUint128BE returns correct value and updates position", () => { // Create a EbxBufReader with a buffer that contains the 128-bit unsigned integer 0x0123456789ABCDEF0123456789ABCDEF bufferReader = new BufReader( WebBuf.fromHex("0123456789ABCDEF0123456789ABCDEF"), ); const result = bufferReader.readU128BE(); // Check that the method returns the correct BigInt expect(result.bn).toEqual(BigInt("0x0123456789ABCDEF0123456789ABCDEF")); // Check that the position has been updated correctly expect(bufferReader.pos).toBe(16); }); test("readUint256BE returns correct value and updates position", () => { // Create a EbxBufReader with a buffer that contains the 256-bit unsigned integer 0x0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF bufferReader = new BufReader( WebBuf.fromHex( "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF", ), ); const result = bufferReader.readU256BE(); // Check that the method returns the correct BigInt expect(result.bn).toEqual( BigInt( "0x0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF", ), ); // Check that the position has been updated correctly expect(bufferReader.pos).toBe(32); }); test("readVarIntBEBuf", () => { let bufferReader = new BufReader(WebBuf.from([0xfd, 0x00, 0x01])); expect(() => bufferReader.readVarIntBEBuf()).toThrow(); bufferReader = new BufReader(WebBuf.from([0xfe, 0x00, 0x00, 0x00, 0x01])); expect(() => bufferReader.readVarIntBEBuf()).toThrow(); bufferReader = new BufReader( WebBuf.from([0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01]), ); expect(() => bufferReader.readVarIntBEBuf()).toThrow(); bufferReader = new BufReader(WebBuf.from([0x01])); expect(bufferReader.readVarIntBEBuf().toString("hex")).toEqual( WebBuf.from([0x01]).toString("hex"), ); bufferReader = new BufReader(WebBuf.from([0xfd, 0x01, 0x00])); expect(bufferReader.readVarIntBEBuf().toString("hex")).toEqual("fd0100"); bufferReader = new BufReader(WebBuf.from([0xfe, 0x01, 0x00, 0x00, 0x00])); expect(bufferReader.readVarIntBEBuf().toString("hex")).toEqual( "fe01000000", ); bufferReader = new BufReader( WebBuf.from([0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]), ); expect(bufferReader.readVarIntBEBuf().toString("hex")).toEqual( "ff0100000000000000", ); }); test("readVarInt", () => { let bufferReader = new BufReader(WebBuf.from([0xfd, 0x00, 0x01])); expect(() => bufferReader.readVarIntU64BE()).toThrow(); bufferReader = new BufReader(WebBuf.from([0xfe, 0x00, 0x00, 0x00, 0x01])); expect(() => bufferReader.readVarIntU64BE()).toThrow(); bufferReader = new BufReader( WebBuf.from([0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01]), ); expect(() => bufferReader.readVarIntU64BE()).toThrow(); bufferReader = new BufReader(WebBuf.from([0x01])); expect(bufferReader.readVarIntU64BE().bn).toEqual(BigInt(1)); bufferReader = new BufReader(WebBuf.from([0xfd, 0x01, 0x00])); expect(bufferReader.readVarIntU64BE().bn).toEqual(2n ** 8n); bufferReader = new BufReader(WebBuf.from([0xfe, 0x01, 0x00, 0x00, 0x00])); expect(bufferReader.readVarIntU64BE().bn).toEqual(2n ** 24n); bufferReader = new BufReader( WebBuf.from([0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]), ); expect(bufferReader.readVarIntU64BE().bn).toEqual(2n ** 56n); }); describe("test vectors", () => { interface TestVectorEbxBufReader { read: TestVectorReadEbxBuf; read_u8: TestVectorReadErrors; read_u16_be: TestVectorReadErrors; read_u32_be: TestVectorReadErrors; read_u64_be: TestVectorReadErrors; read_var_int_buf: TestVectorReadErrors; read_var_int: TestVectorReadErrors; } interface TestVectorReadEbxBuf { errors: TestVectorReadEbxBufError[]; } interface TestVectorReadEbxBufError { hex: string; len: number; error: string; } interface TestVectorReadErrors { errors: TestVectorReadError[]; } interface TestVectorReadError { hex: string; error: string; } const filePath = path.resolve(__dirname, "../vectors/buf-reader.json"); const jsonString = fs.readFileSync(filePath, "utf-8"); const testVector: TestVectorEbxBufReader = JSON.parse(jsonString); test("test vectors: read", () => { for (const test of testVector.read.errors) { const buf = WebBuf.from(test.hex, "hex"); const bufferReader = new BufReader(buf); expect(() => bufferReader.read(test.len)).toThrow(); } }); test("test vectors: read_u8", () => { for (const test of testVector.read_u8.errors) { const buf = WebBuf.from(test.hex, "hex"); const bufferReader = new BufReader(buf); expect(() => bufferReader.readU8()).toThrow(); } }); test("test vectors: read_u16_be", () => { for (const test of testVector.read_u16_be.errors) { const buf = WebBuf.from(test.hex, "hex"); const bufferReader = new BufReader(buf); expect(() => bufferReader.readU16BE()).toThrow(); } }); test("test vectors: read_u32_be", () => { for (const test of testVector.read_u32_be.errors) { const buf = WebBuf.from(test.hex, "hex"); const bufferReader = new BufReader(buf); expect(() => bufferReader.readU32BE()).toThrow(); } }); test("test vectors: read_u64_be", () => { for (const test of testVector.read_u64_be.errors) { const buf = WebBuf.from(test.hex, "hex"); const bufferReader = new BufReader(buf); expect(() => bufferReader.readU64BE()).toThrow(); } }); test("test vectors: read_var_int_buf", () => { for (const test of testVector.read_var_int_buf.errors) { const buf = WebBuf.from(test.hex, "hex"); const bufferReader = new BufReader(buf); expect(() => bufferReader.readVarIntBEBuf()).toThrow(); } }); test("test vectors: read_var_int", () => { for (const test of testVector.read_var_int.errors) { const buf = WebBuf.from(test.hex, "hex"); const bufferReader = new BufReader(buf); expect(() => bufferReader.readVarIntU64BE()).toThrow(); } }); }); });