diff --git a/test/graph_test.h b/test/graph_test.h new file mode 100644 --- /dev/null +++ b/test/graph_test.h @@ -0,0 +1,262 @@ +/* -*- C++ -*- + * + * This file is a part of LEMON, a generic C++ optimization library + * + * Copyright (C) 2003-2008 + * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport + * (Egervary Research Group on Combinatorial Optimization, EGRES). + * + * Permission to use, modify and distribute this software is granted + * provided that this copyright notice appears in all copies. For + * precise terms see the accompanying LICENSE file. + * + * This software is provided "AS IS" with no warranty of any kind, + * express or implied, and with no claim as to its suitability for any + * purpose. + * + */ + +#ifndef LEMON_TEST_GRAPH_TEST_H +#define LEMON_TEST_GRAPH_TEST_H + +#include +#include "test_tools.h" + +namespace lemon { + + template + void checkGraphNodeList(const Graph &G, int cnt) + { + typename Graph::NodeIt n(G); + for(int i=0;i + void checkGraphArcList(const Graph &G, int cnt) + { + typename Graph::ArcIt e(G); + for(int i=0;i + void checkGraphOutArcList(const Graph &G, typename Graph::Node n, int cnt) + { + typename Graph::OutArcIt e(G,n); + for(int i=0;i + void checkGraphInArcList(const Graph &G, typename Graph::Node n, int cnt) + { + typename Graph::InArcIt e(G,n); + for(int i=0;i + void checkGraphEdgeList(const Graph &G, int cnt) + { + typename Graph::EdgeIt e(G); + for(int i=0;i + void checkGraphIncEdgeList(const Graph &G, typename Graph::Node n, int cnt) + { + typename Graph::IncEdgeIt e(G,n); + 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 checkGraphIterators() { + checkDigraphIterators(); + typedef typename Graph::Edge Edge; + typedef typename Graph::EdgeIt EdgeIt; + typedef typename Graph::IncEdgeIt IncEdgeIt; + } + + // 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); + } + } + + // 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 checkDigraph() { + const int num = 5; + Digraph G; + checkGraphNodeList(G, 0); + checkGraphArcList(G, 0); + addPetersen(G, num); + bidirDigraph(G); + checkBidirPetersen(G, num); + } + + template + void checkGraph() { + const int num = 5; + Graph G; + checkGraphNodeList(G, 0); + checkGraphEdgeList(G, 0); + addUPetersen(G, num); + checkUndirPetersen(G, num); + } + +} //namespace lemon + +#endif