From 3db901bd09ab94e4123c316e908cd919a97cc4d3 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 16 Apr 2020 15:48:17 +0200 Subject: [PATCH 1/3] [locale] Expand tests to show overlapping locations - This isn't something that Calamares can acutally fix, so the test will be disabled later. After all, if Brazzaville and Kinshasa are close enough that on the map they are the same pixel, we can't move the cities. --- src/modules/locale/Tests.cpp | 70 ++++++++++++++++++++++++++++++++++-- src/modules/locale/Tests.h | 3 +- 2 files changed, 70 insertions(+), 3 deletions(-) diff --git a/src/modules/locale/Tests.cpp b/src/modules/locale/Tests.cpp index 8104966a4..daa585e3d 100644 --- a/src/modules/locale/Tests.cpp +++ b/src/modules/locale/Tests.cpp @@ -28,9 +28,9 @@ QTEST_MAIN( LocaleTests ) -LocaleTests::LocaleTests() { } +LocaleTests::LocaleTests() {} -LocaleTests::~LocaleTests() { } +LocaleTests::~LocaleTests() {} void LocaleTests::initTestCase() @@ -149,3 +149,69 @@ LocaleTests::testTZImages() QCOMPARE( overlapcount, 0 ); } + +bool +operator<( const QPoint& l, const QPoint& r ) +{ + if ( l.x() < r.x() ) + { + return true; + } + if ( l.x() > r.x() ) + { + return false; + } + return l.y() < r.y(); +} + +void +listAll( const QPoint& p, const CalamaresUtils::Locale::CStringPairList& zones ) +{ + using namespace CalamaresUtils::Locale; + for ( const auto* pz : zones ) + { + const TZZone* zone = dynamic_cast< const TZZone* >( pz ); + if ( p == TimeZoneImageList::getLocationPosition( zone->longitude(), zone->latitude() ) ) + { + cError() << Logger::SubEntry << zone->zone(); + } + } +} + +void +LocaleTests::testTZLocations() +{ + using namespace CalamaresUtils::Locale; + const CStringPairList& regions = TZRegion::fromZoneTab(); + + int overlapcount = 0; + for ( const auto* pr : regions ) + { + const TZRegion* region = dynamic_cast< const TZRegion* >( pr ); + QVERIFY( region ); + + Logger::setupLogLevel( Logger::LOGDEBUG ); + cDebug() << "Region" << region->region() << "zones #" << region->zones().count(); + Logger::setupLogLevel( Logger::LOGERROR ); + + std::set< QPoint > occupied; + + const auto zones = region->zones(); + QVERIFY( zones.count() > 0 ); + for ( const auto* pz : zones ) + { + const TZZone* zone = dynamic_cast< const TZZone* >( pz ); + QVERIFY( zone ); + + auto pos = TimeZoneImageList::getLocationPosition( zone->longitude(), zone->latitude() ); + if ( occupied.find( pos ) != occupied.end() ) + { + cError() << "Zone" << zone->zone() << "occupies same spot as .."; + listAll( pos, zones ); + overlapcount++; + } + occupied.insert( pos ); + } + } + QCOMPARE( overlapcount, 0 ); +} diff --git a/src/modules/locale/Tests.h b/src/modules/locale/Tests.h index e0ca7ad0b..20ef86442 100644 --- a/src/modules/locale/Tests.h +++ b/src/modules/locale/Tests.h @@ -37,7 +37,8 @@ private Q_SLOTS: void testSplitLocaleConfiguration(); // Check the TZ images for consistency - void testTZImages(); + void testTZImages(); // No overlaps in images + void testTZLocations(); // No overlaps in locations }; #endif From 82ba4be5e72bd89d23fd8b787be1531b298a7155 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 16 Apr 2020 17:59:12 +0200 Subject: [PATCH 2/3] [locale] Test for pixel-perfect location of Gibraltar and Ceuta - Can't get Gibraltar (and Ceuta) to be distinguished --- src/modules/locale/Tests.cpp | 46 ++++++++++++++++++++++++++++++++++++ src/modules/locale/Tests.h | 1 + 2 files changed, 47 insertions(+) diff --git a/src/modules/locale/Tests.cpp b/src/modules/locale/Tests.cpp index daa585e3d..53cae3fb4 100644 --- a/src/modules/locale/Tests.cpp +++ b/src/modules/locale/Tests.cpp @@ -215,3 +215,49 @@ LocaleTests::testTZLocations() } QCOMPARE( overlapcount, 0 ); } + +const CalamaresUtils::Locale::TZZone* +findZone( const QString& name ) +{ + using namespace CalamaresUtils::Locale; + const CStringPairList& regions = TZRegion::fromZoneTab(); + + for ( const auto* pr : regions ) + { + const TZRegion* region = dynamic_cast< const TZRegion* >( pr ); + if ( !region ) + { + continue; + } + const auto zones = region->zones(); + for ( const auto* pz : zones ) + { + const TZZone* zone = dynamic_cast< const TZZone* >( pz ); + if ( !zone ) + { + continue; + } + + if ( zone->zone() == name ) + { + return zone; + } + } + } + return nullptr; +} + +void +LocaleTests::testSpecificLocations() +{ + const auto* gibraltar = findZone( "Gibraltar" ); + const auto* ceuta = findZone( "Ceuta" ); + QVERIFY( gibraltar ); + QVERIFY( ceuta ); + + auto gpos = TimeZoneImageList::getLocationPosition( gibraltar->longitude(), gibraltar->latitude() ); + auto cpos = TimeZoneImageList::getLocationPosition( ceuta->longitude(), ceuta->latitude() ); + QVERIFY( gpos != cpos ); + QVERIFY( gibraltar->latitude() > ceuta->latitude() ); + QVERIFY( gpos.y() < cpos.y() ); // Gibraltar is north of Ceuta +} diff --git a/src/modules/locale/Tests.h b/src/modules/locale/Tests.h index 20ef86442..e01b1a25c 100644 --- a/src/modules/locale/Tests.h +++ b/src/modules/locale/Tests.h @@ -39,6 +39,7 @@ private Q_SLOTS: // Check the TZ images for consistency void testTZImages(); // No overlaps in images void testTZLocations(); // No overlaps in locations + void testSpecificLocations(); }; #endif From 69fae85fe88d949dd20c8e1daedc76336b2316d3 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 21 Apr 2020 12:43:45 +0200 Subject: [PATCH 3/3] [locale] Fix test-build - needs if it doesn't get pulled in implicitly - mark tests as expected-to-fail to not block release - SEE #1374 --- src/modules/locale/Tests.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/modules/locale/Tests.cpp b/src/modules/locale/Tests.cpp index 53cae3fb4..b24f37734 100644 --- a/src/modules/locale/Tests.cpp +++ b/src/modules/locale/Tests.cpp @@ -25,6 +25,8 @@ #include +#include + QTEST_MAIN( LocaleTests ) @@ -213,6 +215,8 @@ LocaleTests::testTZLocations() occupied.insert( pos ); } } + + QEXPECT_FAIL("", "TZ Images contain pixel-overlaps", Continue); QCOMPARE( overlapcount, 0 ); } @@ -257,7 +261,9 @@ LocaleTests::testSpecificLocations() auto gpos = TimeZoneImageList::getLocationPosition( gibraltar->longitude(), gibraltar->latitude() ); auto cpos = TimeZoneImageList::getLocationPosition( ceuta->longitude(), ceuta->latitude() ); + QEXPECT_FAIL("", "Gibraltar and Ceuta are really close", Continue); QVERIFY( gpos != cpos ); QVERIFY( gibraltar->latitude() > ceuta->latitude() ); + QEXPECT_FAIL("", "Gibraltar and Ceuta are really close", Continue); QVERIFY( gpos.y() < cpos.y() ); // Gibraltar is north of Ceuta }