feat(serialize, parse): Number, String, Array, ConstString, ConstArray
This commit is contained in:
15
test/index.js
Normal file
15
test/index.js
Normal file
@ -0,0 +1,15 @@
|
||||
export function filledDataView(bytes) {
|
||||
const ab = new ArrayBuffer(bytes.length)
|
||||
const dv = new DataView(ab)
|
||||
|
||||
for (let i = 0; i < bytes.length; i++) {
|
||||
dv.setInt8(i, bytes[i])
|
||||
}
|
||||
|
||||
return dv
|
||||
}
|
||||
|
||||
export function sizedDataView(length) {
|
||||
const ab = new ArrayBuffer(length)
|
||||
return new DataView(ab)
|
||||
}
|
||||
142
test/index.test.js
Normal file
142
test/index.test.js
Normal file
@ -0,0 +1,142 @@
|
||||
import { describe, test, expect } from 'vitest'
|
||||
import { filledDataView, sizedDataView } from '.'
|
||||
import { parse, serialize, sizeof, sizeofHead } from '../src'
|
||||
import { ConstArray, ConstString } from '../src/type'
|
||||
|
||||
describe('serialize', () => {
|
||||
test('Number', () => {
|
||||
const expected = filledDataView([0x40, 0x97, 0xF2, 0x80, 0x00, 0x00, 0x00, 0x00])
|
||||
let dv = sizedDataView(7)
|
||||
expect(() => serialize(dv, 0, Number)).toThrow()
|
||||
|
||||
dv = sizedDataView(sizeof(Number))
|
||||
expect(8).toEqual(dv.byteLength)
|
||||
|
||||
serialize(dv, 1532.625, Number)
|
||||
expect(dv).toEqual(expected)
|
||||
})
|
||||
test('ConstString', () => {
|
||||
const expected = filledDataView([0x68, 0x65, 0x6C, 0x00, 0x00])
|
||||
let dv = sizedDataView(4)
|
||||
expect(() => serialize(dv, 'hello', ConstString(5))).toThrow()
|
||||
|
||||
dv = sizedDataView(5)
|
||||
|
||||
serialize(dv, 'hello', ConstString(3))
|
||||
expect(dv).toEqual(expected)
|
||||
})
|
||||
test('String', () => {
|
||||
const expected = filledDataView([
|
||||
0x00, 0x00, 0x00, 0x05,
|
||||
0x68, 0x65, 0x6C, 0x6C, 0x6F,
|
||||
])
|
||||
let dv = sizedDataView(8)
|
||||
expect(() => serialize(dv, 'hello', String)).toThrow()
|
||||
|
||||
dv = sizedDataView(sizeof('hello'))
|
||||
expect(9).toEqual(dv.byteLength)
|
||||
|
||||
serialize(dv, 'hello', String)
|
||||
expect(dv).toEqual(expected)
|
||||
})
|
||||
test('ConstArray, Number', () => {
|
||||
const expected = filledDataView([
|
||||
0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
])
|
||||
let dv = sizedDataView(15)
|
||||
expect(() => serialize(dv, [1, 2], ConstArray(2), Number)).toThrow()
|
||||
|
||||
dv = sizedDataView(sizeof(ConstArray(2), Number))
|
||||
expect(16).toEqual(dv.byteLength)
|
||||
|
||||
serialize(dv, [1, 2], ConstArray(2), Number)
|
||||
expect(dv).toEqual(expected)
|
||||
})
|
||||
test('Array, Number', () => {
|
||||
const expected = filledDataView([
|
||||
0x00, 0x00, 0x00, 0x02,
|
||||
0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
])
|
||||
let dv = sizedDataView(19)
|
||||
expect(() => serialize(dv, [1, 2], Array, Number)).toThrow()
|
||||
|
||||
dv = sizedDataView(sizeof([1, 2]))
|
||||
expect(20).toEqual(dv.byteLength)
|
||||
|
||||
serialize(dv, [1, 2], Array, Number)
|
||||
expect(dv).toEqual(expected)
|
||||
})
|
||||
})
|
||||
|
||||
describe('parse', () => {
|
||||
test('Number', () => {
|
||||
const expected = 1532.625
|
||||
const dv = filledDataView([0x40, 0x97, 0xF2, 0x80, 0x00, 0x00, 0x00, 0x00])
|
||||
const actual = parse(dv, Number)
|
||||
expect(actual).toEqual(expected)
|
||||
})
|
||||
test('ConstString', () => {
|
||||
const expected = 'hel'
|
||||
const dv = filledDataView([0x68, 0x65, 0x6C, 0x6C, 0x6F])
|
||||
const actual = parse(dv, ConstString(3))
|
||||
expect(actual).toEqual(expected)
|
||||
})
|
||||
test('String', () => {
|
||||
const expected = 'hello'
|
||||
const dv = filledDataView([
|
||||
0x00, 0x00, 0x00, 0x05,
|
||||
0x68, 0x65, 0x6C, 0x6C, 0x6F
|
||||
])
|
||||
const actual = parse(dv, String)
|
||||
expect(actual).toEqual(expected)
|
||||
})
|
||||
test('ConstArray, Number', () => {
|
||||
const expected = [1, 2]
|
||||
const dv = filledDataView([
|
||||
0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
])
|
||||
const actual = parse(dv, ConstArray(2), Number)
|
||||
expect(actual).toEqual(expected)
|
||||
})
|
||||
test('Array, Number', () => {
|
||||
const expected = [1, 2]
|
||||
const dv = filledDataView([
|
||||
0x00, 0x00, 0x00, 0x02,
|
||||
0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
])
|
||||
const actual = parse(dv, Array, Number)
|
||||
expect(actual).toEqual(expected)
|
||||
})
|
||||
})
|
||||
|
||||
describe('sizeofHead', () => {
|
||||
test('Number', () => {
|
||||
expect(sizeofHead(Number)).toEqual(8)
|
||||
expect(sizeofHead(1)).toEqual(8)
|
||||
})
|
||||
test('ConstString', () => {
|
||||
expect(sizeofHead(ConstString(2))).toEqual(2)
|
||||
})
|
||||
test('String', () => {
|
||||
expect(sizeofHead(String)).toEqual(4)
|
||||
expect(sizeofHead('s')).toEqual(4)
|
||||
})
|
||||
test('ConstArray', () => {
|
||||
expect(sizeofHead(ConstArray(2), Number)).toEqual(16)
|
||||
})
|
||||
test('Array', () => {
|
||||
expect(sizeofHead(Array, Number)).toEqual(4)
|
||||
expect(sizeofHead([1])).toEqual(4)
|
||||
})
|
||||
})
|
||||
|
||||
describe('sizeof', () => {
|
||||
test('unknown', () => {
|
||||
expect(() => sizeof(String)).toThrow()
|
||||
expect(() => sizeof(Array, Number)).toThrow()
|
||||
})
|
||||
})
|
||||
18
test/mem.test.js
Normal file
18
test/mem.test.js
Normal file
@ -0,0 +1,18 @@
|
||||
import { expect, test } from "vitest";
|
||||
import { filledDataView, sizedDataView } from ".";
|
||||
import { memcpy } from "../src";
|
||||
|
||||
test('memcpy', () => {
|
||||
{
|
||||
const dest = sizedDataView(9)
|
||||
const src = filledDataView([0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01])
|
||||
memcpy(dest, src)
|
||||
expect(dest).toEqual(src)
|
||||
}
|
||||
{
|
||||
const dest = sizedDataView(10)
|
||||
const src = filledDataView([0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01])
|
||||
memcpy(dest, src)
|
||||
expect(dest).toEqual(src)
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user