swift
testflightplanaircraftinfo.cpp
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (C) swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
7 
8 #include <QTest>
9 
10 #include "test.h"
11 
12 #include "misc/aviation/flightplanaircraftinfo.h"
13 
14 using namespace swift::misc::aviation;
15 
16 namespace MiscTest
17 {
19  class CTestFlightPlanAircraftInfo : public QObject
20  {
21  Q_OBJECT
22 
23  private slots:
25  void icaoConvert();
26 
28  void faaConvert();
29 
31  void nonValidConvert();
32 
33  private:
34  struct TestEntry
35  {
36  QString m_icaoEquipment;
37  QString m_faaEquipment;
38  QString m_aircraftIcao;
40  CComNavEquipment m_equipment;
41  CSsrEquipment m_ssrEquipment;
42  };
43 
44  QList<TestEntry> m_testEntries {
45  { "B737/M-SDE2E3FGHIRWXY/LB1", "B737/L", "B737", CWakeTurbulenceCategory::MEDIUM,
46  CComNavEquipment(CComNavEquipment::ComNavEquipment(
47  CComNavEquipment::Standard | CComNavEquipment::Dme | CComNavEquipment::DFisAcars |
48  CComNavEquipment::PdcAcars | CComNavEquipment::Adf | CComNavEquipment::Gnss |
49  CComNavEquipment::HfRtf | CComNavEquipment::InertiaNavigation |
50  CComNavEquipment::Pbn | CComNavEquipment::Rvsm | CComNavEquipment::Mnps |
51  CComNavEquipment::Vhf833),
52  CComNavEquipment::CpdlcSatcomEquipment()),
53  CSsrEquipment::SSrEquipment(CSsrEquipment::ModeSTypeL | CSsrEquipment::AdsBB1) },
54  { "B748/H-SDE3FGHIM1M2RWXY/LB1", "H/B748/L", "B748", CWakeTurbulenceCategory::HEAVY,
55  CComNavEquipment(CComNavEquipment::ComNavEquipment(
56  CComNavEquipment::Standard | CComNavEquipment::Dme | CComNavEquipment::PdcAcars |
57  CComNavEquipment::Adf | CComNavEquipment::Gnss | CComNavEquipment::HfRtf |
58  CComNavEquipment::InertiaNavigation | CComNavEquipment::Pbn |
59  CComNavEquipment::Rvsm | CComNavEquipment::Mnps | CComNavEquipment::Vhf833),
60  CComNavEquipment::CpdlcSatcomEquipment(CComNavEquipment::AtcSatvoiceInmarsat |
61  CComNavEquipment::AtcSatvoiceMtsat)),
62  CSsrEquipment::SSrEquipment(CSsrEquipment::ModeSTypeL | CSsrEquipment::AdsBB1) },
63  { "C172/L-DGV/C", "C172/G", "C172", CWakeTurbulenceCategory::LIGHT,
64  CComNavEquipment(CComNavEquipment::ComNavEquipment(CComNavEquipment::VhfRtf | CComNavEquipment::Gnss |
65  CComNavEquipment::Dme),
66  CComNavEquipment::CpdlcSatcomEquipment()),
67  CSsrEquipment::SSrEquipment(CSsrEquipment::ModeAC) },
68  { "A388/J-SADE2E3FGHIJ3J4J5M1RWXY/LB1D1", "J/A388/L", "A388", CWakeTurbulenceCategory::SUPER,
69  CComNavEquipment(CComNavEquipment::ComNavEquipment(
70  CComNavEquipment::Standard | CComNavEquipment::Gbas | CComNavEquipment::Dme |
71  CComNavEquipment::DFisAcars | CComNavEquipment::PdcAcars | CComNavEquipment::Adf |
72  CComNavEquipment::Gnss | CComNavEquipment::HfRtf |
73  CComNavEquipment::InertiaNavigation | CComNavEquipment::Pbn |
74  CComNavEquipment::Rvsm | CComNavEquipment::Mnps | CComNavEquipment::Vhf833),
75  CComNavEquipment::CpdlcSatcomEquipment(
76  CComNavEquipment::CpdlcFansVdlA | CComNavEquipment::CpdlcFansVdl2 |
77  CComNavEquipment::CpdlcFansSatcomInmarsat | CComNavEquipment::AtcSatvoiceInmarsat)),
78  CSsrEquipment::SSrEquipment(CSsrEquipment::ModeSTypeL | CSsrEquipment::AdsBB1 | CSsrEquipment::AdsCD1) }
79  };
80  };
81 
82  void CTestFlightPlanAircraftInfo::icaoConvert()
83  {
84  for (const TestEntry &entry : m_testEntries)
85  {
86  CFlightPlanAircraftInfo info(entry.m_icaoEquipment);
87 
88  QVERIFY2(info.getAircraftIcao().hasDesignator(), "Should have designator");
89  QVERIFY2(info.getAircraftIcao().getDesignator() == entry.m_aircraftIcao,
90  "Should have same aircraft ICAO code");
91  QCOMPARE(info.getWtc(), entry.m_wtc);
92  QCOMPARE(info.getComNavEquipment(), entry.m_equipment);
93  QCOMPARE(info.getSsrEquipment(), entry.m_ssrEquipment);
94  QCOMPARE(info.asIcaoString(), entry.m_icaoEquipment);
95  }
96  }
97 
98  void CTestFlightPlanAircraftInfo::faaConvert()
99  {
100  for (const TestEntry &entry : m_testEntries)
101  {
102  CFlightPlanAircraftInfo info(entry.m_faaEquipment);
103 
104  QVERIFY2(info.getAircraftIcao().hasDesignator(), "Should have designator");
105  QCOMPARE(info.getAircraftIcao().getDesignator(), entry.m_aircraftIcao);
106 
107  // FAA code only contains information about heavy and super wake turbulence category
108  if (entry.m_wtc.isCategory(CWakeTurbulenceCategory::HEAVY) ||
109  entry.m_wtc.isCategory(CWakeTurbulenceCategory::SUPER))
110  {
111  QCOMPARE(info.getWtc(), entry.m_wtc);
112  }
113  else { QVERIFY2(info.getWtc().isUnknown(), "Should have UNKNOWN wake turbulence category"); }
114 
115  // Cannot compare COM/NAV equipment and SSR equipment as the FAA code does not contain that much detail
116 
117  QCOMPARE(info.asFaaString(), entry.m_faaEquipment);
118  }
119  }
120 
121  void CTestFlightPlanAircraftInfo::nonValidConvert()
122  {
123  // Missing WTC and equipment code
124  CFlightPlanAircraftInfo info("A388");
125  QCOMPARE(info.asFaaString(), "A388/X");
126  QCOMPARE(info.asIcaoString(), "A388/M-S/N");
127 
128  // FAA format: Missing equipment code
129  info = CFlightPlanAircraftInfo("J/A388");
130  QCOMPARE(info.asFaaString(), "J/A388/X");
131  QCOMPARE(info.asIcaoString(), "A388/J-S/N");
132 
133  // FAA format: Wrong aircraft ICAO (but correct length according to CAircraftIcaoCode::isValidDesignator)
134  info = CFlightPlanAircraftInfo("H/A1/W");
135  QCOMPARE(info.asFaaString(), "H/A1/W");
136  QCOMPARE(info.asIcaoString(), "A1/H-W/C");
137 
138  // FAA format: Missing aircraft ICAO with WTC
139  info = CFlightPlanAircraftInfo("H//W");
140  QCOMPARE(info.asFaaString(), "H//W");
141  QCOMPARE(info.asIcaoString(), "/H-W/C");
142 
143  // FAA format: Equipment code only
144  info = CFlightPlanAircraftInfo("/W");
145  QCOMPARE(info.asFaaString(), "/W");
146  QCOMPARE(info.asIcaoString(), "/M-W/C");
147 
148  // Wrong aircraft ICAO (too short) without WTC and equipment
149  info = CFlightPlanAircraftInfo("X");
150  QCOMPARE(info.asFaaString(), "/X");
151  QCOMPARE(info.asIcaoString(), "/M-S/N");
152 
153  // Wrong aircraft ICAO (too long) without WTC and equipment
154  info = CFlightPlanAircraftInfo("ABCDEFGHIJKL");
155  QCOMPARE(info.asFaaString(), "/X");
156  QCOMPARE(info.asIcaoString(), "/M-S/N");
157 
158  // Empty
159  info = CFlightPlanAircraftInfo("");
160  QCOMPARE(info.asFaaString(), "/X");
161  QCOMPARE(info.asIcaoString(), "/M-S/N");
162 
163  // FAA format: Lower case (all)
164  info = CFlightPlanAircraftInfo("h/b744/L");
165  QCOMPARE(info.asFaaString(), "H/B744/L");
166  QCOMPARE(info.asIcaoString(), "B744/H-GW/C");
167 
168  // FAA format: Lower case without WTC
169  info = CFlightPlanAircraftInfo("b738/w");
170  QCOMPARE(info.asFaaString(), "B738/W");
171  QCOMPARE(info.asIcaoString(), "B738/M-W/C");
172 
173  // Lower case without WTC and equipment
174  info = CFlightPlanAircraftInfo("dh8d");
175  QCOMPARE(info.asFaaString(), "DH8D/X");
176  QCOMPARE(info.asIcaoString(), "DH8D/M-S/N");
177 
178  // FAA format: Invalid WTC
179  info = CFlightPlanAircraftInfo("Q/A346");
180  QCOMPARE(info.asFaaString(), "A346/X");
181  QCOMPARE(info.asIcaoString(), "A346/M-S/N");
182 
183  // FAA format: Leading whitespace
184  info = CFlightPlanAircraftInfo(" H/B748/L");
185  QCOMPARE(info.asFaaString(), "H/B748/L");
186  QCOMPARE(info.asIcaoString(), "B748/H-GW/C");
187 
188  // FAA format: Trailing whitespace
189  info = CFlightPlanAircraftInfo("H/B748/L ");
190  QCOMPARE(info.asFaaString(), "H/B748/L");
191  QCOMPARE(info.asIcaoString(), "B748/H-GW/C");
192 
193  // FAA format: Whitespaces in between
194  info = CFlightPlanAircraftInfo("H / B7 48 /L");
195  QCOMPARE(info.asFaaString(), "H/B748/L");
196  QCOMPARE(info.asIcaoString(), "B748/H-GW/C");
197 
198  // ICAO format: Invalid WTC
199  info = CFlightPlanAircraftInfo("A339/?-S/N");
200  QCOMPARE(info.asFaaString(), "A339/X");
201  QCOMPARE(info.asIcaoString(), "A339/M-S/N");
202 
203  // ICAO format: Missing SSR equipment code
204  info = CFlightPlanAircraftInfo("A339/H-S");
205  QCOMPARE(info.asFaaString(), "A339/X");
206  QCOMPARE(info.asIcaoString(), "A339/M-S/N");
207 
208  // ICAO format: Lowercase
209  info = CFlightPlanAircraftInfo("b737/m-sde2e3fghirwxy/lb1");
210  QCOMPARE(info.asFaaString(), "B737/L");
211  QCOMPARE(info.asIcaoString(), "B737/M-SDE2E3FGHIRWXY/LB1");
212 
213  // ICAO format: Leading whitespace
214  info = CFlightPlanAircraftInfo(" B737/M-SDE2E3FGHIRWXY/LB1");
215  QCOMPARE(info.asFaaString(), "B737/L");
216  QCOMPARE(info.asIcaoString(), "B737/M-SDE2E3FGHIRWXY/LB1");
217 
218  // ICAO format: Trailing whitespace
219  info = CFlightPlanAircraftInfo("B737/M-SDE2E3FGHIRWXY/LB1 ");
220  QCOMPARE(info.asFaaString(), "B737/L");
221  QCOMPARE(info.asIcaoString(), "B737/M-SDE2E3FGHIRWXY/LB1");
222 
223  // ICAO format: Whitespaces in between
224  info = CFlightPlanAircraftInfo("B737/ M - SDE2E3FGH IRWXY / LB1");
225  QCOMPARE(info.asFaaString(), "B737/L");
226  QCOMPARE(info.asIcaoString(), "B737/M-SDE2E3FGHIRWXY/LB1");
227  }
228 
229 } // namespace MiscTest
230 
233 
234 #include "testflightplanaircraftinfo.moc"
235 
Flightplan-related information about an aircraft (aircraft ICAO, equipment and WTC)
ICAO flightplan field 10b.
Definition: ssrequipment.h:16
SWIFTTEST_APPLESS_MAIN(MiscTest::CTestFlightPlanAircraftInfo)
main