dlms-protocol
Version:
DLMS Protocol parser for JavaScript
128 lines (105 loc) • 5.06 kB
JavaScript
import SetRequest from "../src/messages/SetRequest";
import MessageType from "../src/enum/MessageType";
describe("SetRequest class", () => {
const mockDlmsData = {
totalBytes: 5,
rawValue: [0x12, 0x34, 0x56, 0x78, 0x9A],
};
const mockCosemAddress = {
classId: [0x00, 0x01],
instanceId: [0x02, 0x03, 0x04, 0x05, 0x06, 0x07],
attributeId: [0x08],
};
beforeEach(() => {
jest.spyOn(global.Math, "random").mockReturnValue(0.5); // Mock random for consistent invokeId
});
afterEach(() => {
jest.spyOn(global.Math, "random").mockRestore();
});
test("should initialize with default values when no parameters are provided", () => {
const setRequest = new SetRequest();
expect(setRequest.setType).toBe(0);
expect(setRequest.invokeIdAndPriority).toBe(0);
expect(setRequest.cosemClassId).toEqual([0, 0]);
expect(setRequest.cosemObjectInstanceId).toEqual([0, 0, 0, 0, 0, 0]);
expect(setRequest.cosemObjectAttributeId).toEqual([0]);
expect(setRequest.selectiveAccessDescriptor).toBe(0);
expect(setRequest.dlmsData).toBeNull();
expect(setRequest.value).toEqual([]);
expect(setRequest.parameters).toEqual([]);
});
test("should correctly initialize with dlmsData and cosemAddress", () => {
const setRequest = new SetRequest(mockDlmsData, mockCosemAddress, 0x01);
expect(setRequest.setType).toBe(0x01); // dlmsData.totalBytes < 127
expect(setRequest.invokeIdAndPriority).toBe(0xC8); // Mocked invokeId
expect(setRequest.cosemClassId).toEqual(mockCosemAddress.classId);
expect(setRequest.cosemObjectInstanceId).toEqual(mockCosemAddress.instanceId);
expect(setRequest.cosemObjectAttributeId).toEqual(mockCosemAddress.attributeId);
expect(setRequest.selectiveAccessDescriptor).toBe(0x01);
expect(setRequest.dlmsData).toEqual(mockDlmsData);
});
test("should correctly initialize with cosemAddress and parameters", () => {
const hexParameters = "123456789A";
const setRequest = new SetRequest(null, mockCosemAddress, null, hexParameters);
expect(setRequest.setType).toBe(0x01);
expect(setRequest.invokeIdAndPriority).toBe(0xC8); // Mocked invokeId
expect(setRequest.cosemClassId).toEqual(mockCosemAddress.classId);
expect(setRequest.cosemObjectInstanceId).toEqual(mockCosemAddress.instanceId);
expect(setRequest.cosemObjectAttributeId).toEqual(mockCosemAddress.attributeId);
expect(setRequest.selectiveAccessDescriptor).toBe(0x00);
expect(setRequest.parameters).toEqual([0x12, 0x34, 0x56, 0x78, 0x9A]);
});
test("should return the correct byte array with getBytes() (dlmsData)", () => {
const setRequest = new SetRequest(mockDlmsData, mockCosemAddress, 0x01);
const result = setRequest.getBytes();
expect(result).toEqual([
MessageType.SET_REQUEST,
0x01, // setType
0xC8, // invokeIdAndPriority
...mockCosemAddress.classId,
...mockCosemAddress.instanceId,
...mockCosemAddress.attributeId,
0x01, // selectiveAccessDescriptor
...mockDlmsData.rawValue,
]);
});
test("should return the correct byte array with getBytes() (parameters)", () => {
const hexParameters = "123456789A";
const setRequest = new SetRequest(null, mockCosemAddress, null, hexParameters);
const result = setRequest.getBytes();
expect(result).toEqual([
MessageType.SET_REQUEST,
0x01, // setType
0xC8, // invokeIdAndPriority
...mockCosemAddress.classId,
...mockCosemAddress.instanceId,
...mockCosemAddress.attributeId,
0x00, // selectiveAccessDescriptor
0x12, 0x34, 0x56, 0x78, 0x9A, // parameters
]);
});
test("should return the correct hexadecimal string with getHexString()", () => {
const setRequest = new SetRequest(mockDlmsData, mockCosemAddress, 0x01);
setRequest.getBytes(); // Populate value
const hexString = setRequest.getHexString();
const expectedHex = [
MessageType.SET_REQUEST,
0x01, // setType
0xC8, // invokeIdAndPriority
...mockCosemAddress.classId,
...mockCosemAddress.instanceId,
...mockCosemAddress.attributeId,
0x01, // selectiveAccessDescriptor
...mockDlmsData.rawValue,
]
.map(byte => byte.toString(16).toUpperCase().padStart(2, "0"))
.join(" ");
expect(hexString).toBe(expectedHex);
});
test("should correctly convert hex string to byte array with _stringToBytes()", () => {
const setRequest = new SetRequest();
const hexString = "123456";
const result = setRequest._stringToBytes(hexString);
expect(result).toEqual([0x12, 0x34, 0x56]);
});
});