diff -r 33f8d69e642a -r b6732e0d38c5 test/graph_test.h --- a/test/graph_test.h Fri Jul 18 17:26:12 2008 +0100 +++ b/test/graph_test.h Mon Jul 21 16:30:28 2008 +0200 @@ -19,7 +19,11 @@ #ifndef LEMON_TEST_GRAPH_TEST_H #define LEMON_TEST_GRAPH_TEST_H +#include + #include +#include + #include "test_tools.h" namespace lemon { @@ -42,6 +46,10 @@ typename Graph::ArcIt e(G); for(int i=0;i - void checkDigraphIterators() { - typedef typename Digraph::Node Node; - typedef typename Digraph::NodeIt NodeIt; - typedef typename Digraph::Arc Arc; - typedef typename Digraph::ArcIt ArcIt; - typedef typename Digraph::InArcIt InArcIt; - typedef typename Digraph::OutArcIt OutArcIt; + template + void checkGraphConArcList(const Graph &G, int cnt) { + int i = 0; + for (typename Graph::NodeIt u(G); u != INVALID; ++u) { + for (typename Graph::NodeIt v(G); v != INVALID; ++v) { + for (ConArcIt a(G, u, v); a != INVALID; ++a) { + check(G.source(a) == u, "Wrong iterator."); + check(G.target(a) == v, "Wrong iterator."); + ++i; + } + } + } + check(cnt == i, "Wrong iterator."); } template - void checkGraphIterators() { - checkDigraphIterators(); - typedef typename Graph::Edge Edge; - typedef typename Graph::EdgeIt EdgeIt; - typedef typename Graph::IncEdgeIt IncEdgeIt; + void checkGraphConEdgeList(const Graph &G, int cnt) { + int i = 0; + for (typename Graph::NodeIt u(G); u != INVALID; ++u) { + for (typename Graph::NodeIt v(G); v != INVALID; ++v) { + for (ConEdgeIt e(G, u, v); e != INVALID; ++e) { + check((G.u(e) == u && G.v(e) == v) || + (G.u(e) == v && G.v(e) == u), "Wrong iterator."); + i += u == v ? 2 : 1; + } + } + } + check(2 * cnt == i, "Wrong iterator."); } - // Structure returned by addPetersen() - template - struct PetStruct - { - // Vector containing the outer nodes - std::vector outer; - // Vector containing the inner nodes - std::vector inner; - // Vector containing the arcs of the inner circle - std::vector incir; - // Vector containing the arcs of the outer circle - std::vector outcir; - // Vector containing the chord arcs - std::vector chords; - }; - - // Adds the reverse pair of all arcs to a digraph - template - void bidirDigraph(Digraph &G) - { - typedef typename Digraph::Arc Arc; - typedef typename Digraph::ArcIt ArcIt; - - std::vector ee; - - for(ArcIt e(G);e!=INVALID;++e) ee.push_back(e); - - for(int i=0;i - PetStruct addPetersen(Digraph &G,int num = 5) - { - PetStruct n; - - for(int i=0;i - void checkBidirPetersen(const Digraph &G, int num = 5) - { - typedef typename Digraph::NodeIt NodeIt; - - checkGraphNodeList(G, 2 * num); - checkGraphArcList(G, 6 * num); - - for(NodeIt n(G);n!=INVALID;++n) { - checkGraphInArcList(G, n, 3); - checkGraphOutArcList(G, n, 3); + template + void checkArcDirections(const Graph& G) { + for (typename Graph::ArcIt a(G); a != INVALID; ++a) { + check(G.source(a) == G.target(G.oppositeArc(a)), "Wrong direction"); + check(G.target(a) == G.source(G.oppositeArc(a)), "Wrong direction"); + check(G.direct(a, G.direction(a)) == a, "Wrong direction"); } } - // Structure returned by addUPetersen() - template - struct UPetStruct - { - // Vector containing the outer nodes - std::vector outer; - // Vector containing the inner nodes - std::vector inner; - // Vector containing the edges of the inner circle - std::vector incir; - // Vector containing the edges of the outer circle - std::vector outcir; - // Vector containing the chord edges - std::vector chords; - }; - - // Adds a Petersen graph to \c G. - // Returns the nodes and edges of the generated graph. - template - UPetStruct addUPetersen(Graph &G,int num=5) - { - UPetStruct n; - - for(int i=0;i - void checkUndirPetersen(const Graph &G, int num = 5) - { - typedef typename Graph::NodeIt NodeIt; - - checkGraphNodeList(G, 2 * num); - checkGraphEdgeList(G, 3 * num); - checkGraphArcList(G, 6 * num); - - for(NodeIt n(G);n!=INVALID;++n) { - checkGraphIncEdgeList(G, n, 3); + template + void checkNodeIds(const Graph& G) { + std::set values; + for (typename Graph::NodeIt n(G); n != INVALID; ++n) { + check(G.nodeFromId(G.id(n)) == n, "Wrong id"); + check(values.find(G.id(n)) == values.end(), "Wrong id"); + check(G.id(n) <= G.maxNodeId(), "Wrong maximum id"); + values.insert(G.id(n)); } } - template - void checkDigraph() { - const int num = 5; - Digraph G; - checkGraphNodeList(G, 0); - checkGraphArcList(G, 0); - addPetersen(G, num); - bidirDigraph(G); - checkBidirPetersen(G, num); + template + void checkArcIds(const Graph& G) { + std::set values; + for (typename Graph::ArcIt a(G); a != INVALID; ++a) { + check(G.arcFromId(G.id(a)) == a, "Wrong id"); + check(values.find(G.id(a)) == values.end(), "Wrong id"); + check(G.id(a) <= G.maxArcId(), "Wrong maximum id"); + values.insert(G.id(a)); + } } - template - void checkGraph() { - const int num = 5; - Graph G; - checkGraphNodeList(G, 0); - checkGraphEdgeList(G, 0); - addUPetersen(G, num); - checkUndirPetersen(G, num); + template + void checkEdgeIds(const Graph& G) { + std::set values; + for (typename Graph::EdgeIt e(G); e != INVALID; ++e) { + check(G.edgeFromId(G.id(e)) == e, "Wrong id"); + check(values.find(G.id(e)) == values.end(), "Wrong id"); + check(G.id(e) <= G.maxEdgeId(), "Wrong maximum id"); + values.insert(G.id(e)); + } } + template + void checkGraphNodeMap(const Graph& G) { + typedef typename Graph::Node Node; + typedef typename Graph::NodeIt NodeIt; + + typedef typename Graph::template NodeMap IntNodeMap; + IntNodeMap map(G, 42); + for (NodeIt it(G); it != INVALID; ++it) { + check(map[it] == 42, "Wrong map constructor."); + } + int s = 0; + for (NodeIt it(G); it != INVALID; ++it) { + map[it] = 0; + check(map[it] == 0, "Wrong operator[]."); + map.set(it, s); + check(map[it] == s, "Wrong set."); + ++s; + } + s = s * (s - 1) / 2; + for (NodeIt it(G); it != INVALID; ++it) { + s -= map[it]; + } + check(s == 0, "Wrong sum."); + + map = constMap(12); + for (NodeIt it(G); it != INVALID; ++it) { + check(map[it] == 12, "Wrong operator[]."); + } + } + + template + void checkGraphArcMap(const Graph& G) { + typedef typename Graph::Arc Arc; + typedef typename Graph::ArcIt ArcIt; + + typedef typename Graph::template ArcMap IntArcMap; + IntArcMap map(G, 42); + for (ArcIt it(G); it != INVALID; ++it) { + check(map[it] == 42, "Wrong map constructor."); + } + int s = 0; + for (ArcIt it(G); it != INVALID; ++it) { + map[it] = 0; + check(map[it] == 0, "Wrong operator[]."); + map.set(it, s); + check(map[it] == s, "Wrong set."); + ++s; + } + s = s * (s - 1) / 2; + for (ArcIt it(G); it != INVALID; ++it) { + s -= map[it]; + } + check(s == 0, "Wrong sum."); + + map = constMap(12); + for (ArcIt it(G); it != INVALID; ++it) { + check(map[it] == 12, "Wrong operator[]."); + } + } + + template + void checkGraphEdgeMap(const Graph& G) { + typedef typename Graph::Edge Edge; + typedef typename Graph::EdgeIt EdgeIt; + + typedef typename Graph::template EdgeMap IntEdgeMap; + IntEdgeMap map(G, 42); + for (EdgeIt it(G); it != INVALID; ++it) { + check(map[it] == 42, "Wrong map constructor."); + } + int s = 0; + for (EdgeIt it(G); it != INVALID; ++it) { + map[it] = 0; + check(map[it] == 0, "Wrong operator[]."); + map.set(it, s); + check(map[it] == s, "Wrong set."); + ++s; + } + s = s * (s - 1) / 2; + for (EdgeIt it(G); it != INVALID; ++it) { + s -= map[it]; + } + check(s == 0, "Wrong sum."); + + map = constMap(12); + for (EdgeIt it(G); it != INVALID; ++it) { + check(map[it] == 12, "Wrong operator[]."); + } + } + + } //namespace lemon #endif