From af2cf0f2e62c1d0afcae4712857f160bd5ad6f06 Mon Sep 17 00:00:00 2001 From: Debashis Nandi Date: Thu, 17 Oct 2024 01:23:57 +0530 Subject: [PATCH 1/3] topological sorting implementation added --- Headers/0003_Graph/0003_TopologicalSort.h | 34 ++++++++ .../0003_Graph/0003_TopologicalSort.cc | 78 +++++++++++++++++++ SourceCodes/0003_Graph/CMakeLists.txt | 1 + Tests/0003_Graph/0003_TopologicalSortTest.cc | 0 Tests/0003_Graph/CMakeLists.txt | 1 + 5 files changed, 114 insertions(+) create mode 100644 Headers/0003_Graph/0003_TopologicalSort.h create mode 100644 SourceCodes/0003_Graph/0003_TopologicalSort.cc create mode 100644 Tests/0003_Graph/0003_TopologicalSortTest.cc diff --git a/Headers/0003_Graph/0003_TopologicalSort.h b/Headers/0003_Graph/0003_TopologicalSort.h new file mode 100644 index 0000000..88cc7b3 --- /dev/null +++ b/Headers/0003_Graph/0003_TopologicalSort.h @@ -0,0 +1,34 @@ +#pragma once + +#include +#include +#include +#include +using namespace std; +enum color { WHITE, GRAY, BLACK }; + +class TopologicalSortNode +{ +public: + int data; + int color; + int discoveryTime; + int finishingTime; + TopologicalSortNode* parent; + TopologicalSortNode(int value); +}; + +class TopologicalSortGraph +{ +private: + int time; + map> _adjlist; + map _nodeMap; + TopologicalSortNode* MakeOrFindNode(int value); + list _topologicalSortedNodeList; + void DepthFirstSearch(TopologicalSortNode* DFSNode); +public: + void PushDirectedEdge(int valueU, int valueV); + void TopologicalSort(); + vector>> ShowTopologicalSortResult(); +}; \ No newline at end of file diff --git a/SourceCodes/0003_Graph/0003_TopologicalSort.cc b/SourceCodes/0003_Graph/0003_TopologicalSort.cc new file mode 100644 index 0000000..3c8d039 --- /dev/null +++ b/SourceCodes/0003_Graph/0003_TopologicalSort.cc @@ -0,0 +1,78 @@ +#include "../Headers/0003_Graph/0003_TopologicalSort.h" +#include +#include +#include +using namespace std; + +TopologicalSortNode::TopologicalSortNode(int value) +{ + this->data = value; + this->discoveryTime = INT_MAX; + this->finishingTime = INT_MAX; + this->color = WHITE; + this->parent = nullptr; +} + +TopologicalSortNode* TopologicalSortGraph::MakeOrFindNode(int value) +{ + TopologicalSortNode* node = nullptr; + if (this->_nodeMap.find(value) == this->_nodeMap.end()) + { + node = new TopologicalSortNode(value); + this->_nodeMap[value] = node; + } + else + { + node = this->_nodeMap[value]; + } + return node; +} + +void TopologicalSortGraph::DepthFirstSearch(TopologicalSortNode* nodeU) +{ + this->time++; + nodeU->discoveryTime = this->time; + nodeU->color = GRAY; + for (auto nodeV : this->_adjlist[nodeU]) + { + if (nodeV->color == WHITE) + { + nodeV->parent = nodeU; + this->DepthFirstSearch(nodeV); + } + } + nodeU->color = BLACK; + this->time++; + nodeU->finishingTime = time; + this->_topologicalSortedNodeList.push_front(nodeU); +} + +void TopologicalSortGraph::PushDirectedEdge(int valueU, int valueV) +{ + TopologicalSortNode* nodeU = this->MakeOrFindNode(valueU); + TopologicalSortNode* nodeV = this->MakeOrFindNode(valueV); + + this->_adjlist[nodeU].push_back(nodeV); +} + +void TopologicalSortGraph::TopologicalSort() +{ + this->time = 0; + for (auto& iterator : this->_nodeMap) + { + if (iterator.second->color == WHITE) + { + this->DepthFirstSearch(iterator.second); + } + } +} + +vector>> TopologicalSortGraph::ShowTopologicalSortResult() +{ + vector>> result; + for (auto& node : this->_topologicalSortedNodeList) + { + result.push_back(make_pair(node->data, make_pair(node->discoveryTime, node->finishingTime))); + } + return result; +} \ No newline at end of file diff --git a/SourceCodes/0003_Graph/CMakeLists.txt b/SourceCodes/0003_Graph/CMakeLists.txt index 4da8e98..adc8f1e 100644 --- a/SourceCodes/0003_Graph/CMakeLists.txt +++ b/SourceCodes/0003_Graph/CMakeLists.txt @@ -2,6 +2,7 @@ set(0003GRAPH_SOURCES 0001_BreadthFirstSearch.cc 0002_DepthFirstSearch.cc + 0003_TopologicalSort.cc ) # Create a library target diff --git a/Tests/0003_Graph/0003_TopologicalSortTest.cc b/Tests/0003_Graph/0003_TopologicalSortTest.cc new file mode 100644 index 0000000..e69de29 diff --git a/Tests/0003_Graph/CMakeLists.txt b/Tests/0003_Graph/CMakeLists.txt index b42277b..d8defca 100644 --- a/Tests/0003_Graph/CMakeLists.txt +++ b/Tests/0003_Graph/CMakeLists.txt @@ -14,6 +14,7 @@ add_executable( 0003GraphTests 0001_BreadthFirstSearchTest.cc 0002_DepthFirstSearchTest.cc + 0003_TopologicalSortTest.cc ) target_link_libraries( From 8201c77b1bb0969d39c5453750ed11e1beb40234 Mon Sep 17 00:00:00 2001 From: Debashis Nandi Date: Thu, 17 Oct 2024 01:32:06 +0530 Subject: [PATCH 2/3] unit test helper generalized --- Tests/0000_CommonUtilities/UnitTestHelper.h | 18 +++++++++++++++++- Tests/0002_Tree/0001_BinarySearchTreeTest.cc | 2 +- .../0003_Graph/0001_BreadthFirstSearchTest.cc | 9 +++++---- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/Tests/0000_CommonUtilities/UnitTestHelper.h b/Tests/0000_CommonUtilities/UnitTestHelper.h index f6c24aa..5ffc037 100644 --- a/Tests/0000_CommonUtilities/UnitTestHelper.h +++ b/Tests/0000_CommonUtilities/UnitTestHelper.h @@ -5,10 +5,10 @@ #include using namespace std; -template class UnitTestHelper { public: + template string VerifyVectorResult(vector vector) { string result = ""; @@ -19,4 +19,20 @@ class UnitTestHelper result.pop_back(); return result; } + + template + string VerifyVectorResult(vector> vector) + { + string result = ""; + for (auto& iterator : vector) + { + result += string(1, iterator.first) + "(" + to_string(iterator.second) + ")" + " "; + } + + if (!result.empty()) + { + result.pop_back(); + } + return result; + } }; \ No newline at end of file diff --git a/Tests/0002_Tree/0001_BinarySearchTreeTest.cc b/Tests/0002_Tree/0001_BinarySearchTreeTest.cc index b7cfd91..65a5090 100644 --- a/Tests/0002_Tree/0001_BinarySearchTreeTest.cc +++ b/Tests/0002_Tree/0001_BinarySearchTreeTest.cc @@ -5,7 +5,7 @@ namespace BinarySearchTreeTest { - UnitTestHelper unitTestHelper; + UnitTestHelper unitTestHelper; TEST(BSTInsertData, RecursiveInorderTest) { diff --git a/Tests/0003_Graph/0001_BreadthFirstSearchTest.cc b/Tests/0003_Graph/0001_BreadthFirstSearchTest.cc index b87ad99..977f57a 100644 --- a/Tests/0003_Graph/0001_BreadthFirstSearchTest.cc +++ b/Tests/0003_Graph/0001_BreadthFirstSearchTest.cc @@ -1,11 +1,12 @@ #include #include #include "../Headers/0003_Graph/0001_BreadthFirstSearch.h" -#include "../0000_CommonUtilities/UnitTestHelperVectorOfPair.h" +#include "../0000_CommonUtilities/UnitTestHelper.h" namespace BreadthFirstSearchTest { - UnitTestHelperVectorOfPair unitTestHelperVectorOfPair; + UnitTestHelper unitTestHelper; + TEST(BFSTesting, ShowBFSResultTest01) { @@ -24,7 +25,7 @@ namespace BreadthFirstSearchTest graph.BFS('s'); - string actualResult = unitTestHelperVectorOfPair.VerifyVectorOfPair(graph.ShowBFSResult()); + string actualResult = unitTestHelper.VerifyVectorResult(graph.ShowBFSResult()); string expectedResult = "r(1) s(0) t(2) u(3) v(2) w(1) x(2) y(3)"; EXPECT_EQ(actualResult, expectedResult); } @@ -37,7 +38,7 @@ namespace BreadthFirstSearchTest graph.BFS('s'); - string actualResult = unitTestHelperVectorOfPair.VerifyVectorOfPair(graph.ShowBFSResult()); + string actualResult = unitTestHelper.VerifyVectorResult(graph.ShowBFSResult()); string expectedResult = "r(1) s(0)"; EXPECT_EQ(actualResult, expectedResult); } From b41450704911c9a98af3b81d3238fee589ddd162 Mon Sep 17 00:00:00 2001 From: Debashis Nandi Date: Thu, 17 Oct 2024 23:15:18 +0530 Subject: [PATCH 3/3] graph data datatype changes --- Headers/0003_Graph/0001_BreadthFirstSearch.h | 14 +- Headers/0003_Graph/0002_DepthFirstSearch.h | 12 +- .../0003_Graph/0001_BreadthFirstSearch.cc | 12 +- .../0003_Graph/0002_DepthFirstSearch.cc | 11 +- Tests/0000_CommonUtilities/UnitTestHelper.h | 22 ++- .../UnitTestHelperVectorOfPair.h | 42 ----- .../0003_Graph/0001_BreadthFirstSearchTest.cc | 32 ++-- Tests/0003_Graph/0002_DepthFirstSearchTest.cc | 153 +++++++++--------- 8 files changed, 137 insertions(+), 161 deletions(-) delete mode 100644 Tests/0000_CommonUtilities/UnitTestHelperVectorOfPair.h diff --git a/Headers/0003_Graph/0001_BreadthFirstSearch.h b/Headers/0003_Graph/0001_BreadthFirstSearch.h index 6f5326e..05324d8 100644 --- a/Headers/0003_Graph/0001_BreadthFirstSearch.h +++ b/Headers/0003_Graph/0001_BreadthFirstSearch.h @@ -11,22 +11,22 @@ enum color { WHITE, GRAY, BLACK }; class BFSNode { public: - char data; + int data; int distance; int color; BFSNode* parent; - BFSNode(char value); + BFSNode(int value); }; class BFSGraph { private: map> _adjlist; - map _nodeMap; - BFSNode* MakeOrFindNode(char value); + map _nodeMap; + BFSNode* MakeOrFindNode(int value); void BreadthFirstSearch(BFSNode* node); public: - void PushUndirectedEdge(char valueU, char valueV); - void BFS(char value); - vector> ShowBFSResult(); + void PushUndirectedEdge(int valueU, int valueV); + void BFS(int value); + vector> ShowBFSResult(); }; \ No newline at end of file diff --git a/Headers/0003_Graph/0002_DepthFirstSearch.h b/Headers/0003_Graph/0002_DepthFirstSearch.h index d3b7544..b53c9ad 100644 --- a/Headers/0003_Graph/0002_DepthFirstSearch.h +++ b/Headers/0003_Graph/0002_DepthFirstSearch.h @@ -10,12 +10,12 @@ enum color { WHITE, GRAY, BLACK }; class DFSNode { public: - char data; + int data; int color; int discoveredTime; int finishingTime; DFSNode* parent; - DFSNode(char value); + DFSNode(int value); }; class DFSGraph @@ -23,11 +23,11 @@ class DFSGraph private: int time; map> _adjlist; - map _nodeMap; - DFSNode* MakeOrFindNode(char value); + map _nodeMap; + DFSNode* MakeOrFindNode(int value); void DepthFirstSearch(DFSNode* DFSNode); public: - void PushDirectedEdge(char valueU, char valueV); + void PushDirectedEdge(int valueU, int valueV); void DFS(); - vector>> ShowDFSResult(); + vector>> ShowDFSResult(); }; \ No newline at end of file diff --git a/SourceCodes/0003_Graph/0001_BreadthFirstSearch.cc b/SourceCodes/0003_Graph/0001_BreadthFirstSearch.cc index d88c04f..e29991b 100644 --- a/SourceCodes/0003_Graph/0001_BreadthFirstSearch.cc +++ b/SourceCodes/0003_Graph/0001_BreadthFirstSearch.cc @@ -7,7 +7,7 @@ #include using namespace std; -BFSNode::BFSNode(char value) +BFSNode::BFSNode(int value) { this->data = value; this->distance = INT_MAX; @@ -15,7 +15,7 @@ BFSNode::BFSNode(char value) this->parent = nullptr; } -BFSNode* BFSGraph::MakeOrFindNode(char value) +BFSNode* BFSGraph::MakeOrFindNode(int value) { BFSNode* node = nullptr; if (this->_nodeMap.find(value) == this->_nodeMap.end()) @@ -58,7 +58,7 @@ void BFSGraph::BreadthFirstSearch(BFSNode* node) } } -void BFSGraph::PushUndirectedEdge(char valueU, char valueV) +void BFSGraph::PushUndirectedEdge(int valueU, int valueV) { BFSNode* nodeU = this->MakeOrFindNode(valueU); BFSNode* nodeV = this->MakeOrFindNode(valueV); @@ -67,14 +67,14 @@ void BFSGraph::PushUndirectedEdge(char valueU, char valueV) this->_adjlist[nodeV].push_back(nodeU); } -void BFSGraph::BFS(char value) +void BFSGraph::BFS(int value) { this->BreadthFirstSearch(this->_nodeMap[value]); } -vector> BFSGraph::ShowBFSResult() +vector> BFSGraph::ShowBFSResult() { - vector> result; + vector> result; for (auto& node : this->_nodeMap) { result.push_back(make_pair(node.first, node.second->distance)); diff --git a/SourceCodes/0003_Graph/0002_DepthFirstSearch.cc b/SourceCodes/0003_Graph/0002_DepthFirstSearch.cc index c5641d9..bf0bb4f 100644 --- a/SourceCodes/0003_Graph/0002_DepthFirstSearch.cc +++ b/SourceCodes/0003_Graph/0002_DepthFirstSearch.cc @@ -4,7 +4,7 @@ #include using namespace std; -DFSNode::DFSNode(char value) +DFSNode::DFSNode(int value) { this->data = value; this->discoveredTime = INT_MAX; @@ -13,7 +13,7 @@ DFSNode::DFSNode(char value) this->parent = nullptr; } -DFSNode* DFSGraph::MakeOrFindNode(char value) +DFSNode* DFSGraph::MakeOrFindNode(int value) { DFSNode* node = nullptr; if (this->_nodeMap.find(value) == this->_nodeMap.end()) @@ -27,6 +27,7 @@ DFSNode* DFSGraph::MakeOrFindNode(char value) } return node; } + void DFSGraph::DepthFirstSearch(DFSNode* nodeU) { this->time++; @@ -45,7 +46,7 @@ void DFSGraph::DepthFirstSearch(DFSNode* nodeU) nodeU->finishingTime = time; } -void DFSGraph::PushDirectedEdge(char valueU, char valueV) +void DFSGraph::PushDirectedEdge(int valueU, int valueV) { DFSNode* nodeU = this->MakeOrFindNode(valueU); DFSNode* nodeV = this->MakeOrFindNode(valueV); @@ -65,9 +66,9 @@ void DFSGraph::DFS() } } -vector>> DFSGraph::ShowDFSResult() +vector>> DFSGraph::ShowDFSResult() { - vector>> result; + vector>> result; for (auto& node : this->_nodeMap) { result.push_back(make_pair(node.first, make_pair(node.second->discoveredTime, node.second->finishingTime))); diff --git a/Tests/0000_CommonUtilities/UnitTestHelper.h b/Tests/0000_CommonUtilities/UnitTestHelper.h index 5ffc037..5df489e 100644 --- a/Tests/0000_CommonUtilities/UnitTestHelper.h +++ b/Tests/0000_CommonUtilities/UnitTestHelper.h @@ -20,13 +20,29 @@ class UnitTestHelper return result; } - template - string VerifyVectorResult(vector> vector) + template + string VerifyVectorResult(vector> vector) + { + string result = ""; + for (auto& iterator : vector) + { + result += to_string(iterator.first) + "(" + to_string(iterator.second) + ")" + " "; + } + + if (!result.empty()) + { + result.pop_back(); + } + return result; + } + + template + string VerifyVectorResult(vector>> vector) { string result = ""; for (auto& iterator : vector) { - result += string(1, iterator.first) + "(" + to_string(iterator.second) + ")" + " "; + result += to_string(iterator.first) + "(" + to_string(iterator.second.first) + "," + to_string(iterator.second.second) + ")" + " "; } if (!result.empty()) diff --git a/Tests/0000_CommonUtilities/UnitTestHelperVectorOfPair.h b/Tests/0000_CommonUtilities/UnitTestHelperVectorOfPair.h deleted file mode 100644 index f2deab1..0000000 --- a/Tests/0000_CommonUtilities/UnitTestHelperVectorOfPair.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once - -#include -#include -#include -#include -using namespace std; - -template -class UnitTestHelperVectorOfPair -{ -public: - string VerifyVectorOfPair(vector> vector) - { - string result = ""; - for (auto& iterator : vector) - { - result += string(1, iterator.first) + "(" + to_string(iterator.second) + ")" + " "; - } - - if (!result.empty()) - { - result.pop_back(); - } - return result; - } - - string VerifyVectorOfPairOfTwo(vector>> vector) - { - string result = ""; - for (auto& iterator : vector) - { - result += string(1, iterator.first) + "(" + to_string(iterator.second.first) + "," + to_string(iterator.second.second) + ")" + " "; - } - - if (!result.empty()) - { - result.pop_back(); - } - return result; - } -}; \ No newline at end of file diff --git a/Tests/0003_Graph/0001_BreadthFirstSearchTest.cc b/Tests/0003_Graph/0001_BreadthFirstSearchTest.cc index 977f57a..e24870f 100644 --- a/Tests/0003_Graph/0001_BreadthFirstSearchTest.cc +++ b/Tests/0003_Graph/0001_BreadthFirstSearchTest.cc @@ -12,21 +12,21 @@ namespace BreadthFirstSearchTest { BFSGraph graph; - graph.PushUndirectedEdge('s', 'r'); - graph.PushUndirectedEdge('s', 'w'); - graph.PushUndirectedEdge('r', 'v'); - graph.PushUndirectedEdge('w', 't'); - graph.PushUndirectedEdge('w', 'x'); - graph.PushUndirectedEdge('t', 'x'); - graph.PushUndirectedEdge('t', 'u'); - graph.PushUndirectedEdge('x', 'u'); - graph.PushUndirectedEdge('x', 'y'); - graph.PushUndirectedEdge('u', 'y'); - - graph.BFS('s'); + graph.PushUndirectedEdge(1, 2); + graph.PushUndirectedEdge(1, 3); + graph.PushUndirectedEdge(2, 4); + graph.PushUndirectedEdge(3, 5); + graph.PushUndirectedEdge(3, 6); + graph.PushUndirectedEdge(5, 6); + graph.PushUndirectedEdge(5, 7); + graph.PushUndirectedEdge(6, 7); + graph.PushUndirectedEdge(6, 8); + graph.PushUndirectedEdge(7, 8); + + graph.BFS(1); string actualResult = unitTestHelper.VerifyVectorResult(graph.ShowBFSResult()); - string expectedResult = "r(1) s(0) t(2) u(3) v(2) w(1) x(2) y(3)"; + string expectedResult = "1(0) 2(1) 3(1) 4(2) 5(2) 6(2) 7(3) 8(3)"; EXPECT_EQ(actualResult, expectedResult); } @@ -34,12 +34,12 @@ namespace BreadthFirstSearchTest { BFSGraph graph; - graph.PushUndirectedEdge('s', 'r'); + graph.PushUndirectedEdge(1, 2); - graph.BFS('s'); + graph.BFS(1); string actualResult = unitTestHelper.VerifyVectorResult(graph.ShowBFSResult()); - string expectedResult = "r(1) s(0)"; + string expectedResult = "1(0) 2(1)"; EXPECT_EQ(actualResult, expectedResult); } } \ No newline at end of file diff --git a/Tests/0003_Graph/0002_DepthFirstSearchTest.cc b/Tests/0003_Graph/0002_DepthFirstSearchTest.cc index 9eef227..3fd7841 100644 --- a/Tests/0003_Graph/0002_DepthFirstSearchTest.cc +++ b/Tests/0003_Graph/0002_DepthFirstSearchTest.cc @@ -1,41 +1,42 @@ #include #include "../Headers/0003_Graph/0002_DepthFirstSearch.h" -#include "../0000_CommonUtilities/UnitTestHelperVectorOfPair.h" +#include "../0000_CommonUtilities/UnitTestHelper.h" namespace DepthFirstSearchTest { - UnitTestHelperVectorOfPair unitTestHelperVectorOfPair; + UnitTestHelper unitTestHelper; TEST(DFSTesting, ShowDFSResultTest01) { DFSGraph graph; - graph.PushDirectedEdge('u', 'v'); - graph.PushDirectedEdge('u', 'x'); - graph.PushDirectedEdge('v', 'y'); - graph.PushDirectedEdge('w', 'y'); - graph.PushDirectedEdge('w', 'z'); - graph.PushDirectedEdge('x', 'v'); - graph.PushDirectedEdge('y', 'x'); - graph.PushDirectedEdge('z', 'z'); + graph.PushDirectedEdge(1, 2); + graph.PushDirectedEdge(1, 4); + graph.PushDirectedEdge(2, 5); + graph.PushDirectedEdge(3, 5); + graph.PushDirectedEdge(3, 6); + graph.PushDirectedEdge(4, 2); + graph.PushDirectedEdge(5, 4); + graph.PushDirectedEdge(6, 6); graph.DFS(); - string actualResult = unitTestHelperVectorOfPair.VerifyVectorOfPairOfTwo(graph.ShowDFSResult()); - string expectedResult = "u(1,8) v(2,7) w(9,12) x(4,5) y(3,6) z(10,11)"; + string actualResult = unitTestHelper.VerifyVectorResult(graph.ShowDFSResult()); + string expectedResult = "1(1,8) 2(2,7) 3(9,12) 4(4,5) 5(3,6) 6(10,11)"; EXPECT_EQ(actualResult, expectedResult); } + TEST(DFSTesting, ShowDFSResultTest_SingleVertex) { DFSGraph graph; - graph.PushDirectedEdge('a', 'a'); + graph.PushDirectedEdge(1, 1); graph.DFS(); - string actualResult = unitTestHelperVectorOfPair.VerifyVectorOfPairOfTwo(graph.ShowDFSResult()); - string expectedResult = "a(1,2)"; + string actualResult = unitTestHelper.VerifyVectorResult(graph.ShowDFSResult()); + string expectedResult = "1(1,2)"; EXPECT_EQ(actualResult, expectedResult); } @@ -43,28 +44,28 @@ namespace DepthFirstSearchTest { DFSGraph graph; - graph.PushDirectedEdge('a', 'b'); - graph.PushDirectedEdge('c', 'd'); + graph.PushDirectedEdge(1, 2); + graph.PushDirectedEdge(3, 4); graph.DFS(); - string actualResult = unitTestHelperVectorOfPair.VerifyVectorOfPairOfTwo(graph.ShowDFSResult()); - string expectedResult = "a(1,4) b(2,3) c(5,8) d(6,7)"; + string actualResult = unitTestHelper.VerifyVectorResult(graph.ShowDFSResult()); + string expectedResult = "1(1,4) 2(2,3) 3(5,8) 4(6,7)"; EXPECT_EQ(actualResult, expectedResult); } - + TEST(DFSTesting, ShowDFSResultTest_CyclicGraph) { DFSGraph graph; - graph.PushDirectedEdge('a', 'b'); - graph.PushDirectedEdge('b', 'c'); - graph.PushDirectedEdge('c', 'a'); + graph.PushDirectedEdge(1, 2); + graph.PushDirectedEdge(2, 3); + graph.PushDirectedEdge(3, 1); graph.DFS(); - string actualResult = unitTestHelperVectorOfPair.VerifyVectorOfPairOfTwo(graph.ShowDFSResult()); - string expectedResult = "a(1,6) b(2,5) c(3,4)"; + string actualResult = unitTestHelper.VerifyVectorResult(graph.ShowDFSResult()); + string expectedResult = "1(1,6) 2(2,5) 3(3,4)"; EXPECT_EQ(actualResult, expectedResult); } @@ -73,26 +74,26 @@ namespace DepthFirstSearchTest DFSGraph graph; // Adding 15 nodes with several edges - graph.PushDirectedEdge('a', 'b'); - graph.PushDirectedEdge('a', 'c'); - graph.PushDirectedEdge('b', 'd'); - graph.PushDirectedEdge('d', 'e'); - graph.PushDirectedEdge('e', 'f'); - graph.PushDirectedEdge('f', 'g'); - graph.PushDirectedEdge('g', 'h'); - graph.PushDirectedEdge('h', 'i'); - graph.PushDirectedEdge('i', 'j'); - graph.PushDirectedEdge('j', 'k'); - graph.PushDirectedEdge('k', 'l'); - graph.PushDirectedEdge('l', 'm'); - graph.PushDirectedEdge('m', 'n'); - graph.PushDirectedEdge('n', 'o'); - graph.PushDirectedEdge('o', 'p'); + graph.PushDirectedEdge(1, 2); + graph.PushDirectedEdge(1, 3); + graph.PushDirectedEdge(2, 4); + graph.PushDirectedEdge(4, 5); + graph.PushDirectedEdge(5, 6); + graph.PushDirectedEdge(6, 7); + graph.PushDirectedEdge(7, 8); + graph.PushDirectedEdge(8, 9); + graph.PushDirectedEdge(9, 10); + graph.PushDirectedEdge(10, 11); + graph.PushDirectedEdge(11, 12); + graph.PushDirectedEdge(12, 13); + graph.PushDirectedEdge(13, 14); + graph.PushDirectedEdge(14, 15); + graph.PushDirectedEdge(15, 16); graph.DFS(); - string actualResult = unitTestHelperVectorOfPair.VerifyVectorOfPairOfTwo(graph.ShowDFSResult()); - string expectedResult = "a(1,32) b(2,29) c(30,31) d(3,28) e(4,27) f(5,26) g(6,25) h(7,24) i(8,23) j(9,22) k(10,21) l(11,20) m(12,19) n(13,18) o(14,17) p(15,16)"; + string actualResult = unitTestHelper.VerifyVectorResult(graph.ShowDFSResult()); + string expectedResult = "1(1,32) 2(2,29) 3(30,31) 4(3,28) 5(4,27) 6(5,26) 7(6,25) 8(7,24) 9(8,23) 10(9,22) 11(10,21) 12(11,20) 13(12,19) 14(13,18) 15(14,17) 16(15,16)"; EXPECT_EQ(actualResult, expectedResult); } @@ -101,31 +102,31 @@ namespace DepthFirstSearchTest DFSGraph graph; // Adding isolated nodes - graph.PushDirectedEdge('a', 'a'); - graph.PushDirectedEdge('b', 'b'); - graph.PushDirectedEdge('c', 'c'); + graph.PushDirectedEdge(1, 1); + graph.PushDirectedEdge(2, 2); + graph.PushDirectedEdge(3, 3); graph.DFS(); - string actualResult = unitTestHelperVectorOfPair.VerifyVectorOfPairOfTwo(graph.ShowDFSResult()); - string expectedResult = "a(1,2) b(3,4) c(5,6)"; + string actualResult = unitTestHelper.VerifyVectorResult(graph.ShowDFSResult()); + string expectedResult = "1(1,2) 2(3,4) 3(5,6)"; EXPECT_EQ(actualResult, expectedResult); } - + TEST(DFSTesting, ShowDFSResultTest_CyclicGraphWithBackEdges) { DFSGraph graph; // Creating a cycle with back edges - graph.PushDirectedEdge('a', 'b'); - graph.PushDirectedEdge('b', 'c'); - graph.PushDirectedEdge('c', 'a'); // Cycle back to 'a' - graph.PushDirectedEdge('b', 'd'); // Back edge + graph.PushDirectedEdge(1, 2); + graph.PushDirectedEdge(2, 3); + graph.PushDirectedEdge(3, 1); // Cycle back to 'a' + graph.PushDirectedEdge(2, 4); // Back edge graph.DFS(); - string actualResult = unitTestHelperVectorOfPair.VerifyVectorOfPairOfTwo(graph.ShowDFSResult()); - string expectedResult = "a(1,8) b(2,7) c(3,4) d(5,6)"; + string actualResult = unitTestHelper.VerifyVectorResult(graph.ShowDFSResult()); + string expectedResult = "1(1,8) 2(2,7) 3(3,4) 4(5,6)"; EXPECT_EQ(actualResult, expectedResult); } @@ -134,23 +135,23 @@ namespace DepthFirstSearchTest DFSGraph graph; // Complete graph of 4 nodes - graph.PushDirectedEdge('a', 'b'); - graph.PushDirectedEdge('a', 'c'); - graph.PushDirectedEdge('a', 'd'); - graph.PushDirectedEdge('b', 'a'); - graph.PushDirectedEdge('b', 'c'); - graph.PushDirectedEdge('b', 'd'); - graph.PushDirectedEdge('c', 'a'); - graph.PushDirectedEdge('c', 'b'); - graph.PushDirectedEdge('c', 'd'); - graph.PushDirectedEdge('d', 'a'); - graph.PushDirectedEdge('d', 'b'); - graph.PushDirectedEdge('d', 'c'); + graph.PushDirectedEdge(1, 2); + graph.PushDirectedEdge(1, 3); + graph.PushDirectedEdge(1, 4); + graph.PushDirectedEdge(2, 1); + graph.PushDirectedEdge(2, 3); + graph.PushDirectedEdge(2, 4); + graph.PushDirectedEdge(3, 1); + graph.PushDirectedEdge(3, 2); + graph.PushDirectedEdge(3, 4); + graph.PushDirectedEdge(4, 1); + graph.PushDirectedEdge(4, 2); + graph.PushDirectedEdge(4, 3); graph.DFS(); - string actualResult = unitTestHelperVectorOfPair.VerifyVectorOfPairOfTwo(graph.ShowDFSResult()); - string expectedResult = "a(1,8) b(2,7) c(3,6) d(4,5)"; + string actualResult = unitTestHelper.VerifyVectorResult(graph.ShowDFSResult()); + string expectedResult = "1(1,8) 2(2,7) 3(3,6) 4(4,5)"; EXPECT_EQ(actualResult, expectedResult); } @@ -159,17 +160,17 @@ namespace DepthFirstSearchTest DFSGraph graph; // Adding self-loops and parallel edges - graph.PushDirectedEdge('a', 'a'); - graph.PushDirectedEdge('a', 'b'); - graph.PushDirectedEdge('b', 'b'); - graph.PushDirectedEdge('b', 'c'); - graph.PushDirectedEdge('b', 'c'); // Parallel edge - graph.PushDirectedEdge('c', 'c'); // Self-loop + graph.PushDirectedEdge(1, 1); + graph.PushDirectedEdge(1, 2); + graph.PushDirectedEdge(2, 2); + graph.PushDirectedEdge(2, 3); + graph.PushDirectedEdge(2, 3); // Parallel edge + graph.PushDirectedEdge(3, 3); // Self-loop graph.DFS(); - string actualResult = unitTestHelperVectorOfPair.VerifyVectorOfPairOfTwo(graph.ShowDFSResult()); - string expectedResult = "a(1,6) b(2,5) c(3,4)"; + string actualResult = unitTestHelper.VerifyVectorResult(graph.ShowDFSResult()); + string expectedResult = "1(1,6) 2(2,5) 3(3,4)"; EXPECT_EQ(actualResult, expectedResult); }