Skip to content

Commit a9c428b

Browse files
authored
Merge pull request #25 from Debashis08/feature-graph-implementation
test: added tests for scc
2 parents e9c4851 + c7342dc commit a9c428b

File tree

2 files changed

+109
-3
lines changed

2 files changed

+109
-3
lines changed

Tests/0000_CommonUtilities/UnitTestHelper.h

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include<iostream>
44
#include<vector>
55
#include<string>
6+
#include<algorithm>
67
using namespace std;
78

89
class UnitTestHelper
@@ -71,4 +72,39 @@ class UnitTestHelper
7172
}
7273
return result;
7374
}
75+
76+
77+
// This helper method is used to sort the vector of vectors of a particular typename.
78+
// Each inner vector is sorted first.
79+
// Then each of them are sorted by their first element, in increasing order.
80+
template<typename T>
81+
vector<vector<T>> SortVectorOfVectors(vector<vector<T>> data)
82+
{
83+
// Step 1: Sorting each inner vectors.
84+
for (auto& innerVector : data)
85+
{
86+
sort(innerVector.begin(), innerVector.end());
87+
}
88+
89+
// Step 2: Sorting all the vectors by their first element, in increasing order.
90+
sort(data.begin(), data.end(), [](const vector<T>& a, const vector<T>& b)
91+
{
92+
// Checking if both inner vectors are empty to prevent out-of-bounds access.
93+
if (a.empty() && b.empty())
94+
return false;
95+
96+
// Considering empty vector as less than non-empty vector.
97+
if (a.empty())
98+
return true;
99+
100+
// Considering non-empty vector as greater than empty vector.
101+
if (b.empty())
102+
return false;
103+
104+
// Comparing the first elements of each vector.
105+
return (a[0] < b[0]);
106+
});
107+
108+
return data;
109+
}
74110
};

Tests/0003_Graph/0004_StronglyConnectedComponentsTest.cc

Lines changed: 73 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ namespace StronglyConnectedComponentsTest
66
{
77
UnitTestHelper unitTestHelper;
88

9+
// Test case: Testing with a simple graph.
910
TEST(StronglyConnectedComponentsTesting, SimpleGraphTest)
1011
{
1112
StronglyConnectedComponentsGraph graph;
@@ -25,8 +26,77 @@ namespace StronglyConnectedComponentsTest
2526
graph.PushDirectedEdge(7, 8);
2627
graph.PushDirectedEdge(8, 6);
2728

28-
string actualResult = unitTestHelper.VerifyVectorResult(graph.FindAllStronglyConnectedComponents());
29-
string expectedResult = "[6 8 7][1 5][2 3][4]";
30-
EXPECT_EQ(actualResult, expectedResult);
29+
auto actualResult = graph.FindAllStronglyConnectedComponents();
30+
vector<vector<int>> expectedResult = { {6, 8, 7},{1, 5},{2, 3},{4} };
31+
EXPECT_EQ(unitTestHelper.SortVectorOfVectors(actualResult), unitTestHelper.SortVectorOfVectors(expectedResult));
3132
}
33+
34+
// Test case: Single Node.
35+
TEST(StronglyConnectedComponentsTesting, SingleNodeTest)
36+
{
37+
StronglyConnectedComponentsGraph graph;
38+
graph.PushSingleNode(1);
39+
40+
auto actualResult = graph.FindAllStronglyConnectedComponents();
41+
vector<vector<int>> expectedResult = { {1} };
42+
EXPECT_EQ(unitTestHelper.SortVectorOfVectors(actualResult), unitTestHelper.SortVectorOfVectors(expectedResult));
43+
}
44+
45+
// Test case: Disconnected Graph.
46+
TEST(StronglyConnectedComponentsTesting, DisconnectedGraphTest)
47+
{
48+
StronglyConnectedComponentsGraph graph;
49+
graph.PushSingleNode(1);
50+
graph.PushSingleNode(2);
51+
graph.PushSingleNode(3);
52+
53+
auto actualResult = graph.FindAllStronglyConnectedComponents();
54+
vector<vector<int>> expectedResult = { {1},{3},{2} };
55+
EXPECT_EQ(unitTestHelper.SortVectorOfVectors(actualResult), unitTestHelper.SortVectorOfVectors(expectedResult));
56+
}
57+
58+
// Test case: Chain of Nodes.
59+
TEST(StronglyConnectedComponentsTesting, ChainOfNodesTest)
60+
{
61+
StronglyConnectedComponentsGraph graph;
62+
graph.PushDirectedEdge(1, 2);
63+
graph.PushDirectedEdge(2, 3);
64+
graph.PushDirectedEdge(3, 4);
65+
66+
auto actualResult = graph.FindAllStronglyConnectedComponents();
67+
vector<vector<int>> expectedResult = { {2},{1},{3},{4} };
68+
EXPECT_EQ(unitTestHelper.SortVectorOfVectors(actualResult), unitTestHelper.SortVectorOfVectors(expectedResult));
69+
}
70+
71+
// Test case: Bidirectional Edge.
72+
TEST(StronglyConnectedComponentsTesting, BidirectionalEdgeTest)
73+
{
74+
StronglyConnectedComponentsGraph graph;
75+
graph.PushDirectedEdge(1, 2);
76+
graph.PushDirectedEdge(2, 1);
77+
78+
auto actualResult = graph.FindAllStronglyConnectedComponents();
79+
vector<vector<int>> expectedResult = { {2, 1} };
80+
EXPECT_EQ(unitTestHelper.SortVectorOfVectors(actualResult), unitTestHelper.SortVectorOfVectors(expectedResult));
81+
}
82+
83+
// Test case: Complex Graph.
84+
TEST(StronglyConnectedComponentsTesting, ComplexGraphTest)
85+
{
86+
StronglyConnectedComponentsGraph graph;
87+
88+
// Graph structure with multiple SCCs and isolated nodes.
89+
graph.PushDirectedEdge(1, 2);
90+
graph.PushDirectedEdge(2, 3);
91+
graph.PushDirectedEdge(3, 1); // Cycle: 1 -> 2 -> 3 -> 1
92+
graph.PushDirectedEdge(4, 5);
93+
graph.PushDirectedEdge(5, 6);
94+
graph.PushDirectedEdge(6, 4); // Cycle: 4 -> 5 -> 6 -> 4
95+
graph.PushDirectedEdge(7, 8); // Single direction: 7 -> 8
96+
graph.PushSingleNode(9); // Isolated node.
97+
98+
auto actualResult = graph.FindAllStronglyConnectedComponents();
99+
vector<vector<int>> expectedResult = { {4, 6, 5},{7}, { 2, 3, 1},{8}, {9} };
100+
EXPECT_EQ(unitTestHelper.SortVectorOfVectors(actualResult), unitTestHelper.SortVectorOfVectors(expectedResult));
101+
}
32102
}

0 commit comments

Comments
 (0)