29 using namespace swift::misc::aviation;
30 using namespace swift::misc::geo;
31 using namespace swift::misc::physical_quantities;
32 using namespace swift::misc::network;
33 using namespace swift::misc::simulation;
34 using namespace swift::config;
35 using namespace swift::core::fsd;
37 namespace SwiftFsdTest
55 void testConstructor();
57 void testDeletePilot();
58 void testTextMessage();
59 void testRadioMessage();
60 void testClientQueryAtis();
61 void testClientResponseAtis();
62 void testPilotDataUpdate();
63 void testAtcDataUpdate();
65 void testClientResponseEmptyType();
66 void testClientResponseRealName1();
67 void testClientResponseRealName2();
68 void testClientResponseRealName3();
69 void testClientResponseCapabilities();
70 void testPlaneInfoRequestFsinn();
71 void testPlaneInformationFsinn();
73 void testSendPilotLogin();
74 void testSendAtcLogin();
75 void testSendDeletePilot();
76 void testSendDeleteAtc();
77 void testSendPilotDataUpdate1();
78 void testSendPilotDataUpdate2();
79 void testSendPilotDataUpdate3();
80 void testSendAtcDataUpdate();
83 void testSendClientResponse1();
84 void testSendClientResponse2();
85 void testSendClientQuery1();
86 void testSendClientQuery2();
87 void testSendClientQuery3();
88 void testSendTextMessage1();
89 void testSendTextMessage2();
90 void testSendRadioMessage1();
91 void testSendRadioMessage2();
92 void testSendFlightPlanFaa();
93 void testSendFlightPlanIcao();
94 void testSendPlaneInfoRequest();
95 void testSendPlaneInformation1();
96 void testSendPlaneInformation2();
97 void testSendPlaneInformation3();
98 void testSendPlaneInformation4();
99 void testSendAircraftConfiguration();
100 void testSendIncrementalAircraftConfiguration();
101 void testCom1FreqQueryResponse();
102 void testPlaneInfoRequestResponse();
109 const CServer &localTestServer();
114 const CServer &CTestFSDClient::localTestServer()
116 static const CServer dvp(
"Testserver",
"Client project testserver",
"localhost", 6809,
118 CEcosystem(CEcosystem::swiftTest()), CServer::FSDServerVatsim);
122 void CTestFSDClient::init()
124 const CServer server = localTestServer();
126 COwnAircraftProviderDummy::instance()->updateOwnCallsign(
"ABCD");
134 model.setSimulator(CSimulatorInfo::xplane());
135 QString modelDescription(
"[CSL]");
136 model.setDescription(modelDescription);
137 COwnAircraftProviderDummy::instance()->updateOwnModel(model);
141 CFrequency frequency(123.000, CFrequencyUnit::MHz());
142 COwnAircraftProviderDummy::instance()->updateActiveComFrequency(frequency, CComSystem::Com1, {});
144 m_client =
new CFSDClient(CClientProviderDummy::instance(), COwnAircraftProviderDummy::instance(),
145 CRemoteAircraftProviderDummy::instance(),
this);
146 m_client->setUnitTestMode(
true);
147 m_client->setCallsign(
"ABCD");
148 m_client->setClientName(
"Test Client");
149 m_client->setVersion(0, 8);
150 m_client->setClientCapabilities(Capabilities::AtcInfo | Capabilities::AircraftInfo |
151 Capabilities::AircraftConfig);
153 m_client->setServer(server);
154 m_client->setPilotRating(PilotRating::Student);
155 m_client->setSimType(CSimulatorInfo::xplane());
156 m_client->setPilotRating(PilotRating::Student);
157 #ifdef SWIFT_VATSIM_SUPPORT
158 QString key(
"727d1efd5cb9f8d2c28372469d922bb4");
159 m_client->setClientIdAndKey(0xb9ba, key.toLocal8Bit());
163 void CTestFSDClient::cleanup() {
delete m_client; }
165 void CTestFSDClient::testConstructor() {}
167 void CTestFSDClient::testDeleteAtc()
169 QSignalSpy spy(m_client, &CFSDClient::deleteAtcReceived);
170 m_client->sendFsdMessage(
"#DAEDDM_OBS:1234567\r\n");
172 QCOMPARE(spy.count(), 1);
173 QList<QVariant> arguments = spy.takeFirst();
175 QCOMPARE(arguments.at(0).toString(),
"1234567");
178 void CTestFSDClient::testDeletePilot()
180 QSignalSpy spy(m_client, &CFSDClient::deletePilotReceived);
181 m_client->sendFsdMessage(
"#DPOEHAB:1234567\r\n");
183 QCOMPARE(spy.count(), 1);
184 QList<QVariant> arguments = spy.takeFirst();
186 QCOMPARE(arguments.at(0).toString(),
"1234567");
189 void CTestFSDClient::testTextMessage()
191 QSignalSpy spy(m_client, &CFSDClient::textMessagesReceived);
192 m_client->sendFsdMessage(
"#TMEDMM_CTR:BER721:Hey how are you doing?\r\n");
195 QCOMPARE(spy.count(), 1);
196 QList<QVariant> arguments = spy.takeFirst();
198 QCOMPARE(messages.
size(), 1);
200 QCOMPARE(message.
getMessage(),
"Hey how are you doing?");
205 void CTestFSDClient::testRadioMessage()
208 const CFrequency frequency(124050, CFrequencyUnit::kHz());
209 const QString text(
"BER721, Descend F140 when ready");
211 COwnAircraftProviderDummy::instance()->updateActiveComFrequency(
CFrequency(124050, CFrequencyUnit::kHz()),
214 QSignalSpy spy(m_client, &CFSDClient::textMessagesReceived);
215 m_client->sendFsdMessage(
"#TMEDMM_CTR:@24050:BER721, Descend F140 when ready\r\n");
217 QCOMPARE(spy.count(), 1);
218 QList<QVariant> arguments = spy.takeFirst();
220 QCOMPARE(receivedMessages.
size(), 1);
226 QSignalSpy spy2(m_client, &CFSDClient::textMessagesReceived);
227 m_client->sendFsdMessage(
"#TMEDMM_CTR:@24050&@27000:BER721, Descend F140 when ready\r\n");
229 QCOMPARE(spy2.count(), 1);
230 arguments = spy.takeFirst();
232 QCOMPARE(receivedMessages.
size(), 1);
233 message = receivedMessages.
front();
239 void CTestFSDClient::testClientQueryAtis()
243 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
245 m_client->sendClientQueryAtis(callsign);
247 QCOMPARE(spy.count(), 1);
248 QList<QVariant> arguments = spy.takeFirst();
249 QCOMPARE(arguments.size(), 1);
251 QCOMPARE(fsdMessage.
getRawMessage(),
"FSD Sent=>$CQABCD:EDLW_TWR:ATIS");
254 void CTestFSDClient::testClientResponseAtis()
257 m_client->sendClientQueryAtis(callsign);
259 QSignalSpy spyLogoff(m_client, &CFSDClient::atisLogoffTimeReplyReceived);
260 QSignalSpy spyAtis(m_client, &CFSDClient::atisReplyReceived);
262 m_client->sendFsdMessage(
"$CREDLW_TWR:ABCD:ATIS:V:VoiceRoom");
263 m_client->sendFsdMessage(
"$CREDLW_TWR:ABCD:ATIS:T:Dortmund Tower");
264 m_client->sendFsdMessage(
"$CREDLW_TWR:ABCD:ATIS:T:Useful information");
265 m_client->sendFsdMessage(
"$CREDLW_TWR:ABCD:ATIS:T:More useful information");
266 m_client->sendFsdMessage(
"$CREDLW_TWR:ABCD:ATIS:Z:2000z");
267 m_client->sendFsdMessage(
"$CREDLW_TWR:ABCD:ATIS:E:6");
270 QCOMPARE(spyLogoff.count(), 1);
271 QList<QVariant> arguments = spyLogoff.takeFirst();
272 QCOMPARE(arguments.size(), 2);
274 auto receivedLogoffTime = arguments.at(1).value<QString>();
275 QCOMPARE(callsign, receivedCallsign);
276 QCOMPARE(receivedLogoffTime,
"2000z");
279 QCOMPARE(spyAtis.count(), 1);
280 arguments = spyAtis.takeFirst();
281 QCOMPARE(arguments.size(), 2);
284 QCOMPARE(callsign, receivedCallsign);
285 QCOMPARE(atisMessage.
toQString(),
"Dortmund Tower\nUseful information\nMore useful information");
288 void CTestFSDClient::testPilotDataUpdate()
290 QSignalSpy spy(m_client, &CFSDClient::pilotDataUpdateReceived);
291 m_client->sendFsdMessage(
"@N:ABCD:1200:1:48.353855:11.786155:110:0:4290769188:1\r\n");
293 QCOMPARE(spy.count(), 1);
294 QList<QVariant> arguments = spy.takeFirst();
295 QCOMPARE(arguments.size(), 2);
300 QCOMPARE(transponder.getTransponderMode(), CTransponder::ModeC);
301 QCOMPARE(transponder.getTransponderCode(), 1200);
315 void CTestFSDClient::testAtcDataUpdate()
317 QSignalSpy spy(m_client, &CFSDClient::atcDataUpdateReceived);
318 m_client->sendFsdMessage(
"%ZZZZ_APP:28200:5:150:5:48.11028:16.56972:0\r\n");
320 const CFrequency freq(128200, CFrequencyUnit::kHz());
322 const CLength range(150.0, CLengthUnit::NM());
324 QCOMPARE(spy.count(), 1);
325 QList<QVariant> arguments = spy.takeFirst();
326 QCOMPARE(arguments.size(), 4);
327 QCOMPARE(arguments.at(0).value<
CCallsign>(), callsign);
328 QCOMPARE(arguments.at(1).value<
CFrequency>(), freq);
330 QCOMPARE(arguments.at(3).value<
CLength>(), range);
333 void CTestFSDClient::testPong()
335 QSignalSpy spy(m_client, &CFSDClient::pongReceived);
336 m_client->sendFsdMessage(
"$POSERVER:BER368:90835991\r\n");
338 QCOMPARE(spy.count(), 1);
339 QList<QVariant> arguments = spy.takeFirst();
340 QCOMPARE(arguments.size(), 2);
341 QCOMPARE(arguments.at(0).toString(),
"SERVER");
343 arguments.at(1).toDouble(&ok);
347 void CTestFSDClient::testClientResponseEmptyType() { m_client->sendFsdMessage(
"$CRDLH123:BER721::Jon Doe\r\n"); }
349 void CTestFSDClient::testClientResponseRealName1()
351 QSignalSpy spy(m_client, &CFSDClient::realNameResponseReceived);
352 m_client->sendFsdMessage(
"$CRDLH123:BER721:RN:Jon Doe\r\n");
354 QCOMPARE(spy.count(), 1);
355 QList<QVariant> arguments = spy.takeFirst();
356 QCOMPARE(arguments.size(), 2);
357 QCOMPARE(arguments.at(0).toString(),
"DLH123");
358 QCOMPARE(arguments.at(1).toString(),
"Jon Doe");
361 void CTestFSDClient::testClientResponseRealName2()
363 QSignalSpy spy(m_client, &CFSDClient::realNameResponseReceived);
364 m_client->sendFsdMessage(
"$CRDLH123:BER721:RN:Jon Doe:\r\n");
366 QCOMPARE(spy.count(), 1);
367 QList<QVariant> arguments = spy.takeFirst();
368 QCOMPARE(arguments.size(), 2);
369 QCOMPARE(arguments.at(0).toString(),
"DLH123");
370 QCOMPARE(arguments.at(1).toString(),
"Jon Doe");
373 void CTestFSDClient::testClientResponseRealName3()
375 QSignalSpy spy(m_client, &CFSDClient::realNameResponseReceived);
376 m_client->sendFsdMessage(
"$CRDLH123:BER721:RN:Jon Doe::1\r\n");
378 QCOMPARE(spy.count(), 1);
379 QList<QVariant> arguments = spy.takeFirst();
380 QCOMPARE(arguments.size(), 2);
381 QCOMPARE(arguments.at(0).toString(),
"DLH123");
382 QCOMPARE(arguments.at(1).toString(),
"Jon Doe");
385 void CTestFSDClient::testClientResponseCapabilities()
387 QSignalSpy spy(m_client, &CFSDClient::capabilityResponseReceived);
388 m_client->sendFsdMessage(
"$CRAUA64MN:DECHK:CAPS:VERSION=1:ATCINFO=1:MODELDESC=1:ACCONFIG=1\r\n");
390 QCOMPARE(spy.count(), 1);
391 QList<QVariant> arguments = spy.takeFirst();
392 QCOMPARE(arguments.size(), 2);
393 CClient::Capabilities caps = arguments.at(1).value<swift::misc::network::CClient::Capabilities>();
394 QVERIFY(caps.testFlag(CClient::FsdWithAircraftConfig));
397 void CTestFSDClient::testPlaneInfoRequestFsinn()
399 QSignalSpy spy(m_client, &CFSDClient::planeInformationFsinnReceived);
400 m_client->sendFsdMessage(
"#SBLHA449:DLH53M:FSIPIR:1::A320:10.05523:0.49785:1320.00000:2.AB13B127.5611C1A2::"
401 "A320-200 Airbus Leipzig Air CFM\r\n");
403 QCOMPARE(spy.count(), 1);
404 QList<QVariant> arguments = spy.takeFirst();
405 QCOMPARE(arguments.size(), 5);
414 void CTestFSDClient::testPlaneInformationFsinn()
416 QSignalSpy spy(m_client, &CFSDClient::planeInformationFsinnReceived);
417 m_client->sendFsdMessage(
"#SBLHA449:AUA89SY:FSIPI:1::A320:10.05523:0.49785:1320.00000:2.AB13B127.5611C1A2::"
418 "A320-200 Airbus Leipzig Air CFM\r\n");
420 QCOMPARE(spy.count(), 1);
421 QList<QVariant> arguments = spy.takeFirst();
422 QCOMPARE(arguments.size(), 5);
427 void CTestFSDClient::testSendPilotLogin()
429 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
431 m_client->sendLogin();
433 QCOMPARE(spy.count(), 1);
434 QList<QVariant> arguments = spy.takeFirst();
435 QCOMPARE(arguments.size(), 1);
437 QCOMPARE(fsdMessage.
getRawMessage(),
"FSD Sent=>#APABCD:SERVER:1234567:123456:1:101:16:Test User");
440 void CTestFSDClient::testSendAtcLogin()
442 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
443 m_client->setLoginMode(CLoginMode::Observer);
444 m_client->setAtcRating(AtcRating::Controller1);
445 m_client->sendLogin();
447 QCOMPARE(spy.count(), 1);
448 QList<QVariant> arguments = spy.takeFirst();
449 QCOMPARE(arguments.size(), 1);
451 QCOMPARE(fsdMessage.
getRawMessage(),
"FSD Sent=>#AAABCD:SERVER:Test User:1234567:123456:5:101");
454 void CTestFSDClient::testSendDeletePilot()
456 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
458 m_client->sendDeletePilot();
460 QCOMPARE(spy.count(), 1);
461 QList<QVariant> arguments = spy.takeFirst();
462 QCOMPARE(arguments.size(), 1);
464 QCOMPARE(fsdMessage.
getRawMessage(),
"FSD Sent=>#DPABCD:1234567");
467 void CTestFSDClient::testSendDeleteAtc()
469 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
471 m_client->sendDeleteAtc();
473 QCOMPARE(spy.count(), 1);
474 QList<QVariant> arguments = spy.takeFirst();
475 QCOMPARE(arguments.size(), 1);
477 QCOMPARE(fsdMessage.
getRawMessage(),
"FSD Sent=>#DAABCD:1234567");
480 void CTestFSDClient::testSendPilotDataUpdate1()
482 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
485 const CHeading heading(25.0, CAngleUnit::deg());
486 const CAngle pitch(1.0, CAngleUnit::deg());
487 const CAngle bank(1.0, CAngleUnit::deg());
488 const CSpeed gs(0.0, CSpeedUnit::kts());
498 COwnAircraftProviderDummy::instance()->updateOwnSituation(situation);
499 COwnAircraftProviderDummy::instance()->updateCockpit({}, {},
CTransponder(1200, CTransponder::ModeC), {});
501 m_client->sendPilotDataUpdate();
503 QCOMPARE(spy.count(), 2);
504 const QList<QVariant> arguments = spy.takeLast();
505 QCOMPARE(arguments.size(), 1);
510 QCOMPARE(fsdRawMessage,
"FSD Sent=>@N:ABCD:1200:1:48.35386:11.78616:110:0:4286566684:1");
513 void CTestFSDClient::testSendPilotDataUpdate2()
515 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
518 const CHeading heading(25.0, CAngleUnit::deg());
519 const CAngle pitch(0.0, CAngleUnit::deg());
520 const CAngle bank(0.0, CAngleUnit::deg());
521 const CSpeed gs(0.0, CSpeedUnit::kts());
531 COwnAircraftProviderDummy::instance()->updateOwnSituation(situation);
532 COwnAircraftProviderDummy::instance()->updateCockpit({}, {},
CTransponder(1200, CTransponder::ModeC), {});
534 m_client->sendPilotDataUpdate();
536 QCOMPARE(spy.count(), 2);
537 QList<QVariant> arguments = spy.takeLast();
538 QCOMPARE(arguments.size(), 1);
543 QCOMPARE(fsdMessage.
getRawMessage(),
"FSD Sent=>@N:ABCD:1200:1:48.35386:11.78616:110:0:284:1");
547 void CTestFSDClient::testSendPilotDataUpdate3()
549 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
552 const CHeading heading(25.0, CAngleUnit::deg());
553 const CAngle pitch(-1.0, CAngleUnit::deg());
554 const CAngle bank(-1.0, CAngleUnit::deg());
555 const CSpeed gs(0.0, CSpeedUnit::kts());
565 COwnAircraftProviderDummy::instance()->updateOwnSituation(situation);
566 COwnAircraftProviderDummy::instance()->updateCockpit({}, {},
CTransponder(1200, CTransponder::ModeC), {});
568 m_client->sendPilotDataUpdate();
570 QCOMPARE(spy.count(), 2);
571 QList<QVariant> arguments = spy.takeLast();
572 QCOMPARE(arguments.size(), 1);
577 QCOMPARE(fsdMessage.
getRawMessage(),
"FSD Sent=>@N:ABCD:1200:1:48.35386:11.78616:110:0:8397084:1");
580 void CTestFSDClient::testSendAtcDataUpdate()
582 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
583 m_client->sendAtcDataUpdate(48.11028, 8.56972);
585 QCOMPARE(spy.count(), 1);
586 QList<QVariant> arguments = spy.takeFirst();
587 QCOMPARE(arguments.size(), 1);
589 QCOMPARE(fsdMessage.
getRawMessage(),
"FSD Sent=>%ABCD:99998:0:300:1:48.11028:8.56972:0");
592 void CTestFSDClient::testSendPing()
594 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
595 m_client->sendPing(
"SERVER");
597 QCOMPARE(spy.count(), 1);
598 QList<QVariant> arguments = spy.takeFirst();
599 QCOMPARE(arguments.size(), 1);
601 QVERIFY(fsdMessage.
getRawMessage().contains(
"FSD Sent=>$PIABCD:SERVER:"));
604 void CTestFSDClient::testSendPong()
606 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
607 m_client->sendPong(
"SERVER",
"123456789");
609 QCOMPARE(spy.count(), 1);
610 QList<QVariant> arguments = spy.takeFirst();
611 QCOMPARE(arguments.size(), 1);
613 QCOMPARE(fsdMessage.
getRawMessage(),
"FSD Sent=>$POABCD:SERVER:123456789");
616 void CTestFSDClient::testSendClientResponse1()
618 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
619 m_client->sendClientResponse(ClientQueryType::RealName,
"ZZZZ_TWR");
621 QCOMPARE(spy.count(), 1);
622 QList<QVariant> arguments = spy.takeFirst();
623 QCOMPARE(arguments.size(), 1);
625 QCOMPARE(fsdMessage.
getRawMessage(),
"FSD Sent=>$CRABCD:ZZZZ_TWR:RN:Test User::1");
628 void CTestFSDClient::testSendClientResponse2()
630 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
631 m_client->sendClientResponse(ClientQueryType::Capabilities,
"ZZZZ_TWR");
633 QCOMPARE(spy.count(), 1);
634 QList<QVariant> arguments = spy.takeFirst();
635 QCOMPARE(arguments.size(), 1);
637 QCOMPARE(fsdMessage.
getRawMessage(),
"FSD Sent=>$CRABCD:ZZZZ_TWR:CAPS:ATCINFO=1:MODELDESC=1:ACCONFIG=1");
640 void CTestFSDClient::testSendClientQuery1()
642 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
643 m_client->sendClientQuery(ClientQueryType::RealName,
"ZZZZ_TWR");
645 QCOMPARE(spy.count(), 1);
646 QList<QVariant> arguments = spy.takeFirst();
647 QCOMPARE(arguments.size(), 1);
649 QCOMPARE(fsdMessage.
getRawMessage(),
"FSD Sent=>$CQABCD:ZZZZ_TWR:RN");
652 void CTestFSDClient::testSendClientQuery2()
654 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
655 m_client->sendClientQueryIsValidAtc(
"EDDM_TWR");
657 QCOMPARE(spy.count(), 1);
658 QList<QVariant> arguments = spy.takeFirst();
659 QCOMPARE(arguments.size(), 1);
661 QCOMPARE(fsdMessage.
getRawMessage(),
"FSD Sent=>$CQABCD:SERVER:ATC:EDDM_TWR");
664 void CTestFSDClient::testSendClientQuery3()
666 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
667 m_client->sendClientQueryAircraftConfig(
"DLH123");
669 QCOMPARE(spy.count(), 1);
670 QList<QVariant> arguments = spy.takeFirst();
671 QCOMPARE(arguments.size(), 1);
673 QCOMPARE(fsdMessage.
getRawMessage(),
"FSD Sent=>$CQABCD:DLH123:ACC:{\"request\":\"full\"}");
676 void CTestFSDClient::testSendTextMessage1()
678 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
679 m_client->sendTextMessage(
"ZZZZ_TWR",
"hey dude!");
681 QCOMPARE(spy.count(), 1);
682 QList<QVariant> arguments = spy.takeFirst();
683 QCOMPARE(arguments.size(), 1);
685 QCOMPARE(fsdMessage.
getRawMessage(),
"FSD Sent=>#TMABCD:ZZZZ_TWR:hey dude!");
688 void CTestFSDClient::testSendTextMessage2()
690 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
691 m_client->sendTextMessage(TextMessageGroups::AllSups,
"Please help!!!");
693 QCOMPARE(spy.count(), 1);
694 QList<QVariant> arguments = spy.takeFirst();
695 QCOMPARE(arguments.size(), 1);
697 QCOMPARE(fsdMessage.
getRawMessage(),
"FSD Sent=>#TMABCD:*S:Please help!!!");
700 void CTestFSDClient::testSendRadioMessage1()
702 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
703 QVector<int> frequencies { 124050 };
704 m_client->sendRadioMessage(frequencies,
"hey dude!");
706 QCOMPARE(spy.count(), 1);
707 QList<QVariant> arguments = spy.takeFirst();
708 QCOMPARE(arguments.size(), 1);
710 QCOMPARE(fsdMessage.
getRawMessage(),
"FSD Sent=>#TMABCD:@24050:hey dude!");
713 void CTestFSDClient::testSendRadioMessage2()
715 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
716 QVector<int> frequencies { 124050, 135725 };
717 m_client->sendRadioMessage(frequencies,
"hey dude!");
719 QCOMPARE(spy.count(), 1);
720 QList<QVariant> arguments = spy.takeFirst();
721 QCOMPARE(arguments.size(), 1);
723 QCOMPARE(fsdMessage.
getRawMessage(),
"FSD Sent=>#TMABCD:@24050&@35725:hey dude!");
726 void CTestFSDClient::testSendFlightPlanFaa()
729 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
730 QDateTime takeoffTimePlanned = QDateTime::fromString(
"1530",
"hhmm");
731 takeoffTimePlanned.setTimeSpec(Qt::UTC);
732 QDateTime takeoffTimeActual = QDateTime::fromString(
"1535",
"hhmm");
733 takeoffTimeActual.setTimeSpec(Qt::UTC);
736 CFlightPlan fp({}, info,
"EGLL",
"KORD",
"NONE", takeoffTimePlanned, takeoffTimeActual,
737 CTime(8.25, CTimeUnit::h()),
CTime(9.5, CTimeUnit::h()), flightLevel,
739 m_client->sendFlightPlan(fp);
741 QCOMPARE(spy.count(), 1);
742 QList<QVariant> arguments = spy.takeFirst();
743 QCOMPARE(arguments.size(), 1);
747 "FSD Sent=>$FPABCD:SERVER:V:H/B744/L:420:EGLL:1530:1535:FL350:KORD:8:15:9:30:NONE:UNIT TEST:EGLL.KORD");
750 void CTestFSDClient::testSendFlightPlanIcao()
752 CServer server = localTestServer();
754 m_client->setServer(server);
756 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
757 QDateTime takeoffTimePlanned = QDateTime::fromString(
"1530",
"hhmm");
758 takeoffTimePlanned.setTimeSpec(Qt::UTC);
759 QDateTime takeoffTimeActual = QDateTime::fromString(
"1535",
"hhmm");
760 takeoffTimeActual.setTimeSpec(Qt::UTC);
763 CFlightPlan fp({}, info,
"EGLL",
"KORD",
"NONE", takeoffTimePlanned, takeoffTimeActual,
764 CTime(8.25, CTimeUnit::h()),
CTime(9.5, CTimeUnit::h()), flightLevel,
766 m_client->sendFlightPlan(fp);
768 QCOMPARE(spy.count(), 1);
769 QList<QVariant> arguments = spy.takeFirst();
770 QCOMPARE(arguments.size(), 1);
774 "FSD Sent=>$FPABCD:SERVER:V:B748/H-SDE3FGHIM1M2RWXY/LB1:420:EGLL:1530:1535:FL350:KORD:8:15:9:30:NONE:UNIT "
778 void CTestFSDClient::testSendPlaneInfoRequest()
780 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
781 m_client->sendPlaneInfoRequest(
"XYZ");
783 QCOMPARE(spy.count(), 1);
784 QList<QVariant> arguments = spy.takeFirst();
785 QCOMPARE(arguments.size(), 1);
787 QCOMPARE(fsdMessage.
getRawMessage(),
"FSD Sent=>#SBABCD:XYZ:PIR");
790 void CTestFSDClient::testSendPlaneInformation1()
792 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
793 m_client->sendPlaneInformation(
"XYZ",
"B744",
"BAW");
795 QCOMPARE(spy.count(), 1);
796 QList<QVariant> arguments = spy.takeFirst();
797 QCOMPARE(arguments.size(), 1);
799 QCOMPARE(fsdMessage.
getRawMessage(),
"FSD Sent=>#SBABCD:XYZ:PI:GEN:EQUIPMENT=B744:AIRLINE=BAW");
802 void CTestFSDClient::testSendPlaneInformation2()
804 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
805 m_client->sendPlaneInformation(
"XYZ",
"B744",
"BAW",
"UNION");
807 QCOMPARE(spy.count(), 1);
808 QList<QVariant> arguments = spy.takeFirst();
809 QCOMPARE(arguments.size(), 1);
811 QCOMPARE(fsdMessage.
getRawMessage(),
"FSD Sent=>#SBABCD:XYZ:PI:GEN:EQUIPMENT=B744:AIRLINE=BAW:LIVERY=UNION");
814 void CTestFSDClient::testSendPlaneInformation3()
816 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
817 m_client->sendPlaneInformation(
"XYZ",
"B744");
819 QCOMPARE(spy.count(), 1);
820 QList<QVariant> arguments = spy.takeFirst();
821 QCOMPARE(arguments.size(), 1);
823 QCOMPARE(fsdMessage.
getRawMessage(),
"FSD Sent=>#SBABCD:XYZ:PI:GEN:EQUIPMENT=B744");
826 void CTestFSDClient::testSendPlaneInformation4()
828 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
829 m_client->sendPlaneInformation(
"XYZ",
"",
"",
"UNION");
831 QCOMPARE(spy.count(), 1);
832 QList<QVariant> arguments = spy.takeFirst();
833 QCOMPARE(arguments.size(), 1);
835 QCOMPARE(fsdMessage.
getRawMessage(),
"FSD Sent=>#SBABCD:XYZ:PI:GEN:LIVERY=UNION");
838 void CTestFSDClient::testSendAircraftConfiguration()
840 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
841 m_client->sendAircraftConfiguration(
"XYZ",
"{\"request\":\"full\"}");
843 QCOMPARE(spy.count(), 1);
844 QList<QVariant> arguments = spy.takeFirst();
845 QCOMPARE(arguments.size(), 1);
847 QCOMPARE(fsdMessage.
getRawMessage(),
"FSD Sent=>$CQABCD:XYZ:ACC:{\"request\":\"full\"}");
850 void CTestFSDClient::testSendIncrementalAircraftConfiguration()
852 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
854 CAircraftParts parts = COwnAircraftProviderDummy::instance()->getOwnAircraftParts();
856 COwnAircraftProviderDummy::instance()->updateOwnParts(parts);
858 m_client->sendIncrementalAircraftConfig();
860 QCOMPARE(spy.count(), 1);
861 QList<QVariant> arguments = spy.takeFirst();
862 QCOMPARE(arguments.size(), 1);
864 QCOMPARE(fsdMessage.
getRawMessage(),
"FSD Sent=>$CQABCD:@94836:ACC:{\"config\":{\"gear_down\":true}}");
867 void CTestFSDClient::testCom1FreqQueryResponse()
869 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
870 m_client->sendFsdMessage(
"$CQEDMM_CTR:ABCD:C?\r\n");
872 QCOMPARE(spy.count(), 2);
873 QList<QVariant> arguments = spy.takeAt(1);
874 QCOMPARE(arguments.size(), 1);
876 QCOMPARE(fsdMessage.
getRawMessage(),
"FSD Sent=>$CRABCD:EDMM_CTR:C?:123.000");
879 void CTestFSDClient::testPlaneInfoRequestResponse()
881 QSignalSpy spy(m_client, &CFSDClient::rawFsdMessage);
882 m_client->sendFsdMessage(
"#SBEDMM_CTR:ABCD:PIR\r\n");
884 QCOMPARE(spy.count(), 2);
885 QList<QVariant> arguments = spy.takeAt(1);
886 QCOMPARE(arguments.size(), 1);
888 QCOMPARE(fsdMessage.
getRawMessage(),
"FSD Sent=>#SBABCD:EDMM_CTR:PI:GEN:EQUIPMENT=B737:AIRLINE=BER");
891 void CTestFSDClient::testAuth()
929 if (!CNetworkUtils::canConnect(url, m, 2500))
931 qWarning() <<
"Skipping unit test as" << url.
getFullUrl() <<
"cannot be connected";
987 #include "testfsdclient.moc"
CTestFSDClient(QObject *parent=nullptr)
Constructor.
virtual ~CTestFSDClient()
Destructor.
FSD client Todo: Send (interim) data updates automatically Todo Check ':' in FSD messages....
static const CIdentifier & anonymous()
Returns an anonymous identifier, which is a valid identifier without name.
size_type size() const
Returns number of elements in the sequence.
reference front()
Access the first element.
Value object for ICAO classification.
Value object encapsulating information of aircraft's parts.
void setGearDown(bool down)
Set gear down.
Value object encapsulating information of an aircraft's situation.
void setPressureAltitude(const CAltitude &altitude)
Set pressure altitude.
void setGroundSpeed(const physical_quantities::CSpeed &groundspeed)
Set ground speed.
void setBank(const physical_quantities::CAngle &bank)
Set bank (angle)
void setHeading(const CHeading &heading)
Set heading.
void setAltitude(const CAltitude &altitude)
Set altitude.
const CCallsign & getCallsign() const
Corresponding callsign.
const physical_quantities::CSpeed & getGroundSpeed() const
Get ground speed.
const CAltitude & getAltitude() const
Get altitude.
void setPitch(const physical_quantities::CAngle &pitch)
Set pitch.
const CAltitude & getPressureAltitude() const
Get pressure altitude.
const geo::CCoordinateGeodetic & getPosition() const
Get position.
void setPosition(const geo::CCoordinateGeodetic &position)
Set position.
Value object for ICAO classification.
Altitude as used in aviation, can be AGL or MSL altitude.
@ PressureAltitude
Altitude above the standard datum plane.
@ FlightLevel
Flight level.
Value object encapsulating information of a callsign.
const QString & asString() const
Get callsign (normalized)
Flightplan-related information about an aircraft (aircraft ICAO, equipment and WTC)
Value object for a flight plan.
@ VFR
Visual flight rules.
Heading as used in aviation, can be true or magnetic heading.
Value object encapsulating information about an airpot.
void setCombinedCode(const QString &code)
Combined code.
bool setAirlineIcaoCode(const CAirlineIcaoCode &airlineIcao)
Airline ICAO code.
virtual CLatitude latitude() const
Latitude.
virtual CLongitude longitude() const
Longitude.
QString toQString(bool i18n=false) const
Cast as QString.
Ecosystem of server belonging together.
Value object for a FSD setup.
Value object for a raw FSD message.
const QString & getRawMessage() const
Get raw message.
Value object encapsulating information of a server.
int getPort() const
Get port.
const QString & getAddress() const
Get address.
void setFsdSetup(const CFsdSetup &setup)
Set FSD setup.
Value object encapsulating information of a text message.
const QString & getMessage() const
Get message.
const aviation::CCallsign & getSenderCallsign() const
Get callsign (from)
const aviation::CCallsign & getRecipientCallsign() const
Get callsign (to)
const physical_quantities::CFrequency & getFrequency() const
Get frequency.
Value object encapsulating a list of text messages.
Value object encapsulating information of a location, kind of simplified CValueObject compliant versi...
QString getFullUrl(bool withQuery=true) const
Qualified name.
Value object encapsulating information of a user.
Physical unit angle (radians, degrees)
Physical unit length (length)
Aircraft model (used by another pilot, my models on disk)
Free functions in swift::misc.
void registerMetadata()
Register all relevant metadata in Misc.
SWIFTTEST_MAIN(SwiftFsdTest::CTestFSDClient)
main
bool pingServer(const CServer &server)
Ping the server.