47 using namespace swift::misc::aviation;
48 using namespace swift::misc::network;
49 using namespace swift::config;
50 using namespace swift::core::fsd;
69 void testAtcDataUpdate();
70 void testAuthChallenge();
71 void testAuthResponse();
72 void testClientIdentification();
73 void testClientQuery();
74 void testClientResponse();
76 void testDeletePilot();
77 void testEuroscopeSimData();
78 void testFlightPlan();
79 void testFSDIdentification();
80 void testInterimPilotDataUpdate();
81 void testKillRequest();
83 void testPilotDataUpdate();
84 void testVisualPilotDataUpdate();
85 void testVisualPilotDataToggle();
87 void testPlaneInfoRequest();
88 void testPlaneInformation();
89 void testPlaneInfoRequestFsinn();
90 void testPlaneInformationFsinn();
92 void testServerError();
93 void testTextMessage();
96 void CTestFsdMessages::testAddAtc()
98 const AddAtc message(
"ABCD",
"Jon Doe",
"1234567",
"1234567", AtcRating::Student3, 100);
100 QCOMPARE(message.sender(),
"ABCD");
101 QCOMPARE(message.receiver(),
"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");
108 QString stringRef(
"ABCD:SERVER:Jon Doe:1234567:1234567:4:100");
109 QString str = message.toTokens().join(
":");
110 QCOMPARE(str, stringRef);
113 const AddAtc messageFromTokens = AddAtc::fromTokens(tokens);
114 QCOMPARE(messageFromTokens, message);
117 void CTestFsdMessages::testAddPilot()
119 const AddPilot message(
"ABCD",
"1234567",
"1234567", PilotRating::Student, 100, SimType::MSFS95,
"Jon Doe");
120 QCOMPARE(message.sender(),
QString(
"ABCD"));
121 QCOMPARE(message.receiver(),
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);
129 QString stringRef(
"ABCD:SERVER:1234567:1234567:1:100:1:Jon Doe");
130 QString str = message.toTokens().join(
":");
131 QCOMPARE(str, stringRef);
134 const AddPilot messageFromTokens = AddPilot::fromTokens(tokens);
135 QCOMPARE(messageFromTokens, message);
138 void CTestFsdMessages::testAtcDataUpdate()
140 const AtcDataUpdate message(
"ABCD", 128200, CFacilityType::APP, 145, AtcRating::Controller1, 48.11028, 8.56972,
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);
152 QString stringRef(
"ABCD:28200:5:145:5:48.11028:8.56972:100");
153 QString str = message.toTokens().join(
":");
156 const AtcDataUpdate reference(
"ABCD", 128200, CFacilityType::APP, 145, AtcRating::Controller1, 48.11028,
160 const AtcDataUpdate messageFromTokens = AtcDataUpdate::fromTokens(tokens);
161 QCOMPARE(reference, messageFromTokens);
164 void CTestFsdMessages::testAuthChallenge()
166 const AuthChallenge message(
"ABCD",
"SERVER",
"7a57f2dd9d360d347b");
171 const QString stringRef(
"ABCD:SERVER:7a57f2dd9d360d347b");
172 const QString str = message.toTokens().join(
":");
176 const AuthChallenge messageFromTokens = AuthChallenge::fromTokens(tokens);
177 QCOMPARE(messageFromTokens, message);
180 void CTestFsdMessages::testAuthResponse()
182 const AuthResponse message(
"ABCD",
"SERVER",
"7a57f2dd9d360d347b");
187 const QString stringRef(
"ABCD:SERVER:7a57f2dd9d360d347b");
188 const QString str = message.toTokens().join(
":");
191 const AuthResponse reference(
"ABCD",
"SERVER",
"7a57f2dd9d360d347b");
194 const AuthResponse messageFromTokens = AuthResponse::fromTokens(tokens);
195 QCOMPARE(messageFromTokens, message);
198 void CTestFsdMessages::testClientIdentification()
201 "29bbc8b1398eb38e0139");
204 QCOMPARE(0xe410, message.m_clientId);
205 QCOMPARE(
"Client", message.m_clientName);
206 QCOMPARE(1, message.m_clientVersionMajor);
207 QCOMPARE(5, message.m_clientVersionMinor);
212 QString stringRef(
"ABCD:SERVER:e410:Client:1:5:1234567:1108540872:29bbc8b1398eb38e0139");
213 QString str = message.toTokens().join(
":");
217 "29bbc8b1398eb38e0139");
220 QString(
"ABCD:SERVER:e410:Client:1:5:1234567:1108540872:29bbc8b1398eb38e0139").
split(
':');
222 QCOMPARE(messageFromTokens, message);
225 void CTestFsdMessages::testClientQuery()
251 void CTestFsdMessages::testClientResponse()
253 const ClientResponse message(
"ABCD",
"SERVER", ClientQueryType::Capabilities, {
"MODELDESC=1",
"ATCINFO=1" });
256 QCOMPARE(ClientQueryType::Capabilities, message.m_queryType);
257 QStringList reference {
"MODELDESC=1",
"ATCINFO=1" };
258 QCOMPARE(reference, message.m_responseData);
260 QString stringRef(
"ABCD:SERVER:CAPS:MODELDESC=1:ATCINFO=1");
261 auto str = message.toTokens().join(
":");
265 auto messageFromTokens = ClientResponse::fromTokens(tokens);
266 QCOMPARE(messageFromTokens, message);
269 void CTestFsdMessages::testDeleteAtc()
271 const DeleteAtc message(
"ABCD",
"1234567");
277 QString stringRef(
"ABCD:1234567");
278 QString str = message.toTokens().join(
":");
282 auto messageFromTokens = DeleteAtc::fromTokens(tokens);
283 QCOMPARE(messageFromTokens, message);
286 void CTestFsdMessages::testDeletePilot()
294 QString stringRef(
"ABCD:1234567");
295 QString str = message.toTokens().join(
":");
299 auto messageFromTokens = DeletePilot::fromTokens(tokens);
300 QCOMPARE(messageFromTokens, message);
303 void CTestFsdMessages::testEuroscopeSimData()
305 const EuroscopeSimData message(
"ABCD",
"A320",
"DLH", 0, 43.1257800, -72.1584100, 12000, 180, 10, -10, 250,
310 QCOMPARE(43.12578, message.m_latitude);
311 QCOMPARE(-72.15841, message.m_longitude);
312 QCOMPARE(12000, message.m_altitude);
316 QCOMPARE(250, message.m_groundSpeed);
317 QCOMPARE(
false, message.m_onGround);
319 QCOMPARE(50, message.m_thrustPercent);
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(
":");
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);
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);
344 void CTestFsdMessages::testFlightPlan()
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");
351 QCOMPARE(FlightType::VFR, message.m_flightType);
353 QCOMPARE(420, message.m_trueCruisingSpeed);
355 QCOMPARE(1530, message.m_estimatedDepTime);
356 QCOMPARE(1535, message.m_actualDepTime);
359 QCOMPARE(8, message.m_hoursEnroute);
360 QCOMPARE(15, message.m_minutesEnroute);
361 QCOMPARE(9, message.m_fuelAvailHours);
362 QCOMPARE(30, message.m_fuelAvailMinutes);
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(
":");
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);
377 void CTestFsdMessages::testFSDIdentification() {}
379 void CTestFsdMessages::testInterimPilotDataUpdate()
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);
394 QString stringRef(
"ABCD:XYZ:VI:43.12578:-72.15841:12008:400:25132146");
395 QString str = message.toTokens().join(
":");
399 auto messageFromTokens = InterimPilotDataUpdate::fromTokens(tokens);
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);
412 void CTestFsdMessages::testKillRequest()
414 const KillRequest message(
"SUP",
"ABCD",
"I don't like you!");
420 QString stringRef(
"SUP:ABCD:I don't like you!");
421 QString str = message.toTokens().join(
":");
425 auto messageFromTokens = KillRequest::fromTokens(tokens);
426 QCOMPARE(messageFromTokens, message);
429 void CTestFsdMessages::testPBH()
433 int pitch, bank, heading;
436 for (
int pitch = -90; pitch < 90; pitch++) { testData.
push_back({ pitch, 0, 0 }); }
437 for (
int bank = -179; bank < 180; bank++) { testData.
push_back({ 0, bank, 0 }); }
438 for (
int heading = 0; heading < 360; heading++) { testData.
push_back({ 0, 0, heading }); }
439 for (
const auto &input : testData)
441 std::uint32_t pbh = 0;
442 packPBH(input.pitch, input.bank, input.heading,
true, pbh);
447 bool onGround2 =
false;
448 unpackPBH(pbh, pitch2, bank2, heading2, onGround2);
459 if (input.heading < 0) { heading2 -= 360; }
460 QVERIFY(qAbs(input.heading - heading2) < 1);
464 void CTestFsdMessages::testPilotDataUpdate()
466 const PilotDataUpdate message(CTransponder::ModeC,
"ABCD", 7000, PilotRating::Student, 43.12578, -72.15841,
467 12000, 12008, 125, -2, 3, 280,
true);
471 QCOMPARE(CTransponder::ModeC, message.m_transponderMode);
472 QCOMPARE(7000, message.m_transponderCode);
473 QCOMPARE(PilotRating::Student, message.m_rating);
474 QCOMPARE(43.12578, message.m_latitude);
475 QCOMPARE(-72.15841, message.m_longitude);
476 QCOMPARE(12000, message.m_altitudeTrue);
477 QCOMPARE(12008, message.m_altitudePressure);
478 QCOMPARE(125, message.m_groundSpeed);
484 QString stringRef(
"N:ABCD:7000:1:43.12578:-72.15841:12000:125:25132146:8");
485 QString str = message.toTokens().join(
":");
489 auto messageFromTokens = PilotDataUpdate::fromTokens(tokens);
492 QCOMPARE(CTransponder::ModeC, messageFromTokens.m_transponderMode);
493 QCOMPARE(7000, messageFromTokens.m_transponderCode);
494 QCOMPARE(PilotRating::Student, messageFromTokens.m_rating);
495 QCOMPARE(43.12578, messageFromTokens.m_latitude);
496 QCOMPARE(-72.15841, messageFromTokens.m_longitude);
497 QCOMPARE(12000, messageFromTokens.m_altitudeTrue);
498 QCOMPARE(12008, messageFromTokens.m_altitudePressure);
499 QCOMPARE(125, messageFromTokens.m_groundSpeed);
500 QVERIFY(message.m_pitch - messageFromTokens.m_pitch < 1.0);
501 QVERIFY(message.m_bank - messageFromTokens.m_bank < 1.0);
502 QVERIFY(message.m_heading - messageFromTokens.m_heading < 1.0);
503 QCOMPARE(messageFromTokens.m_onGround,
true);
506 void CTestFsdMessages::testVisualPilotDataUpdate()
508 const VisualPilotDataUpdate message(
"ABCD", 43.1257891, -72.1584142, 12000.12, 1404.00, -2, 3, 280, -1.0001,
509 2.0001, 3.0001, -0.0349, 0.0524, 0.0175);
512 QCOMPARE(43.1257891, message.m_latitude);
513 QCOMPARE(-72.1584142, message.m_longitude);
514 QCOMPARE(12000.12, message.m_altitudeTrue);
515 QCOMPARE(1404.00, message.m_heightAgl);
519 QCOMPARE(-1.0001, message.m_xVelocity);
520 QCOMPARE(2.0001, message.m_yVelocity);
521 QCOMPARE(3.0001, message.m_zVelocity);
522 QCOMPARE(-0.0349, message.m_pitchRadPerSec);
523 QCOMPARE(0.0524, message.m_bankRadPerSec);
524 QCOMPARE(0.0175, message.m_headingRadPerSec);
525 QCOMPARE(0.0, message.m_noseGearAngle);
528 "ABCD:43.1257891:-72.1584142:12000.12:1404.00:25132144:-1.0001:2.0001:3.0001:-0.0349:0.0175:0.0524:0.00");
529 QString str = message.toTokens().join(
":");
532 QStringList tokens =
QString(
"ABCD:43.1257891:-72.1584142:12000.12:1404.00:25132144:-1.0001:2.0001:3.0001:-0."
533 "0349:0.0175:0.0524:0.00")
535 auto messageFromTokens = VisualPilotDataUpdate::fromTokens(tokens);
537 QCOMPARE(43.1257891, messageFromTokens.m_latitude);
538 QCOMPARE(-72.1584142, messageFromTokens.m_longitude);
539 QCOMPARE(12000.12, messageFromTokens.m_altitudeTrue);
540 QCOMPARE(1404.00, messageFromTokens.m_heightAgl);
541 QVERIFY(message.m_pitch - messageFromTokens.m_pitch < 1.0);
542 QVERIFY(message.m_bank - messageFromTokens.m_bank < 1.0);
543 QVERIFY(message.m_heading - messageFromTokens.m_heading < 1.0);
544 QCOMPARE(-1.0001, messageFromTokens.m_xVelocity);
545 QCOMPARE(2.0001, messageFromTokens.m_yVelocity);
546 QCOMPARE(3.0001, messageFromTokens.m_zVelocity);
547 QCOMPARE(-0.0349, messageFromTokens.m_pitchRadPerSec);
548 QCOMPARE(0.0524, messageFromTokens.m_bankRadPerSec);
549 QCOMPARE(0.0175, messageFromTokens.m_headingRadPerSec);
550 QCOMPARE(0.0, messageFromTokens.m_noseGearAngle);
553 void CTestFsdMessages::testVisualPilotDataToggle()
561 QString stringRef(
"SERVER:ABCD:1");
562 QString str = message.toTokens().join(
":");
566 auto messageFromTokens = VisualPilotDataToggle::fromTokens(tokens);
569 QCOMPARE(
true, messageFromTokens.m_active);
572 void CTestFsdMessages::testPing()
574 const Ping message(
"ABCD",
"SERVER",
"85275222");
577 QCOMPARE(
"85275222", message.m_timestamp);
579 QString stringRef(
"ABCD:SERVER:85275222");
580 QString str = message.toTokens().join(
":");
584 auto messageFromTokens = Ping::fromTokens(tokens);
585 QCOMPARE(messageFromTokens, message);
588 void CTestFsdMessages::testPlaneInfoRequest()
594 QString stringRef(
"ABCD:XYZ:PIR");
595 QString str = message.toTokens().join(
":");
599 auto messageFromTokens = PlaneInfoRequest::fromTokens(tokens);
600 QCOMPARE(messageFromTokens, message);
603 void CTestFsdMessages::testPlaneInformation()
613 QString stringRef1(
"ABCD:XYZ:PI:GEN:EQUIPMENT=B744");
614 QString str1 = message1.toTokens().join(
":");
618 QString stringRef2(
"ABCD:XYZ:PI:GEN:EQUIPMENT=B744:AIRLINE=BAW");
619 QString str2 = message2.toTokens().join(
":");
623 QString stringRef3(
"ABCD:XYZ:PI:GEN:EQUIPMENT=B744:AIRLINE=BAW:LIVERY=UNION");
624 QString str3 = message3.toTokens().join(
":");
630 auto messageFromTokens1 = PlaneInformation::fromTokens(tokens1);
631 QCOMPARE(reference1, messageFromTokens1);
636 auto messageFromTokens2 = PlaneInformation::fromTokens(tokens2);
637 QCOMPARE(reference2, messageFromTokens2);
642 auto messageFromTokens3 = PlaneInformation::fromTokens(tokens3);
643 QCOMPARE(reference3, messageFromTokens3);
646 void CTestFsdMessages::testPlaneInfoRequestFsinn()
648 const PlaneInfoRequestFsinn message(
"ABCD",
"XYZ",
"DLH",
"A320",
"L2J",
"FLIGHTFACTOR A320 LUFTHANSA D-AIPC");
654 QCOMPARE(
QString(
"FLIGHTFACTOR A320 LUFTHANSA D-AIPC"), message.m_sendMModelString);
656 QString stringRef(
"ABCD:XYZ:FSIPIR:0:DLH:A320:::::L2J:FLIGHTFACTOR A320 LUFTHANSA D-AIPC");
657 QString str = message.toTokens().join(
":");
661 void CTestFsdMessages::testPlaneInformationFsinn()
663 const PlaneInformationFsinn message(
"ABCD",
"XYZ",
"DLH",
"A320",
"L2J",
"FLIGHTFACTOR A320 LUFTHANSA D-AIPC");
669 QCOMPARE(
QString(
"FLIGHTFACTOR A320 LUFTHANSA D-AIPC"), message.m_sendMModelString);
671 QString stringRef(
"ABCD:XYZ:FSIPI:0:DLH:A320:::::L2J:FLIGHTFACTOR A320 LUFTHANSA D-AIPC");
672 QString str = message.toTokens().join(
":");
676 void CTestFsdMessages::testPong()
678 const Pong message(
"ABCD",
"SERVER",
"85275222");
681 QCOMPARE(
"85275222", message.m_timestamp);
683 QString stringRef(
"ABCD:SERVER:85275222");
684 QString str = message.toTokens().join(
":");
687 const Pong reference(
"ABCD",
"SERVER",
"85275222");
690 auto messageFromTokens = Pong::fromTokens(tokens);
691 QCOMPARE(messageFromTokens, message);
694 void CTestFsdMessages::testServerError()
696 const ServerError message(
"SERVER",
"ABCD", ServerErrorCode::NoWeatherProfile,
"EGLL",
697 "No such weather profile");
700 QCOMPARE(ServerErrorCode::NoWeatherProfile, message.m_errorNumber);
701 QCOMPARE(
"EGLL", message.m_causingParameter);
702 QCOMPARE(
"No such weather profile", message.m_description);
704 QString stringRef(
"SERVER:ABCD:9:EGLL:No such weather profile");
705 QString str = message.toTokens().join(
":");
709 auto messageFromTokens = ServerError::fromTokens(tokens);
710 QCOMPARE(messageFromTokens, message);
713 void CTestFsdMessages::testTextMessage() {}
719 #include "testfsdmessages.moc"
~CTestFsdMessages()=default
Destructor.
CTestFsdMessages(QObject *parent=nullptr)
Constructor.
FSD Message: ATC data update.
FSD Message: auth challenge.
Responds to an authentication challenge. The protocol for formulating and responding to auth challeng...
This packet is sent by any client that supports the VATSIM client authentication protocol,...
This packet is used to respond to a client data request.
Used to notify the server of the intention to close the connection. If a client receives this packet ...
Pilot data update broadcast by Euroscope Simulator every second.
Interim pilot data update sent to specific receivers faster than the standard broadcast update.
Kill request initiated from the server or supervisor. Client needs to disconnect immediatly upon rece...
Pilot data update broadcasted to all clients in range every 5 seconds.
Ping. Needs to be answered with a pong.
FSinn specific version of plane information request.
Request to send plane information. Shall be answered by a PlaneInformation message.
Sent or received as reply to a ping.
FSD Message Server Error.
Message from server to start or stop sending visual pilot data updates.
Pilot data update broadcasted to pilots in range every 0.2 seconds.
Value object encapsulating information about aircraft's lights.
void unpackPBH(quint32 pbh, double &pitch, double &bank, double &heading, bool &onGround)
Unpack pitch, bank, heading and onGround from 32 bit integer.
void packPBH(double pitch, double bank, double heading, bool onGround, quint32 &pbh)
Pack pitch, bank, heading and onGround into 32 bit integer.
void push_back(QList< T >::parameter_type value)
QStringList split(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const const
QCOMPARE(actual, expected)
SWIFTTEST_APPLESS_MAIN(MiscTest::CTestFsdMessages)
main
Pitch bank heading union.