logicsrc/packages/ans/src/bytes.test.ts
AliaksandrNazaruk 8107140228
Some checks failed
CI / build (push) Has been cancelled
test / test (push) Has been cancelled
fix(ans): reject non-hex input in fromHex instead of silently decoding to 0 (#91)
fromHex validated only that the string was even-length, then used
parseInt(pair, 16) per byte. parseInt returns NaN for a non-hex pair, and a
Uint8Array stores NaN as 0 — so fromHex('zzzz') silently returned [0, 0]
instead of failing. Add a hex-charset check (allowing empty input) so bad
input throws. Add bytes.test.ts covering valid decode, round-trip, odd-length
and non-hex cases.
2026-07-02 16:37:39 -07:00

27 lines
1 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { fromHex, toHex } from './bytes.js';
describe('fromHex', () => {
it('decodes valid hex, with and without 0x prefix', () => {
expect([...fromHex('00ff10')]).toEqual([0x00, 0xff, 0x10]);
expect([...fromHex('0xdeadbeef')]).toEqual([0xde, 0xad, 0xbe, 0xef]);
expect([...fromHex('')]).toEqual([]);
});
it('round-trips with toHex', () => {
const bytes = Uint8Array.from([0, 1, 127, 128, 255]);
expect([...fromHex(toHex(bytes))]).toEqual([...bytes]);
});
it('throws on odd-length input', () => {
expect(() => fromHex('abc')).toThrow(/odd-length/);
});
it('throws on non-hex characters instead of silently decoding to 0', () => {
// Previously parseInt('zz', 16) === NaN, which a Uint8Array stores as 0,
// so fromHex('zzzz') silently returned [0, 0].
expect(() => fromHex('zzzz')).toThrow(/invalid hex/);
expect(() => fromHex('00gg')).toThrow(/invalid hex/);
expect(() => fromHex('0xnothex')).toThrow(/invalid hex/);
});
});