diff --git a/lib/plugins/Label_QQ.test.ts b/lib/plugins/Label_QQ.test.ts index 8e139b5..306fbd3 100644 --- a/lib/plugins/Label_QQ.test.ts +++ b/lib/plugins/Label_QQ.test.ts @@ -117,6 +117,29 @@ describe('Label QQ', () => { expect(decodeResult.formatted.items[2].value).toBe('00:58:00'); }); + test('decodes Label QQ groundspeed placeholder after non-placeholder field (#507)', () => { + // Variant 1 layout but field 45..48 is '---' while 42..45 is '028'. + // Previously the guard tested remaining.text (the 42..45 field), so this + // message stored NaN groundspeed and rendered "NaN knots". + message.text = 'KLGBKLAX0004\r\n001FE07000444N3349.8W11810.1028---0009'; + const decodeResult = plugin.decode(message); + + expect(decodeResult.decoded).toBe(true); + expect(decodeResult.decoder.decodeLevel).toBe('partial'); + expect(decodeResult.decoder.name).toBe('label-qq'); + expect(decodeResult.raw.departure_icao).toBe('KLGB'); + expect(decodeResult.raw.arrival_icao).toBe('KLAX'); + expect(decodeResult.raw.position.latitude).toBe(33.83); + expect(decodeResult.raw.position.longitude).toBe(-118.16833333333334); + expect(decodeResult.raw.groundspeed).toBeUndefined(); + expect(Number.isNaN(decodeResult.raw.groundspeed)).toBe(false); + expect(decodeResult.remaining.text).toBe('028,---,0009'); + expect(decodeResult.formatted.items.length).toBe(4); + expect( + decodeResult.formatted.items.some((item) => item.code === 'GSPD'), + ).toBe(false); + }); + // disabled because all messages should decode test.skip('decodes Label QQ ', () => { message.text = 'QQ Bogus message'; diff --git a/lib/plugins/Label_QQ.ts b/lib/plugins/Label_QQ.ts index 82f5f22..3f1f26c 100644 --- a/lib/plugins/Label_QQ.ts +++ b/lib/plugins/Label_QQ.ts @@ -43,13 +43,11 @@ export class Label_QQ extends DecoderPlugin { ResultFormatter.unknown(decodeResult, message.text.substring(42, 45)); ResultFormatter.position(decodeResult, pos); - if (decodeResult.remaining.text !== '---') { - ResultFormatter.groundspeed( - decodeResult, - Number(message.text.substring(45, 48)), - ); + const gsField = message.text.substring(45, 48); + if (decodeResult.remaining.text !== '---' && gsField !== '---') { + ResultFormatter.groundspeed(decodeResult, Number(gsField)); } else { - ResultFormatter.unknown(decodeResult, message.text.substring(45, 48)); + ResultFormatter.unknown(decodeResult, gsField); } ResultFormatter.unknown(decodeResult, message.text.substring(48)); } else {