swift
testflightplan.cpp
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (C) 2017 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 
13 #include "misc/aviation/selcal.h"
15 #include "misc/pq/literals.h"
16 
17 using namespace swift::misc::aviation;
18 using namespace swift::misc::network;
19 using namespace swift::misc::physical_quantities;
20 
21 namespace MiscTest
22 {
24  class CTestFlightPlan : public QObject
25  {
26  Q_OBJECT
27 
28  private slots:
30  void flightPlanRemarks();
31 
33  void flightPlanAltitude();
34 
36  void importVpilotFlightplan();
37  };
38 
39  void CTestFlightPlan::flightPlanRemarks()
40  {
41  QString remarks;
42  CFlightPlanRemarks fpRemarks(remarks);
43  QVERIFY2(fpRemarks.isEmpty(), "Expect NULL flight plan remarks");
44 
45  remarks = QStringLiteral("RT/KESTREL OPR/MYTRAVEL REG/G-DAJC SEL/FP-ES PER/C NAV/RNP10");
46  fpRemarks = CFlightPlanRemarks(remarks);
47  QVERIFY2(fpRemarks.getSelcalCode().getCode() == "FPES", "Wrong SELCAL code");
48  QVERIFY2(fpRemarks.getFlightOperator() == "MYTRAVEL", "Wrong flight operator");
49  QVERIFY2(fpRemarks.getRegistration().asString() == "GDAJC", "Wrong registration");
50 
51  remarks = QStringLiteral("OPR/UAL CALLSIGN/UNITED");
52  fpRemarks = CFlightPlanRemarks(remarks);
53  QVERIFY2(fpRemarks.getAirlineIcao().getDesignator() == "UAL", "Wrong airline, expect UAL");
54  QVERIFY2(fpRemarks.getFlightOperator().isEmpty(), "Expect to operator, should be in airline");
55  QVERIFY2(fpRemarks.getRegistration().isEmpty(), "Expect no registration");
56  QVERIFY2(fpRemarks.getRadioTelephony() == "UNITED", "Expect telephony");
57 
58  remarks = QStringLiteral("/v/FPL-VIR9-IS-A346/DEP/S-EGLL/ARR/KJFK/REG/G-VGAS/TCAS RVR/200 OPR/VIRGIN AIRLINES");
59  fpRemarks = CFlightPlanRemarks(remarks);
60  QVERIFY2(fpRemarks.getRegistration().asString() == "GVGAS", "Wrong registration");
61  QVERIFY2(fpRemarks.getFlightOperator() == "VIRGIN AIRLINES", "Wrong operator");
62  QVERIFY2(fpRemarks.getVoiceCapabilities().getCapabilities() == CVoiceCapabilities::Voice,
63  "Wrong airline, expect UAL");
64 
65  remarks =
66  QStringLiteral("/v/FPL-VIR9-IS-A346/ OPR/VIRGIN AIRLINES DEP/S-EGLL/ARR/KJFK/REG/G-VGAS/TCAS RVR/200");
67  fpRemarks = CFlightPlanRemarks(remarks);
68  QVERIFY2(fpRemarks.getRegistration().asString() == "GVGAS", "Wrong registration");
69  QVERIFY2(fpRemarks.getFlightOperator() == "VIRGIN AIRLINES", "Wrong operator");
70  QVERIFY2(fpRemarks.getVoiceCapabilities().getCapabilities() == CVoiceCapabilities::Voice,
71  "Wrong airline, expect UAL");
72  }
73 
74  void CTestFlightPlan::flightPlanAltitude()
75  {
76  CAltitude a;
77  a.parseFromFpAltitudeString("FL125");
78  QVERIFY2(a == CAltitude(12500, CAltitude::FlightLevel, CLengthUnit::ft()), "Wrong altitude FL125");
79  a.parseFromFpAltitudeString("FL126");
80  QVERIFY2(a == CAltitude(12600, CAltitude::FlightLevel, CLengthUnit::ft()), "Wrong altitude FL126");
81  a.parseFromFpAltitudeString("A122");
82  QVERIFY2(a == CAltitude(12200, CAltitude::MeanSeaLevel, CLengthUnit::ft()), "Wrong altitude A122");
83  a.parseFromFpAltitudeString("123ft");
84  QVERIFY2(a == CAltitude(123, CAltitude::MeanSeaLevel, CLengthUnit::ft()), "Wrong altitude 123ft");
85  a.parseFromFpAltitudeString("1234m");
86  QVERIFY2(a == CAltitude(1234, CAltitude::MeanSeaLevel, CLengthUnit::m()), "Wrong altitude 1234m");
87  a.parseFromFpAltitudeString("S0666");
88  QVERIFY2(a == CAltitude(6660, CAltitude::FlightLevel, CLengthUnit::m()), "Wrong altitude S0666");
89  a.parseFromFpAltitudeString("M456");
90  QVERIFY2(a == CAltitude(4560, CAltitude::MeanSeaLevel, CLengthUnit::m()), "Wrong altitude M456");
91 
92  // some values which are supposed to be wrong
93  CAltitude faulty(a);
94  faulty.makeNegative();
95  QVERIFY2(!faulty.isValidFpAltitude(), "Negative values not allowed");
96 
97  // as string
98  a = CAltitude(12500, CAltitude::FlightLevel, CLengthUnit::ft());
99  QVERIFY2(a.asFpICAOAltitudeString() == "FL125", "Expect FL125");
100  QVERIFY2(a.asFpVatsimAltitudeString() == "FL125", "Expect FL125");
101  a = CAltitude(15000, CAltitude::MeanSeaLevel, CLengthUnit::ft());
102  QVERIFY2(a.asFpICAOAltitudeString() == "A150", "Expect A150");
103  // QVERIFY2(a.asFpVatsimAltitudeString() == "15000ft", "Expect 15000");
104  QVERIFY2(a.asFpVatsimAltitudeString() == "15000", "Expect 15000");
105  a = CAltitude(1500, CAltitude::FlightLevel, CLengthUnit::m());
106  QVERIFY2(a.asFpICAOAltitudeString() == "S0150", "Expect S0150");
107  a = CAltitude(1600, CAltitude::MeanSeaLevel, CLengthUnit::m());
108  QVERIFY2(a.asFpICAOAltitudeString() == "M0160", "Expect M0160");
109  }
110 
111  void CTestFlightPlan::importVpilotFlightplan()
112  {
113  using namespace swift::misc::physical_quantities::Literals;
114 
115  const CFlightPlan fp = CFlightPlan::fromVPilotFormat(QStringLiteral(
116  "<?xml version=\"1.0\" encoding=\"utf-8\"?><FlightPlan "
117  "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" "
118  "FlightType=\"VFR\" Equipment=\"G\" CruiseAltitude=\"5500\" CruiseSpeed=\"115\" DepartureAirport=\"EDRY\" "
119  "DestinationAirport=\"EDDL\" AlternateAirport=\"EDDK\" Route=\"WRB DOMUX\" "
120  "Remarks=\"TEST remark\" IsHeavy=\"false\" EquipmentPrefix=\"\" EquipmentSuffix=\"\" "
121  "DepartureTime=\"1744\" "
122  "DepartureTimeAct=\"1744\" EnrouteHours=\"2\" EnrouteMinutes=\"28\" FuelHours=\"3\" FuelMinutes=\"45\" "
123  "VoiceType=\"Full\" />"));
124 
125  QCOMPARE_EQ(fp.getFlightRules(), CFlightPlan::VFR);
126  QCOMPARE_EQ(fp.getCruiseTrueAirspeed(), 115_kts);
127  QCOMPARE_EQ(fp.getOriginAirportIcao().getIcaoCode(), "EDRY");
128  QCOMPARE_EQ(fp.getDestinationAirportIcao().getIcaoCode(), "EDDL");
129  QCOMPARE_EQ(fp.getAlternateAirportIcao().getIcaoCode(), "EDDK");
130  QCOMPARE_EQ(fp.getRemarks(), "/V/ TEST remark");
131  QCOMPARE_EQ(fp.getRoute(), "WRB DOMUX");
132  QCOMPARE_EQ(fp.getFuelTime(), CTime(3, 45, 0));
133  QCOMPARE_EQ(fp.getEnrouteTime(), CTime(2, 28, 0));
134  QCOMPARE_EQ(fp.getCruiseAltitude().asFpVatsimAltitudeString(), "FL055");
135  QCOMPARE_EQ(fp.getTakeoffTimePlannedHourMin(), "17:44");
136 
137  // Should not read aircraft type from vfp
138  QCOMPARE_EQ(fp.getAircraftInfo().getAircraftIcao().getAircraftType(), "");
139  }
140 } // namespace MiscTest
141 
144 
145 #include "testflightplan.moc"
146 
Flightplan unit tests.
QString getAircraftType() const
Aircraft type, such a L(andplane), S(eaplane), H(elicopter)
QString getIcaoCode() const
Get ICAO code.
Altitude as used in aviation, can be AGL or MSL altitude.
Definition: altitude.h:52
QString asFpVatsimAltitudeString() const
As simple VATSIM string, only FLxxx or altitude as ft.
Definition: altitude.cpp:363
QString asFpICAOAltitudeString() const
Altitude string (official version)
Definition: altitude.cpp:340
bool parseFromFpAltitudeString(const QString &value, CStatusMessageList *msgs=nullptr)
Parse from FP altitude string.
Definition: altitude.cpp:188
CAircraftIcaoCode getAircraftIcao() const
Get Aircraft ICAO.
Value object for a flight plan.
Definition: flightplan.h:148
const physical_quantities::CTime & getFuelTime() const
Get amount of fuel load in time.
Definition: flightplan.h:339
QString getTakeoffTimePlannedHourMin() const
Get planned takeoff time (planned)
Definition: flightplan.cpp:257
const physical_quantities::CSpeed & getCruiseTrueAirspeed() const
Get planned cruise TAS.
Definition: flightplan.h:354
const QString & getRoute() const
Get route string.
Definition: flightplan.h:363
@ VFR
Visual flight rules.
Definition: flightplan.h:156
FlightRules getFlightRules() const
Get flight rules as in FlightRules.
Definition: flightplan.h:357
const QString & getRemarks() const
Get remarks string.
Definition: flightplan.h:375
const CAirportIcaoCode & getAlternateAirportIcao() const
Get alternate destination airport ICAO code.
Definition: flightplan.h:315
const CAltitude & getCruiseAltitude() const
Cruising altitudes.
Definition: flightplan.h:348
const physical_quantities::CTime & getEnrouteTime() const
Get planned enroute flight time.
Definition: flightplan.h:330
const CAirportIcaoCode & getOriginAirportIcao() const
Get origin airport ICAO code.
Definition: flightplan.h:309
static CFlightPlan fromVPilotFormat(const QString &vPilotData)
From vPilot data.
Definition: flightplan.cpp:325
const CAirportIcaoCode & getDestinationAirportIcao() const
Get destination airport ICAO code.
Definition: flightplan.h:312
CFlightPlanAircraftInfo getAircraftInfo() const
Get ICAO aircraft NAV/COM equipment.
Definition: flightplan.h:384
Flight plan remarks, parsed values.
Definition: flightplan.h:46
SWIFTTEST_APPLESS_MAIN(MiscTest::CTestFlightPlan)
main