mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-30 21:30:05 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			167 lines
		
	
	
	
		
			4.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			167 lines
		
	
	
	
		
			4.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include <scwx/qt/map/map_provider.hpp>
 | |
| #include <scwx/qt/settings/general_settings.hpp>
 | |
| #include <scwx/qt/util/maplibre.hpp>
 | |
| #include <scwx/util/environment.hpp>
 | |
| #include <scwx/util/logger.hpp>
 | |
| 
 | |
| #include <QCoreApplication>
 | |
| #include <QTimer>
 | |
| 
 | |
| #include <gtest/gtest.h>
 | |
| #include <qmaplibre.hpp>
 | |
| #include <re2/re2.h>
 | |
| 
 | |
| namespace scwx
 | |
| {
 | |
| namespace qt
 | |
| {
 | |
| namespace map
 | |
| {
 | |
| 
 | |
| static const std::string logPrefix_ {"scwx::qt::map::map_provider.test"};
 | |
| static const auto        logger_ = scwx::util::Logger::Create(logPrefix_);
 | |
| 
 | |
| class ByMapProviderTest :
 | |
|     public testing::TestWithParam<std::pair<MapProvider, std::string>>
 | |
| {
 | |
| };
 | |
| 
 | |
| TEST_P(ByMapProviderTest, MapProviderLayers)
 | |
| {
 | |
|    auto& [mapProvider, apiKeyName] = GetParam();
 | |
| 
 | |
|    // Configure API key
 | |
|    std::string apiKey = scwx::util::GetEnvironment(apiKeyName);
 | |
|    if (apiKey.empty())
 | |
|    {
 | |
|       logger_->info("API key not set, skipping test");
 | |
|       EXPECT_EQ(true, true);
 | |
|       return;
 | |
|    }
 | |
| 
 | |
|    // Setup QCoreApplication
 | |
|    int              argc   = 1;
 | |
|    const char*      argv[] = {"arg", nullptr};
 | |
|    QCoreApplication application(argc, const_cast<char**>(argv));
 | |
| 
 | |
|    // Configure map provider
 | |
|    const MapProviderInfo& mapProviderInfo = GetMapProviderInfo(mapProvider);
 | |
| 
 | |
|    // Configure QMapLibre
 | |
|    QMapLibre::Settings mapSettings {};
 | |
|    if (mapProvider == map::MapProvider::Mapbox)
 | |
|    {
 | |
|       mapSettings.setProviderTemplate(mapProviderInfo.providerTemplate_);
 | |
|       mapSettings.setApiKey(QString::fromStdString(apiKey));
 | |
|    }
 | |
|    else if (mapProvider == map::MapProvider::MapTiler)
 | |
|    {
 | |
|       settings::GeneralSettings::Instance().maptiler_api_key().SetValue(apiKey);
 | |
|    }
 | |
| 
 | |
|    std::shared_ptr<map::MapContext> mapContext =
 | |
|       std::make_shared<map::MapContext>();
 | |
|    std::shared_ptr<QMapLibre::Map> map =
 | |
|       std::make_shared<QMapLibre::Map>(nullptr, mapSettings, QSize(1, 1));
 | |
|    mapContext->set_map(map);
 | |
|    mapContext->set_map_provider(mapProvider);
 | |
|    application.processEvents();
 | |
| 
 | |
|    // Connect style load completion signal
 | |
|    QObject::connect(
 | |
|       map.get(),
 | |
|       &QMapLibre::Map::mapChanged,
 | |
|       [&](QMapLibre::Map::MapChange mapChange)
 | |
|       {
 | |
|          if (mapChange ==
 | |
|              QMapLibre::Map::MapChange::MapChangeDidFinishLoadingStyle)
 | |
|          {
 | |
|             application.exit();
 | |
|          }
 | |
|       });
 | |
| 
 | |
|    // Connect timeout timer
 | |
|    bool   timeout = false;
 | |
|    QTimer timeoutTimer {};
 | |
|    timeoutTimer.setSingleShot(true);
 | |
|    QObject::connect(&timeoutTimer,
 | |
|                     &QTimer::timeout,
 | |
|                     [&]()
 | |
|                     {
 | |
|                        // Reached timeout
 | |
|                        logger_->warn("Timed out waiting for style change");
 | |
|                        timeout = true;
 | |
| 
 | |
|                        application.exit();
 | |
|                     });
 | |
| 
 | |
|    // Iterate through each style
 | |
|    for (const auto& mapStyle : mapProviderInfo.mapStyles_)
 | |
|    {
 | |
|       using namespace std::chrono_literals;
 | |
| 
 | |
|       // Load style
 | |
|       timeout = false;
 | |
|       util::maplibre::SetMapStyleUrl(mapContext, mapStyle.url_);
 | |
|       timeoutTimer.start(5000ms);
 | |
|       application.exec();
 | |
|       timeoutTimer.stop();
 | |
| 
 | |
|       // Check result
 | |
|       if (!timeout)
 | |
|       {
 | |
|          // Print layer names for debug
 | |
|          std::string layerIdsString = map->layerIds().join(", ").toStdString();
 | |
|          logger_->debug("{} Layers: [{}]", mapStyle.name_, layerIdsString);
 | |
| 
 | |
|          // Search layer list
 | |
|          bool foundMatch = false;
 | |
|          for (const QString& qlayer : map->layerIds())
 | |
|          {
 | |
|             const std::string layer = qlayer.toStdString();
 | |
| 
 | |
|             // Draw below layers defined in map style
 | |
|             auto it =
 | |
|                std::find_if(mapStyle.drawBelow_.cbegin(),
 | |
|                             mapStyle.drawBelow_.cend(),
 | |
|                             [&layer](const std::string& styleLayer) -> bool
 | |
|                             {
 | |
|                                // Perform case insensitive matching
 | |
|                                RE2 re {"(?i)" + styleLayer};
 | |
|                                return RE2::FullMatch(layer, re);
 | |
|                             });
 | |
| 
 | |
|             if (it != mapStyle.drawBelow_.cend())
 | |
|             {
 | |
|                foundMatch = true;
 | |
|                break;
 | |
|             }
 | |
|          }
 | |
| 
 | |
|          // Check match
 | |
|          EXPECT_EQ(foundMatch, true);
 | |
| 
 | |
|          if (!foundMatch)
 | |
|          {
 | |
|             logger_->error("Could not find drawBelow in style {}",
 | |
|                            mapStyle.name_);
 | |
|          }
 | |
|       }
 | |
|       else
 | |
|       {
 | |
|          EXPECT_EQ(timeout, false);
 | |
|       }
 | |
|    }
 | |
| 
 | |
|    EXPECT_EQ(false, false);
 | |
| }
 | |
| 
 | |
| INSTANTIATE_TEST_SUITE_P(
 | |
|    MapProviderTest,
 | |
|    ByMapProviderTest,
 | |
|    testing::Values(std::make_pair(MapProvider::Mapbox, "MAPBOX_API_KEY"),
 | |
|                    std::make_pair(MapProvider::MapTiler, "MAPTILER_API_KEY")));
 | |
| 
 | |
| } // namespace map
 | |
| } // namespace qt
 | |
| } // namespace scwx
 | 
