klao@962: // -*- C++ -*- klao@962: klao@962: #include <lemon/undir_graph_extender.h> klao@962: #include <lemon/concept/undir_graph.h> klao@962: #include <lemon/list_graph.h> klao@962: #include <lemon/smart_graph.h> klao@962: #include <lemon/full_graph.h> klao@962: klao@1053: #include <lemon/graph_utils.h> klao@1053: klao@962: #include "test_tools.h" klao@962: klao@962: klao@962: using namespace lemon; klao@962: using namespace lemon::concept; klao@962: klao@1053: void check_concepts() { klao@962: typedef UndirGraphExtender<ListGraphBase> UndirListGraphBase; klao@962: klao@962: typedef IterableUndirGraphExtender< klao@962: AlterableUndirGraphExtender<UndirListGraphBase> > IterableUndirListGraph; klao@962: klao@1022: typedef MappableUndirGraphExtender<IterableUndirListGraph> klao@1022: MappableUndirListGraph; klao@1022: klao@1022: typedef ErasableUndirGraphExtender< klao@1022: ClearableUndirGraphExtender< klao@1022: ExtendableUndirGraphExtender<MappableUndirListGraph> > > Graph; klao@1022: klao@1022: checkConcept<BaseIterableUndirGraphConcept, Graph>(); klao@1022: checkConcept<IterableUndirGraphConcept, Graph>(); klao@1022: checkConcept<MappableUndirGraphConcept, Graph>(); klao@1022: klao@1022: checkConcept<UndirGraph, Graph>(); klao@1022: checkConcept<ErasableUndirGraph, Graph>(); klao@962: klao@1034: checkConcept<UndirGraph, UndirListGraph>(); klao@1034: checkConcept<ErasableUndirGraph, UndirListGraph>(); klao@1034: klao@1034: checkConcept<UndirGraph, UndirSmartGraph>(); klao@1034: checkConcept<ExtendableUndirGraph, UndirSmartGraph>(); klao@1034: klao@1030: checkConcept<UndirGraph, UndirGraph>(); klao@1053: } klao@1053: klao@1054: template <typename Graph> klao@1053: void check_item_counts(Graph &g, int n, int e) { klao@1053: check(countNodes(g)==n, "Wrong node number."); klao@1053: check(countEdges(g)==2*e, "Wrong edge number."); klao@1053: } klao@1053: klao@1054: template <typename Graph> klao@1053: void print_items(Graph &g) { klao@1054: klao@1054: typedef typename Graph::NodeIt NodeIt; klao@1054: typedef typename Graph::UndirEdgeIt UEdgeIt; klao@1054: typedef typename Graph::EdgeIt EdgeIt; klao@1054: klao@1053: cout << "Nodes" << endl; klao@1053: int i=0; klao@1053: for(NodeIt it(g); it!=INVALID; ++it, ++i) { klao@1053: cout << " " << i << ": " << g.id(it) << endl; klao@1053: } klao@1053: klao@1053: cout << "UndirEdge" << endl; klao@1053: i=0; klao@1053: for(UEdgeIt it(g); it!=INVALID; ++it, ++i) { klao@1053: cout << " " << i << ": " << g.id(it) klao@1053: << " (" << g.id(g.source(it)) << ", " << g.id(g.target(it)) klao@1053: << ")" << endl; klao@1053: } klao@1053: klao@1053: cout << "Edge" << endl; klao@1053: i=0; klao@1053: for(EdgeIt it(g); it!=INVALID; ++it, ++i) { klao@1053: cout << " " << i << ": " << g.id(it) klao@1053: << " (" << g.id(g.source(it)) << ", " << g.id(g.target(it)) klao@1053: << ")" << endl; klao@1053: } klao@1053: klao@1053: } klao@1053: klao@1054: template <typename Graph> klao@1054: void check_graph() { klao@1053: klao@1054: typedef typename Graph::Node Node; klao@1054: typedef typename Graph::UndirEdge UEdge; klao@1054: typedef typename Graph::Edge Edge; klao@1054: typedef typename Graph::NodeIt NodeIt; klao@1054: typedef typename Graph::UndirEdgeIt UEdgeIt; klao@1054: typedef typename Graph::EdgeIt EdgeIt; klao@1053: klao@1053: Graph g; klao@1053: klao@1053: check_item_counts(g,0,0); klao@1053: klao@1053: Node klao@1053: n1 = g.addNode(), klao@1053: n2 = g.addNode(), klao@1053: n3 = g.addNode(); klao@1053: klao@1053: UEdge klao@1053: e1 = g.addEdge(n1, n2), klao@1053: e2 = g.addEdge(n2, n3); klao@1053: klao@1053: // print_items(g); klao@1053: klao@1053: check_item_counts(g,3,2); klao@1030: klao@1054: klao@1054: } klao@1054: klao@1054: int main() { klao@1054: check_concepts(); klao@1054: klao@1054: check_graph<UndirListGraph>(); klao@1054: check_graph<UndirSmartGraph>(); klao@1054: klao@962: return 0; klao@962: }