obd-raw-data-parser
Version:
A lightweight TypeScript library for parsing OBD-II raw data into human readable format. Based on the excellent work of obd-utils by Nishkalkashyap.
275 lines (274 loc) • 10.1 kB
JavaScript
import { DTCBaseDecoder, } from "../index.js";
describe("DTC Decoder", () => {
describe("DTCBaseDecoder", () => {
const baseConfig = {
logPrefix: "TEST",
};
test("should decode DTCs from non-CAN mode 03 response with data", () => {
const decoder = new DTCBaseDecoder({
...baseConfig,
isCan: false,
serviceMode: "03",
troubleCodeType: "CURRENT",
});
// From DTC_WITH_DATA_EXAMPLE.txt
const response = [
[],
[],
];
const result = decoder.decodeDTCs(response);
expect(result).toEqual(["P0101", "P0113", "U114B"]);
});
test("should handle NO DATA response in non-CAN format", () => {
const decoder = new DTCBaseDecoder({
...baseConfig,
isCan: false,
serviceMode: "0A",
troubleCodeType: "PERMANENT",
});
// From DTC_9141_2.txt
const response = [
[],
[],
];
const result = decoder.decodeDTCs(response);
expect(result).toEqual([]);
});
test("should handle empty DTCs in non-CAN format", () => {
const decoder = new DTCBaseDecoder({
...baseConfig,
isCan: false,
serviceMode: "03",
troubleCodeType: "CURRENT",
});
// From DTC_NO_DATA_EXAMPLE.txt
const response = [
[],
[],
];
const result = decoder.decodeDTCs(response);
expect(result).toEqual([]);
});
test("should decode multiple DTCs from CAN format mode 03", () => {
const decoder = new DTCBaseDecoder({
...baseConfig,
isCan: true,
serviceMode: "03",
troubleCodeType: "CURRENT",
});
// From BASIC.txt CAN format
const response = [
[
48, 49, 48, 13, 48, 58, 52, 51, 48, 55, 48, 49, 48, 49, 48, 49, 49,
51, 13,
],
[],
[],
[],
];
const result = decoder.decodeDTCs(response);
expect(result).toEqual([
"P0101",
"P0113",
"U114B",
"U115B",
"U115E",
"U1164",
"U2222",
]);
});
test("should decode multiple DTCs from CAN format mode 07", () => {
const decoder = new DTCBaseDecoder({
...baseConfig,
isCan: true,
serviceMode: "07",
troubleCodeType: "PENDING",
});
// From BASIC.txt CAN format
const response = [
[
48, 49, 48, 13, 48, 58, 52, 55, 48, 55, 48, 49, 48, 49, 48, 49, 49,
51, 13,
],
[],
[],
[],
[],
];
const result = decoder.decodeDTCs(response);
expect(result).toEqual([
"P0101",
"P0113",
"U114B",
"U115B",
"U115E",
"U1164",
"U2222",
]);
});
test("should decode multiple DTCs from CAN format mode 0A", () => {
const decoder = new DTCBaseDecoder({
...baseConfig,
isCan: true,
serviceMode: "0A",
troubleCodeType: "PERMANENT",
});
// From BASIC.txt CAN format
const response = [
[
48, 49, 48, 13, 48, 58, 52, 65, 48, 55, 48, 49, 48, 49, 48, 49, 49,
51, 13,
],
[],
[],
[],
[],
];
const result = decoder.decodeDTCs(response);
expect(result).toEqual([
"P0101",
"P0113",
"U114B",
"U115B",
"U115E",
"U1164",
"U2222",
]);
});
test("should decode DTCs from non-CAN mode 0A with numeric response", () => {
const decoder = new DTCBaseDecoder({
...baseConfig,
isCan: false,
serviceMode: "0A",
troubleCodeType: "PERMANENT",
});
// From DTC_WITH_DATA_EXAMPLE.txt
const response = [
[],
[],
];
const result = decoder.decodeDTCs(response);
expect(result).toEqual(["P017F"]);
});
test("should handle sequential commands and responses", () => {
const decoder = new DTCBaseDecoder({
...baseConfig,
isCan: false,
serviceMode: "03",
troubleCodeType: "CURRENT",
});
// Test multiple commands in sequence
const responses = [
// Mode 03 response
[
[],
[],
],
// Mode 07 response
[
[],
[],
],
// Mode 0A response
[
[],
[],
],
];
const results = responses.map((response) => decoder.decodeDTCs(response));
expect(results).toEqual([
["P0101", "P0113", "U114B"],
["C0701", "P0101", "P13D1"],
["P017F"],
]);
});
test("should handle mixed response patterns", () => {
const decoder = new DTCBaseDecoder({
...baseConfig,
isCan: false,
serviceMode: "0A",
troubleCodeType: "PERMANENT",
});
const mixedResponses = [
// NO DATA response
[
[],
[],
],
// Numeric response
[
[],
[],
],
];
const results = mixedResponses.map((response) => decoder.decodeDTCs(response));
expect(results).toEqual([[], ["P017F"]]);
});
test("should handle responses with termination characters", () => {
const decoder = new DTCBaseDecoder({
...baseConfig,
isCan: false,
serviceMode: "03",
troubleCodeType: "CURRENT",
});
// Test responses with different termination patterns
const responses = [
// Response with CR
[[52, 51, 48, 49, 48, 49, 48, 49, 49, 51, 68, 49, 52, 66, 13], [13]],
// Response with CR + prompt
[
[],
[],
],
];
responses.forEach((response) => {
const result = decoder.decodeDTCs(response);
expect(result).toEqual(["P0101", "P0113", "U114B"]);
});
});
test("should handle malformed responses", () => {
const decoder = new DTCBaseDecoder({
...baseConfig,
isCan: false,
serviceMode: "03",
troubleCodeType: "CURRENT",
});
const malformedResponses = [
// Empty response
[[], []],
// Incomplete response
[
[],
[],
],
// Invalid characters
[
[],
[],
],
];
malformedResponses.forEach((response) => {
const result = decoder.decodeDTCs(response);
expect(result).toEqual([]);
});
});
test("should handle different DTC prefix types", () => {
const decoder = new DTCBaseDecoder({
...baseConfig,
isCan: false,
serviceMode: "03",
troubleCodeType: "CURRENT",
});
// Test responses with different DTC prefixes (P, C, B, U)
const responses = [
// P-type DTC
[
[], // P0101
[],
],
];
const results = responses.map((response) => decoder.decodeDTCs(response));
expect(results).toEqual([["P0101"]]);
});
});
});