diff --git a/Tests/0000_CommonUtilities/UnitTestHelper.h b/Tests/0000_CommonUtilities/UnitTestHelper.h index 9ab647a..8e32a97 100644 --- a/Tests/0000_CommonUtilities/UnitTestHelper.h +++ b/Tests/0000_CommonUtilities/UnitTestHelper.h @@ -3,6 +3,7 @@ #include #include #include +#include using namespace std; class UnitTestHelper @@ -71,4 +72,39 @@ class UnitTestHelper } return result; } + + + // This helper method is used to sort the vector of vectors of a particular typename. + // Each inner vector is sorted first. + // Then each of them are sorted by their first element, in increasing order. + template + vector> SortVectorOfVectors(vector> data) + { + // Step 1: Sorting each inner vectors. + for (auto& innerVector : data) + { + sort(innerVector.begin(), innerVector.end()); + } + + // Step 2: Sorting all the vectors by their first element, in increasing order. + sort(data.begin(), data.end(), [](const vector& a, const vector& b) + { + // Checking if both inner vectors are empty to prevent out-of-bounds access. + if (a.empty() && b.empty()) + return false; + + // Considering empty vector as less than non-empty vector. + if (a.empty()) + return true; + + // Considering non-empty vector as greater than empty vector. + if (b.empty()) + return false; + + // Comparing the first elements of each vector. + return (a[0] < b[0]); + }); + + return data; + } }; \ No newline at end of file diff --git a/Tests/0003_Graph/0004_StronglyConnectedComponentsTest.cc b/Tests/0003_Graph/0004_StronglyConnectedComponentsTest.cc index cc245e6..5648c10 100644 --- a/Tests/0003_Graph/0004_StronglyConnectedComponentsTest.cc +++ b/Tests/0003_Graph/0004_StronglyConnectedComponentsTest.cc @@ -6,6 +6,7 @@ namespace StronglyConnectedComponentsTest { UnitTestHelper unitTestHelper; + // Test case: Testing with a simple graph. TEST(StronglyConnectedComponentsTesting, SimpleGraphTest) { StronglyConnectedComponentsGraph graph; @@ -25,8 +26,77 @@ namespace StronglyConnectedComponentsTest graph.PushDirectedEdge(7, 8); graph.PushDirectedEdge(8, 6); - string actualResult = unitTestHelper.VerifyVectorResult(graph.FindAllStronglyConnectedComponents()); - string expectedResult = "[6 8 7][1 5][2 3][4]"; - EXPECT_EQ(actualResult, expectedResult); + auto actualResult = graph.FindAllStronglyConnectedComponents(); + vector> expectedResult = { {6, 8, 7},{1, 5},{2, 3},{4} }; + EXPECT_EQ(unitTestHelper.SortVectorOfVectors(actualResult), unitTestHelper.SortVectorOfVectors(expectedResult)); } + + // Test case: Single Node. + TEST(StronglyConnectedComponentsTesting, SingleNodeTest) + { + StronglyConnectedComponentsGraph graph; + graph.PushSingleNode(1); + + auto actualResult = graph.FindAllStronglyConnectedComponents(); + vector> expectedResult = { {1} }; + EXPECT_EQ(unitTestHelper.SortVectorOfVectors(actualResult), unitTestHelper.SortVectorOfVectors(expectedResult)); + } + + // Test case: Disconnected Graph. + TEST(StronglyConnectedComponentsTesting, DisconnectedGraphTest) + { + StronglyConnectedComponentsGraph graph; + graph.PushSingleNode(1); + graph.PushSingleNode(2); + graph.PushSingleNode(3); + + auto actualResult = graph.FindAllStronglyConnectedComponents(); + vector> expectedResult = { {1},{3},{2} }; + EXPECT_EQ(unitTestHelper.SortVectorOfVectors(actualResult), unitTestHelper.SortVectorOfVectors(expectedResult)); + } + + // Test case: Chain of Nodes. + TEST(StronglyConnectedComponentsTesting, ChainOfNodesTest) + { + StronglyConnectedComponentsGraph graph; + graph.PushDirectedEdge(1, 2); + graph.PushDirectedEdge(2, 3); + graph.PushDirectedEdge(3, 4); + + auto actualResult = graph.FindAllStronglyConnectedComponents(); + vector> expectedResult = { {2},{1},{3},{4} }; + EXPECT_EQ(unitTestHelper.SortVectorOfVectors(actualResult), unitTestHelper.SortVectorOfVectors(expectedResult)); + } + + // Test case: Bidirectional Edge. + TEST(StronglyConnectedComponentsTesting, BidirectionalEdgeTest) + { + StronglyConnectedComponentsGraph graph; + graph.PushDirectedEdge(1, 2); + graph.PushDirectedEdge(2, 1); + + auto actualResult = graph.FindAllStronglyConnectedComponents(); + vector> expectedResult = { {2, 1} }; + EXPECT_EQ(unitTestHelper.SortVectorOfVectors(actualResult), unitTestHelper.SortVectorOfVectors(expectedResult)); + } + + // Test case: Complex Graph. + TEST(StronglyConnectedComponentsTesting, ComplexGraphTest) + { + StronglyConnectedComponentsGraph graph; + + // Graph structure with multiple SCCs and isolated nodes. + graph.PushDirectedEdge(1, 2); + graph.PushDirectedEdge(2, 3); + graph.PushDirectedEdge(3, 1); // Cycle: 1 -> 2 -> 3 -> 1 + graph.PushDirectedEdge(4, 5); + graph.PushDirectedEdge(5, 6); + graph.PushDirectedEdge(6, 4); // Cycle: 4 -> 5 -> 6 -> 4 + graph.PushDirectedEdge(7, 8); // Single direction: 7 -> 8 + graph.PushSingleNode(9); // Isolated node. + + auto actualResult = graph.FindAllStronglyConnectedComponents(); + vector> expectedResult = { {4, 6, 5},{7}, { 2, 3, 1},{8}, {9} }; + EXPECT_EQ(unitTestHelper.SortVectorOfVectors(actualResult), unitTestHelper.SortVectorOfVectors(expectedResult)); + } } \ No newline at end of file