From 5c32a912f3cfa97057459cf075ec78ee880648e3 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Fri, 7 Apr 2017 18:52:05 +0200 Subject: [PATCH] Based on unit test failure (clang): * now ignore incomplete entities for airline/aircraft ICAOs from DB * utility functions to find invalid designators * adjusted unit test, avoid taking a random element * and fixed 4 wrong ICAO entries in DB --- src/blackcore/db/icaodatareader.cpp | 4 +-- src/blackmisc/aviation/aircrafticaocode.cpp | 4 +-- .../aviation/aircrafticaocodelist.cpp | 16 +++++++++++ src/blackmisc/aviation/aircrafticaocodelist.h | 6 +++++ .../aviation/airlineicaocodelist.cpp | 16 +++++++++++ src/blackmisc/aviation/airlineicaocodelist.h | 6 +++++ tests/blackcore/testreaders.cpp | 27 ++++++++++++++++--- 7 files changed, 71 insertions(+), 8 deletions(-) diff --git a/src/blackcore/db/icaodatareader.cpp b/src/blackcore/db/icaodatareader.cpp index 1df4a53df..b731db1d4 100644 --- a/src/blackcore/db/icaodatareader.cpp +++ b/src/blackcore/db/icaodatareader.cpp @@ -239,7 +239,7 @@ namespace BlackCore } // normally read from special view which already filter incomplete - const CAircraftIcaoCodeList codes = CAircraftIcaoCodeList::fromDatabaseJson(res, false); + const CAircraftIcaoCodeList codes = CAircraftIcaoCodeList::fromDatabaseJson(res, true); const int n = codes.size(); qint64 latestTimestamp = codes.latestTimestampMsecsSinceEpoch(); if (n > 0 && latestTimestamp < 0) @@ -266,7 +266,7 @@ namespace BlackCore emit dataRead(CEntityFlags::AirlineIcaoEntity, CEntityFlags::ReadFailed, 0); return; } - const CAirlineIcaoCodeList codes = CAirlineIcaoCodeList::fromDatabaseJson(res, false); + const CAirlineIcaoCodeList codes = CAirlineIcaoCodeList::fromDatabaseJson(res, true); const int n = codes.size(); qint64 latestTimestamp = codes.latestTimestampMsecsSinceEpoch(); if (n > 0 && latestTimestamp < 0) diff --git a/src/blackmisc/aviation/aircrafticaocode.cpp b/src/blackmisc/aviation/aircrafticaocode.cpp index cd5fb6cd3..b106423c8 100644 --- a/src/blackmisc/aviation/aircrafticaocode.cpp +++ b/src/blackmisc/aviation/aircrafticaocode.cpp @@ -532,8 +532,8 @@ namespace BlackMisc // Amphibian, Glider, Helicopter, Seaplane, Landplane, Tilt wing static const QString validDescriptions = "AGHSLT"; - // Electric, Jet, Piston, Turpoprop - static const QString validEngines = "EJPT"; + // Electric, Jet, Piston, Turpoprop, and - for no engine + static const QString validEngines = "EJPT-"; if (!validDescriptions.contains(combinedType[0])) { return false; } if (!combinedType[1].isDigit()) { return false; } diff --git a/src/blackmisc/aviation/aircrafticaocodelist.cpp b/src/blackmisc/aviation/aircrafticaocodelist.cpp index df2ea1e5d..ee87964ac 100644 --- a/src/blackmisc/aviation/aircrafticaocodelist.cpp +++ b/src/blackmisc/aviation/aircrafticaocodelist.cpp @@ -34,6 +34,22 @@ namespace BlackMisc }); } + CAircraftIcaoCodeList CAircraftIcaoCodeList::findByValidDesignator() const + { + return this->findBy([](const CAircraftIcaoCode & code) + { + return code.hasValidDesignator(); + }); + } + + CAircraftIcaoCodeList CAircraftIcaoCodeList::findByInvalidDesignator() const + { + return this->findBy([](const CAircraftIcaoCode & code) + { + return !code.hasValidDesignator(); + }); + } + CAircraftIcaoCodeList CAircraftIcaoCodeList::findByDesignatorOrIataCode(const QString &icaoOrIata) const { if (icaoOrIata.isEmpty()) { return CAircraftIcaoCodeList(); } diff --git a/src/blackmisc/aviation/aircrafticaocodelist.h b/src/blackmisc/aviation/aircrafticaocodelist.h index 2bd739c20..6684a0e02 100644 --- a/src/blackmisc/aviation/aircrafticaocodelist.h +++ b/src/blackmisc/aviation/aircrafticaocodelist.h @@ -54,6 +54,12 @@ namespace BlackMisc //! Find by family CAircraftIcaoCodeList findByFamily(const QString &family) const; + //! Ones with a valid designator + CAircraftIcaoCodeList findByValidDesignator() const; + + //! Ones with an invalid designator + CAircraftIcaoCodeList findByInvalidDesignator() const; + //! Find by ICAO/IATA code CAircraftIcaoCodeList findByDesignatorOrIataCode(const QString &icaoOrIata) const; diff --git a/src/blackmisc/aviation/airlineicaocodelist.cpp b/src/blackmisc/aviation/airlineicaocodelist.cpp index 89f535e2b..25fe3dd8d 100644 --- a/src/blackmisc/aviation/airlineicaocodelist.cpp +++ b/src/blackmisc/aviation/airlineicaocodelist.cpp @@ -106,6 +106,22 @@ namespace BlackMisc }); } + CAirlineIcaoCodeList CAirlineIcaoCodeList::findByValidDesignator() const + { + return this->findBy([](const CAirlineIcaoCode & code) + { + return code.hasValidDesignator(); + }); + } + + CAirlineIcaoCodeList CAirlineIcaoCodeList::findByInvalidDesignator() const + { + return this->findBy([](const CAirlineIcaoCode & code) + { + return !code.hasValidDesignator(); + }); + } + CAirlineIcaoCode CAirlineIcaoCodeList::smartAirlineIcaoSelector(const CAirlineIcaoCode &icaoPattern, const CCallsign &callsign) const { if (icaoPattern.hasValidDbKey()) { return icaoPattern; } diff --git a/src/blackmisc/aviation/airlineicaocodelist.h b/src/blackmisc/aviation/airlineicaocodelist.h index c7c1214be..6ebfd3ab2 100644 --- a/src/blackmisc/aviation/airlineicaocodelist.h +++ b/src/blackmisc/aviation/airlineicaocodelist.h @@ -74,6 +74,12 @@ namespace BlackMisc //! Find by military flag CAirlineIcaoCodeList findByMilitary(bool military) const; + //! The ones with a valid designator + CAirlineIcaoCodeList findByValidDesignator() const; + + //! The ones with an invalid designator + CAirlineIcaoCodeList findByInvalidDesignator() const; + //! Best selection by given pattern CAirlineIcaoCode smartAirlineIcaoSelector(const CAirlineIcaoCode &icaoPattern, const CCallsign &callsign) const; diff --git a/tests/blackcore/testreaders.cpp b/tests/blackcore/testreaders.cpp index 69f1e2d7b..9becc86c1 100644 --- a/tests/blackcore/testreaders.cpp +++ b/tests/blackcore/testreaders.cpp @@ -81,10 +81,29 @@ namespace BlackCoreTest QVERIFY2(this->m_icaoReader->getAircraftIcaoCodesCount() > 0, qUtf8Printable(m1)); QVERIFY2(this->m_icaoReader->getAirlineIcaoCodesCount() > 0, qUtf8Printable(m2)); - const CAircraftIcaoCode aircraftIcao(this->m_icaoReader->getAircraftIcaoCodes().frontOrDefault()); - const CAirlineIcaoCode airlineIcao(this->m_icaoReader->getAirlineIcaoCodes().frontOrDefault()); - QVERIFY2(aircraftIcao.hasDesignator(), "Missing data for aircraft ICAO"); - QVERIFY2(airlineIcao.hasValidDesignator(), "Missing data for airline ICAO"); + // reader set to ignore incomplete ICAO data, so sizes must match + const CAircraftIcaoCodeList aircraftIcaos = this->m_icaoReader->getAircraftIcaoCodes(); + const CAirlineIcaoCodeList airlineIcaos = this->m_icaoReader->getAirlineIcaoCodes(); + const CAircraftIcaoCodeList aircraftIcaosValid(aircraftIcaos.findByValidDesignator()); + const CAirlineIcaoCodeList airlineIcaosValid(airlineIcaos.findByValidDesignator()); + const CAircraftIcaoCodeList aircraftIcaosInvalid(aircraftIcaos.findByInvalidDesignator()); + const CAirlineIcaoCodeList airlineIcaosInvalid(airlineIcaos.findByInvalidDesignator()); + const int aircraftValidSize = aircraftIcaosValid.size(); + const int aircraftSize = aircraftIcaos.size(); + const int airlineValidSize = airlineIcaosValid.size(); + const int airlineSize = airlineIcaos.size(); + + if (!aircraftIcaosInvalid.isEmpty()) + { + qDebug() << aircraftIcaosInvalid.toQString(); + } + if (!airlineIcaosInvalid.isEmpty()) + { + qDebug() << airlineIcaosInvalid.toQString(); + } + + QVERIFY2(aircraftValidSize == aircraftSize, "All aircraft ICAOs must be valid"); + QVERIFY2(airlineValidSize == airlineSize, "Some airline ICAOs must be valid"); CApplication::processEventsFor(2500); // make sure events are processed }