dlms-protocol
Version:
DLMS Protocol parser for JavaScript
126 lines (109 loc) • 4.55 kB
JavaScript
import ActionResponse from "../src/messages/ActionResponse";
import MessageType from "../src/enum/MessageType";
import DlmsDatas from "../src/typesDLMS/DlmsDatas";
jest.mock("../src/typesDLMS/DlmsDatas");
describe("ActionResponse class", () => {
beforeEach(() => {
DlmsDatas.factory.mockClear();
});
const mockDlmsData = {
rawValue: [0x12, 0x34, 0x56],
insertData: jest.fn(),
};
DlmsDatas.factory.mockReturnValue(mockDlmsData);
test("should initialize with default values when no bytes are provided", () => {
const actionResponse = new ActionResponse();
expect(actionResponse.SetType).toBeNull();
expect(actionResponse.InvokeIdAndPriority).toBeNull();
expect(actionResponse.DataAcessResult).toBeNull();
expect(actionResponse.ReturnParameters).toBeNull();
expect(actionResponse.ParameterType).toBeNull();
expect(actionResponse.DlmsData).toBeNull();
expect(actionResponse.GetDataAcessResult).toBeNull();
expect(actionResponse.Value).toBeNull();
});
test("should correctly parse bytes with ReturnParameters = 0", () => {
const bytes = [MessageType.ACTION_RESPONSE, 0x01, 0xC3, 0x00, 0x00];
const actionResponse = new ActionResponse(bytes);
expect(actionResponse.SetType).toBe(0x01);
expect(actionResponse.InvokeIdAndPriority).toBe(0xC3);
expect(actionResponse.DataAcessResult).toBe(0x00);
expect(actionResponse.ReturnParameters).toBe(0x00);
expect(actionResponse.ParameterType).toBeNull();
expect(actionResponse.DlmsData).toBeNull();
expect(actionResponse.GetDataAcessResult).toBeNull();
expect(actionResponse.Value).toEqual(bytes);
});
test("should correctly parse bytes with ParameterType = 0 (DlmsData)", () => {
const bytes = [
MessageType.ACTION_RESPONSE,
0x01,
0xC3,
0x00,
0x01,
0x00, // ParameterType
0x12, // DlmsData type
0x34,
0x56,
];
const actionResponse = new ActionResponse(bytes);
expect(actionResponse.SetType).toBe(0x01);
expect(actionResponse.InvokeIdAndPriority).toBe(0xC3);
expect(actionResponse.DataAcessResult).toBe(0x00);
expect(actionResponse.ReturnParameters).toBe(0x01);
expect(actionResponse.ParameterType).toBe(0x00);
expect(actionResponse.DlmsData).toEqual(mockDlmsData);
expect(mockDlmsData.insertData).toHaveBeenCalledWith([0x12, 0x34, 0x56]);
expect(actionResponse.GetDataAcessResult).toBeNull();
});
test("should correctly parse bytes with ParameterType != 0 (GetDataAcessResult)", () => {
const bytes = [
MessageType.ACTION_RESPONSE,
0x01,
0xC3,
0x00,
0x01,
0x01, // ParameterType
0x05, // GetDataAcessResult
];
const actionResponse = new ActionResponse(bytes);
expect(actionResponse.SetType).toBe(0x01);
expect(actionResponse.InvokeIdAndPriority).toBe(0xC3);
expect(actionResponse.DataAcessResult).toBe(0x00);
expect(actionResponse.ReturnParameters).toBe(0x01);
expect(actionResponse.ParameterType).toBe(0x01);
expect(actionResponse.DlmsData).toBeNull();
expect(actionResponse.GetDataAcessResult).toBe(0x05);
});
test("should return the correct byte array with getBytes()", () => {
const bytes = [
MessageType.ACTION_RESPONSE,
0x01,
0xC3,
0x00,
0x01,
0x00, // ParameterType
0x12, 0x34, 0x56, // DlmsData rawValue
];
const actionResponse = new ActionResponse(bytes);
const result = actionResponse.getBytes();
expect(result).toEqual(Buffer.from(bytes));
});
test("should return the correct hexadecimal string with getHexString()", () => {
const bytes = [
MessageType.ACTION_RESPONSE,
0x01,
0xC3,
0x00,
0x01,
0x00, // ParameterType
0x12, 0x34, 0x56, // DlmsData rawValue
];
const actionResponse = new ActionResponse(bytes);
const hexString = actionResponse.getHexString();
const expectedHex = bytes
.map(byte => byte.toString(16).toUpperCase().padStart(2, "0"))
.join(" ");
expect(hexString).toBe(expectedHex);
});
});