Files
serialize-js/test/Struct.test.js
2025-08-10 09:42:06 +03:00

128 lines
3.9 KiB
JavaScript

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)
expect(() => serialize(dv, { x: 1, z: 2 }, Vector2)).toThrow()
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
])
let nested_json
test('serialize, nested', () => {
let start = process.hrtime.bigint()
const dv = sizedDataView(sizeof(nested, Nested))
serialize(dv, nested, Nested)
const delta_serialize = process.hrtime.bigint() - start
start = process.hrtime.bigint()
nested_json = JSON.stringify(nested)
const delta_json = process.hrtime.bigint() - start
console.log(`Struct, nested: serialize ns: ${delta_serialize}, JSON.stringify ns: ${delta_json}`)
expectDataViewEqual(dv, nested_dv)
})
test('parse, nested', () => {
let start = process.hrtime.bigint()
const actual = parse(nested_dv, Nested)
const delta_serialize = process.hrtime.bigint() - start
start = process.hrtime.bigint()
const json = JSON.parse(nested_json)
const delta_json = process.hrtime.bigint() - start
console.log(`Struct, nested: parse ns: ${delta_serialize}, JSON.parse ns: ${delta_json}`)
expectDataViewEqual(actual, 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)
})
})