osrm-backend/third_party/vtzero/test/t/test_feature.cpp

98 lines
2.6 KiB
C++

#include <test.hpp>
#include <vtzero/feature.hpp>
#include <vtzero/layer.hpp>
#include <vtzero/vector_tile.hpp>
TEST_CASE("default constructed feature") {
vtzero::feature feature{};
REQUIRE_FALSE(feature.valid());
REQUIRE_FALSE(feature);
REQUIRE(feature.id() == 0);
REQUIRE_FALSE(feature.has_id());
REQUIRE(feature.geometry_type() == vtzero::GeomType::UNKNOWN);
REQUIRE_ASSERT(feature.geometry());
REQUIRE(feature.empty());
REQUIRE(feature.num_properties() == 0);
}
TEST_CASE("read a feature") {
const auto data = load_test_tile();
vtzero::vector_tile tile{data};
auto layer = tile.get_layer_by_name("bridge");
REQUIRE(layer.valid());
auto feature = layer.next_feature();
REQUIRE(feature.valid());
REQUIRE(feature);
REQUIRE(feature.id() == 0);
REQUIRE(feature.has_id());
REQUIRE(feature.geometry_type() == vtzero::GeomType::LINESTRING);
REQUIRE_FALSE(feature.empty());
REQUIRE(feature.num_properties() == 4);
}
TEST_CASE("iterate over all properties of a feature") {
const auto data = load_test_tile();
vtzero::vector_tile tile{data};
auto layer = tile.get_layer_by_name("bridge");
auto feature = layer.next_feature();
int count = 0;
SECTION("external iterator") {
while (auto p = feature.next_property()) {
++count;
if (p.key() == "type") {
REQUIRE(p.value().type() == vtzero::property_value_type::string_value);
REQUIRE(p.value().string_value() == "primary");
}
}
}
SECTION("internal iterator") {
feature.for_each_property([&count](const vtzero::property& p) {
++count;
if (p.key() == "type") {
REQUIRE(p.value().type() == vtzero::property_value_type::string_value);
REQUIRE(p.value().string_value() == "primary");
}
return true;
});
}
REQUIRE(count == 4);
}
TEST_CASE("iterate over some properties of a feature") {
const auto data = load_test_tile();
vtzero::vector_tile tile{data};
auto layer = tile.get_layer_by_name("bridge");
REQUIRE(layer.valid());
auto feature = layer.next_feature();
REQUIRE(feature.valid());
int count = 0;
SECTION("external iterator") {
while (auto p = feature.next_property()) {
++count;
if (p.key() == "oneway") {
break;
}
}
}
SECTION("internal iterator") {
feature.for_each_property([&count](const vtzero::property& p) {
++count;
return p.key() != "oneway";
});
}
REQUIRE(count == 2);
}