From 1aa8eb363f5bc50edea5ddf1994be6969ca87d27 Mon Sep 17 00:00:00 2001 From: maze Date: Wed, 18 Mar 2026 19:23:27 +0100 Subject: [PATCH] More bugfixes in comment offsets --- src/frame.ts | 2 +- test/frame.extras.test.ts | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/frame.ts b/src/frame.ts index 636d06c..afbd717 100644 --- a/src/frame.ts +++ b/src/frame.ts @@ -822,7 +822,7 @@ export class Frame implements IFrame { } // remove altitude token from ext and advance ext for further parsing - commentOffset += 7; + commentOffset += altMatch[0].length; ext = ext.replace(altMatch[0], "").trimStart(); continue; diff --git a/test/frame.extras.test.ts b/test/frame.extras.test.ts index 49badff..4885480 100644 --- a/test/frame.extras.test.ts +++ b/test/frame.extras.test.ts @@ -6,6 +6,26 @@ import type { PositionPayload } from "../src/frame.types"; import { feetToMeters, milesToMeters } from "../src/parser"; describe("APRS extras test vectors", () => { + it("parses altitude token in the beginning of a comment and emits structure", () => { + const raw = + "DL3QP-R>APDG03,TCPIP*,qAC,T2ROMANIA:!5151.12ND00637.65E&/A=000000440 MMDVM Voice 439.40000MHz -7.6000MHz, DL3QP_Pi-Star"; + const frame = Frame.fromString(raw); + const res = frame.decode(true) as { payload: PositionPayload | null; structure: Dissected }; + const { payload, structure } = res; + + expect(payload).not.toBeNull(); + // Altitude 001234 ft -> meters + expect(payload!.position.altitude).toBe(0); + + const commentSeg = structure.find((s) => /comment/i.test(String(s.name))) as Segment | undefined; + expect(commentSeg).toBeDefined(); + const fieldsAlt = (commentSeg!.fields ?? []) as Field[]; + const hasAlt = fieldsAlt.some((f) => f.name === "altitude"); + expect(hasAlt).toBe(true); + + expect(payload!.position.comment).toBe("440 MMDVM Voice 439.40000MHz -7.6000MHz, DL3QP_Pi-Star"); + }); + it("parses altitude token marker mid-comment and emits structure", () => { const raw = "N0CALL>APRS,WIDE1-1:!4500.00N/07000.00W#RNG0001ALT/A=001234 Your Comment Here"; const frame = Frame.fromString(raw);