import { BASIC_TYPES, FixedArrayHandler, DynamicArrayHandler, CompoundTypeHandler, serializeToBinary, deserializeFromBinary } from '../index.mjs'; import assert from 'node:assert/strict'; import { areArrayBuffersEqual } from '@og/utility'; import { UUID } from '@og/uuid'; class Point { constructor(x, y) { this.x = x; this.y = y; } foo() { return this.x + this.y; } } Point.typedef = [ { field: 'x', type: BASIC_TYPES.u8 }, { field: 'y', type: BASIC_TYPES.u8 }, ]; describe('binary-struct', () => { describe('serializeToBinary', () => { it('type i8', () => { let res = serializeToBinary(-123, BASIC_TYPES.i8); // Example value for i8 let ans = new Uint8Array([0x85]); // Byte representation of -123 as i8 assert.ok(areArrayBuffersEqual(res, ans)); }); it('type i16', () => { let res = serializeToBinary(-12345, BASIC_TYPES.i16); // Example value for i16 let ans = new Uint8Array([0xc7, 0xcf]); // Byte representation of -12345 as i16 assert.ok(areArrayBuffersEqual(res, ans)); }); it('type i32', () => { let res = serializeToBinary(-1234567890, BASIC_TYPES.i32); // Example value for i32 let ans = new Uint8Array([0x2e, 0xfd, 0x69, 0xb6]); // Byte representation of -1234567890 as i32 assert.ok(areArrayBuffersEqual(res, ans)); }); it('type i64', () => { let res = serializeToBinary(-1234567890123456789n, BASIC_TYPES.i64); // Example value for i64 let ans = new Uint8Array([0xeb, 0x7e, 0x16, 0x82, 0x0b, 0xef, 0xdd, 0xee]); // Byte representation of -1234567890123456789 as i64 assert.ok(areArrayBuffersEqual(res, ans)); }); it('type u8', () => { let res = serializeToBinary(60, BASIC_TYPES.u8); // Example value for u8 let ans = new Uint8Array([0x3c]); // Byte representation of 60 as u8 assert.ok(areArrayBuffersEqual(res, ans)); }); it('type u16', () => { let res = serializeToBinary(56789, BASIC_TYPES.u16); // Example value for u16 let ans = new Uint8Array([0xd5, 0xdd]); // Byte representation of 56789 as u16 assert.ok(areArrayBuffersEqual(res, ans)); }); it('type u32', () => { let res = serializeToBinary(1234567890, BASIC_TYPES.u32); // Example value for u32 let ans = new Uint8Array([0xd2, 0x02, 0x96, 0x49]); // Byte representation of 1234567890 as u32 assert.ok(areArrayBuffersEqual(res, ans)); }); it('type u64', () => { let res = serializeToBinary(123456789009876543n, BASIC_TYPES.u64); // Example value for u64 let ans = new Uint8Array([0x3f, 0x46, 0x0b, 0xa6, 0x4b, 0x9b, 0xb6, 0x01]); // Byte representation of 123456789009876543 as u64 assert.ok(areArrayBuffersEqual(res, ans)); }); it('type uuid', () => { let res = serializeToBinary(new UUID('f5b3ad32-2a77-4f2e-a3b8-3eb8a8546f2b'), BASIC_TYPES.uuid); let ans = new Uint8Array([0xf5, 0xb3, 0xad, 0x32, 0x2a, 0x77, 0x4f, 0x2e, 0xa3, 0xb8, 0x3e, 0xb8, 0xa8, 0x54, 0x6f, 0x2b]); assert.ok(areArrayBuffersEqual(res, ans)); }); it('type string', () => { let res = serializeToBinary('hello world', BASIC_TYPES.str); let ans = new Uint8Array([0x0b, 0x00, 0x00, 0x00, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64]); assert.ok(areArrayBuffersEqual(res, ans)); }); it('type u16[]', () => { let res = serializeToBinary([0x1770, 0x3c3a, 0x9012], new DynamicArrayHandler(BASIC_TYPES.u16)); let ans = new Uint8Array([0x03, 0x00, 0x00, 0x00, 0x70, 0x17, 0x3a, 0x3c, 0x12, 0x90]); assert.ok(areArrayBuffersEqual(res, ans)); }); it('type u16[3]', () => { let res = serializeToBinary([0x1770, 0x3c3a, 0x9012], new FixedArrayHandler(3, BASIC_TYPES.u16)); let ans = new Uint8Array([0x70, 0x17, 0x3a, 0x3c, 0x12, 0x90]); assert.ok(areArrayBuffersEqual(res, ans)); }); it('type Point', () => { let res = serializeToBinary(new Point(2, 3), Point); let ans = new Uint8Array([0x02, 0x03]); assert.ok(areArrayBuffersEqual(res, ans)); }); }); describe('deserializeFromBinary', () => { it('type i8', () => { let binaryData = new Uint8Array([0x85]).buffer; let res = deserializeFromBinary(new DataView(binaryData), BASIC_TYPES.i8); let ans = -123; assert.equal(res, ans); }); it('type i16', () => { let binaryData = new Uint8Array([0xc7, 0xcf]).buffer; let res = deserializeFromBinary(new DataView(binaryData), BASIC_TYPES.i16); let ans = -12345; assert.equal(res, ans); }); it('type i32', () => { let binaryData = new Uint8Array([0x2e, 0xfd, 0x69, 0xb6]).buffer; let res = deserializeFromBinary(new DataView(binaryData), BASIC_TYPES.i32); let ans = -1234567890; assert.equal(res, ans); }); it('type i64', () => { let binaryData = new Uint8Array([0xeb, 0x7e, 0x16, 0x82, 0x0b, 0xef, 0xdd, 0xee]).buffer; let res = deserializeFromBinary(new DataView(binaryData), BASIC_TYPES.i64); let ans = BigInt('-1234567890123456789'); assert.equal(res, ans); }); it('type u8', () => { let binaryData = new Uint8Array([0x3c]).buffer; let res = deserializeFromBinary(new DataView(binaryData), BASIC_TYPES.u8); let ans = 60; assert.equal(res, ans); }); it('type u16', () => { let binaryData = new Uint8Array([0xd5, 0xdd]).buffer; let res = deserializeFromBinary(new DataView(binaryData), BASIC_TYPES.u16); let ans = 56789; assert.equal(res, ans); }); it('type u32', () => { let binaryData = new Uint8Array([0xd2, 0x02, 0x96, 0x49]).buffer; let res = deserializeFromBinary(new DataView(binaryData), BASIC_TYPES.u32); let ans = 1234567890; assert.equal(res, ans); }); it('type u64', () => { let binaryData = new Uint8Array([0x3f, 0x46, 0x0b, 0xa6, 0x4b, 0x9b, 0xb6, 0x01]).buffer; let res = deserializeFromBinary(new DataView(binaryData), BASIC_TYPES.u64); let ans = BigInt('123456789009876543'); assert.equal(res, ans); }); it('type uuid', () => { let binaryData = new Uint8Array([0xf5, 0xb3, 0xad, 0x32, 0x2a, 0x77, 0x4f, 0x2e, 0xa3, 0xb8, 0x3e, 0xb8, 0xa8, 0x54, 0x6f, 0x2b]).buffer; let res = deserializeFromBinary(new DataView(binaryData), BASIC_TYPES.uuid); let ans = 'f5b3ad32-2a77-4f2e-a3b8-3eb8a8546f2b'; assert.equal(res.toString(), ans); }); it('type string', () => { let binaryData = new Uint8Array([0x0b, 0x00, 0x00, 0x00, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64]).buffer; let res = deserializeFromBinary(new DataView(binaryData), BASIC_TYPES.str); let ans = 'hello world'; assert.equal(res, ans); }); it('type u16[]', () => { let binaryData = new Uint8Array([0x03, 0x00, 0x00, 0x00, 0x70, 0x17, 0x3a, 0x3c, 0x12, 0x90]).buffer; let res = deserializeFromBinary(new DataView(binaryData), new DynamicArrayHandler(BASIC_TYPES.u16)); let ans = [0x1770, 0x3c3a, 0x9012]; assert.deepEqual(res, ans); }); it('type u16[3]', () => { let binaryData = new Uint8Array([0x70, 0x17, 0x3a, 0x3c, 0x12, 0x90]).buffer; let res = deserializeFromBinary(new DataView(binaryData), new FixedArrayHandler(3, BASIC_TYPES.u16)); let ans = [0x1770, 0x3c3a, 0x9012]; assert.deepEqual(res, ans); }); it('type Point', () => { let binaryData = new Uint8Array([0x02, 0x03]).buffer; let res = deserializeFromBinary(new DataView(binaryData), Point); let ans = new Point(2, 3); assert.equal(res.x, ans.x); assert.equal(res.y, ans.y); assert.equal(res.foo(), ans.foo()) }); }); });