00001
00002
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
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
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
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
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
00133
00134
00135
00136
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
00153
00154
00155
00156
00157
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
00186
00187
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
00195
00196
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