aptos
Version:
133 lines (113 loc) • 5.6 kB
text/typescript
// Copyright © Aptos Foundation
// SPDX-License-Identifier: Apache-2.0
import { Deserializer } from "../../bcs/deserializer";
describe("BCS Deserializer", () => {
it("deserializes a non-empty string", () => {
const deserializer = new Deserializer(
new Uint8Array([
24, 0xc3, 0xa7, 0xc3, 0xa5, 0xe2, 0x88, 0x9e, 0xe2, 0x89, 0xa0, 0xc2, 0xa2, 0xc3, 0xb5, 0xc3, 0x9f, 0xe2, 0x88,
0x82, 0xc6, 0x92, 0xe2, 0x88, 0xab,
]),
);
expect(deserializer.deserializeStr()).toBe("çå∞≠¢õß∂ƒ∫");
});
it("deserializes an empty string", () => {
const deserializer = new Deserializer(new Uint8Array([0]));
expect(deserializer.deserializeStr()).toBe("");
});
it("deserializes dynamic length bytes", () => {
const deserializer = new Deserializer(new Uint8Array([5, 0x41, 0x70, 0x74, 0x6f, 0x73]));
expect(deserializer.deserializeBytes()).toEqual(new Uint8Array([0x41, 0x70, 0x74, 0x6f, 0x73]));
});
it("deserializes dynamic length bytes with zero elements", () => {
const deserializer = new Deserializer(new Uint8Array([0]));
expect(deserializer.deserializeBytes()).toEqual(new Uint8Array([]));
});
it("deserializes fixed length bytes", () => {
const deserializer = new Deserializer(new Uint8Array([0x41, 0x70, 0x74, 0x6f, 0x73]));
expect(deserializer.deserializeFixedBytes(5)).toEqual(new Uint8Array([0x41, 0x70, 0x74, 0x6f, 0x73]));
});
it("deserializes fixed length bytes with zero element", () => {
const deserializer = new Deserializer(new Uint8Array([]));
expect(deserializer.deserializeFixedBytes(0)).toEqual(new Uint8Array([]));
});
it("deserializes a boolean value", () => {
let deserializer = new Deserializer(new Uint8Array([0x01]));
expect(deserializer.deserializeBool()).toEqual(true);
deserializer = new Deserializer(new Uint8Array([0x00]));
expect(deserializer.deserializeBool()).toEqual(false);
});
it("throws when dserializing a boolean with disallowed values", () => {
expect(() => {
const deserializer = new Deserializer(new Uint8Array([0x12]));
deserializer.deserializeBool();
}).toThrow("Invalid boolean value");
});
it("deserializes a uint8", () => {
const deserializer = new Deserializer(new Uint8Array([0xff]));
expect(deserializer.deserializeU8()).toEqual(255);
});
it("deserializes a uint16", () => {
let deserializer = new Deserializer(new Uint8Array([0xff, 0xff]));
expect(deserializer.deserializeU16()).toEqual(65535);
deserializer = new Deserializer(new Uint8Array([0x34, 0x12]));
expect(deserializer.deserializeU16()).toEqual(4660);
});
it("deserializes a uint32", () => {
let deserializer = new Deserializer(new Uint8Array([0xff, 0xff, 0xff, 0xff]));
expect(deserializer.deserializeU32()).toEqual(4294967295);
deserializer = new Deserializer(new Uint8Array([0x78, 0x56, 0x34, 0x12]));
expect(deserializer.deserializeU32()).toEqual(305419896);
});
it("deserializes a uint64", () => {
let deserializer = new Deserializer(new Uint8Array([0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]));
expect(deserializer.deserializeU64()).toEqual(BigInt("18446744073709551615"));
deserializer = new Deserializer(new Uint8Array([0x00, 0xef, 0xcd, 0xab, 0x78, 0x56, 0x34, 0x12]));
expect(deserializer.deserializeU64()).toEqual(BigInt("1311768467750121216"));
});
it("deserializes a uint128", () => {
let deserializer = new Deserializer(
new Uint8Array([0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]),
);
expect(deserializer.deserializeU128()).toEqual(BigInt("340282366920938463463374607431768211455"));
deserializer = new Deserializer(
new Uint8Array([0x00, 0xef, 0xcd, 0xab, 0x78, 0x56, 0x34, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]),
);
expect(deserializer.deserializeU128()).toEqual(BigInt("1311768467750121216"));
});
it("deserializes a uint256", () => {
let deserializer = new Deserializer(
new Uint8Array([
0x31, 0x30, 0x29, 0x28, 0x27, 0x26, 0x25, 0x24, 0x23, 0x22, 0x21, 0x20, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14,
0x13, 0x12, 0x11, 0x10, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00,
]),
);
expect(deserializer.deserializeU256()).toEqual(
BigInt("0x0001020304050607080910111213141516171819202122232425262728293031"),
);
});
it("deserializes a uleb128", () => {
let deserializer = new Deserializer(new Uint8Array([0xcd, 0xea, 0xec, 0x31]));
expect(deserializer.deserializeUleb128AsU32()).toEqual(104543565);
deserializer = new Deserializer(new Uint8Array([0xff, 0xff, 0xff, 0xff, 0x0f]));
expect(deserializer.deserializeUleb128AsU32()).toEqual(4294967295);
});
it("throws when deserializing a uleb128 with out ranged value", () => {
expect(() => {
const deserializer = new Deserializer(new Uint8Array([0x80, 0x80, 0x80, 0x80, 0x10]));
deserializer.deserializeUleb128AsU32();
}).toThrow("Overflow while parsing uleb128-encoded uint32 value");
});
it("throws when deserializing against buffer that has been drained", () => {
expect(() => {
const deserializer = new Deserializer(
new Uint8Array([
24, 0xc3, 0xa7, 0xc3, 0xa5, 0xe2, 0x88, 0x9e, 0xe2, 0x89, 0xa0, 0xc2, 0xa2, 0xc3, 0xb5, 0xc3, 0x9f, 0xe2,
0x88, 0x82, 0xc6, 0x92, 0xe2, 0x88, 0xab,
]),
);
deserializer.deserializeStr();
deserializer.deserializeStr();
}).toThrow("Reached to the end of buffer");
});
});