1
0
Fork 0
mirror of https://github.com/systemed/tilemaker synced 2025-02-21 21:54:08 +01:00
tilemaker/test/pbf_reader.test.cpp
2023-12-28 20:07:50 +00:00

130 lines
3.7 KiB
C++

#include <iostream>
#include <fstream>
#include <sstream>
#include "external/minunit.h"
#include "pbf_reader.h"
MU_TEST(test_pbf_reader) {
std::ifstream monaco("test/monaco.pbf", std::ifstream::in);
PbfReader::PbfReader reader;
PbfReader::BlobHeader bh = reader.readBlobHeader(monaco);
protozero::data_view blob = reader.readBlob(bh.datasize, monaco);
PbfReader::HeaderBlock header = reader.readHeaderBlock(blob);
mu_check(header.hasBbox);
mu_check(header.optionalFeatures.size() == 1);
mu_check(header.optionalFeatures.find("Sort.Type_then_ID") != header.optionalFeatures.end());
mu_check(header.bbox.minLon == 7.409205);
mu_check(header.bbox.maxLon == 7.448637);
mu_check(header.bbox.minLat == 43.723350);
mu_check(header.bbox.maxLat == 43.751690);
bool foundNode = false, foundWay = false, foundRelation = false;
int blocks = 0, groups = 0, strings = 0, nodes = 0, ways = 0, relations = 0;
while (!monaco.eof()) {
bh = reader.readBlobHeader(monaco);
if (bh.type == "eof")
break;
blocks++;
blob = reader.readBlob(bh.datasize, monaco);
PbfReader::PrimitiveBlock pb = reader.readPrimitiveBlock(blob);
for (const auto str : pb.stringTable) {
if (strings == 200) {
std::string s(str.data(), str.size());
mu_check(s == "description:FR");
}
strings++;
}
for (const auto& group : pb.groups()) {
groups++;
for (const auto& node : group.nodes()) {
nodes++;
if (node.id == 21911886) {
foundNode = true;
bool foundHighwayCrossing = false;
for (int i = node.tagStart; i < node.tagEnd; i += 2) {
const auto keyIndex = group.translateNodeKeyValue(i);
const auto valueIndex = group.translateNodeKeyValue(i + 1);
std::string key(pb.stringTable[keyIndex].data(), pb.stringTable[keyIndex].size());
std::string value(pb.stringTable[valueIndex].data(), pb.stringTable[valueIndex].size());
if (key == "highway" && value == "crossing")
foundHighwayCrossing = true;
}
mu_check(foundHighwayCrossing);
}
}
for (const auto& way : group.ways()) {
ways++;
if (way.id == 4224978) {
foundWay = true;
bool foundSportSoccer = false;
for (int i = 0; i < way.keys.size(); i++) {
std::string key(pb.stringTable[way.keys[i]].data(), pb.stringTable[way.keys[i]].size());
std::string value(pb.stringTable[way.vals[i]].data(), pb.stringTable[way.vals[i]].size());
if (key == "sport" && value == "soccer")
foundSportSoccer = true;
}
mu_check(foundSportSoccer);
mu_check(way.refs.size() == 5);
mu_check(way.refs[0] == 25178088);
mu_check(way.refs[2] == 25178045);
mu_check(way.refs[4] == 25178088);
}
}
for (const auto& relation : group.relations()) {
relations++;
if (relation.id == 1124039) {
foundRelation = true;
mu_check(relation.memids.size() == 17);
mu_check(relation.types.size() == 17);
mu_check(relation.roles_sid.size() == 17);
mu_check(relation.types[0] == PbfReader::Relation::MemberType::NODE);
mu_check(relation.types[2] == PbfReader::Relation::MemberType::WAY);
mu_check(relation.types[16] == PbfReader::Relation::MemberType::RELATION);
}
}
}
}
//std::cout << blocks << " blocks, " << groups << " groups, " << nodes << " nodes, " << ways << " ways, " << relations << " relations" << std::endl;
mu_check(foundNode);
mu_check(foundWay);
mu_check(foundRelation);
mu_check(blocks == 6);
mu_check(groups == 6);
mu_check(strings == 8236);
mu_check(nodes == 30477);
mu_check(ways == 4825);
mu_check(relations == 285);
}
MU_TEST_SUITE(test_suite_pbf_reader) {
MU_RUN_TEST(test_pbf_reader);
}
int main() {
MU_RUN_SUITE(test_suite_pbf_reader);
MU_REPORT();
return MU_EXIT_CODE;
}