85 lines
2.6 KiB
TypeScript
85 lines
2.6 KiB
TypeScript
import assert from 'node:assert/strict';
|
|
import test, { describe } from 'node:test';
|
|
import type { PduParams, PduParamsInput } from '../src/defs/commands.ts';
|
|
import { cmds, cmdsById, commandNameById, isCommandName } from '../src/defs/commands.ts';
|
|
|
|
describe('command table', () => {
|
|
test('every command is reachable by name and by id', () => {
|
|
assert.equal(cmds.submit_sm?.id, 0x00000004);
|
|
assert.equal(cmds.submit_sm_resp?.id, 0x80000004);
|
|
assert.equal(cmdsById[0x00000004]?.command, 'submit_sm');
|
|
assert.equal(cmdsById[0x80000009]?.command, 'bind_transceiver_resp');
|
|
});
|
|
|
|
test('covers all 33 commands', () => {
|
|
assert.equal(Object.keys(cmds).length, 33);
|
|
});
|
|
|
|
// Wire order, not alphabetical order — reordering these corrupts every PDU.
|
|
test('submit_sm parameters are in wire order', () => {
|
|
assert.deepEqual(Object.keys(cmds.submit_sm?.params ?? {}), [
|
|
'service_type',
|
|
'source_addr_ton',
|
|
'source_addr_npi',
|
|
'source_addr',
|
|
'dest_addr_ton',
|
|
'dest_addr_npi',
|
|
'destination_addr',
|
|
'esm_class',
|
|
'protocol_id',
|
|
'priority_flag',
|
|
'schedule_delivery_time',
|
|
'validity_period',
|
|
'registered_delivery',
|
|
'replace_if_present_flag',
|
|
'data_coding',
|
|
'sm_default_msg_id',
|
|
'sm_length',
|
|
'short_message',
|
|
]);
|
|
});
|
|
|
|
test('resolves names from ids and guards unknown ones', () => {
|
|
assert.equal(commandNameById(0x00000004), 'submit_sm');
|
|
assert.equal(commandNameById(0x0BADF00D), undefined);
|
|
assert.ok(isCommandName('deliver_sm'));
|
|
assert.ok(!isCommandName('deliver_pizza'));
|
|
});
|
|
});
|
|
|
|
describe('per-command parameter types', () => {
|
|
test('narrow to the fields the command actually defines', () => {
|
|
const params: PduParams<'submit_sm'> = {
|
|
data_coding: 0,
|
|
destination_addr: '46709771337',
|
|
dest_addr_npi: 0,
|
|
dest_addr_ton: 1,
|
|
esm_class: 0,
|
|
priority_flag: 0,
|
|
protocol_id: 0,
|
|
registered_delivery: 0,
|
|
replace_if_present_flag: 0,
|
|
schedule_delivery_time: '',
|
|
service_type: '',
|
|
short_message: Buffer.from('hello'),
|
|
sm_default_msg_id: 0,
|
|
sm_length: 5,
|
|
source_addr: '46701113311',
|
|
source_addr_npi: 0,
|
|
source_addr_ton: 1,
|
|
validity_period: '',
|
|
};
|
|
|
|
// Fails to compile if short_message is not known to be a Buffer.
|
|
assert.equal(params.short_message.toString(), 'hello');
|
|
// Fails to compile if destination_addr is not known to be a string.
|
|
assert.equal(params.destination_addr.length, 11);
|
|
});
|
|
|
|
test('accept a partial input, coercing numbers into the string fields', () => {
|
|
const input: PduParamsInput<'submit_sm_resp'> = { message_id: 2343 };
|
|
|
|
assert.equal(input.message_id, 2343);
|
|
});
|
|
});
|