co-maps/generator/generator_tests/osm_o5m_source_test.cpp
2025-11-22 13:58:55 +01:00

169 lines
4.8 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "testing/testing.hpp"
#include "generator/osm_o5m_source.hpp"
#include <iterator>
#include <set>
#include <utility>
#include <vector>
#include "source_data.hpp"
namespace osm_o5m_source_test
{
using std::begin, std::end, std::pair, std::string, std::vector;
UNIT_TEST(OSM_O5M_Source_Node_read_test)
{
string data(begin(node2_o5m_data), end(node2_o5m_data));
std::stringstream ss(data);
osm::O5MSource dataset([&ss](uint8_t * buffer, size_t size)
{ return ss.read(reinterpret_cast<char *>(buffer), size).gcount(); }, 10 /* buffer size */);
osm::O5MSource::Iterator it = dataset.begin();
osm::O5MSource::Entity const & em = *it;
TEST_EQUAL(em.id, 513709898, ());
TEST_EQUAL(em.user, string("Xmypblu"), ());
TEST_EQUAL(em.uid, 395071, ());
TEST_EQUAL(em.version, 8, ());
TEST_EQUAL(em.changeset, 12059128, ());
TEST(AlmostEqualAbs(em.lon, 38.7666704, 1e-7), ());
TEST(AlmostEqualAbs(em.lat, 55.0927062, 1e-7), ());
auto const tags = em.Tags();
auto tagIterator = tags.begin();
auto const & tag = *tagIterator;
TEST_EQUAL(tag.key, string("amenity"), ());
TEST_EQUAL(tag.value, string("cinema"), ());
++tagIterator;
TEST_EQUAL(tag.key, string("name"), ());
TEST_EQUAL(tag.value, string("КТ Горизонт"), ());
++tagIterator;
TEST(!(tagIterator != tags.end()), ());
}
UNIT_TEST(OSM_O5M_Source_Way_read_test)
{
string data(begin(way_o5m_data), end(way_o5m_data));
std::stringstream ss(data);
osm::O5MSource dataset([&ss](uint8_t * buffer, size_t size)
{ return ss.read(reinterpret_cast<char *>(buffer), size).gcount(); }, 10 /* buffer size */);
std::set<int64_t> nodes;
vector<pair<string, string>> const validTags = {{"name", "Yukon River"}, {"name:ru", "Юкон"}, {"waterway", "river"}};
for (auto const & em : dataset)
{
switch (em.type)
{
case osm::O5MSource::EntityType::Node:
{
nodes.insert(em.id);
for (auto const & tag : em.Tags())
TEST(false, ("Unexpected tag:", tag.key, tag.value));
break;
}
case osm::O5MSource::EntityType::Way:
{
size_t ndCounter = 0;
size_t tagCounter = 0;
for (auto const & nd : em.Nodes())
{
ndCounter++;
TEST(nodes.count(nd), ());
}
TEST_EQUAL(nodes.size(), ndCounter, ());
for (auto const & tag : em.Tags())
{
TEST_EQUAL(tag.key, validTags[tagCounter].first, ());
TEST_EQUAL(tag.value, validTags[tagCounter].second, ());
tagCounter++;
}
TEST_EQUAL(validTags.size(), tagCounter, ());
break;
}
default: break;
}
}
}
UNIT_TEST(OSM_O5M_Source_Relation_read_test)
{
string data(begin(relation_o5m_data), end(relation_o5m_data));
std::stringstream ss(data);
osm::O5MSource dataset([&ss](uint8_t * buffer, size_t size)
{ return ss.read(reinterpret_cast<char *>(buffer), size).gcount(); }, 10 /* buffer size */);
std::set<int64_t> nodes;
std::set<int64_t> entities;
vector<pair<string, string>> const validNodeTags = {{"name", "Whitehorse"}, {"place", "town"}};
vector<pair<string, string>> const validRelationTags = {
{"name", "Whitehorse"}, {"place", "town"}, {"type", "multipolygon"}};
using TType = osm::O5MSource::EntityType;
vector<pair<TType, string>> const relationMembers = {{TType::Way, "outer"}, {TType::Node, ""}};
for (auto const & em : dataset)
{
entities.insert(em.id);
switch (em.type)
{
case TType::Node:
{
nodes.insert(em.id);
size_t tagCounter = 0;
for (auto const & tag : em.Tags())
{
TEST_EQUAL(tag.key, validNodeTags[tagCounter].first, ());
TEST_EQUAL(tag.value, validNodeTags[tagCounter].second, ());
tagCounter++;
}
break;
}
case TType::Way:
{
size_t ndCounter = 0;
for (auto const & nd : em.Nodes())
{
ndCounter++;
TEST(nodes.count(nd), ());
}
TEST_EQUAL(nodes.size(), ndCounter, ());
for (auto const & tag : em.Tags())
TEST(false, ("Unexpected tag:", tag.key, tag.value));
break;
}
case TType::Relation:
{
size_t memberCounter = 0;
size_t tagCounter = 0;
for (auto const & member : em.Members())
{
TEST(entities.count(member.ref), ());
TEST_EQUAL(relationMembers[memberCounter].first, member.type, ("Current member:", memberCounter));
TEST_EQUAL(relationMembers[memberCounter].second, member.role, ("Current member:", memberCounter));
memberCounter++;
}
TEST_EQUAL(memberCounter, 2, ());
for (auto const & tag : em.Tags())
{
TEST_EQUAL(tag.key, validRelationTags[tagCounter].first, ());
TEST_EQUAL(tag.value, validRelationTags[tagCounter].second, ());
tagCounter++;
}
TEST_EQUAL(validRelationTags.size(), tagCounter, ());
break;
}
default: break;
}
}
}
} // namespace osm_o5m_source_test