00001 //---------------------------------------------------------------------------- 00002 /** @file 00003 */ 00004 //---------------------------------------------------------------------------- 00005 00006 #include <boost/test/auto_unit_test.hpp> 00007 00008 #include "Digraph.hpp" 00009 00010 using namespace benzene; 00011 00012 //--------------------------------------------------------------------------- 00013 00014 namespace { 00015 00016 BOOST_AUTO_TEST_CASE(Digraph_AllTests) 00017 { 00018 Digraph<int> g; 00019 00020 g.AddEdge(1, 2); 00021 BOOST_CHECK_EQUAL(g.OutDegree(1), 1); 00022 BOOST_CHECK_EQUAL(g.OutDegree(2), 0); 00023 BOOST_CHECK_EQUAL(g.InDegree(1), 0); 00024 BOOST_CHECK_EQUAL(g.InDegree(2), 1); 00025 BOOST_CHECK(g.IsEdge(1, 2)); 00026 BOOST_CHECK(!g.IsEdge(2, 1)); 00027 BOOST_CHECK(g.VertexExists(1)); 00028 BOOST_CHECK(g.VertexExists(2)); 00029 00030 g.AddEdge(2, 1); 00031 BOOST_CHECK_EQUAL(g.OutDegree(1), 1); 00032 BOOST_CHECK_EQUAL(g.OutDegree(2), 1); 00033 BOOST_CHECK_EQUAL(g.InDegree(1), 1); 00034 BOOST_CHECK_EQUAL(g.InDegree(2), 1); 00035 BOOST_CHECK(g.IsEdge(1, 2)); 00036 BOOST_CHECK(g.IsEdge(2, 1)); 00037 00038 std::set<int> s; 00039 g.AddEdge(4, 5); 00040 g.AddEdge(1, 3); 00041 g.AddEdge(5, 7); 00042 g.AddEdge(3, 1); 00043 g.AddEdge(8, 1); 00044 g.AddEdge(9, 3); 00045 g.FindTwoCycles(s); 00046 BOOST_CHECK_EQUAL(s.size(), 3u); 00047 BOOST_CHECK_EQUAL(s.count(1), 1u); 00048 BOOST_CHECK_EQUAL(s.count(2), 1u); 00049 BOOST_CHECK_EQUAL(s.count(3), 1u); 00050 BOOST_CHECK_EQUAL(s.count(5), 0u); 00051 00052 s = g.OutSet(1); 00053 BOOST_CHECK_EQUAL(s.size(), 2u); 00054 BOOST_CHECK_EQUAL(s.count(2), 1u); 00055 BOOST_CHECK_EQUAL(s.count(3), 1u); 00056 00057 s = g.InSet(1); 00058 BOOST_CHECK_EQUAL(s.size(), 3u); 00059 BOOST_CHECK_EQUAL(s.count(2), 1u); 00060 BOOST_CHECK_EQUAL(s.count(3), 1u); 00061 BOOST_CHECK_EQUAL(s.count(8), 1u); 00062 00063 std::set<int> t; 00064 t.insert(1); 00065 t.insert(3); 00066 g.InSet(t, s); 00067 BOOST_CHECK_EQUAL(s.size(), 5u); 00068 BOOST_CHECK_EQUAL(s.count(1), 1u); 00069 BOOST_CHECK_EQUAL(s.count(2), 1u); 00070 BOOST_CHECK_EQUAL(s.count(3), 1u); 00071 BOOST_CHECK_EQUAL(s.count(8), 1u); 00072 BOOST_CHECK_EQUAL(s.count(9), 1u); 00073 00074 // add a loop 00075 g.AddEdge(1, 1); 00076 s = g.OutSet(1); 00077 BOOST_CHECK_EQUAL(s.size(), 3u); 00078 BOOST_CHECK_EQUAL(s.count(1), 1u); 00079 00080 // check the transpose 00081 Digraph<int> tr; 00082 g.Transpose(tr); 00083 BOOST_CHECK(tr.IsEdge(1, 2)); 00084 BOOST_CHECK(tr.IsEdge(2, 1)); 00085 BOOST_CHECK(tr.IsEdge(5, 4)); 00086 BOOST_CHECK(tr.IsEdge(3, 1)); 00087 BOOST_CHECK(tr.IsEdge(7, 5)); 00088 BOOST_CHECK(tr.IsEdge(1, 3)); 00089 BOOST_CHECK(tr.IsEdge(1, 8)); 00090 BOOST_CHECK(tr.IsEdge(3, 9)); 00091 BOOST_CHECK(tr.IsEdge(1, 1)); 00092 00093 // check sources and sinks 00094 t = g.Sources(); 00095 BOOST_CHECK_EQUAL(t.size(), 3u); 00096 BOOST_CHECK_EQUAL(t.count(4), 1u); 00097 BOOST_CHECK_EQUAL(t.count(8), 1u); 00098 BOOST_CHECK_EQUAL(t.count(9), 1u); 00099 t = g.Sinks(); 00100 BOOST_CHECK_EQUAL(t.size(), 1u); 00101 BOOST_CHECK_EQUAL(t.count(7), 1u); 00102 00103 // check removing edges and removing vertices 00104 g.Clear(); 00105 BOOST_CHECK_EQUAL(g.NumVertices(), 0); 00106 00107 g.AddEdge(1, 2); 00108 g.AddEdge(2, 3); 00109 g.RemoveEdge(1, 2); 00110 BOOST_CHECK(!g.IsEdge(1, 2)); 00111 BOOST_CHECK(g.VertexExists(1)); 00112 BOOST_CHECK(g.VertexExists(2)); 00113 BOOST_CHECK(g.VertexExists(3)); 00114 00115 g.AddEdge(1, 5); 00116 g.AddEdge(2, 5); 00117 g.RemoveVertex(5); 00118 BOOST_CHECK(!g.VertexExists(5)); 00119 BOOST_CHECK(g.VertexExists(1)); 00120 BOOST_CHECK(g.VertexExists(2)); 00121 BOOST_CHECK(!g.IsEdge(1, 5)); 00122 BOOST_CHECK(!g.IsEdge(2, 5)); 00123 00124 } 00125 00126 BOOST_AUTO_TEST_CASE(Digraph_StronglyConnectedComponents) 00127 { 00128 Digraph<int> g1; 00129 std::vector<std::set<int> > comp; 00130 00131 // 00132 // 1 -> 2 -> 3 -> 4 8 <-> 9 10 -> 11 00133 // ^ | 00134 // +---------+ 00135 // 00136 // Components are (1,2,3), (4), (8, 9), (10), (11) 00137 // 00138 g1.AddEdge(1, 2); 00139 g1.AddEdge(2, 3); 00140 g1.AddEdge(3, 1); 00141 g1.AddEdge(3, 4); 00142 00143 g1.AddEdge(8, 9); 00144 g1.AddEdge(9, 8); 00145 00146 g1.AddEdge(10, 11); 00147 00148 g1.FindStronglyConnectedComponents(comp); 00149 BOOST_CHECK_EQUAL(comp.size(), 5u); 00150 00151 // 00152 // 1 -> 2 -> 3 -> 4 -> 9 -> 10 -> 12 -> 13 14 -+ 00153 // ^ v ^ v ^----+ ^__| 00154 // 7 <- 6 <- 5 <- 8 +----11 00155 // 00156 // Components are: 00157 // (1,2,3,5,6,7), (4), (8), (9,10,11), (12,13), (14) 00158 // 00159 Digraph<int> g2; 00160 g2.AddEdge(1, 2); 00161 g2.AddEdge(2, 3); 00162 g2.AddEdge(3, 5); 00163 g2.AddEdge(5, 6); 00164 g2.AddEdge(6, 7); 00165 g2.AddEdge(7, 1); 00166 00167 g2.AddEdge(8, 5); 00168 00169 g2.AddEdge(4, 9); 00170 00171 g2.AddEdge(9, 10); 00172 g2.AddEdge(10, 11); 00173 g2.AddEdge(11, 9); 00174 00175 g2.AddEdge(10, 12); 00176 00177 g2.AddEdge(12, 13); 00178 g2.AddEdge(13, 12); 00179 00180 g2.AddEdge(14, 14); 00181 00182 g2.FindStronglyConnectedComponents(comp); 00183 BOOST_CHECK_EQUAL(comp.size(), 6u); 00184 00185 // 3 00186 // ^ 00187 // 1 > 2 00188 Digraph<int> g3; 00189 g3.AddEdge(1, 2); 00190 g3.AddEdge(1, 3); 00191 g3.FindStronglyConnectedComponents(comp); 00192 BOOST_CHECK_EQUAL(comp.size(), 3u); 00193 00194 // 3 00195 // v 00196 // 1 < 2 00197 Digraph<int> g4; 00198 g4.AddEdge(2, 1); 00199 g4.AddEdge(3, 1); 00200 g4.FindStronglyConnectedComponents(comp); 00201 BOOST_CHECK_EQUAL(comp.size(), 3u); 00202 } 00203 00204 } 00205 00206 //---------------------------------------------------------------------------