deno.land / x / msgpack_javascript@v3.0.0-beta2 / test / ExtensionCodec.test.ts
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200import assert from "assert";import util from "util";import { encode, decode, ExtensionCodec, decodeAsync } from "../src";
describe("ExtensionCodec", () => { context("timestamp", () => { const extensionCodec = ExtensionCodec.defaultCodec;
it("encodes and decodes a date without milliseconds (timestamp 32)", () => { const date = new Date(1556633024000); const encoded = encode(date, { extensionCodec }); assert.deepStrictEqual( decode(encoded, { extensionCodec }), date, `date: ${date.toISOString()}, encoded: ${util.inspect(encoded)}`, ); });
it("encodes and decodes a date with milliseconds (timestamp 64)", () => { const date = new Date(1556633024123); const encoded = encode(date, { extensionCodec }); assert.deepStrictEqual( decode(encoded, { extensionCodec }), date, `date: ${date.toISOString()}, encoded: ${util.inspect(encoded)}`, ); });
it("encodes and decodes a future date (timestamp 96)", () => { const date = new Date(0x400000000 * 1000); const encoded = encode(date, { extensionCodec }); assert.deepStrictEqual( decode(encoded, { extensionCodec }), date, `date: ${date.toISOString()}, encoded: ${util.inspect(encoded)}`, ); }); });
context("custom extensions", () => { const extensionCodec = new ExtensionCodec();
// Set<T> extensionCodec.register({ type: 0, encode: (object: unknown): Uint8Array | null => { if (object instanceof Set) { return encode([...object]); } else { return null; } }, decode: (data: Uint8Array) => { const array = decode(data) as Array<unknown>; return new Set(array); }, });
// Map<T> extensionCodec.register({ type: 1, encode: (object: unknown): Uint8Array | null => { if (object instanceof Map) { return encode([...object]); } else { return null; } }, decode: (data: Uint8Array) => { const array = decode(data) as Array<[unknown, unknown]>; return new Map(array); }, });
it("encodes and decodes custom data types (synchronously)", () => { const set = new Set([1, 2, 3]); const map = new Map([ ["foo", "bar"], ["bar", "baz"], ]); const encoded = encode([set, map], { extensionCodec }); assert.deepStrictEqual(decode(encoded, { extensionCodec }), [set, map]); });
it("encodes and decodes custom data types (asynchronously)", async () => { const set = new Set([1, 2, 3]); const map = new Map([ ["foo", "bar"], ["bar", "baz"], ]); const encoded = encode([set, map], { extensionCodec }); const createStream = async function* () { yield encoded; }; assert.deepStrictEqual(await decodeAsync(createStream(), { extensionCodec }), [set, map]); }); });
context("custom extensions with custom context", () => { class Context { public expectations: Array<any> = []; constructor(public ctxVal: number) {} public hasVisited(val: any) { this.expectations.push(val); } } const extensionCodec = new ExtensionCodec<Context>();
class Magic<T> { constructor(public val: T) {} }
// Magic extensionCodec.register({ type: 0, encode: (object: unknown, context): Uint8Array | null => { if (object instanceof Magic) { context.hasVisited({ encoding: object.val }); return encode({ magic: object.val, ctx: context.ctxVal }, { extensionCodec, context }); } else { return null; } }, decode: (data: Uint8Array, extType, context) => { extType; const decoded = decode(data, { extensionCodec, context }) as { magic: number }; context.hasVisited({ decoding: decoded.magic, ctx: context.ctxVal }); return new Magic(decoded.magic); }, });
it("encodes and decodes custom data types (synchronously)", () => { const context = new Context(42); const magic1 = new Magic(17); const magic2 = new Magic({ foo: new Magic("inner") }); const test = [magic1, magic2]; const encoded = encode(test, { extensionCodec, context }); assert.deepStrictEqual(decode(encoded, { extensionCodec, context }), test); assert.deepStrictEqual(context.expectations, [ { encoding: magic1.val, }, { encoding: magic2.val, }, { encoding: magic2.val.foo.val, }, { ctx: 42, decoding: magic1.val, }, { ctx: 42, decoding: magic2.val.foo.val, }, { ctx: 42, decoding: magic2.val, }, ]); });
it("encodes and decodes custom data types (asynchronously)", async () => { const context = new Context(42); const magic1 = new Magic(17); const magic2 = new Magic({ foo: new Magic("inner") }); const test = [magic1, magic2]; const encoded = encode(test, { extensionCodec, context }); const createStream = async function* () { yield encoded; }; assert.deepStrictEqual(await decodeAsync(createStream(), { extensionCodec, context }), test); assert.deepStrictEqual(context.expectations, [ { encoding: magic1.val, }, { encoding: magic2.val, }, { encoding: magic2.val.foo.val, }, { ctx: 42, decoding: magic1.val, }, { ctx: 42, decoding: magic2.val.foo.val, }, { ctx: 42, decoding: magic2.val, }, ]); }); });});
Version Info