From 68b5276514be9272e5f827ab6aa78299cceb4da2 Mon Sep 17 00:00:00 2001 From: Anatoly Serdtcev Date: Thu, 31 Oct 2019 20:46:29 +0300 Subject: [PATCH] [generator:tests] Add way intermediate generation test --- .../intermediate_data_test.cpp | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/generator/generator_tests/intermediate_data_test.cpp b/generator/generator_tests/intermediate_data_test.cpp index 8bbad2c..4a534ef 100644 --- a/generator/generator_tests/intermediate_data_test.cpp +++ b/generator/generator_tests/intermediate_data_test.cpp @@ -7,17 +7,30 @@ // #include "testing/testing.hpp" +#include "generator/generator_tests/common.hpp" +#include "generator/generator_tests/source_data.hpp" #include "generator/intermediate_elements.hpp" +#include "generator/osm_element.hpp" +#include "generator/osm_source.hpp" #include "coding/reader.hpp" #include "coding/writer.hpp" #include +#include +#include +#include +#include #include +using namespace generator_tests; +using namespace generator; using namespace std; +using namespace std::literals; + +using OsmFormatParser = std::function)>; UNIT_TEST(Intermediate_Data_empty_way_element_save_load_test) { @@ -109,3 +122,64 @@ UNIT_TEST(Intermediate_Data_relation_element_save_load_test) TEST_NOT_EQUAL(e2.tags["key1old"], "value1old", ()); TEST_NOT_EQUAL(e2.tags["key2old"], "value2old", ()); } + +std::vector ReadOsmElements( + std::string const & filename, OsmElement::EntityType type, OsmFormatParser parser) +{ + std::vector elements; + + auto stream = std::fstream{filename}; + SourceReader reader(stream); + parser(reader, [&elements, type](OsmElement * e) + { + if (e->m_type == type) + elements.push_back(*e); + }); + + return elements; +} + +UNIT_TEST(IntermediateData_WaysGenerationTest) +{ + auto const osmSamples = std::map{ + {"xml", way_xml_data}, {"o5m", {std::begin(way_o5m_data), std::end(way_o5m_data)}}}; + auto const osmFormatParsers = std::map{ + {"xml", ProcessOsmElementsFromXML}, {"o5m", ProcessOsmElementsFromO5M}}; + + for (auto const & sample : osmSamples) + { + auto const & osmFileTypeExtension = sample.first; + auto const & osmFileData = sample.second; + + // Skip test for node storage type "mem": 64Gb required. + for (auto const & nodeStorageType : {"raw"s, "map"s}) + { + auto const & dataPath = ScopedDir("intermediate_data", true /* recursiveForceRemove */); + auto genInfo = feature::GenerateInfo{}; + genInfo.m_dataPath = dataPath.GetFullPath(); + genInfo.m_targetDir = dataPath.GetFullPath(); + genInfo.m_tmpDir = dataPath.GetFullPath(); + genInfo.m_osmFileName = "planet." + osmFileTypeExtension; + genInfo.SetOsmFileType(osmFileTypeExtension); + genInfo.SetNodeStorageType(nodeStorageType); + + std::ofstream{genInfo.m_osmFileName} << osmFileData; + auto generation = GenerateIntermediateData(genInfo); + CHECK(generation, ()); + + auto ways = ReadOsmElements(genInfo.m_osmFileName, OsmElement::EntityType::Way, + osmFormatParsers.at(osmFileTypeExtension)); + TEST_EQUAL(ways.size(), 1, ()); + + auto const & intermediateData = cache::IntermediateData{genInfo, true /* forceReload */}; + auto const & cache = intermediateData.GetCache(); + for (auto const & element : ways) + { + auto way = WayElement{element.m_id}; + TEST(cache->GetWay(element.m_id, way), ()); + TEST_EQUAL(way.m_wayOsmId, element.m_id, ()); + TEST_EQUAL(way.nodes.size(), element.Nodes().size(), ()); + } + } + } +}