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: }