dlms-protocol
Version:
DLMS Protocol parser for JavaScript
112 lines (91 loc) • 4.67 kB
JavaScript
import ActionRequest from "../src/messages/ActionRequest";
import MessageType from "../src/enum/MessageType";
describe("ActionRequest class", () => {
const mockCosemAddress = {
Classid: [0x00, 0x01],
Instanceid: [0x00, 0x02, 0x00, 0x03],
Attributeid: [0x01]
};
const mockDlmsData = {
RawValue: [0x12, 0x34, 0x56]
};
test("should initialize with default values when no parameters are provided", () => {
const actionRequest = new ActionRequest(mockCosemAddress);
expect(actionRequest.SetType).toBe(0x01);
expect(actionRequest.invokeIdAndPriority).toBeGreaterThanOrEqual(0xC1);
expect(actionRequest.invokeIdAndPriority).toBeLessThanOrEqual(0xCF);
expect(actionRequest.CosemClassId).toEqual(mockCosemAddress.Classid);
expect(actionRequest.CosemObjectInstanceId).toEqual(mockCosemAddress.Instanceid);
expect(actionRequest.CosemObjectAttributeId).toEqual(mockCosemAddress.Attributeid);
expect(actionRequest.MethodInvocationParameters).toBe(0);
});
test("should initialize with parameters provided as a hex string", () => {
const parameters = "123456";
const actionRequest = new ActionRequest(mockCosemAddress, parameters);
expect(actionRequest.MethodInvocationParameters).toBe(1);
expect(actionRequest.Parameters).toEqual([0x12, 0x34, 0x56]);
});
test("should initialize with dlmsData provided", () => {
const actionRequest = new ActionRequest(mockCosemAddress, null, mockDlmsData);
expect(actionRequest.MethodInvocationParameters).toBe(1);
expect(actionRequest.DlmsData).toEqual(mockDlmsData);
});
test("should throw an error if insertData() is called", () => {
const actionRequest = new ActionRequest(mockCosemAddress);
expect(() => actionRequest.insertData([])).toThrow("Method not implemented");
});
test("should correctly set data with insertDataWithAddress()", () => {
const actionRequest = new ActionRequest(mockCosemAddress);
const newCosemAddress = {
Classid: [0x10, 0x20],
Instanceid: [0x30, 0x40, 0x50, 0x60],
Attributeid: [0x02]
};
actionRequest.insertDataWithAddress(newCosemAddress);
expect(actionRequest.CosemClassId).toEqual(newCosemAddress.Classid);
expect(actionRequest.CosemObjectInstanceId).toEqual(newCosemAddress.Instanceid);
expect(actionRequest.CosemObjectAttributeId).toEqual(newCosemAddress.Attributeid);
expect(actionRequest.MethodInvocationParameters).toBe(0);
});
test("should correctly set data with insertDataWithDlms()", () => {
const actionRequest = new ActionRequest(mockCosemAddress);
actionRequest.insertDataWithDlms(mockCosemAddress, mockDlmsData);
expect(actionRequest.CosemClassId).toEqual(mockCosemAddress.Classid);
expect(actionRequest.CosemObjectInstanceId).toEqual(mockCosemAddress.Instanceid);
expect(actionRequest.CosemObjectAttributeId).toEqual(mockCosemAddress.Attributeid);
expect(actionRequest.MethodInvocationParameters).toBe(1);
expect(actionRequest.DlmsData).toEqual(mockDlmsData);
});
test("should return the correct byte array with getBytes()", () => {
const actionRequest = new ActionRequest(mockCosemAddress, null, mockDlmsData);
const result = actionRequest.getBytes();
expect(result).toEqual([
MessageType.ACTION_REQUEST,
0x01, // SetType
expect.any(Number), // invokeIdAndPriority (randomized)
...mockCosemAddress.Classid,
...mockCosemAddress.Instanceid,
...mockCosemAddress.Attributeid,
0x01, // MethodInvocationParameters
...mockDlmsData.RawValue
]);
});
test("should return the correct hexadecimal string with getHexString()", () => {
const actionRequest = new ActionRequest(mockCosemAddress, null, mockDlmsData);
actionRequest.getBytes(); // Ensure Value is populated
const hexString = actionRequest.getHexString();
const expectedHex = [
MessageType.ACTION_REQUEST,
0x01, // SetType
actionRequest.invokeIdAndPriority,
...mockCosemAddress.Classid,
...mockCosemAddress.Instanceid,
...mockCosemAddress.Attributeid,
0x01, // MethodInvocationParameters
...mockDlmsData.RawValue
]
.map(byte => byte.toString(16).padStart(2, "0").toUpperCase())
.join(" ");
expect(hexString).toBe(expectedHex);
});
});