swift
testdata.cpp
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 
4 #include "misc/test/testdata.h"
5 
8 #include "misc/directoryutils.h"
9 #include "misc/fileutils.h"
10 #include "misc/math/mathutils.h"
11 #include "misc/network/server.h"
12 #include "misc/network/userlist.h"
14 #include "misc/swiftdirectories.h"
15 #include "misc/variantlist.h"
16 
17 using namespace swift::misc::aviation;
18 using namespace swift::misc::geo;
19 using namespace swift::misc::math;
20 using namespace swift::misc::network;
21 using namespace swift::misc::physical_quantities;
22 using namespace swift::misc::simulation;
23 
25 namespace swift::misc::test
26 {
27  int randomIndex(int size) { return CMathUtils::randomInteger(0, size - 1); }
28 
29  const CServer &CTestData::getTrafficServer()
30  {
31  static const CServer trafficServer("fooserver", "a foo server", "localhost", 1234,
32  CUser("112233", "Some real name", "email@xyz.com", "secret"), CFsdSetup(),
33  CEcosystem(CEcosystem::VATSIM), CServer::FSDServerVatsim);
34  return trafficServer;
35  }
36 
37  const CVariantList &CTestData::getCVariantList()
38  {
39  static const CVariantList vl({ CVariant::from(CLength(100, CLengthUnit::m())),
40  CVariant::from(CSpeed(200, CSpeedUnit::m_s())),
41  CVariant::from(CTestData::getCoordinateMunichTower()) });
42  return vl;
43  }
44 
45  CPropertyIndexVariantMap getCPropertyIndexVariantMapImpl()
46  {
47  CPropertyIndexVariantMap valueMap;
48  valueMap.addValue(1000, 111.222);
49  valueMap.addValue(2000, CTestData::getRandomControllerCallsign());
50  valueMap.addValue(3000, CTestData::getCoordinateFrankfurtTower());
51  valueMap.addValue(4000, QDateTime::currentDateTime().addDays(1));
52  valueMap.addValue(5000, QString("foobar"));
53  return valueMap;
54  }
55 
56  const CPropertyIndexVariantMap &CTestData::getCPropertyIndexVariantMap()
57  {
58  static const CPropertyIndexVariantMap valueMap(getCPropertyIndexVariantMapImpl());
59  return valueMap;
60  }
61 
62  const CCoordinateGeodetic &CTestData::getCoordinateMunichTower()
63  {
64  static const CCoordinateGeodetic c =
65  CCoordinateGeodetic::fromWgs84("48° 21′ 13″ N", "11° 47′ 09″ E", { 1487, CLengthUnit::ft() });
66  return c;
67  }
68 
69  const CCoordinateGeodetic &CTestData::getCoordinateFrankfurtTower()
70  {
71  static const CCoordinateGeodetic c =
72  CCoordinateGeodetic::fromWgs84("50° 1' 18.38″ N", "8° 33' 23.24″ E", { 355, CLengthUnit::ft() });
73  return c;
74  }
75 
76  const CFlightPlan &CTestData::getFlightPlan()
77  {
78  static const CFlightPlanAircraftInfo info("T/A320/F");
79  static const CFlightPlan fp(
80  CCallsign("DAMBZ", CCallsign::Aircraft), info, "EDDF", "EDDM", "EDDN", QDateTime::currentDateTimeUtc(),
81  QDateTime::currentDateTime().addSecs(600), CTime(1.0, CTimeUnit::h()), CTime(2.0, CTimeUnit::h()),
82  CAltitude(10000, CAltitude::MeanSeaLevel, CLengthUnit::ft()), CSpeed(400, CSpeedUnit::kts()),
83  CFlightPlan::IFR, "DKB T104 ANORA", "Testing flight");
84  return fp;
85  }
86 
87  const CAtcStation &CTestData::getMunichTower()
88  {
89  static const CAtcStation t(CCallsign("EDDM_TWR"), CUser("654321", "John Doe"),
90  CFrequency(119.9, CFrequencyUnit::MHz()), CTestData::getCoordinateFrankfurtTower(),
91  CLength(50, CLengthUnit::km()), false);
92  return t;
93  }
94 
95  const CAtcStation &CTestData::getFrankfurtTower()
96  {
97  static const CAtcStation t(CCallsign("EDDF_TWR"), CUser("654321", "Joe Bar"),
98  CFrequency(118.7, CFrequencyUnit::MHz()), CTestData::getCoordinateMunichTower(),
99  CLength(50, CLengthUnit::km()), true, QDateTime::currentDateTimeUtc().addSecs(2400));
100  return t;
101  }
102 
103  const CAtcStation &CTestData::getMunichApproach()
104  {
105  static const CAtcStation t(CCallsign("eddm_app"), CUser("654321", "Jen Doe"),
106  CFrequency(120.7, CFrequencyUnit::MHz()), CTestData::getCoordinateMunichTower(),
107  CLength(100, CLengthUnit::km()), false);
108  return t;
109  }
110 
111  const CAtcStationList &CTestData::getAtcStations()
112  {
113  static const CAtcStationList stations(
114  { CTestData::getFrankfurtTower(), CTestData::getMunichTower(), CTestData::getMunichApproach() });
115  return stations;
116  }
117 
118  const CAtcStation &CTestData::getRandomAtcStation()
119  {
120  static const int s = CTestData::getAtcStations().size();
121  return getAtcStations()[randomIndex(s)];
122  }
123 
124  const CCallsignSet &CTestData::getPilotCallsigns()
125  {
126  static const CCallsignSet callsigns({ CCallsign("DEMBZ"), CCallsign("DLH123"), CCallsign("RYR635L"),
127  CCallsign("LGL974"), CCallsign("AUI129"), CCallsign("CLX756") });
128  return callsigns;
129  }
130 
131  const CCallsign &CTestData::getRandomPilotCallsign()
132  {
133  static const QList<CCallsign> callsigns(CTestData::getPilotCallsigns().toQList());
134  return callsigns[randomIndex(callsigns.size())];
135  }
136 
137  const CCallsignSet &CTestData::getControllerCallsigns()
138  {
139  static const CCallsignSet callsigns({ CCallsign("EDDM_TWR"), CCallsign("EDDM_APP"), CCallsign("EDDM_GND"),
140  CCallsign("EDDF_TWR"), CCallsign("EDDF_APP"), CCallsign("EDDF_GND") });
141  return callsigns;
142  }
143 
144  const CCallsign &CTestData::getRandomControllerCallsign()
145  {
146  static const QList<CCallsign> callsigns(CTestData::getControllerCallsigns().toQList());
147  return callsigns[randomIndex(callsigns.size())];
148  }
149 
150  const CUserList &CTestData::getPilots()
151  {
152  static const QList<CCallsign> callsigns(CTestData::getPilotCallsigns().toQList());
153  static const CUserList pilots({
154  CUser("100100", "Joe Doe", callsigns[0]),
155  CUser("100101", "Jane Foo", callsigns[1]),
156  CUser("100200", "Frank Sky", callsigns[2]),
157  CUser("100300", "Richard F. Frings", callsigns[3]),
158  CUser("100301", "Torben Frey", callsigns[4]),
159  CUser("100400", "Kay Dòresn", callsigns[5]),
160  });
161  return pilots;
162  }
163 
164  const CUser &CTestData::getRandomPilot()
165  {
166  static const int s = CTestData::getPilots().size();
167  return CTestData::getPilots()[randomIndex(s)];
168  }
169 
170  const CUserList &CTestData::getControllers()
171  {
172  static const QList<CCallsign> callsigns(CTestData::getControllerCallsigns().toQList());
173  static const CUserList controllers({
174  CUser("300100", "Jeff Doe", callsigns[0]),
175  CUser("300101", "Foo Mister", callsigns[1]),
176  CUser("300200", "Sky Du", callsigns[2]),
177  CUser("300300", "F. Frings", callsigns[3]),
178  CUser("300301", "Ralf Smith", callsigns[4]),
179  CUser("300400", "Doreen Jump", callsigns[5]),
180  });
181  return controllers;
182  }
183 
184  const CUser &CTestData::getRandomController()
185  {
186  static const int s = CTestData::getControllers().size();
187  return CTestData::getControllers()[randomIndex(s)];
188  }
189 
190  CAircraftSituation getAircraftSituationAboveMunichTowerImpl()
191  {
192  CAircraftSituation situation(CTestData::getCoordinateMunichTower(),
193  CHeading(10, CHeading::True, CAngleUnit::deg()), CAngle(12, CAngleUnit::deg()),
194  CAngle(5, CAngleUnit::deg()), CSpeed(111, CSpeedUnit::km_h()));
195  situation.setAltitude({ 2500, CLengthUnit::ft() });
196  situation.setCallsign(CTestData::getRandomPilotCallsign());
197  return situation;
198  }
199 
200  const CAircraftSituation &CTestData::getAircraftSituationAboveMunichTower()
201  {
202  static const CAircraftSituation situation(getAircraftSituationAboveMunichTowerImpl());
203  return situation;
204  }
205 
206  CAircraftSituation getAircraftSituationAboveFrankfurtTowerImpl()
207  {
208  CAircraftSituation situation(CTestData::getCoordinateFrankfurtTower(),
209  CHeading(290, CHeading::True, CAngleUnit::deg()), CAngle(4, CAngleUnit::deg()),
210  CAngle(10, CAngleUnit::deg()), CSpeed(200, CSpeedUnit::km_h()));
211  situation.setAltitude({ 4000, CLengthUnit::ft() });
212  situation.setCallsign(CTestData::getRandomPilotCallsign());
213  return situation;
214  }
215 
216  const CAircraftSituation &CTestData::getAircraftSituationAboveFrankfurtTower()
217  {
218  static const CAircraftSituation situation(getAircraftSituationAboveFrankfurtTowerImpl());
219  return situation;
220  }
221 
222  const CAircraftIcaoCode &CTestData::getDBAircraftIcaoB737()
223  {
224  static const QString json =
225  CFileUtils::readFileToString(CSwiftDirectories::testFilesDirectory(), "DBAircraftIcaoB737Boeing.json");
226  static const CAircraftIcaoCode icao(CAircraftIcaoCode::fromJson(json));
227  Q_ASSERT(icao.hasValidDbKey());
228  return icao;
229  }
230 
231  const CAircraftIcaoCode &CTestData::getDBAircraftIcaoC172()
232  {
233  static const QString json =
234  CFileUtils::readFileToString(CSwiftDirectories::testFilesDirectory(), "DBAircraftIcaoC172Cessna.json");
235  static const CAircraftIcaoCode icao(CAircraftIcaoCode::fromJson(json));
236  Q_ASSERT(icao.hasValidDbKey());
237  return icao;
238  }
239 
240  const CAirlineIcaoCode &CTestData::getDbAirlineIcaoDLH()
241  {
242  static const QString json =
244  static const CAirlineIcaoCode icao(CAirlineIcaoCode::fromJson(json));
245  Q_ASSERT(icao.hasValidDbKey());
246  return icao;
247  }
248 
249  const CAirlineIcaoCode &CTestData::getDbAirlineIcaoBAW()
250  {
251  static const QString json =
253  static const CAirlineIcaoCode icao(CAirlineIcaoCode::fromJson(json));
254  Q_ASSERT(icao.hasValidDbKey());
255  return icao;
256  }
257 
258  const CLivery &CTestData::getDbLiveryDLHStarAlliance()
259  {
260  static const QString json =
261  CFileUtils::readFileToString(CSwiftDirectories::testFilesDirectory(), "DBLiveryDLHStarAlliance.json");
262  static const CLivery livery(CLivery::fromJson(json));
263  Q_ASSERT(livery.hasValidDbKey());
264  return livery;
265  }
266 
267  const CAircraftModel &CTestData::getDbAircraftModelFsxA2AC172Skyhawk()
268  {
269  static const QString json =
270  CFileUtils::readFileToString(CSwiftDirectories::testFilesDirectory(), "DBModelFSXA2ACessnaC172.json");
271  static const CAircraftModel model(CAircraftModel::fromDatabaseJson(json::jsonObjectFromString(json)));
272  Q_ASSERT(model.hasValidDbKey());
273  Q_ASSERT(!model.getModelString().isEmpty());
274  return model;
275  }
276 
277  const CAircraftModel &CTestData::getDbAircraftModelFsxAerosoftA320()
278  {
279  static const QString json =
281  static const CAircraftModel model(CAircraftModel::fromDatabaseJson(json::jsonObjectFromString(json)));
282  Q_ASSERT(model.hasValidDbKey());
283  Q_ASSERT(!model.getModelString().isEmpty());
284  return model;
285  }
286 
287  CSimulatedAircraft getC172AircraftImpl()
288  {
289  CUser pilot = CTestData::getRandomPilot();
290  CSimulatedAircraft aircraft(pilot.getCallsign(), CTestData::getDbAircraftModelFsxA2AC172Skyhawk(), pilot,
291  CTestData::getAircraftSituationAboveMunichTower());
292  CTransponder t = CTransponder(7000, CTransponder::ModeC);
293  aircraft.setTransponder(t);
294  aircraft.setCom1ActiveFrequency(CTestData::getRandomAtcStation().getFrequency());
295  aircraft.setCom2ActiveFrequency(CTestData::getRandomAtcStation().getFrequency());
296  return aircraft;
297  }
298 
299  const CSimulatedAircraft &CTestData::getC172Aircraft()
300  {
301  static const CSimulatedAircraft aircraft(getC172AircraftImpl());
302  return aircraft;
303  }
304 
305  CSimulatedAircraft getA320AircraftImpl()
306  {
307  CUser pilot = CTestData::getRandomPilot();
308  CSimulatedAircraft aircraft(pilot.getCallsign(), CTestData::getDbAircraftModelFsxAerosoftA320(), pilot,
309  CTestData::getAircraftSituationAboveFrankfurtTower());
310  const CTransponder t = CTransponder(7000, CTransponder::ModeC);
311  aircraft.setTransponder(t);
312  aircraft.setCom1ActiveFrequency(CTestData::getRandomAtcStation().getFrequency());
313  aircraft.setCom2ActiveFrequency(CTestData::getRandomAtcStation().getFrequency());
314  return aircraft;
315  }
316 
317  const CSimulatedAircraft &CTestData::getA320Aircraft()
318  {
319  static const CSimulatedAircraft aircraft(getA320AircraftImpl());
320  return aircraft;
321  }
322 } // namespace swift::misc::test
static QString readFileToString(const QString &fileNameAndPath)
Read file into string.
Definition: fileutils.cpp:68
static const QString & testFilesDirectory()
Where test files are located.
static CVariant from(T &&value)
Synonym for fromValue().
Definition: variant.h:147
Value object for ICAO classification.
Value object encapsulating information of an aircraft's situation.
Value object for ICAO classification.
Altitude as used in aviation, can be AGL or MSL altitude.
Definition: altitude.h:52
Value object encapsulating information about an ATC station.
Definition: atcstation.h:38
Value object for a list of ATC stations.
Value object encapsulating information of a callsign.
Definition: callsign.h:30
Value object for a set of callsigns.
Definition: callsignset.h:26
Flightplan-related information about an aircraft (aircraft ICAO, equipment and WTC)
Value object for a flight plan.
Definition: flightplan.h:148
@ IFR
Instrument flight rules.
Definition: flightplan.h:157
Heading as used in aviation, can be true or magnetic heading.
Definition: heading.h:41
Value object encapsulating information about an airpot.
Definition: livery.h:29
static DerivedObj fromJson(const QJsonObject &json)
Get object from QJsonObject.
Definition: mixinjson.h:190
Ecosystem of server belonging together.
Definition: ecosystem.h:21
Value object for a FSD setup.
Definition: fsdsetup.h:24
Value object encapsulating information of a server.
Definition: server.h:28
Value object encapsulating information of a user.
Definition: user.h:28
const aviation::CCallsign & getCallsign() const
Get associated callsign.
Definition: user.h:140
Value object encapsulating a list of voice rooms.
Definition: userlist.h:26
Physical unit angle (radians, degrees)
Definition: angle.h:23
Physical unit length (length)
Definition: length.h:18
Aircraft model (used by another pilot, my models on disk)
Definition: aircraftmodel.h:71
Comprehensive information of an aircraft.
QJsonObject jsonObjectFromString(const QString &json, bool acceptCacheFormat)
JSON Object from string.
Definition: json.cpp:413
Generate data for testing purposes.
Definition: testdata.h:45