|
| 1 | +import { MessageDecoder } from "../MessageDecoder"; |
| 2 | +import { Label_H2_02E } from "./Label_H2_02E"; |
| 3 | + |
| 4 | +describe("Label_H2 02E", () => { |
| 5 | + let plugin: Label_H2_02E; |
| 6 | + |
| 7 | + beforeEach(() => { |
| 8 | + const decoder = new MessageDecoder(); |
| 9 | + plugin = new Label_H2_02E(decoder); |
| 10 | + }); |
| 11 | + test("matches qualifiers", () => { |
| 12 | + expect(plugin.decode).toBeDefined(); |
| 13 | + expect(plugin.name).toBe("label-h2-02e"); |
| 14 | + expect(plugin.qualifiers).toBeDefined(); |
| 15 | + expect(plugin.qualifiers()).toEqual({ |
| 16 | + labels: ["H2"], |
| 17 | + preambles: ["02E"], |
| 18 | + }); |
| 19 | + }); |
| 20 | + |
| 21 | + test("decodes discord example 1", () => { |
| 22 | + const text = |
| 23 | + "02E20HEGNLKPRN40359E02208116253601M627259020G QN41179E02134316323599M617247037G QN41591E02100516393603M610266040G QN42393E02026716463602M600276033G QN43197E01954316533598M592299037G QN44023E01929517003596M587313033G Q"; |
| 24 | + const decodeResult = plugin.decode({ text: text }); |
| 25 | + /* |
| 26 | + Route: HEGN-LKPR |
| 27 | +1 40°35.9'N, 022°08.1'E 16:25 FL360 36,000 ft -62.7°C 259°/20kts |
| 28 | +2 41°17.9'N, 021°34.3'E 16:32 FL359 35,900 ft -61.7°C 247°/37kts |
| 29 | +3 41°59.1'N, 021°00.5'E 16:39 FL360 36,000 ft -61.0°C 266°/40kts |
| 30 | +4 42°39.3'N, 020°26.7'E 16:46 FL360 36,000 ft -60.0°C 276°/33kts |
| 31 | +5 43°19.7'N, 019°54.3'E 16:53 FL359 35,900 ft -59.2°C 299°/37kts |
| 32 | +6 44°02.3'N, 019°29.5'E 17:00 FL359 35,900 ft -58.7°C 313°/33kts |
| 33 | + */ |
| 34 | + expect(decodeResult.decoded).toBe(true); |
| 35 | + expect(decodeResult.decoder.decodeLevel).toBe("full"); |
| 36 | + expect(decodeResult.formatted.description).toBe("Weather Report"); |
| 37 | + expect(decodeResult.message.text).toBe(text); |
| 38 | + const weather = decodeResult.raw.wind_data; |
| 39 | + expect(weather.length).toBe(6); |
| 40 | + expect(decodeResult.formatted.items[0].label).toBe("Day of Month"); |
| 41 | + expect(typeof decodeResult.formatted.items[0].value).toBe("string"); |
| 42 | + expect(decodeResult.formatted.items[1].label).toBe("Origin"); |
| 43 | + expect(decodeResult.formatted.items[1].value).toBe("HEGN"); |
| 44 | + expect(decodeResult.formatted.items[2].label).toBe("Destination"); |
| 45 | + expect(decodeResult.formatted.items[2].value).toBe("LKPR"); |
| 46 | + expect(decodeResult.formatted.items[3].label).toBe("Wind Data"); |
| 47 | + expect(decodeResult.formatted.items[3].value).toBe( |
| 48 | + "N40359E022081(40.598 N, 22.135 E)@16:25:00 at FL360: 259° at 20kt, -62.7°C at FL360" |
| 49 | + ); |
| 50 | + expect(decodeResult.formatted.items[4].label).toBe("Wind Data"); |
| 51 | + expect(decodeResult.formatted.items[4].value).toBe( |
| 52 | + "N41179E021343(41.298 N, 21.572 E)@16:32:00 at FL359: 247° at 37kt, -61.7°C at FL359" |
| 53 | + ); |
| 54 | + expect(decodeResult.formatted.items[5].label).toBe("Wind Data"); |
| 55 | + expect(decodeResult.formatted.items[5].value).toBe( |
| 56 | + "N41591E021005(41.985 N, 21.008 E)@16:39:00 at FL360: 266° at 40kt, -61°C at FL360" |
| 57 | + ); |
| 58 | + expect(decodeResult.formatted.items[6].label).toBe("Wind Data"); |
| 59 | + expect(decodeResult.formatted.items[6].value).toBe( |
| 60 | + "N42393E020267(42.655 N, 20.445 E)@16:46:00 at FL360: 276° at 33kt, -60°C at FL360" |
| 61 | + ); |
| 62 | + expect(decodeResult.formatted.items[7].label).toBe("Wind Data"); |
| 63 | + expect(decodeResult.formatted.items[7].value).toBe( |
| 64 | + "N43197E019543(43.328 N, 19.905 E)@16:53:00 at FL359: 299° at 37kt, -59.2°C at FL359" |
| 65 | + ); |
| 66 | + expect(decodeResult.formatted.items[8].label).toBe("Wind Data"); |
| 67 | + expect(decodeResult.formatted.items[8].value).toBe( |
| 68 | + "N44023E019295(44.038 N, 19.492 E)@17:00:00 at FL359: 313° at 33kt, -58.7°C at FL359" |
| 69 | + ); |
| 70 | + }); |
| 71 | + |
| 72 | + test("decodes discord example 2", () => { |
| 73 | + const text = |
| 74 | + "02E20EGKKLBSFN45081E01757116493501M577327021G QN44401E01903016563499M575352028G QN44115E02008017033468M550319029G QN43420E02112317103296M525299036G QN43125E02214517172023M277271022G Q"; |
| 75 | + const decodeResult = plugin.decode({ text: text }); |
| 76 | + |
| 77 | + /* |
| 78 | + Route: EGKK-LBSF |
| 79 | +1 FL350 ~35,000 ft -57.7°C 327°/21kts |
| 80 | +2 FL349 ~34,900 ft -57.5°C 352°/28kts |
| 81 | +3 FL346 ~34,600 ft -55.0°C 319°/29kts |
| 82 | +4 FL329 ~32,900 ft -52.5°C 299°/36kts |
| 83 | +5 FL202 ~20,200 ft -27.7°C 271°/22kts |
| 84 | +*/ |
| 85 | + expect(decodeResult.decoded).toBe(true); |
| 86 | + expect(decodeResult.decoder.decodeLevel).toBe("full"); |
| 87 | + expect(decodeResult.formatted.description).toBe("Weather Report"); |
| 88 | + expect(decodeResult.message.text).toBe(text); |
| 89 | + const weather = decodeResult.raw.wind_data; |
| 90 | + expect(weather.length).toBe(5); |
| 91 | + expect(decodeResult.formatted.items[0].label).toBe("Day of Month"); |
| 92 | + expect(typeof decodeResult.formatted.items[0].value).toBe("string"); |
| 93 | + expect(decodeResult.formatted.items[1].label).toBe("Origin"); |
| 94 | + expect(decodeResult.formatted.items[1].value).toBe("EGKK"); |
| 95 | + expect(decodeResult.formatted.items[2].label).toBe("Destination"); |
| 96 | + expect(decodeResult.formatted.items[2].value).toBe("LBSF"); |
| 97 | + expect(decodeResult.formatted.items[3].label).toBe("Wind Data"); |
| 98 | + expect(decodeResult.formatted.items[3].value).toBe( |
| 99 | + "N45081E017571(45.135 N, 17.952 E)@16:49:00 at FL350: 327° at 21kt, -57.7°C at FL350" |
| 100 | + ); |
| 101 | + expect(decodeResult.formatted.items[4].label).toBe("Wind Data"); |
| 102 | + expect(decodeResult.formatted.items[4].value).toBe( |
| 103 | + "N44401E019030(44.668 N, 19.050 E)@16:56:00 at FL349: 352° at 28kt, -57.5°C at FL349" |
| 104 | + ); |
| 105 | + expect(decodeResult.formatted.items[5].label).toBe("Wind Data"); |
| 106 | + expect(decodeResult.formatted.items[5].value).toBe( |
| 107 | + "N44115E020080(44.192 N, 20.133 E)@17:03:00 at FL346: 319° at 29kt, -55°C at FL346" |
| 108 | + ); |
| 109 | + expect(decodeResult.formatted.items[6].label).toBe("Wind Data"); |
| 110 | + expect(decodeResult.formatted.items[6].value).toBe( |
| 111 | + "N43420E021123(43.700 N, 21.205 E)@17:10:00 at FL329: 299° at 36kt, -52.5°C at FL329" |
| 112 | + ); |
| 113 | + expect(decodeResult.formatted.items[7].label).toBe("Wind Data"); |
| 114 | + expect(decodeResult.formatted.items[7].value).toBe( |
| 115 | + "N43125E022145(43.208 N, 22.242 E)@17:17:00 at FL202: 271° at 22kt, -27.7°C at FL202" |
| 116 | + ); |
| 117 | + }); |
| 118 | + |
| 119 | + test("decodes website example", () => { |
| 120 | + // https://app.airframes.io/messages/6025352132 |
| 121 | + const text = |
| 122 | + "02E20EIDWKORDN44087W08505523383800M470251091G QN43210W08520623452813M442251113G QN42461W08539523522189M295256121G QN42380W08623723591780M227266100G Q"; |
| 123 | + const decodeResult = plugin.decode({ text: text }); |
| 124 | + |
| 125 | + expect(decodeResult.decoded).toBe(true); |
| 126 | + expect(decodeResult.decoder.decodeLevel).toBe("full"); |
| 127 | + expect(decodeResult.formatted.description).toBe("Weather Report"); |
| 128 | + expect(decodeResult.message.text).toBe(text); |
| 129 | + const weather = decodeResult.raw.wind_data; |
| 130 | + expect(weather.length).toBe(4); |
| 131 | + expect(decodeResult.formatted.items[0].label).toBe("Day of Month"); |
| 132 | + expect(typeof decodeResult.formatted.items[0].value).toBe("string"); |
| 133 | + expect(decodeResult.formatted.items[1].label).toBe("Origin"); |
| 134 | + expect(decodeResult.formatted.items[1].value).toBe("EIDW"); |
| 135 | + expect(decodeResult.formatted.items[2].label).toBe("Destination"); |
| 136 | + expect(decodeResult.formatted.items[2].value).toBe("KORD"); |
| 137 | + expect(decodeResult.formatted.items[3].label).toBe("Wind Data"); |
| 138 | + expect(decodeResult.formatted.items[3].value).toBe( |
| 139 | + "N44087W085055(44.145 N, 85.092 W)@23:38:00 at FL380: 251° at 91kt, -47°C at FL380" |
| 140 | + ); |
| 141 | + expect(decodeResult.formatted.items[4].label).toBe("Wind Data"); |
| 142 | + expect(decodeResult.formatted.items[4].value).toBe( |
| 143 | + "N43210W085206(43.350 N, 85.343 W)@23:45:00 at FL281: 251° at 113kt, -44.2°C at FL281" |
| 144 | + ); |
| 145 | + expect(decodeResult.formatted.items[5].label).toBe("Wind Data"); |
| 146 | + expect(decodeResult.formatted.items[5].value).toBe( |
| 147 | + "N42461W085395(42.768 N, 85.658 W)@23:52:00 at FL218: 256° at 121kt, -29.5°C at FL218" |
| 148 | + ); |
| 149 | + expect(decodeResult.formatted.items[6].label).toBe("Wind Data"); |
| 150 | + expect(decodeResult.formatted.items[6].value).toBe( |
| 151 | + "N42380W086237(42.633 N, 86.395 W)@23:59:00 at FL178: 266° at 100kt, -22.7°C at FL178" |
| 152 | + ); |
| 153 | + }); |
| 154 | + |
| 155 | + test("decodes invalid message", () => { |
| 156 | + const text = "02E20INVALID MESSAGE TEXT"; |
| 157 | + const decodeResult = plugin.decode({ text: text }); |
| 158 | + |
| 159 | + expect(decodeResult.decoded).toBe(false); |
| 160 | + expect(decodeResult.decoder.decodeLevel).toBe("none"); |
| 161 | + expect(decodeResult.formatted.description).toBe("Weather Report"); |
| 162 | + expect(decodeResult.message.text).toBe(text); |
| 163 | + expect(decodeResult.remaining.text).toBe("02E20INVALID MESSAGE TEXT"); |
| 164 | + }); |
| 165 | +}); |
0 commit comments