swift
Loading...
Searching...
No Matches
testfsdmessages.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (C) 2018 swift Project Community / Contributors
2// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3
5
10
11#include <QObject>
12#include <QTest>
13
14#include "test.h"
15
16#include "config/buildconfig.h"
17#include "core/fsd/addatc.h"
18#include "core/fsd/addpilot.h"
25#include "core/fsd/deleteatc.h"
27#include "core/fsd/enums.h"
29#include "core/fsd/flightplan.h"
33#include "core/fsd/pbh.h"
35#include "core/fsd/ping.h"
40#include "core/fsd/pong.h"
41#include "core/fsd/serializer.h"
46
47using namespace swift::misc::aviation;
48using namespace swift::misc::network;
49using namespace swift::config;
50using namespace swift::core::fsd;
51
52namespace MiscTest
53{
56 {
58
59 public:
61 explicit CTestFsdMessages(QObject *parent = nullptr) : QObject(parent) {}
62
64 ~CTestFsdMessages() override = default;
65
66 private slots:
67 void testAddAtc();
68 void testAddPilot();
69 void testAtcDataUpdate();
70 void testAuthChallenge();
71 void testAuthResponse();
72 void testClientIdentification();
73 void testClientQuery();
74 void testClientResponse();
75 void testDeleteAtc();
76 void testDeletePilot();
77 void testEuroscopeSimData();
78 void testFlightPlan();
79 void testFSDIdentification();
80 void testInterimPilotDataUpdate();
81 void testKillRequest();
82 void testPBH();
83 void testPilotDataUpdate();
84 void testVisualPilotDataUpdate();
85 void testVisualPilotDataToggle();
86 void testPing();
87 void testPlaneInfoRequest();
88 void testPlaneInformation();
89 void testPlaneInfoRequestFsinn();
90 void testPlaneInformationFsinn();
91 void testPong();
92 void testServerError();
93 void testTextMessage();
94 };
95
96 void CTestFsdMessages::testAddAtc()
97 {
98 const AddAtc message("ABCD", "Jon Doe", "1234567", "1234567", AtcRating::Student3, 100);
99
100 QCOMPARE(message.getSender(), "ABCD");
101 QCOMPARE(message.getReceiver(), "SERVER");
102 QCOMPARE(message.cid(), "1234567");
103 QCOMPARE(message.password(), "1234567");
104 QCOMPARE(message.rating(), AtcRating::Student3);
105 QCOMPARE(message.protocolRevision(), 100);
106 QCOMPARE(message.realName(), "Jon Doe");
107
108 QString stringRef("ABCD:SERVER:Jon Doe:1234567:1234567:4:100");
109 QString str = message.toTokens().join(":");
110 QCOMPARE(str, stringRef);
111
112 QStringList tokens = QString("ABCD:SERVER:Jon Doe:1234567:1234567:4:100").split(':');
113 const AddAtc messageFromTokens = AddAtc::fromTokens(tokens);
114 QCOMPARE(messageFromTokens, message);
115 }
116
117 void CTestFsdMessages::testAddPilot()
118 {
119 const AddPilot message("ABCD", "1234567", "1234567", PilotRating::Student, 100, SimType::MSFS95, "Jon Doe");
120 QCOMPARE(message.getSender(), QString("ABCD"));
121 QCOMPARE(message.getReceiver(), QString("SERVER"));
122 QCOMPARE(message.cid(), QString("1234567"));
123 QCOMPARE(message.password(), QString("1234567"));
124 QCOMPARE(message.rating(), PilotRating::Student);
125 QCOMPARE(message.protocolVersion(), 100);
126 QCOMPARE(message.realName(), QString("Jon Doe"));
127 QCOMPARE(message.simType(), SimType::MSFS95);
128
129 QString stringRef("ABCD:SERVER:1234567:1234567:1:100:1:Jon Doe");
130 QString str = message.toTokens().join(":");
131 QCOMPARE(str, stringRef);
132
133 QStringList tokens = QString("ABCD:SERVER:1234567:1234567:1:100:1:Jon Doe").split(':');
134 const AddPilot messageFromTokens = AddPilot::fromTokens(tokens);
135 QCOMPARE(messageFromTokens, message);
136 }
137
138 void CTestFsdMessages::testAtcDataUpdate()
139 {
140 const AtcDataUpdate message("ABCD", 128200, CFacilityType::APP, 145, AtcRating::Controller1, 48.11028, 8.56972,
141 100);
142 QCOMPARE(message.getSender(), QString("ABCD"));
143 QCOMPARE(message.getReceiver(), QString(""));
144 QCOMPARE(message.m_frequencykHz, 128200);
145 QCOMPARE(message.m_facility, CFacilityType::APP);
146 QCOMPARE(message.m_visibleRange, 145);
147 QCOMPARE(message.m_rating, AtcRating::Controller1);
148 QCOMPARE(message.m_latitude, 48.11028);
149 QCOMPARE(message.m_longitude, 8.56972);
150 QCOMPARE(message.m_elevation, 100);
151
152 QString stringRef("ABCD:28200:5:145:5:48.11028:8.56972:100");
153 QString str = message.toTokens().join(":");
154 QCOMPARE(str, stringRef);
155
156 const AtcDataUpdate reference("ABCD", 128200, CFacilityType::APP, 145, AtcRating::Controller1, 48.11028,
157 8.56972, 100);
158
159 QStringList tokens = QString("ABCD:28200:5:145:5:48.11028:8.56972:100").split(':');
160 const AtcDataUpdate messageFromTokens = AtcDataUpdate::fromTokens(tokens);
161 QCOMPARE(reference, messageFromTokens);
162 }
163
164 void CTestFsdMessages::testAuthChallenge()
165 {
166 const AuthChallenge message("ABCD", "SERVER", "7a57f2dd9d360d347b");
167 QCOMPARE(message.getSender(), QString("ABCD"));
168 QCOMPARE(message.getReceiver(), QString("SERVER"));
169 QCOMPARE(QString("7a57f2dd9d360d347b"), message.m_challengeKey);
170
171 const QString stringRef("ABCD:SERVER:7a57f2dd9d360d347b");
172 const QString str = message.toTokens().join(":");
173 QCOMPARE(str, stringRef);
174
175 const QStringList tokens = QString("ABCD:SERVER:7a57f2dd9d360d347b").split(':');
176 const AuthChallenge messageFromTokens = AuthChallenge::fromTokens(tokens);
177 QCOMPARE(messageFromTokens, message);
178 }
179
180 void CTestFsdMessages::testAuthResponse()
181 {
182 const AuthResponse message("ABCD", "SERVER", "7a57f2dd9d360d347b");
183 QCOMPARE(message.getSender(), QString("ABCD"));
184 QCOMPARE(message.getReceiver(), QString("SERVER"));
185 QCOMPARE(QString("7a57f2dd9d360d347b"), message.m_response);
186
187 const QString stringRef("ABCD:SERVER:7a57f2dd9d360d347b");
188 const QString str = message.toTokens().join(":");
189 QCOMPARE(str, stringRef);
190
191 const AuthResponse reference("ABCD", "SERVER", "7a57f2dd9d360d347b");
192
193 const QStringList tokens = QString("ABCD:SERVER:7a57f2dd9d360d347b").split(':');
194 const AuthResponse messageFromTokens = AuthResponse::fromTokens(tokens);
195 QCOMPARE(messageFromTokens, message);
196 }
197
198 void CTestFsdMessages::testClientIdentification()
199 {
200 const ClientIdentification message("ABCD", 0xe410, "Client", 1, 5, "1234567", "1108540872",
201 "29bbc8b1398eb38e0139");
202 QCOMPARE(message.getSender(), QString("ABCD"));
203 QCOMPARE(message.getReceiver(), QString("SERVER"));
204 QCOMPARE(0xe410, message.m_clientId);
205 QCOMPARE("Client", message.m_clientName);
206 QCOMPARE(1, message.m_clientVersionMajor);
207 QCOMPARE(5, message.m_clientVersionMinor);
208 QCOMPARE(QString("1234567"), message.m_userCid);
209 QCOMPARE(QString("1108540872"), message.m_sysUid);
210 QCOMPARE(QString("29bbc8b1398eb38e0139"), message.m_initialChallenge);
211
212 QString stringRef("ABCD:SERVER:e410:Client:1:5:1234567:1108540872:29bbc8b1398eb38e0139");
213 QString str = message.toTokens().join(":");
214 QCOMPARE(str, stringRef);
215
216 const ClientIdentification reference("ABCD", 0xe410, "Client", 1, 5, "1234567", "1108540872",
217 "29bbc8b1398eb38e0139");
218
219 const QStringList tokens =
220 QString("ABCD:SERVER:e410:Client:1:5:1234567:1108540872:29bbc8b1398eb38e0139").split(':');
221 const ClientIdentification messageFromTokens = ClientIdentification::fromTokens(tokens);
222 QCOMPARE(messageFromTokens, message);
223 }
224
225 void CTestFsdMessages::testClientQuery() // cppcheck-suppress functionStatic
226 {
227 // const ClientQuery message("ABCD", "@94835", Client::WhoIsTracking);
228 // QCOMPARE(message.sender(), QString("ABCD"));
229 // QCOMPARE(QString("@94835"), message.receiver());
230 // QCOMPARE(ClientQueryType::WhoIsTracking, message.m_queryType);
231 // QCOMPARE(QStringList(), message.m_payload);
232
233 // const ClientQuery pdu2("ABCD", "@94835", ClientQueryType::WhoIsTracking, {"LHA449"});
234 // QCOMPARE(QString("ABCD"), pdu2.sender());
235 // QCOMPARE(QString("@94835"), pdu2.receiver());
236 // QCOMPARE(ClientQueryType::WhoIsTracking, pdu2.m_queryType);
237 // QCOMPARE(QStringList {"LHA449"}, pdu2.m_payload);
238
239 // const ClientQuery message("ABCD", "@94835", ClientQueryType::WhoIsTracking, {"LHA449"});
240 // QString stringRef("ABCD:@94835:WH:LHA449");
241 // QString str = message.toTokens().join(":");
242 // QCOMPARE(str, stringRef);
243
244 // const ClientQuery reference("ABCD", "@94835", ClientQueryType::WhoIsTracking, {"LHA449"});
245
246 // QStringList tokens = QString("ABCD:@94835:WH:LHA449").split(':');
247 // const ClientQuery messageFromTokens = ClientQuery::fromTokens(tokens);
248 // QCOMPARE(messageFromTokens, message);
249 }
250
251 void CTestFsdMessages::testClientResponse()
252 {
253 const ClientResponse message("ABCD", "SERVER", ClientQueryType::Capabilities, { "MODELDESC=1", "ATCINFO=1" });
254 QCOMPARE(message.getSender(), QString("ABCD"));
255 QCOMPARE(message.getReceiver(), QString("SERVER"));
256 QCOMPARE(ClientQueryType::Capabilities, message.m_queryType);
257 QStringList reference { "MODELDESC=1", "ATCINFO=1" };
258 QCOMPARE(reference, message.m_responseData);
259
260 QString stringRef("ABCD:SERVER:CAPS:MODELDESC=1:ATCINFO=1");
261 auto str = message.toTokens().join(":");
262 QCOMPARE(str, stringRef);
263
264 QStringList tokens = QString("ABCD:SERVER:CAPS:MODELDESC=1:ATCINFO=1").split(':');
265 auto messageFromTokens = ClientResponse::fromTokens(tokens);
266 QCOMPARE(messageFromTokens, message);
267 }
268
269 void CTestFsdMessages::testDeleteAtc()
270 {
271 const DeleteAtc message("ABCD", "1234567");
272
273 QCOMPARE(message.getSender(), QString("ABCD"));
274 QCOMPARE(QString(""), message.getReceiver());
275 QCOMPARE(QString("1234567"), message.m_cid);
276
277 QString stringRef("ABCD:1234567");
278 QString str = message.toTokens().join(":");
279 QCOMPARE(str, stringRef);
280
281 QStringList tokens = QString("ABCD:1234567").split(':');
282 auto messageFromTokens = DeleteAtc::fromTokens(tokens);
283 QCOMPARE(messageFromTokens, message);
284 }
285
286 void CTestFsdMessages::testDeletePilot()
287 {
288 const DeletePilot message("ABCD", "1234567");
289
290 QCOMPARE(message.getSender(), QString("ABCD"));
291 QCOMPARE(QString(""), message.getReceiver());
292 QCOMPARE(QString("1234567"), message.m_cid);
293
294 QString stringRef("ABCD:1234567");
295 QString str = message.toTokens().join(":");
296 QCOMPARE(str, stringRef);
297
298 QStringList tokens = QString("ABCD:1234567").split(':');
299 auto messageFromTokens = DeletePilot::fromTokens(tokens);
300 QCOMPARE(messageFromTokens, message);
301 }
302
303 void CTestFsdMessages::testEuroscopeSimData()
304 {
305 const EuroscopeSimData message("ABCD", "A320", "DLH", 0, 43.1257800, -72.1584100, 12000, 180, 10, -10, 250,
306 false, 0, 50, {});
307
308 QCOMPARE(message.getSender(), QString("ABCD"));
309 QCOMPARE(QString(""), message.getReceiver());
310 QCOMPARE(43.12578, message.m_latitude);
311 QCOMPARE(-72.15841, message.m_longitude);
312 QCOMPARE(12000, message.m_altitude);
313 QCOMPARE(180, message.m_heading);
314 QCOMPARE(10, message.m_bank);
315 QCOMPARE(-10, message.m_pitch);
316 QCOMPARE(250, message.m_groundSpeed);
317 QCOMPARE(false, message.m_onGround);
318 QCOMPARE(0, message.m_gearPercent);
319 QCOMPARE(50, message.m_thrustPercent);
320 QCOMPARE(CAircraftLights(), message.m_lights);
321
322 QString stringRef(":ABCD:A320:DLH:0:43.1257800:-72.1584100:12000.0:180.00:10:-10:250:0:0:50:0:0.0:0");
323 QString str = message.toTokens().join(":");
324 QCOMPARE(str, stringRef);
325
326 QStringList tokens =
327 QString(":ABCD:A320:DLH:0:43.1257800:-72.1584100:12000:180.00:10:-10:250:0:0:50:0:0.0:0").split(':');
328 auto messageFromTokens = EuroscopeSimData::fromTokens(tokens);
329 QCOMPARE(QString("ABCD"), messageFromTokens.getSender());
330 QCOMPARE(QString(""), messageFromTokens.getReceiver());
331 QCOMPARE(43.12578, messageFromTokens.m_latitude);
332 QCOMPARE(-72.15841, messageFromTokens.m_longitude);
333 QCOMPARE(12000, messageFromTokens.m_altitude);
334 QCOMPARE(180, messageFromTokens.m_heading);
335 QCOMPARE(10, messageFromTokens.m_bank);
336 QCOMPARE(-10, messageFromTokens.m_pitch);
337 QCOMPARE(250, messageFromTokens.m_groundSpeed);
338 QCOMPARE(false, messageFromTokens.m_onGround);
339 QCOMPARE(0, messageFromTokens.m_gearPercent);
340 QCOMPARE(50, messageFromTokens.m_thrustPercent);
341 QCOMPARE(CAircraftLights(), messageFromTokens.m_lights);
342 }
343
344 void CTestFsdMessages::testFlightPlan()
345 {
346 const FlightPlan message("ABCD", "SERVER", FlightType::VFR, "B744", 420, "EGLL", 1530, 1535, "FL350", "KORD", 8,
347 15, 9, 30, "NONE", "Unit Test", "EGLL.KORD");
348
349 QCOMPARE(message.getSender(), QString("ABCD"));
350 QCOMPARE(message.getReceiver(), QString("SERVER"));
351 QCOMPARE(FlightType::VFR, message.m_flightType);
352 QCOMPARE(QString("B744"), message.m_aircraftIcaoType);
353 QCOMPARE(420, message.m_trueCruisingSpeed);
354 QCOMPARE(QString("EGLL"), message.m_depAirport);
355 QCOMPARE(1530, message.m_estimatedDepTime);
356 QCOMPARE(1535, message.m_actualDepTime);
357 QCOMPARE(QString("FL350"), message.m_cruiseAlt);
358 QCOMPARE(QString("KORD"), message.m_destAirport);
359 QCOMPARE(8, message.m_hoursEnroute);
360 QCOMPARE(15, message.m_minutesEnroute);
361 QCOMPARE(9, message.m_fuelAvailHours);
362 QCOMPARE(30, message.m_fuelAvailMinutes);
363 QCOMPARE(QString("NONE"), message.m_altAirport);
364 QCOMPARE(QString("Unit Test"), message.m_remarks);
365 QCOMPARE(QString("EGLL.KORD"), message.m_route);
366
367 QString stringRef("ABCD:SERVER:V:B744:420:EGLL:1530:1535:FL350:KORD:8:15:9:30:NONE:Unit Test:EGLL.KORD");
368 QString str = message.toTokens().join(":");
369 QCOMPARE(str, stringRef);
370
371 QStringList tokens =
372 QString("ABCD:SERVER:V:B744:420:EGLL:1530:1535:FL350:KORD:8:15:9:30:NONE:Unit Test:EGLL.KORD").split(':');
373 auto messageFromTokens = FlightPlan::fromTokens(tokens);
374 QCOMPARE(messageFromTokens, message);
375 }
376
377 void CTestFsdMessages::testFSDIdentification() {} // cppcheck-suppress functionStatic
378
379 void CTestFsdMessages::testInterimPilotDataUpdate()
380 {
381 const InterimPilotDataUpdate message("ABCD", "XYZ", 43.12578, -72.15841, 12008, 400, -2, 3, 280, true);
382
383 QCOMPARE(message.getSender(), QString("ABCD"));
384 QCOMPARE(QString("XYZ"), message.getReceiver());
385 QCOMPARE(43.12578, message.m_latitude);
386 QCOMPARE(-72.15841, message.m_longitude);
387 QCOMPARE(12008, message.m_altitudeTrue);
388 QCOMPARE(400, message.m_groundSpeed);
389 QCOMPARE(-2, message.m_pitch);
390 QCOMPARE(3, message.m_bank);
391 QCOMPARE(280, message.m_heading);
392 QCOMPARE(true, message.m_onGround);
393
394 QString stringRef("ABCD:XYZ:VI:43.12578:-72.15841:12008:400:25132146");
395 QString str = message.toTokens().join(":");
396 QCOMPARE(str, stringRef);
397
398 QStringList tokens = QString("ABCD:XYZ:VI:43.12578:-72.15841:12008:400:25132146").split(':');
399 auto messageFromTokens = InterimPilotDataUpdate::fromTokens(tokens);
400 QCOMPARE(QString("ABCD"), messageFromTokens.getSender());
401 QCOMPARE(QString("XYZ"), messageFromTokens.getReceiver());
402 QCOMPARE(43.12578, messageFromTokens.m_latitude);
403 QCOMPARE(-72.15841, messageFromTokens.m_longitude);
404 QCOMPARE(12008, messageFromTokens.m_altitudeTrue);
405 QCOMPARE(400, messageFromTokens.m_groundSpeed);
406 QVERIFY(message.m_pitch - messageFromTokens.m_pitch < 1.0);
407 QVERIFY(message.m_bank - messageFromTokens.m_bank < 1.0);
408 QVERIFY(message.m_heading - messageFromTokens.m_heading < 1.0);
409 QCOMPARE(messageFromTokens.m_onGround, true);
410 }
411
412 void CTestFsdMessages::testKillRequest()
413 {
414 const KillRequest message("SUP", "ABCD", "I don't like you!");
415
416 QCOMPARE(QString("SUP"), message.getSender());
417 QCOMPARE(QString("ABCD"), message.getReceiver());
418 QCOMPARE(QString("I don't like you!"), message.m_reason);
419
420 QString stringRef("SUP:ABCD:I don't like you!");
421 QString str = message.toTokens().join(":");
422 QCOMPARE(str, stringRef);
423
424 QStringList tokens = QString("SUP:ABCD:I don't like you!").split(':');
425 auto messageFromTokens = KillRequest::fromTokens(tokens);
426 QCOMPARE(messageFromTokens, message);
427 }
428
429 void CTestFsdMessages::testPBH()
430 {
431 struct PBH
432 {
433 int pitch, bank, heading;
434 };
435 QVector<PBH> testData;
436 for (int pitch = -90; pitch < 90; pitch++)
437 {
438 testData.push_back({ pitch, 0, 0 });
439 }
440 for (int bank = -179; bank < 180; bank++)
441 {
442 testData.push_back({ 0, bank, 0 });
443 }
444 for (int heading = 0; heading < 360; heading++)
445 {
446 testData.push_back({ 0, 0, heading });
447 }
448 for (const auto &input : testData)
449 {
450 std::uint32_t pbh = 0;
451 packPBH(input.pitch, input.bank, input.heading, true, pbh);
452
453 double pitch2 = 0;
454 double bank2 = 0;
455 double heading2 = 0;
456 bool onGround2 = false;
457 unpackPBH(pbh, pitch2, bank2, heading2, onGround2);
458 QVERIFY(pitch2 >= -90);
459 QVERIFY(pitch2 < 90);
460 QVERIFY(bank2 >= -180);
461 QVERIFY(bank2 < 180);
462 QVERIFY(heading2 >= 0);
463 QVERIFY(heading2 < 360);
464 QCOMPARE(input.pitch, pitch2);
465 QCOMPARE(input.bank, bank2);
466 QCOMPARE(true, onGround2);
467
468 if (input.heading < 0)
469 {
470 heading2 -= 360;
471 }
472 QVERIFY(qAbs(input.heading - heading2) < 1);
473 }
474 }
475
476 void CTestFsdMessages::testPilotDataUpdate()
477 {
478 const PilotDataUpdate message(CTransponder::ModeC, "ABCD", 7000, PilotRating::Student, 43.12578, -72.15841,
479 12000, 12008, 125, -2, 3, 280, true);
480
481 QCOMPARE(message.getSender(), QString("ABCD"));
482 QCOMPARE(QString(""), message.getReceiver());
483 QCOMPARE(CTransponder::ModeC, message.m_transponderMode);
484 QCOMPARE(7000, message.m_transponderCode);
485 QCOMPARE(PilotRating::Student, message.m_rating);
486 QCOMPARE(43.12578, message.m_latitude);
487 QCOMPARE(-72.15841, message.m_longitude);
488 QCOMPARE(12000, message.m_altitudeTrue);
489 QCOMPARE(12008, message.m_altitudePressure);
490 QCOMPARE(125, message.m_groundSpeed);
491 QCOMPARE(-2, message.m_pitch);
492 QCOMPARE(3, message.m_bank);
493 QCOMPARE(280, message.m_heading);
494 QCOMPARE(true, message.m_onGround);
495
496 QString stringRef("N:ABCD:7000:1:43.12578:-72.15841:12000:125:25132146:8");
497 QString str = message.toTokens().join(":");
498 QCOMPARE(str, stringRef);
499
500 QStringList tokens = QString("N:ABCD:7000:1:43.12578:-72.15841:12000:125:25132146:8").split(':');
501 auto messageFromTokens = PilotDataUpdate::fromTokens(tokens);
502 QCOMPARE(QString("ABCD"), messageFromTokens.getSender());
503 QCOMPARE(QString(""), messageFromTokens.getReceiver());
504 QCOMPARE(CTransponder::ModeC, messageFromTokens.m_transponderMode);
505 QCOMPARE(7000, messageFromTokens.m_transponderCode);
506 QCOMPARE(PilotRating::Student, messageFromTokens.m_rating);
507 QCOMPARE(43.12578, messageFromTokens.m_latitude);
508 QCOMPARE(-72.15841, messageFromTokens.m_longitude);
509 QCOMPARE(12000, messageFromTokens.m_altitudeTrue);
510 QCOMPARE(12008, messageFromTokens.m_altitudePressure);
511 QCOMPARE(125, messageFromTokens.m_groundSpeed);
512 QVERIFY(message.m_pitch - messageFromTokens.m_pitch < 1.0);
513 QVERIFY(message.m_bank - messageFromTokens.m_bank < 1.0);
514 QVERIFY(message.m_heading - messageFromTokens.m_heading < 1.0);
515 QCOMPARE(messageFromTokens.m_onGround, true);
516 }
517
518 void CTestFsdMessages::testVisualPilotDataUpdate()
519 {
520 const VisualPilotDataUpdate message("ABCD", 43.1257891, -72.1584142, 12000.12, 1404.00, -2, 3, 280, -1.0001,
521 2.0001, 3.0001, -0.0349, 0.0524, 0.0175);
522
523 QCOMPARE(QString("ABCD"), message.getSender());
524 QCOMPARE(43.1257891, message.m_latitude);
525 QCOMPARE(-72.1584142, message.m_longitude);
526 QCOMPARE(12000.12, message.m_altitudeTrue);
527 QCOMPARE(1404.00, message.m_heightAgl);
528 QCOMPARE(-2, message.m_pitch);
529 QCOMPARE(3, message.m_bank);
530 QCOMPARE(280, message.m_heading);
531 QCOMPARE(-1.0001, message.m_xVelocity);
532 QCOMPARE(2.0001, message.m_yVelocity);
533 QCOMPARE(3.0001, message.m_zVelocity);
534 QCOMPARE(-0.0349, message.m_pitchRadPerSec);
535 QCOMPARE(0.0524, message.m_bankRadPerSec);
536 QCOMPARE(0.0175, message.m_headingRadPerSec);
537 QCOMPARE(0.0, message.m_noseGearAngle);
538
539 QString stringRef(
540 "ABCD:43.1257891:-72.1584142:12000.12:1404.00:25132144:-1.0001:2.0001:3.0001:-0.0349:0.0175:0.0524:0.00");
541 QString str = message.toTokens().join(":");
542 QCOMPARE(str, stringRef);
543
544 QStringList tokens = QString("ABCD:43.1257891:-72.1584142:12000.12:1404.00:25132144:-1.0001:2.0001:3.0001:-0."
545 "0349:0.0175:0.0524:0.00")
546 .split(':');
547 auto messageFromTokens = VisualPilotDataUpdate::fromTokens(tokens);
548 QCOMPARE(QString("ABCD"), messageFromTokens.getSender());
549 QCOMPARE(43.1257891, messageFromTokens.m_latitude);
550 QCOMPARE(-72.1584142, messageFromTokens.m_longitude);
551 QCOMPARE(12000.12, messageFromTokens.m_altitudeTrue);
552 QCOMPARE(1404.00, messageFromTokens.m_heightAgl);
553 QVERIFY(message.m_pitch - messageFromTokens.m_pitch < 1.0);
554 QVERIFY(message.m_bank - messageFromTokens.m_bank < 1.0);
555 QVERIFY(message.m_heading - messageFromTokens.m_heading < 1.0);
556 QCOMPARE(-1.0001, messageFromTokens.m_xVelocity);
557 QCOMPARE(2.0001, messageFromTokens.m_yVelocity);
558 QCOMPARE(3.0001, messageFromTokens.m_zVelocity);
559 QCOMPARE(-0.0349, messageFromTokens.m_pitchRadPerSec);
560 QCOMPARE(0.0524, messageFromTokens.m_bankRadPerSec);
561 QCOMPARE(0.0175, messageFromTokens.m_headingRadPerSec);
562 QCOMPARE(0.0, messageFromTokens.m_noseGearAngle);
563 }
564
565 void CTestFsdMessages::testVisualPilotDataToggle()
566 {
567 const VisualPilotDataToggle message("SERVER", "ABCD", true);
568
569 QCOMPARE(QString("SERVER"), message.getSender());
570 QCOMPARE(QString("ABCD"), message.m_client);
571 QCOMPARE(true, message.m_active);
572
573 QString stringRef("SERVER:ABCD:1");
574 QString str = message.toTokens().join(":");
575 QCOMPARE(str, stringRef);
576
577 QStringList tokens = QString("SERVER:ABCD:1").split(':');
578 auto messageFromTokens = VisualPilotDataToggle::fromTokens(tokens);
579 QCOMPARE(QString("SERVER"), messageFromTokens.getSender());
580 QCOMPARE(QString("ABCD"), messageFromTokens.m_client);
581 QCOMPARE(true, messageFromTokens.m_active);
582 }
583
584 void CTestFsdMessages::testPing()
585 {
586 const Ping message("ABCD", "SERVER", "85275222");
587 QCOMPARE(message.getSender(), QString("ABCD"));
588 QCOMPARE(message.getReceiver(), QString("SERVER"));
589 QCOMPARE("85275222", message.m_timestamp);
590
591 QString stringRef("ABCD:SERVER:85275222");
592 QString str = message.toTokens().join(":");
593 QCOMPARE(str, stringRef);
594
595 QStringList tokens = QString("ABCD:SERVER:85275222").split(':');
596 auto messageFromTokens = Ping::fromTokens(tokens);
597 QCOMPARE(messageFromTokens, message);
598 }
599
600 void CTestFsdMessages::testPlaneInfoRequest()
601 {
602 const PlaneInfoRequest message("ABCD", "XYZ");
603 QCOMPARE(message.getSender(), QString("ABCD"));
604 QCOMPARE(QString("XYZ"), message.getReceiver());
605
606 QString stringRef("ABCD:XYZ:PIR");
607 QString str = message.toTokens().join(":");
608 QCOMPARE(str, stringRef);
609
610 QStringList tokens = QString("ABCD:XYZ:PIR").split(':');
611 auto messageFromTokens = PlaneInfoRequest::fromTokens(tokens);
612 QCOMPARE(messageFromTokens, message);
613 }
614
615 void CTestFsdMessages::testPlaneInformation()
616 {
617 const PlaneInformation message("ABCD", "XYZ", "B744", "BAW", "UNION");
618 QCOMPARE(message.getSender(), QString("ABCD"));
619 QCOMPARE(QString("XYZ"), message.getReceiver());
620 QCOMPARE(QString("B744"), message.m_aircraft);
621 QCOMPARE(QString("BAW"), message.m_airline);
622 QCOMPARE(QString("UNION"), message.m_livery);
623
624 const PlaneInformation message1("ABCD", "XYZ", "B744", "", "");
625 QString stringRef1("ABCD:XYZ:PI:GEN:EQUIPMENT=B744");
626 QString str1 = message1.toTokens().join(":");
627 QCOMPARE(str1, stringRef1);
628
629 const PlaneInformation message2("ABCD", "XYZ", "B744", "BAW", "");
630 QString stringRef2("ABCD:XYZ:PI:GEN:EQUIPMENT=B744:AIRLINE=BAW");
631 QString str2 = message2.toTokens().join(":");
632 QCOMPARE(str2, stringRef2);
633
634 const PlaneInformation message3("ABCD", "XYZ", "B744", "BAW", "UNION");
635 QString stringRef3("ABCD:XYZ:PI:GEN:EQUIPMENT=B744:AIRLINE=BAW:LIVERY=UNION");
636 QString str3 = message3.toTokens().join(":");
637 QCOMPARE(str3, stringRef3);
638
639 const PlaneInformation reference1("ABCD", "XYZ", "B744", "", "");
640
641 QStringList tokens1 = QString("ABCD:XYZ:PI:GEN:EQUIPMENT=B744").split(':');
642 auto messageFromTokens1 = PlaneInformation::fromTokens(tokens1);
643 QCOMPARE(reference1, messageFromTokens1);
644
645 const PlaneInformation reference2("ABCD", "XYZ", "B744", "BAW", "");
646
647 QStringList tokens2 = QString("ABCD:XYZ:PI:GEN:EQUIPMENT=B744:AIRLINE=BAW").split(':');
648 auto messageFromTokens2 = PlaneInformation::fromTokens(tokens2);
649 QCOMPARE(reference2, messageFromTokens2);
650
651 const PlaneInformation reference3("ABCD", "XYZ", "B744", "BAW", "UNION");
652
653 QStringList tokens3 = QString("ABCD:XYZ:PI:GEN:EQUIPMENT=B744:AIRLINE=BAW:LIVERY=UNION").split(':');
654 auto messageFromTokens3 = PlaneInformation::fromTokens(tokens3);
655 QCOMPARE(reference3, messageFromTokens3);
656 }
657
658 void CTestFsdMessages::testPlaneInfoRequestFsinn()
659 {
660 const PlaneInfoRequestFsinn message("ABCD", "XYZ", "DLH", "A320", "L2J", "FLIGHTFACTOR A320 LUFTHANSA D-AIPC");
661 QCOMPARE(message.getSender(), QString("ABCD"));
662 QCOMPARE(QString("XYZ"), message.getReceiver());
663 QCOMPARE(QString("DLH"), message.m_airlineIcao);
664 QCOMPARE(QString("A320"), message.m_aircraftIcao);
665 QCOMPARE(QString("L2J"), message.m_aircraftIcaoCombinedType);
666 QCOMPARE(QString("FLIGHTFACTOR A320 LUFTHANSA D-AIPC"), message.m_sendMModelString);
667
668 QString stringRef("ABCD:XYZ:FSIPIR:0:DLH:A320:::::L2J:FLIGHTFACTOR A320 LUFTHANSA D-AIPC");
669 QString str = message.toTokens().join(":");
670 QCOMPARE(str, stringRef);
671 }
672
673 void CTestFsdMessages::testPlaneInformationFsinn()
674 {
675 const PlaneInformationFsinn message("ABCD", "XYZ", "DLH", "A320", "L2J", "FLIGHTFACTOR A320 LUFTHANSA D-AIPC");
676 QCOMPARE(message.getSender(), QString("ABCD"));
677 QCOMPARE(QString("XYZ"), message.getReceiver());
678 QCOMPARE(QString("DLH"), message.m_airlineIcao);
679 QCOMPARE(QString("A320"), message.m_aircraftIcao);
680 QCOMPARE(QString("L2J"), message.m_aircraftIcaoCombinedType);
681 QCOMPARE(QString("FLIGHTFACTOR A320 LUFTHANSA D-AIPC"), message.m_sendMModelString);
682
683 QString stringRef("ABCD:XYZ:FSIPI:0:DLH:A320:::::L2J:FLIGHTFACTOR A320 LUFTHANSA D-AIPC");
684 QString str = message.toTokens().join(":");
685 QCOMPARE(str, stringRef);
686 }
687
688 void CTestFsdMessages::testPong()
689 {
690 const Pong message("ABCD", "SERVER", "85275222");
691 QCOMPARE(message.getSender(), QString("ABCD"));
692 QCOMPARE(message.getReceiver(), QString("SERVER"));
693 QCOMPARE("85275222", message.m_timestamp);
694
695 QString stringRef("ABCD:SERVER:85275222");
696 QString str = message.toTokens().join(":");
697 QCOMPARE(str, stringRef);
698
699 const Pong reference("ABCD", "SERVER", "85275222");
700
701 QStringList tokens = QString("ABCD:SERVER:85275222").split(':');
702 auto messageFromTokens = Pong::fromTokens(tokens);
703 QCOMPARE(messageFromTokens, message);
704 }
705
706 void CTestFsdMessages::testServerError()
707 {
708 const ServerError message("SERVER", "ABCD", ServerErrorCode::NoWeatherProfile, "EGLL",
709 "No such weather profile");
710 QCOMPARE(QString("SERVER"), message.getSender());
711 QCOMPARE(QString("ABCD"), message.getReceiver());
712 QCOMPARE(ServerErrorCode::NoWeatherProfile, message.m_errorNumber);
713 QCOMPARE("EGLL", message.m_causingParameter);
714 QCOMPARE("No such weather profile", message.m_description);
715
716 QString stringRef("SERVER:ABCD:9:EGLL:No such weather profile");
717 QString str = message.toTokens().join(":");
718 QCOMPARE(str, stringRef);
719
720 QStringList tokens = QString("SERVER:ABCD:009:EGLL:No such weather profile").split(':');
721 auto messageFromTokens = ServerError::fromTokens(tokens);
722 QCOMPARE(messageFromTokens, message);
723 }
724
725 void CTestFsdMessages::testTextMessage() {} // cppcheck-suppress functionStatic
726} // namespace MiscTest
727
730
731#include "testfsdmessages.moc"
732
Testing FSD Messages.
~CTestFsdMessages()=default
Destructor.
CTestFsdMessages(QObject *parent=nullptr)
Constructor.
Add ATC message.
Definition addatc.h:19
static AddAtc fromTokens(const QStringList &tokens)
Construct from tokens.
Definition addatc.cpp:30
FSD Message: Add Pilot.
Definition addpilot.h:19
static AddPilot fromTokens(const QStringList &tokens)
Construct from tokens.
Definition addpilot.cpp:33
static DeleteAtc fromTokens(const QStringList &tokens)
Construct from tokens.
Definition deleteatc.cpp:20
static InterimPilotDataUpdate fromTokens(const QStringList &tokens)
Construct from tokens.
static PlaneInfoRequest fromTokens(const QStringList &tokens)
Construct from tokens.
static PlaneInformation fromTokens(const QStringList &tokens)
Construct from tokens.
@ MSFS95
MS Flight Simulator 95.
Definition enums.h:46
@ EuroscopeSimData
Broadcast to announce we request SIMDATA packets.
Definition enums.h:84
void unpackPBH(quint32 pbh, double &pitch, double &bank, double &heading, bool &onGround)
Unpack pitch, bank, heading and onGround from 32 bit integer.
Definition pbh.h:57
void packPBH(double pitch, double bank, double heading, bool onGround, quint32 &pbh)
Pack pitch, bank, heading and onGround into 32 bit integer.
Definition pbh.h:38
void push_back(QList< T >::parameter_type value)
QObject(QObject *parent)
Q_OBJECTQ_OBJECT
QObject * parent() const const
QStringList split(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const const
QCOMPARE(actual, expected)
QVERIFY(condition)
#define SWIFTTEST_APPLESS_MAIN(TestObject)
Implements a main() function that executes all tests in TestObject without instantiating a QApplicati...
Definition test.h:39