1+ #include " gtest/gtest.h"
2+ #include " CXXGraph.hpp"
3+ #include < map>
4+
5+ // https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm#Example
6+ TEST (FWTest, test_1)
7+ {
8+ CXXGRAPH::Node<int > node1 (1 , 1 );
9+ CXXGRAPH::Node<int > node2 (2 , 2 );
10+ CXXGRAPH::Node<int > node3 (3 , 3 );
11+ CXXGRAPH::Node<int > node4 (4 , 4 );
12+
13+ CXXGRAPH::DirectedWeightedEdge<int > edge1 (1 , node2, node1, 4 );
14+ CXXGRAPH::DirectedWeightedEdge<int > edge2 (2 , node1, node3, -2 );
15+ CXXGRAPH::DirectedWeightedEdge<int > edge3 (3 , node3, node4, 2 );
16+ CXXGRAPH::DirectedWeightedEdge<int > edge4 (4 , node4, node2, -1 );
17+ CXXGRAPH::DirectedWeightedEdge<int > edge5 (3 , node2, node3, 3 );
18+
19+ std::list<const CXXGRAPH::Edge<int > *> edgeSet;
20+ edgeSet.push_back (&edge1);
21+ edgeSet.push_back (&edge2);
22+ edgeSet.push_back (&edge3);
23+ edgeSet.push_back (&edge4);
24+ edgeSet.push_back (&edge5);
25+
26+ CXXGRAPH::Graph<int > graph (edgeSet);
27+ CXXGRAPH::FWResult res = graph.floydWarshall ();
28+
29+ std::map<std::pair<unsigned long , unsigned long >, double > pairwise_dist;
30+ auto key = std::make_pair (node1.getId (), node1.getId ());
31+ auto nodeSet = graph.getNodeSet ();
32+ double values[4 ][4 ] = {{0 , -1 , -2 , 0 }, {4 , 0 , 2 , 4 }, {5 , 1 , 0 , 2 }, {3 , -1 , 1 , 0 }};
33+ int row (0 ), col (0 );
34+ for (auto elem1 : nodeSet)
35+ {
36+ col = 0 ;
37+ for (auto elem2 : nodeSet)
38+ {
39+ auto key = std::make_pair (elem1->getId (), elem2->getId ());
40+ pairwise_dist[key] = values[row][col];
41+ col += 1 ;
42+ }
43+ row += 1 ;
44+ }
45+ auto isEqual = pairwise_dist.size () == res.result .size () && std::equal (pairwise_dist.begin (), pairwise_dist.end (), res.result .begin (),
46+ [](auto a, auto b)
47+ { return a.first == b.first ; });
48+
49+ ASSERT_TRUE (res.success );
50+ ASSERT_FALSE (res.negativeCycle );
51+ ASSERT_TRUE (isEqual);
52+ ASSERT_EQ (res.errorMessage , " " );
53+ }
54+
55+ // a graph with negative cycle
56+ TEST (FWTest, test_2)
57+ {
58+ CXXGRAPH::Node<int > node0 (0 , 0 );
59+ CXXGRAPH::Node<int > node1 (1 , 1 );
60+ CXXGRAPH::Node<int > node2 (2 , 2 );
61+ CXXGRAPH::DirectedWeightedEdge<int > edge1 (1 , node0, node1, 2 );
62+ CXXGRAPH::DirectedWeightedEdge<int > edge2 (2 , node1, node2, 3 );
63+ CXXGRAPH::DirectedWeightedEdge<int > edge3 (3 , node2, node0, -7 );
64+ std::list<const CXXGRAPH::Edge<int > *> edgeSet;
65+ edgeSet.push_back (&edge1);
66+ edgeSet.push_back (&edge2);
67+ edgeSet.push_back (&edge3);
68+ CXXGRAPH::Graph<int > graph (edgeSet);
69+ CXXGRAPH::FWResult res = graph.floydWarshall ();
70+ ASSERT_TRUE (res.success );
71+ ASSERT_TRUE (res.negativeCycle );
72+ ASSERT_EQ (res.errorMessage , " " );
73+ }
74+
75+ // UndirectedWeightedEdge
76+ TEST (FWTest, test_3)
77+ {
78+ CXXGRAPH::Node<int > node1 (1 , 1 );
79+ CXXGRAPH::Node<int > node2 (2 , 2 );
80+ CXXGRAPH::Node<int > node3 (3 , 3 );
81+ std::pair<const CXXGRAPH::Node<int > *, const CXXGRAPH::Node<int > *> pairNode (&node1, &node2);
82+ CXXGRAPH::DirectedWeightedEdge<int > edge1 (1 , pairNode, 1 );
83+ CXXGRAPH::DirectedWeightedEdge<int > edge2 (2 , node2, node3, 1 );
84+ CXXGRAPH::UndirectedWeightedEdge<int > edge3 (3 , node1, node3, 6 );
85+ std::list<const CXXGRAPH::Edge<int > *> edgeSet;
86+ edgeSet.push_back (&edge1);
87+ edgeSet.push_back (&edge2);
88+ edgeSet.push_back (&edge3);
89+ CXXGRAPH::Graph<int > graph (edgeSet);
90+ CXXGRAPH::FWResult res = graph.floydWarshall ();
91+ ASSERT_TRUE (res.success );
92+ ASSERT_FALSE (res.negativeCycle );
93+ ASSERT_EQ (res.errorMessage , " " );
94+ }
95+
96+ // No weighted edge
97+ TEST (FWTest, test_4)
98+ {
99+ CXXGRAPH::Node<int > node1 (1 , 1 );
100+ CXXGRAPH::Node<int > node2 (2 , 2 );
101+ CXXGRAPH::Node<int > node3 (3 , 3 );
102+ std::pair<const CXXGRAPH::Node<int > *, const CXXGRAPH::Node<int > *> pairNode (&node1, &node2);
103+ CXXGRAPH::DirectedWeightedEdge<int > edge1 (1 , pairNode, 1 );
104+ CXXGRAPH::DirectedWeightedEdge<int > edge2 (2 , node2, node3, 1 );
105+ CXXGRAPH::DirectedEdge<int > edge3 (3 , node1, node3);
106+ std::list<const CXXGRAPH::Edge<int > *> edgeSet;
107+ edgeSet.push_back (&edge1);
108+ edgeSet.push_back (&edge2);
109+ edgeSet.push_back (&edge3);
110+ CXXGRAPH::Graph<int > graph (edgeSet);
111+ CXXGRAPH::FWResult res = graph.floydWarshall ();
112+ ASSERT_FALSE (res.success );
113+ ASSERT_EQ (res.errorMessage , CXXGRAPH::ERR_NO_WEIGHTED_EDGE);
114+ }
0 commit comments