UNPKG

@seriousme/opifex

Version:

MQTT client & server for Deno & NodeJS

124 lines (108 loc) 4.01 kB
import assert from "node:assert/strict"; import { test } from "node:test"; import { Decoder } from "./decoder.ts"; const utf8encoder = new TextEncoder(); test("decode byte", () => { const byte = 127; const decoder = new Decoder(Uint8Array.from([byte])); assert.deepStrictEqual(decoder.getByte(), byte); assert.deepStrictEqual(decoder.done(), true); }); test("decode Int16", () => { const value = 0xf0f2; const msb = 0xf0; const lsb = 0xf2; const decoder = new Decoder(Uint8Array.from([msb, lsb])); assert.deepStrictEqual(decoder.getInt16(), value); assert.deepStrictEqual(decoder.done(), true); }); test("decode Int16 with remainder", () => { const value = 0xf0f2; const msb = 0xf0; const lsb = 0xf2; const decoder = new Decoder(Uint8Array.from([msb, lsb, 0xff])); assert.deepStrictEqual(decoder.getInt16(), value, "value is correct"); assert.deepStrictEqual(decoder.atEnd(), false); }); test("decode byte array", () => { const byteArray = new Array(300); byteArray.fill(127); const len = byteArray.length; const decoder = new Decoder( Uint8Array.from([len >> 8, len & 0xff, ...byteArray]), ); assert.deepStrictEqual(decoder.getByteArray(), Uint8Array.from(byteArray)); assert.deepStrictEqual(decoder.done(), true); }); test("decode byte array as remainder", () => { const str = "hello world"; const byteArray = utf8encoder.encode(str); const decoder = new Decoder(byteArray); assert.deepStrictEqual(decoder.getRemainder(), byteArray); assert.deepStrictEqual(decoder.done(), true); }); test("decode byte array as empty remainder", () => { const str = "hello world"; const emptyArray = Uint8Array.from([]); const byteArray = utf8encoder.encode(str); const len = byteArray.length; const decoder = new Decoder(Uint8Array.from([0x00, len, ...byteArray])); assert.deepStrictEqual(decoder.getUtf8String(), str); assert.deepStrictEqual(decoder.getRemainder(), emptyArray); assert.deepStrictEqual(decoder.done(), true); }); test("decode string", () => { const str = "hello world"; const byteArray = utf8encoder.encode(str); const len = byteArray.length; const decoder = new Decoder(Uint8Array.from([0x00, len, ...byteArray])); assert.deepStrictEqual(decoder.getUtf8String(), str); assert.deepStrictEqual(decoder.done(), true); }); test("decode topic", () => { const str = "hello world"; const byteArray = utf8encoder.encode(str); const len = byteArray.length; const decoder = new Decoder(Uint8Array.from([0x00, len, ...byteArray])); assert.deepStrictEqual(decoder.getTopic(), str); assert.deepStrictEqual(decoder.done(), true); }); test("Topic too short", () => { const decoder = new Decoder(Uint8Array.from([0x00, 0])); assert.throws( () => decoder.getTopic(), Error, "Topic must contain valid UTF-8 and contain more than 1 byte and no wildcards", ); }); test("Invalid topic", () => { const decoder = new Decoder(Uint8Array.from([0x00, 0x01, 0x00])); assert.throws( () => decoder.getTopic(), Error, "Topic must contain valid UTF-8 and contain more than 1 byte and no wildcards", ); }); test("Invalid topicFilter", () => { const decoder = new Decoder(Uint8Array.from([0x00, 0x01, 0x00])); assert.throws( () => decoder.getTopic(), Error, "Topic must contain valid UTF-8 and contain more than 1 byte and no wildcards", ); }); test("Buffer too short", () => { const str = "hello world"; const byteArray = utf8encoder.encode(str); const len = byteArray.length; const decoder = new Decoder(Uint8Array.from([0x00, len + 1, ...byteArray])); assert.throws(() => decoder.getUtf8String(), Error, "too short"); }); test("Buffer too long", () => { const str = "hello world"; const byteArray = utf8encoder.encode(str); const len = byteArray.length; const decoder = new Decoder(Uint8Array.from([0x00, len, ...byteArray, 0])); assert.deepStrictEqual(decoder.getUtf8String(), str); assert.throws(() => decoder.done(), Error, "too long"); });