#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "mln/tile/vector_mlt_tile_data.hpp" using namespace mln; TEST(VectorTile, setError) { VectorTileTest test; VectorMVTTile tile(OverscaledTileID(0, 0, 0), "source", test.tileParameters, test.tileset); tile.setError(std::make_exception_ptr(std::runtime_error("test"))); EXPECT_FALSE(tile.isRenderable()); EXPECT_TRUE(tile.isLoaded()); EXPECT_TRUE(tile.isComplete()); } TEST(VectorTile, onError) { VectorTileTest test; VectorMVTTile tile(OverscaledTileID(0, 0, 0), "source", test.tileParameters, test.tileset); tile.onError(std::make_exception_ptr(std::runtime_error("test")), 0); EXPECT_FALSE(tile.isRenderable()); EXPECT_TRUE(tile.isLoaded()); EXPECT_TRUE(tile.isComplete()); } TEST(VectorTile, Issue8542) { VectorTileTest test; VectorMVTTile tile(OverscaledTileID(0, 0, 0), "source", test.tileParameters, test.tileset); // Query before data is set std::vector result; tile.querySourceFeatures(result, {{{"layer"}}, {}}); } TEST(VectorTileData, ParseResults) { VectorMVTTileData data(std::make_shared(util::read_file("test/fixtures/map/issue12432/0-0-0.mvt"))); std::vector layerNames = data.layerNames(); ASSERT_EQ(layerNames.size(), 2u); ASSERT_EQ(layerNames.at(0), "admin"); ASSERT_EQ(layerNames.at(1), "water"); ASSERT_FALSE(data.getLayer("invalid")); std::unique_ptr layer = data.getLayer("admin"); ASSERT_EQ(layer->getName(), "admin"); ASSERT_EQ(layer->featureCount(), 17154u); ASSERT_THROW(layer->getFeature(17154u), std::out_of_range); std::unique_ptr feature = layer->getFeature(0u); ASSERT_EQ(feature->getType(), mln::FeatureType::LineString); ASSERT_TRUE(feature->getID().is()); ASSERT_EQ(feature->getID().get(), 1u); const std::unordered_map& properties = feature->getProperties(); ASSERT_EQ(properties.size(), 3u); ASSERT_EQ(properties.at("disputed"), *feature->getValue("disputed")); ASSERT_EQ(feature->getValue("invalid"), std::nullopt); } TEST(VectorTileData, MLTParseResults) { struct SubCase { bool useFastPFOR; bool fastPFOREnabled; }; for (const auto& testCase : std::vector{ SubCase{.useFastPFOR = false, .fastPFOREnabled = false}, SubCase{.useFastPFOR = false, .fastPFOREnabled = true}, SubCase{.useFastPFOR = true, .fastPFOREnabled = true}, SubCase{.useFastPFOR = true, .fastPFOREnabled = false}, }) { const auto path = "test/fixtures/map/issue12432/0-0-0" + std::string(testCase.useFastPFOR ? "-fastpfor.mlt" : ".mlt"); VectorMLTTileData data(std::make_shared(util::read_file(path)), testCase.fastPFOREnabled); std::vector layerNames = data.layerNames(); if (!testCase.fastPFOREnabled && testCase.useFastPFOR) { // If fast PFOR is not enabled, the fast PFOR tile should fail to parse ASSERT_EQ(layerNames.size(), 0u); continue; } // MLT layers are presented in the order they're encountered, not sorted alphabetically like MVT layers ASSERT_EQ(layerNames.size(), 2u); ASSERT_EQ(layerNames.at(0), "water"); ASSERT_EQ(layerNames.at(1), "admin"); ASSERT_FALSE(data.getLayer("invalid")); std::unique_ptr layer = data.getLayer("admin"); ASSERT_EQ(layer->getName(), "admin"); ASSERT_EQ(layer->featureCount(), 17154u); std::unique_ptr feature = layer->getFeature(0u); ASSERT_EQ(feature->getType(), mln::FeatureType::LineString); ASSERT_TRUE(feature->getID().is()); ASSERT_EQ(feature->getID().get(), 1u); const std::unordered_map& properties = feature->getProperties(); ASSERT_EQ(properties.size(), 3u); ASSERT_EQ(properties.at("disputed"), *feature->getValue("disputed")); ASSERT_EQ(feature->getValue("invalid"), std::nullopt); } }