swift
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 
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"
19 #include "core/fsd/atcdataupdate.h"
20 #include "core/fsd/authchallenge.h"
21 #include "core/fsd/authresponse.h"
23 #include "core/fsd/clientquery.h"
25 #include "core/fsd/deleteatc.h"
26 #include "core/fsd/deletepilot.h"
27 #include "core/fsd/enums.h"
29 #include "core/fsd/flightplan.h"
32 #include "core/fsd/killrequest.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"
42 #include "core/fsd/servererror.h"
43 #include "core/fsd/textmessage.h"
46 
47 using namespace swift::misc::aviation;
48 using namespace swift::misc::network;
49 using namespace swift::config;
50 using namespace swift::core::fsd;
51 
52 namespace MiscTest
53 {
55  class CTestFsdMessages : public QObject
56  {
57  Q_OBJECT
58 
59  public:
61  explicit CTestFsdMessages(QObject *parent = nullptr) : QObject(parent) {}
62 
64  virtual ~CTestFsdMessages() {}
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.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");
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.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);
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.sender(), QString("ABCD"));
143  QCOMPARE(message.receiver(), 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.sender(), QString("ABCD"));
168  QCOMPARE(message.receiver(), 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.sender(), QString("ABCD"));
184  QCOMPARE(message.receiver(), 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.sender(), QString("ABCD"));
203  QCOMPARE(message.receiver(), 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()
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.sender(), QString("ABCD"));
255  QCOMPARE(message.receiver(), 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.sender(), QString("ABCD"));
274  QCOMPARE(QString(""), message.receiver());
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.sender(), QString("ABCD"));
291  QCOMPARE(QString(""), message.receiver());
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.sender(), QString("ABCD"));
309  QCOMPARE(QString(""), message.receiver());
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.sender());
330  QCOMPARE(QString(""), messageFromTokens.receiver());
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.sender(), QString("ABCD"));
350  QCOMPARE(message.receiver(), 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() {}
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.sender(), QString("ABCD"));
384  QCOMPARE(QString("XYZ"), message.receiver());
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.sender());
401  QCOMPARE(QString("XYZ"), messageFromTokens.receiver());
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.sender());
417  QCOMPARE(QString("ABCD"), message.receiver());
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++) { 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)
440  {
441  std::uint32_t pbh = 0;
442  packPBH(input.pitch, input.bank, input.heading, true, pbh);
443 
444  double pitch2 = 0;
445  double bank2 = 0;
446  double heading2 = 0;
447  bool onGround2 = false;
448  unpackPBH(pbh, pitch2, bank2, heading2, onGround2);
449  QVERIFY(pitch2 >= -90);
450  QVERIFY(pitch2 < 90);
451  QVERIFY(bank2 >= -180);
452  QVERIFY(bank2 < 180);
453  QVERIFY(heading2 >= 0);
454  QVERIFY(heading2 < 360);
455  QCOMPARE(input.pitch, pitch2);
456  QCOMPARE(input.bank, bank2);
457  QCOMPARE(true, onGround2);
458 
459  if (input.heading < 0) { heading2 -= 360; }
460  QVERIFY(qAbs(input.heading - heading2) < 1);
461  }
462  }
463 
464  void CTestFsdMessages::testPilotDataUpdate()
465  {
466  const PilotDataUpdate message(CTransponder::ModeC, "ABCD", 7000, PilotRating::Student, 43.12578, -72.15841,
467  12000, 12008, 125, -2, 3, 280, true);
468 
469  QCOMPARE(message.sender(), QString("ABCD"));
470  QCOMPARE(QString(""), message.receiver());
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);
479  QCOMPARE(-2, message.m_pitch);
480  QCOMPARE(3, message.m_bank);
481  QCOMPARE(280, message.m_heading);
482  QCOMPARE(true, message.m_onGround);
483 
484  QString stringRef("N:ABCD:7000:1:43.12578:-72.15841:12000:125:25132146:8");
485  QString str = message.toTokens().join(":");
486  QCOMPARE(str, stringRef);
487 
488  QStringList tokens = QString("N:ABCD:7000:1:43.12578:-72.15841:12000:125:25132146:8").split(':');
489  auto messageFromTokens = PilotDataUpdate::fromTokens(tokens);
490  QCOMPARE(QString("ABCD"), messageFromTokens.sender());
491  QCOMPARE(QString(""), messageFromTokens.receiver());
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);
504  }
505 
506  void CTestFsdMessages::testVisualPilotDataUpdate()
507  {
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);
510 
511  QCOMPARE(QString("ABCD"), message.sender());
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);
516  QCOMPARE(-2, message.m_pitch);
517  QCOMPARE(3, message.m_bank);
518  QCOMPARE(280, message.m_heading);
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);
526 
527  QString stringRef(
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(":");
530  QCOMPARE(str, stringRef);
531 
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")
534  .split(':');
535  auto messageFromTokens = VisualPilotDataUpdate::fromTokens(tokens);
536  QCOMPARE(QString("ABCD"), messageFromTokens.sender());
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);
551  }
552 
553  void CTestFsdMessages::testVisualPilotDataToggle()
554  {
555  const VisualPilotDataToggle message("SERVER", "ABCD", true);
556 
557  QCOMPARE(QString("SERVER"), message.sender());
558  QCOMPARE(QString("ABCD"), message.m_client);
559  QCOMPARE(true, message.m_active);
560 
561  QString stringRef("SERVER:ABCD:1");
562  QString str = message.toTokens().join(":");
563  QCOMPARE(str, stringRef);
564 
565  QStringList tokens = QString("SERVER:ABCD:1").split(':');
566  auto messageFromTokens = VisualPilotDataToggle::fromTokens(tokens);
567  QCOMPARE(QString("SERVER"), messageFromTokens.sender());
568  QCOMPARE(QString("ABCD"), messageFromTokens.m_client);
569  QCOMPARE(true, messageFromTokens.m_active);
570  }
571 
572  void CTestFsdMessages::testPing()
573  {
574  const Ping message("ABCD", "SERVER", "85275222");
575  QCOMPARE(message.sender(), QString("ABCD"));
576  QCOMPARE(message.receiver(), QString("SERVER"));
577  QCOMPARE("85275222", message.m_timestamp);
578 
579  QString stringRef("ABCD:SERVER:85275222");
580  QString str = message.toTokens().join(":");
581  QCOMPARE(str, stringRef);
582 
583  QStringList tokens = QString("ABCD:SERVER:85275222").split(':');
584  auto messageFromTokens = Ping::fromTokens(tokens);
585  QCOMPARE(messageFromTokens, message);
586  }
587 
588  void CTestFsdMessages::testPlaneInfoRequest()
589  {
590  const PlaneInfoRequest message("ABCD", "XYZ");
591  QCOMPARE(message.sender(), QString("ABCD"));
592  QCOMPARE(QString("XYZ"), message.receiver());
593 
594  QString stringRef("ABCD:XYZ:PIR");
595  QString str = message.toTokens().join(":");
596  QCOMPARE(str, stringRef);
597 
598  QStringList tokens = QString("ABCD:XYZ:PIR").split(':');
599  auto messageFromTokens = PlaneInfoRequest::fromTokens(tokens);
600  QCOMPARE(messageFromTokens, message);
601  }
602 
603  void CTestFsdMessages::testPlaneInformation()
604  {
605  const PlaneInformation message("ABCD", "XYZ", "B744", "BAW", "UNION");
606  QCOMPARE(message.sender(), QString("ABCD"));
607  QCOMPARE(QString("XYZ"), message.receiver());
608  QCOMPARE(QString("B744"), message.m_aircraft);
609  QCOMPARE(QString("BAW"), message.m_airline);
610  QCOMPARE(QString("UNION"), message.m_livery);
611 
612  const PlaneInformation message1("ABCD", "XYZ", "B744", "", "");
613  QString stringRef1("ABCD:XYZ:PI:GEN:EQUIPMENT=B744");
614  QString str1 = message1.toTokens().join(":");
615  QCOMPARE(str1, stringRef1);
616 
617  const PlaneInformation message2("ABCD", "XYZ", "B744", "BAW", "");
618  QString stringRef2("ABCD:XYZ:PI:GEN:EQUIPMENT=B744:AIRLINE=BAW");
619  QString str2 = message2.toTokens().join(":");
620  QCOMPARE(str2, stringRef2);
621 
622  const PlaneInformation message3("ABCD", "XYZ", "B744", "BAW", "UNION");
623  QString stringRef3("ABCD:XYZ:PI:GEN:EQUIPMENT=B744:AIRLINE=BAW:LIVERY=UNION");
624  QString str3 = message3.toTokens().join(":");
625  QCOMPARE(str3, stringRef3);
626 
627  const PlaneInformation reference1("ABCD", "XYZ", "B744", "", "");
628 
629  QStringList tokens1 = QString("ABCD:XYZ:PI:GEN:EQUIPMENT=B744").split(':');
630  auto messageFromTokens1 = PlaneInformation::fromTokens(tokens1);
631  QCOMPARE(reference1, messageFromTokens1);
632 
633  const PlaneInformation reference2("ABCD", "XYZ", "B744", "BAW", "");
634 
635  QStringList tokens2 = QString("ABCD:XYZ:PI:GEN:EQUIPMENT=B744:AIRLINE=BAW").split(':');
636  auto messageFromTokens2 = PlaneInformation::fromTokens(tokens2);
637  QCOMPARE(reference2, messageFromTokens2);
638 
639  const PlaneInformation reference3("ABCD", "XYZ", "B744", "BAW", "UNION");
640 
641  QStringList tokens3 = QString("ABCD:XYZ:PI:GEN:EQUIPMENT=B744:AIRLINE=BAW:LIVERY=UNION").split(':');
642  auto messageFromTokens3 = PlaneInformation::fromTokens(tokens3);
643  QCOMPARE(reference3, messageFromTokens3);
644  }
645 
646  void CTestFsdMessages::testPlaneInfoRequestFsinn()
647  {
648  const PlaneInfoRequestFsinn message("ABCD", "XYZ", "DLH", "A320", "L2J", "FLIGHTFACTOR A320 LUFTHANSA D-AIPC");
649  QCOMPARE(message.sender(), QString("ABCD"));
650  QCOMPARE(QString("XYZ"), message.receiver());
651  QCOMPARE(QString("DLH"), message.m_airlineIcao);
652  QCOMPARE(QString("A320"), message.m_aircraftIcao);
653  QCOMPARE(QString("L2J"), message.m_aircraftIcaoCombinedType);
654  QCOMPARE(QString("FLIGHTFACTOR A320 LUFTHANSA D-AIPC"), message.m_sendMModelString);
655 
656  QString stringRef("ABCD:XYZ:FSIPIR:0:DLH:A320:::::L2J:FLIGHTFACTOR A320 LUFTHANSA D-AIPC");
657  QString str = message.toTokens().join(":");
658  QCOMPARE(str, stringRef);
659  }
660 
661  void CTestFsdMessages::testPlaneInformationFsinn()
662  {
663  const PlaneInformationFsinn message("ABCD", "XYZ", "DLH", "A320", "L2J", "FLIGHTFACTOR A320 LUFTHANSA D-AIPC");
664  QCOMPARE(message.sender(), QString("ABCD"));
665  QCOMPARE(QString("XYZ"), message.receiver());
666  QCOMPARE(QString("DLH"), message.m_airlineIcao);
667  QCOMPARE(QString("A320"), message.m_aircraftIcao);
668  QCOMPARE(QString("L2J"), message.m_aircraftIcaoCombinedType);
669  QCOMPARE(QString("FLIGHTFACTOR A320 LUFTHANSA D-AIPC"), message.m_sendMModelString);
670 
671  QString stringRef("ABCD:XYZ:FSIPI:0:DLH:A320:::::L2J:FLIGHTFACTOR A320 LUFTHANSA D-AIPC");
672  QString str = message.toTokens().join(":");
673  QCOMPARE(str, stringRef);
674  }
675 
676  void CTestFsdMessages::testPong()
677  {
678  const Pong message("ABCD", "SERVER", "85275222");
679  QCOMPARE(message.sender(), QString("ABCD"));
680  QCOMPARE(message.receiver(), QString("SERVER"));
681  QCOMPARE("85275222", message.m_timestamp);
682 
683  QString stringRef("ABCD:SERVER:85275222");
684  QString str = message.toTokens().join(":");
685  QCOMPARE(str, stringRef);
686 
687  const Pong reference("ABCD", "SERVER", "85275222");
688 
689  QStringList tokens = QString("ABCD:SERVER:85275222").split(':');
690  auto messageFromTokens = Pong::fromTokens(tokens);
691  QCOMPARE(messageFromTokens, message);
692  }
693 
694  void CTestFsdMessages::testServerError()
695  {
696  const ServerError message("SERVER", "ABCD", ServerErrorCode::NoWeatherProfile, "EGLL",
697  "No such weather profile");
698  QCOMPARE(QString("SERVER"), message.sender());
699  QCOMPARE(QString("ABCD"), message.receiver());
700  QCOMPARE(ServerErrorCode::NoWeatherProfile, message.m_errorNumber);
701  QCOMPARE("EGLL", message.m_causingParameter);
702  QCOMPARE("No such weather profile", message.m_description);
703 
704  QString stringRef("SERVER:ABCD:9:EGLL:No such weather profile");
705  QString str = message.toTokens().join(":");
706  QCOMPARE(str, stringRef);
707 
708  QStringList tokens = QString("SERVER:ABCD:009:EGLL:No such weather profile").split(':');
709  auto messageFromTokens = ServerError::fromTokens(tokens);
710  QCOMPARE(messageFromTokens, message);
711  }
712 
713  void CTestFsdMessages::testTextMessage() {}
714 } // namespace MiscTest
715 
718 
719 #include "testfsdmessages.moc"
720 
Testing FSD Messages.
CTestFsdMessages(QObject *parent=nullptr)
Constructor.
virtual ~CTestFsdMessages()
Destructor.
Add ATC message.
Definition: addatc.h:19
FSD Message: Add Pilot.
Definition: addpilot.h:19
FSD Message: ATC data update.
Definition: atcdataupdate.h:19
FSD Message: auth challenge.
Definition: authchallenge.h:15
Responds to an authentication challenge. The protocol for formulating and responding to auth challeng...
Definition: authresponse.h:16
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.
FSD Message Delete ATC.
Definition: deleteatc.h:15
Used to notify the server of the intention to close the connection. If a client receives this packet ...
Definition: deletepilot.h:16
Pilot data update broadcast by Euroscope Simulator every second.
FSD Message: flightplan.
Definition: flightplan.h:16
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...
Definition: killrequest.h:16
Pilot data update broadcasted to all clients in range every 5 seconds.
Ping. Needs to be answered with a pong.
Definition: ping.h:15
FSinn specific version of plane information request.
Request to send plane information. Shall be answered by a PlaneInformation message.
This packet is sent in reply to a FSinn request (FSIPIR)
This packet is sent in reply to a PIR request to inform the client which multiplayer model to use....
Sent or received as reply to a ping.
Definition: pong.h:15
FSD Message Server Error.
Definition: servererror.h:16
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.
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
SWIFTTEST_APPLESS_MAIN(MiscTest::CTestFsdMessages)
main
Pitch bank heading union.
Definition: pbh.h:16