From 4f377278521d38947346abd38baa3e283c80deda Mon Sep 17 00:00:00 2001 From: Maksim Andrianov Date: Thu, 24 Oct 2019 15:15:18 +0300 Subject: [PATCH] Review fixes --- .../generator_tests/hierarchy_entry_tests.cpp | 9 +- generator/hierarchy_entry.cpp | 2 +- indexer/complex/tree_node.hpp | 11 ++- indexer/indexer_tests/CMakeLists.txt | 1 + indexer/indexer_tests/tree_node_tests.cpp | 84 +++++++++++++++++++ 5 files changed, 98 insertions(+), 9 deletions(-) create mode 100644 indexer/indexer_tests/tree_node_tests.cpp diff --git a/generator/generator_tests/hierarchy_entry_tests.cpp b/generator/generator_tests/hierarchy_entry_tests.cpp index f30cf4dfaf..faeeb32447 100644 --- a/generator/generator_tests/hierarchy_entry_tests.cpp +++ b/generator/generator_tests/hierarchy_entry_tests.cpp @@ -6,10 +6,10 @@ #include "indexer/complex/tree_node.hpp" -#include "base/geo_object_id.hpp" - #include "platform/platform_tests_support/scoped_file.hpp" +#include "base/geo_object_id.hpp" + using generator::tests_support::TestWithClassificator; using platform::tests_support::ScopedFile; @@ -79,10 +79,9 @@ std::string const kCsv1 = "Николай Егорович Жуковский;" "Russia_Moscow"; -generator::CompositeId MakeId(unsigned long long f, unsigned long long s) +generator::CompositeId MakeId(uint64_t f, uint64_t s) { - return generator::CompositeId(base::GeoObjectId(static_cast(f)), - base::GeoObjectId(static_cast(s))); + return generator::CompositeId(base::GeoObjectId(f), base::GeoObjectId(s)); } UNIT_CLASS_TEST(TestWithClassificator, Complex_HierarchyEntryCsv) diff --git a/generator/hierarchy_entry.cpp b/generator/hierarchy_entry.cpp index 637ae96a7c..bb4602c4b2 100644 --- a/generator/hierarchy_entry.cpp +++ b/generator/hierarchy_entry.cpp @@ -133,7 +133,7 @@ tree_node::types::PtrList LoadHierachy(std::string const & filen { std::unordered_map> nodes; for (auto const & row : coding::CSVRunner( - coding::CSVReader(filename, false /* header */, kCsvDelimiter))) + coding::CSVReader(filename, false /* hasHeader */, kCsvDelimiter))) { auto entry = HierarchyEntryFromCsvRow(row); auto const id = entry.m_id; diff --git a/indexer/complex/tree_node.hpp b/indexer/complex/tree_node.hpp index 3bdfc9d306..a55aca74fb 100644 --- a/indexer/complex/tree_node.hpp +++ b/indexer/complex/tree_node.hpp @@ -88,13 +88,18 @@ template void PreOrderVisit(types::Ptr const & node, Fn && fn) { base::ControlFlowWrapper wrapper(std::forward(fn)); - std::function const &)> preOrderVisitDetail; + std::function const &)> preOrderVisitDetail; preOrderVisitDetail = [&](auto const & node) { if (wrapper(node) == base::ControlFlow::Break) - return; + return base::ControlFlow::Break; for (auto const & ch : node->GetChildren()) - preOrderVisitDetail(ch); + { + if (preOrderVisitDetail(ch) == base::ControlFlow::Break) + return base::ControlFlow::Break; + } + + return base::ControlFlow::Continue; }; preOrderVisitDetail(node); } diff --git a/indexer/indexer_tests/CMakeLists.txt b/indexer/indexer_tests/CMakeLists.txt index 413b9c2aa8..8a870f52e9 100644 --- a/indexer/indexer_tests/CMakeLists.txt +++ b/indexer/indexer_tests/CMakeLists.txt @@ -32,6 +32,7 @@ set( succinct_trie_test.cpp test_mwm_set.hpp test_type.cpp + tree_node_tests.cpp trie_test.cpp ugc_types_test.cpp visibility_test.cpp diff --git a/indexer/indexer_tests/tree_node_tests.cpp b/indexer/indexer_tests/tree_node_tests.cpp new file mode 100644 index 0000000000..37051191cd --- /dev/null +++ b/indexer/indexer_tests/tree_node_tests.cpp @@ -0,0 +1,84 @@ +#include "testing/testing.hpp" + +#include "indexer/complex/tree_node.hpp" + +#include "base/control_flow.hpp" + +#include +#include +#include + +namespace +{ +decltype(auto) MakeTree() +{ + auto tree1 = tree_node::MakeTreeNode(1); + + auto node11 = tree_node::MakeTreeNode(21); + tree_node::Link(tree_node::MakeTreeNode(31), node11); + tree_node::Link(tree_node::MakeTreeNode(32), node11); + tree_node::Link(tree_node::MakeTreeNode(33), node11); + tree_node::Link(node11, tree1); + tree_node::Link(tree_node::MakeTreeNode(34), tree1); + + auto tree2 = tree_node::MakeTreeNode(22); + tree_node::Link(tree_node::MakeTreeNode(35), tree2); + tree_node::Link(tree_node::MakeTreeNode(36), tree2); + tree_node::Link(tree2, tree1); + return tree1; +} + +UNIT_TEST(TreeNode_PreOrderVisit) +{ + auto const tree = MakeTree(); + std::vector res; + tree_node::PreOrderVisit(tree, [&](auto const & node) { + res.emplace_back(node->GetData()); + }); + std::vector const expected = {1, 21, 31, 32, 33, 34, 22, 35, 36}; + TEST_EQUAL(res, expected, ()); + + auto countVisitedNode = 0; + tree_node::PreOrderVisit(tree, [&](auto const & node) { + ++countVisitedNode; + return node->GetData() == 32 ? base::ControlFlow::Break : base::ControlFlow::Continue; + }); + TEST_EQUAL(countVisitedNode, 4, ()); +} + +UNIT_TEST(TreeNode_Size) +{ + auto const tree = MakeTree(); + auto const size = tree_node::Size(tree); + TEST_EQUAL(size, 9, ()); +} + +UNIT_TEST(TreeNode_FindIf) +{ + auto const tree = MakeTree(); + auto node = tree_node::FindIf(tree, [](auto const & d) { return d == 1; }); + TEST(node, ()); + + node = tree_node::FindIf(tree, [](auto const & d) { return d == 22; }); + TEST(node, ()); + + node = tree_node::FindIf(tree, [](auto const & d) { return d == 36; }); + TEST(node, ()); + + node = tree_node::FindIf(tree, [](auto const & d) { return d == 100; }); + TEST(!node, ()); +} + +UNIT_TEST(TreeNode_GetDepth) +{ + auto const tree = MakeTree(); + auto depth = tree_node::GetDepth(tree_node::FindIf(tree, [](auto const & d) { return d == 1; })); + TEST_EQUAL(depth, 1, ()); + + depth = tree_node::GetDepth(tree_node::FindIf(tree, [](auto const & d) { return d == 22; })); + TEST_EQUAL(depth, 2, ()); + + depth = tree_node::GetDepth(tree_node::FindIf(tree, [](auto const & d) { return d == 36; })); + TEST_EQUAL(depth, 3, ()); +} +} // namespace