1+ #include " gtest/gtest.h"
2+ #include " CXXGraph.hpp"
3+
4+ // minimum spanning tree can differ so instead of checking
5+ // the exact order of elements, we can check some properties
6+ // like the length & cost of mst which must remain the same
7+
8+ // example taken from
9+ // https://www.geeksforgeeks.org/prims-mst-for-adjacency-list-representation-greedy-algo-6/TEST(FWTest, test_1)
10+ TEST (PrimTest, test_1)
11+ {
12+ CXXGRAPH::Node<int > node0 (0 , 0 );
13+ CXXGRAPH::Node<int > node1 (1 , 1 );
14+ CXXGRAPH::Node<int > node2 (2 , 2 );
15+ CXXGRAPH::Node<int > node3 (3 , 3 );
16+ CXXGRAPH::Node<int > node4 (4 , 4 );
17+ CXXGRAPH::Node<int > node5 (5 , 5 );
18+ CXXGRAPH::Node<int > node6 (6 , 6 );
19+ CXXGRAPH::Node<int > node7 (7 , 7 );
20+ CXXGRAPH::Node<int > node8 (8 , 8 );
21+
22+ CXXGRAPH::UndirectedWeightedEdge<int > edge1 (1 , node0, node1, 4 );
23+ CXXGRAPH::UndirectedWeightedEdge<int > edge2 (2 , node0, node7, 8 );
24+ CXXGRAPH::UndirectedWeightedEdge<int > edge3 (3 , node1, node7, 11 );
25+ CXXGRAPH::UndirectedWeightedEdge<int > edge4 (3 , node1, node2, 8 );
26+ CXXGRAPH::UndirectedWeightedEdge<int > edge5 (4 , node7, node8, 7 );
27+ CXXGRAPH::UndirectedWeightedEdge<int > edge6 (3 , node7, node6, 1 );
28+ CXXGRAPH::UndirectedWeightedEdge<int > edge7 (3 , node8, node2, 2 );
29+ CXXGRAPH::UndirectedWeightedEdge<int > edge8 (3 , node8, node6, 6 );
30+ CXXGRAPH::UndirectedWeightedEdge<int > edge9 (3 , node2, node5, 4 );
31+ CXXGRAPH::UndirectedWeightedEdge<int > edge10 (3 , node2, node3, 7 );
32+ CXXGRAPH::UndirectedWeightedEdge<int > edge11 (3 , node6, node5, 2 );
33+ CXXGRAPH::UndirectedWeightedEdge<int > edge12 (3 , node3, node4, 9 );
34+ CXXGRAPH::UndirectedWeightedEdge<int > edge13 (3 , node3, node5, 14 );
35+ CXXGRAPH::UndirectedWeightedEdge<int > edge14 (3 , node5, node4, 10 );
36+
37+ std::list<const CXXGRAPH::Edge<int > *> edgeSet;
38+ edgeSet.push_back (&edge1);
39+ edgeSet.push_back (&edge2);
40+ edgeSet.push_back (&edge3);
41+ edgeSet.push_back (&edge4);
42+ edgeSet.push_back (&edge5);
43+ edgeSet.push_back (&edge6);
44+ edgeSet.push_back (&edge7);
45+ edgeSet.push_back (&edge8);
46+ edgeSet.push_back (&edge9);
47+ edgeSet.push_back (&edge10);
48+ edgeSet.push_back (&edge11);
49+ edgeSet.push_back (&edge12);
50+ edgeSet.push_back (&edge13);
51+ edgeSet.push_back (&edge14);
52+
53+ CXXGRAPH::Graph<int > graph (edgeSet);
54+ CXXGRAPH::PrimResult res = graph.prim ();
55+
56+ ASSERT_TRUE (res.success );
57+ ASSERT_EQ (res.result .size (), graph.getNodeSet ().size ());
58+ ASSERT_EQ (res.mstCost , 37 );
59+ ASSERT_EQ (res.errorMessage , " " );
60+ }
61+
62+
63+ // example taken from
64+ // https://www.gatevidyalay.com/prims-algorithm-prim-algorithm-example/
65+ TEST (PrimTest, test_2)
66+ {
67+ CXXGRAPH::Node<int > node1 (1 , 1 );
68+ CXXGRAPH::Node<int > node2 (2 , 2 );
69+ CXXGRAPH::Node<int > node3 (3 , 3 );
70+ CXXGRAPH::Node<int > node4 (4 , 4 );
71+ CXXGRAPH::Node<int > node5 (5 , 5 );
72+ CXXGRAPH::Node<int > node6 (6 , 6 );
73+ CXXGRAPH::Node<int > node7 (7 , 7 );
74+
75+ CXXGRAPH::UndirectedWeightedEdge<int > edge1 (1 , node1, node2, 28 );
76+ CXXGRAPH::UndirectedWeightedEdge<int > edge2 (2 , node1, node6, 10 );
77+ CXXGRAPH::UndirectedWeightedEdge<int > edge3 (3 , node2, node7, 14 );
78+ CXXGRAPH::UndirectedWeightedEdge<int > edge4 (4 , node2, node3, 16 );
79+ CXXGRAPH::UndirectedWeightedEdge<int > edge5 (5 , node6, node5, 25 );
80+ CXXGRAPH::UndirectedWeightedEdge<int > edge6 (6 , node7, node5, 24 );
81+ CXXGRAPH::UndirectedWeightedEdge<int > edge7 (7 , node7, node4, 18 );
82+ CXXGRAPH::UndirectedWeightedEdge<int > edge8 (8 , node5, node4, 22 );
83+ CXXGRAPH::UndirectedWeightedEdge<int > edge9 (9 , node4, node3, 12 );
84+
85+ std::list<const CXXGRAPH::Edge<int > *> edgeSet;
86+ edgeSet.push_back (&edge1);
87+ edgeSet.push_back (&edge2);
88+ edgeSet.push_back (&edge3);
89+ edgeSet.push_back (&edge4);
90+ edgeSet.push_back (&edge5);
91+ edgeSet.push_back (&edge6);
92+ edgeSet.push_back (&edge7);
93+ edgeSet.push_back (&edge8);
94+ edgeSet.push_back (&edge9);
95+
96+ CXXGRAPH::Graph<int > graph (edgeSet);
97+ CXXGRAPH::PrimResult res = graph.prim ();
98+
99+ // double values[4][4] = {{0, -1, -2, 0}, {4, 0, 2, 4}, {5, 1, 0, 2}, {3, -1, 1, 0}};
100+ // unsigned long mst[] = {}
101+ ASSERT_TRUE (res.success );
102+ ASSERT_EQ (res.result .size (), graph.getNodeSet ().size ());
103+ ASSERT_EQ (res.mstCost , 99 );
104+ ASSERT_EQ (res.errorMessage , " " );
105+
106+ }
107+
108+
109+ // example taken from
110+ // https://www.gatevidyalay.com/prims-algorithm-prim-algorithm-example/
111+ TEST (PrimTest, test_3)
112+ {
113+ CXXGRAPH::Node<int > node1 (1 , 1 );
114+ CXXGRAPH::Node<int > node2 (2 , 2 );
115+ CXXGRAPH::Node<int > node3 (3 , 3 );
116+ CXXGRAPH::Node<int > node4 (4 , 4 );
117+ CXXGRAPH::Node<int > node5 (5 , 5 );
118+ CXXGRAPH::Node<int > node6 (6 , 6 );
119+ CXXGRAPH::Node<int > node7 (7 , 7 );
120+
121+ CXXGRAPH::UndirectedWeightedEdge<int > edge1 (1 , node1, node2, 1 );
122+ CXXGRAPH::UndirectedWeightedEdge<int > edge2 (2 , node1, node3, 5 );
123+ CXXGRAPH::UndirectedWeightedEdge<int > edge3 (3 , node2, node5, 7 );
124+ CXXGRAPH::UndirectedWeightedEdge<int > edge4 (4 , node2, node4, 8 );
125+ CXXGRAPH::UndirectedWeightedEdge<int > edge5 (5 , node2, node3, 4 );
126+ CXXGRAPH::UndirectedWeightedEdge<int > edge6 (6 , node3, node4, 6 );
127+ CXXGRAPH::UndirectedWeightedEdge<int > edge7 (7 , node3, node6, 2 );
128+ CXXGRAPH::UndirectedWeightedEdge<int > edge8 (8 , node4, node6, 9 );
129+ CXXGRAPH::UndirectedWeightedEdge<int > edge9 (9 , node4, node5, 11 );
130+ CXXGRAPH::UndirectedWeightedEdge<int > edge10 (9 , node5, node7, 10 );
131+ CXXGRAPH::UndirectedWeightedEdge<int > edge11 (9 , node5, node6, 3 );
132+ CXXGRAPH::UndirectedWeightedEdge<int > edge12 (9 , node6, node7, 12 );
133+
134+ std::list<const CXXGRAPH::Edge<int > *> edgeSet;
135+ edgeSet.push_back (&edge1);
136+ edgeSet.push_back (&edge2);
137+ edgeSet.push_back (&edge3);
138+ edgeSet.push_back (&edge4);
139+ edgeSet.push_back (&edge5);
140+ edgeSet.push_back (&edge6);
141+ edgeSet.push_back (&edge7);
142+ edgeSet.push_back (&edge8);
143+ edgeSet.push_back (&edge9);
144+ edgeSet.push_back (&edge10);
145+ edgeSet.push_back (&edge11);
146+ edgeSet.push_back (&edge12);
147+
148+ CXXGRAPH::Graph<int > graph (edgeSet);
149+ CXXGRAPH::PrimResult res = graph.prim ();
150+
151+ ASSERT_TRUE (res.success );
152+ ASSERT_EQ (res.result .size (), graph.getNodeSet ().size ());
153+ ASSERT_EQ (res.mstCost , 26 );
154+ ASSERT_EQ (res.errorMessage , " " );
155+ }
156+
157+ // test for directed and no weighted edge errors
158+ TEST (PrimTest, test_4)
159+ {
160+ CXXGRAPH::Node<int > node1 (1 , 1 );
161+ CXXGRAPH::Node<int > node2 (2 , 2 );
162+ CXXGRAPH::Node<int > node3 (3 , 3 );
163+ CXXGRAPH::DirectedWeightedEdge<int > edge1 (1 , node1, node2, 1 );
164+ CXXGRAPH::DirectedWeightedEdge<int > edge2 (2 , node2, node3, 1 );
165+ std::list<const CXXGRAPH::Edge<int > *> edgeSet;
166+ edgeSet.push_back (&edge1);
167+ edgeSet.push_back (&edge2);
168+ CXXGRAPH::Graph<int > graph (edgeSet);
169+ CXXGRAPH::PrimResult res = graph.prim ();
170+ ASSERT_FALSE (res.success );
171+ ASSERT_EQ (res.errorMessage , CXXGRAPH::ERR_DIR_GRAPH);
172+
173+ CXXGRAPH::UndirectedEdge<int > edge3 (3 , node1, node2);
174+ std::list<const CXXGRAPH::Edge<int > *> edgeSet1;
175+ edgeSet1.push_back (&edge3);
176+ CXXGRAPH::Graph<int > graph1 (edgeSet1);
177+ res = graph1.prim ();
178+ ASSERT_FALSE (res.success );
179+ ASSERT_EQ (res.errorMessage , CXXGRAPH::ERR_NO_WEIGHTED_EDGE);
180+ }
0 commit comments