import { describe, expect, test } from "vitest"; import { ConstDataView, parse, serialize, sizeof, Struct } from "../src"; import { filledDataView, sizedDataView } from '../src' import { expectDataViewEqual } from "."; describe(Struct.name, () => { const User = Struct({ age: Number, name: String }) const user = { age: 1, name: 'hello' } const user_dv = filledDataView([ 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // age 0x00, 0x00, 0x00, 0x0C, // name_head // name 0x00, 0x00, 0x00, 0x05, // name.size 0x68, 0x65, 0x6C, 0x6C, 0x6F, // name.data ]) test('serialize, headless', () => { expect(() => sizeof(User)).toThrow() const dv = sizedDataView(sizeof(user, User)) expect(21).toEqual(dv.byteLength) serialize(dv, user, User) expectDataViewEqual(dv, user_dv) }) test('parse, headless', () => { expectDataViewEqual(parse(user_dv, User), user) }) const Vector2 = Struct({ x: Number, y: Number }) const vector2 = { x: 1, y: 2 } const vector2_dv = filledDataView([ 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // x 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // y ]) test('serialize, non-headless', () => { const dv = sizedDataView(sizeof(Vector2)) expect(16).toEqual(dv.byteLength) serialize(dv, vector2, Vector2) expectDataViewEqual(dv, vector2_dv) }) test('parse, non-headless', () => { expectDataViewEqual(parse(vector2_dv, Vector2), vector2) }) const Nested = Struct({ user: User, vector2: [Vector2] }) const nested = { user, vector2 } const nested_dv = filledDataView([ 0x00, 0x00, 0x00, 0x14, // user_head // vector2 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // vector2.x 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // vector2.y // user 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // user.age 0x00, 0x00, 0x00, 0x0C, // user.name_head // user.name 0x00, 0x00, 0x00, 0x05, // user.name.size 0x68, 0x65, 0x6C, 0x6C, 0x6F, // user.name.data ]) test('serialize, nested', () => { const dv = sizedDataView(sizeof(nested, Nested)) serialize(dv, nested, Nested) expectDataViewEqual(dv, nested_dv) }) test('parse, nested', () => { expectDataViewEqual(parse(nested_dv, Nested), nested) }) const Token = Struct({ data: Struct({ name: String }), header: Struct({ expires: Number }), signature: ConstDataView(4), }) const token = { data: { name: 'sek1ro' }, header: { expires: 1 }, signature: filledDataView([0xFF, 0xFF, 0xFF, 0xFF]), } const token_dv = filledDataView([ 0x00, 0x00, 0x00, 0x10, // data_head // header 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // header.expires 0xFF, 0xFF, 0xFF, 0xFF, // signature // data 0x00, 0x00, 0x00, 0x04, // data.name_head // data.name 0x00, 0x00, 0x00, 0x06, 0x73, 0x65, 0x6b, 0x31, 0x72, 0x6f, ]) test('serialize, Token', () => { const dv = sizedDataView(sizeof(token, Token)) serialize(dv, token, Token) expectDataViewEqual(dv, token_dv) }) test('parse, Token', () => { expectDataViewEqual(parse(token_dv, Token), token) }) })