diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt index 20fa3a8f..0c1ff52d 100644 --- a/src/test/CMakeLists.txt +++ b/src/test/CMakeLists.txt @@ -17,6 +17,7 @@ add_files( FilePathTestSuite.cpp FileSystemTestSuite.cpp GraphTestSuite.cpp + HierarchyCacheTestSuite.cpp JavaIndexSampleProjectsTestSuite.cpp JavaParserTestSuite.cpp LogManagerTestSuite.cpp diff --git a/src/test/HierarchyCacheTestSuite.cpp b/src/test/HierarchyCacheTestSuite.cpp new file mode 100644 index 00000000..f0903971 --- /dev/null +++ b/src/test/HierarchyCacheTestSuite.cpp @@ -0,0 +1,83 @@ +#include "catch.hpp" + +#include "HierarchyCache.h" + +TEST_CASE("HierarchyCache returns no inheritance edges for empty node set") +{ + HierarchyCache cache; + cache.createInheritance(1, 1, 2); + std::vector>> inheritanceEdges = + cache.getInheritanceEdgesForNodeId(1, {}); + REQUIRE(inheritanceEdges.size() == 0); +} + +TEST_CASE("HierarchyCache returns inheritance edge for non-empty node set") +{ + HierarchyCache cache; + cache.createInheritance(1, 1, 2); + std::vector>> inheritanceEdges = + cache.getInheritanceEdgesForNodeId(1, {2}); + REQUIRE(inheritanceEdges.size() == 1); + { + const std::tuple>& edge = inheritanceEdges[0]; + const Id sourceId = std::get<0>(edge); + const Id targetId = std::get<1>(edge); + const std::vector edgeIds = std::get<2>(edge); + REQUIRE(sourceId == 1); + REQUIRE(targetId == 2); + REQUIRE(edgeIds.size() == 1); + REQUIRE(edgeIds[0] == 1); + } +} + +TEST_CASE("HierarchyCache skips inheritance for nodes not in set") +{ + HierarchyCache cache; + cache.createInheritance(1, 1, 2); + cache.createInheritance(2, 2, 3); + std::vector>> inheritanceEdges = + cache.getInheritanceEdgesForNodeId(1, {3}); + REQUIRE(inheritanceEdges.size() == 1); + { + const std::tuple>& edge = inheritanceEdges[0]; + const Id sourceId = std::get<0>(edge); + const Id targetId = std::get<1>(edge); + const std::vector edgeIds = std::get<2>(edge); + REQUIRE(sourceId == 1); + REQUIRE(targetId == 3); + REQUIRE(edgeIds.size() == 2); + REQUIRE(edgeIds[0] == 1); + REQUIRE(edgeIds[1] == 2); + } +} + +TEST_CASE("HierarchyCache returns inheritance edges for cyclic inheritance") +{ + HierarchyCache cache; + cache.createInheritance(1, 1, 2); + cache.createInheritance(2, 2, 1); + std::vector>> inheritanceEdges = + cache.getInheritanceEdgesForNodeId(1, {1, 2}); + REQUIRE(inheritanceEdges.size() == 2); + { + const std::tuple>& edge = inheritanceEdges[0]; + const Id sourceId = std::get<0>(edge); + const Id targetId = std::get<1>(edge); + const std::vector edgeIds = std::get<2>(edge); + REQUIRE(sourceId == 1); + REQUIRE(targetId == 2); + REQUIRE(edgeIds.size() == 1); + REQUIRE(edgeIds[0] == 1); + } + { + const std::tuple>& edge = inheritanceEdges[1]; + const Id sourceId = std::get<0>(edge); + const Id targetId = std::get<1>(edge); + const std::vector edgeIds = std::get<2>(edge); + REQUIRE(sourceId == 1); + REQUIRE(targetId == 1); + REQUIRE(edgeIds.size() == 2); + REQUIRE(edgeIds[0] == 1); + REQUIRE(edgeIds[1] == 2); + } +}