test/undir_graph_test.cc
author alpar
Thu, 28 Jul 2005 19:04:43 +0000
changeset 1603 5ad84fbadf2b
parent 1435 8e85e6bbefdf
child 1680 4f8b9cee576b
permissions -rw-r--r--
More docs
     1 // -*- C++ -*-
     2 
     3 #include <lemon/bits/undir_graph_extender.h>
     4 #include <lemon/concept/undir_graph.h>
     5 #include <lemon/list_graph.h>
     6 #include <lemon/smart_graph.h>
     7 #include <lemon/full_graph.h>
     8 
     9 #include <lemon/graph_utils.h>
    10 
    11 #include "test_tools.h"
    12 
    13 
    14 using namespace lemon;
    15 using namespace lemon::concept;
    16 
    17 void check_concepts() {
    18   typedef UndirGraphExtender<ListGraphBase> UndirListGraphBase;
    19 
    20   typedef IterableUndirGraphExtender<
    21     AlterableUndirGraphExtender<UndirListGraphBase> > IterableUndirListGraph;
    22 
    23   typedef MappableUndirGraphExtender<IterableUndirListGraph>
    24     MappableUndirListGraph;
    25 
    26   typedef ErasableUndirGraphExtender<
    27     ClearableUndirGraphExtender<
    28     ExtendableUndirGraphExtender<MappableUndirListGraph> > > Graph;
    29 
    30   checkConcept<BaseIterableUndirGraphConcept, Graph>();
    31   checkConcept<IterableUndirGraphConcept, Graph>();
    32   checkConcept<MappableUndirGraphConcept, Graph>();
    33 
    34   checkConcept<UndirGraph, Graph>();
    35   checkConcept<ErasableUndirGraph, Graph>();
    36 
    37   checkConcept<UndirGraph, UndirListGraph>();
    38   checkConcept<ErasableUndirGraph, UndirListGraph>();
    39 
    40   checkConcept<UndirGraph, UndirSmartGraph>();
    41   checkConcept<ExtendableUndirGraph, UndirSmartGraph>();
    42 
    43   checkConcept<UndirGraph, UndirFullGraph>();
    44 
    45   checkConcept<UndirGraph, UndirGraph>();
    46 }
    47 
    48 template <typename Graph>
    49 void check_item_counts(Graph &g, int n, int e) {
    50   check(countNodes(g)==n, "Wrong node number.");
    51   check(countEdges(g)==2*e, "Wrong edge number.");
    52 }
    53 
    54 template <typename Graph>
    55 void print_items(Graph &g) {
    56 
    57   typedef typename Graph::NodeIt NodeIt;
    58   typedef typename Graph::UndirEdgeIt UEdgeIt;
    59   typedef typename Graph::EdgeIt EdgeIt;
    60 
    61   std::cout << "Nodes" << std::endl;
    62   int i=0;
    63   for(NodeIt it(g); it!=INVALID; ++it, ++i) {
    64     std::cout << "  " << i << ": " << g.id(it) << std::endl;
    65   }
    66 
    67   std::cout << "UndirEdge" << std::endl;
    68   i=0;
    69   for(UEdgeIt it(g); it!=INVALID; ++it, ++i) {
    70     std::cout << "  " << i << ": " << g.id(it) 
    71 	 << " (" << g.id(g.source(it)) << ", " << g.id(g.target(it)) 
    72 	 << ")" << std::endl;
    73   }
    74 
    75   std::cout << "Edge" << std::endl;
    76   i=0;
    77   for(EdgeIt it(g); it!=INVALID; ++it, ++i) {
    78     std::cout << "  " << i << ": " << g.id(it)
    79 	 << " (" << g.id(g.source(it)) << ", " << g.id(g.target(it)) 
    80 	 << ")" << std::endl;
    81   }
    82 
    83 }
    84 
    85 template <typename Graph>
    86 void check_graph() {
    87 
    88   typedef typename Graph::Node Node;
    89   typedef typename Graph::UndirEdge UEdge;
    90   typedef typename Graph::Edge Edge;
    91   typedef typename Graph::NodeIt NodeIt;
    92   typedef typename Graph::UndirEdgeIt UEdgeIt;
    93   typedef typename Graph::EdgeIt EdgeIt;
    94 
    95   Graph g;
    96 
    97   check_item_counts(g,0,0);
    98 
    99   Node
   100     n1 = g.addNode(),
   101     n2 = g.addNode(),
   102     n3 = g.addNode();
   103 
   104   UEdge
   105     e1 = g.addEdge(n1, n2),
   106     e2 = g.addEdge(n2, n3);
   107 
   108   // print_items(g);
   109 
   110   check_item_counts(g,3,2);
   111 
   112 
   113 }
   114 
   115 int main() {
   116   check_concepts();
   117 
   118   check_graph<UndirListGraph>();
   119   check_graph<UndirSmartGraph>();
   120 
   121   {
   122     UndirFullGraph g(5);
   123     check_item_counts(g, 5, 10);
   124   }
   125 
   126   return 0;
   127 }