Main   Namespaces   Classes   Hierarchy   Annotated   Files   Compound   Global   Pages  

DigraphTest.cpp

Go to the documentation of this file.
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 //---------------------------------------------------------------------------


6 Jan 2011 Doxygen 1.6.3