85 lines
2.6 KiB
TypeScript
85 lines
2.6 KiB
TypeScript
import { describe, it, expect } from 'vitest';
|
|
import { Address } from '../src/address';
|
|
|
|
describe('Address.constructor', () => {
|
|
it('truncates callsign to 6 chars and uppercases; accepts valid SSID', () => {
|
|
const a = new Address('abcdefg', 12);
|
|
expect(a.callsign).toBe('ABCDEF');
|
|
expect(a.ssid).toBe(12);
|
|
});
|
|
|
|
describe('input validation', () => {
|
|
it('rejects non-string callsign', () => {
|
|
expect(() => new Address(123 as any, 0)).toThrow(TypeError);
|
|
});
|
|
|
|
it('rejects empty callsign', () => {
|
|
expect(() => new Address(' ', 0)).toThrow();
|
|
});
|
|
|
|
it('rejects non-integer or out-of-range SSID', () => {
|
|
// non-integer
|
|
expect(() => new Address('ABC', 1.5 as any)).toThrow(TypeError);
|
|
// out of range
|
|
expect(() => new Address('ABC', -1)).toThrow(RangeError);
|
|
expect(() => new Address('ABC', 16)).toThrow(RangeError);
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('Address.fromBytes', () => {
|
|
it('roundtrips to/from bytes and string', () => {
|
|
const a = new Address('NOCALL', 3);
|
|
const b = Address.fromBytes(a.toBytes(true));
|
|
expect(b.callsign).toBe('NOCALL');
|
|
expect(b.ssid).toBe(3);
|
|
expect(a.toString()).toBe('NOCALL-3');
|
|
});
|
|
|
|
it('throws on short buffer', () => {
|
|
expect(() => Address.fromBytes(new Uint8Array([1, 2, 3]))).toThrow();
|
|
});
|
|
});
|
|
|
|
describe('Address.fromString', () => {
|
|
it('parses string addresses', () => {
|
|
const a = Address.fromString('FOO-1');
|
|
expect(a.callsign).toBe('FOO');
|
|
expect(a.ssid).toBe(1);
|
|
});
|
|
|
|
describe('input validation', () => {
|
|
it('rejects invalid fromString inputs', () => {
|
|
// non-string
|
|
expect(() => Address.fromString(123 as any)).toThrow(TypeError);
|
|
// empty
|
|
expect(() => Address.fromString('-1')).toThrow();
|
|
// non-numeric SSID
|
|
expect(() => Address.fromString('FOO-A')).toThrow();
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('Address.toBytes', () => {
|
|
it('encodes callsign bytes and SSID correctly with and without last bit', () => {
|
|
const a = new Address('AB', 5);
|
|
const b = a.toBytes(false);
|
|
expect(b[0]).toBe('A'.charCodeAt(0) << 1);
|
|
expect(b[1]).toBe('B'.charCodeAt(0) << 1);
|
|
// padding spaces are 0x20 << 1 == 0x40
|
|
expect(b[2]).toBe(0x40);
|
|
expect(b[6]).toBe(0x60 | ((5 << 1) & 0xfe));
|
|
|
|
const last = a.toBytes(true);
|
|
expect((last[6] & 0x01)).toBe(1);
|
|
});
|
|
});
|
|
|
|
describe('Address.toString', () => {
|
|
it('omits SSID when showSsid is false and supports custom separator', () => {
|
|
const a = new Address('call', 2);
|
|
expect(a.toString({ showSsid: false })).toBe('CALL');
|
|
expect(a.toString({ sep: ':' })).toBe('CALL:2');
|
|
});
|
|
});
|