test/ugraph_test.cc
author deba
Wed, 01 Mar 2006 10:25:30 +0000
changeset 1991 d7442141d9ef
parent 1956 a055123339d5
child 2111 ea1fa1bc3f6d
permissions -rw-r--r--
The graph adadptors can be alteration observed.
In most cases it uses the adapted graph alteration notifiers.
Only special case is now the UndirGraphAdaptor, where
we have to proxy the signals from the graph.

The SubBidirGraphAdaptor is removed, because it doest not
gives more feature than the EdgeSubGraphAdaptor<UndirGraphAdaptor<Graph>>.

The ResGraphAdaptor is based on this composition.
     1 /* -*- C++ -*-
     2  *
     3  * This file is a part of LEMON, a generic C++ optimization library
     4  *
     5  * Copyright (C) 2003-2006
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     8  *
     9  * Permission to use, modify and distribute this software is granted
    10  * provided that this copyright notice appears in all copies. For
    11  * precise terms see the accompanying LICENSE file.
    12  *
    13  * This software is provided "AS IS" with no warranty of any kind,
    14  * express or implied, and with no claim as to its suitability for any
    15  * purpose.
    16  *
    17  */
    18 
    19 #include <lemon/bits/graph_extender.h>
    20 #include <lemon/concept/ugraph.h>
    21 #include <lemon/list_graph.h>
    22 #include <lemon/smart_graph.h>
    23 #include <lemon/full_graph.h>
    24 #include <lemon/grid_ugraph.h>
    25 
    26 #include <lemon/graph_utils.h>
    27 
    28 #include "test_tools.h"
    29 
    30 
    31 using namespace lemon;
    32 using namespace lemon::concept;
    33 
    34 void check_concepts() {
    35   checkConcept<UGraph, ListUGraph>();
    36   checkConcept<ErasableUGraph, ListUGraph>();
    37 
    38   checkConcept<UGraph, SmartUGraph>();
    39   checkConcept<ExtendableUGraph, SmartUGraph>();
    40 
    41   checkConcept<UGraph, FullUGraph>();
    42 
    43   checkConcept<UGraph, UGraph>();
    44 
    45   checkConcept<UGraph, GridUGraph>();
    46 }
    47 
    48 template <typename Graph>
    49 void check_item_counts(Graph &g, int n, int e) {
    50   int nn = 0;
    51   for (typename Graph::NodeIt it(g); it != INVALID; ++it) {
    52     ++nn;
    53   }
    54 
    55   check(nn == n, "Wrong node number.");
    56   check(countNodes(g) == n, "Wrong node number.");
    57 
    58   int ee = 0;
    59   for (typename Graph::EdgeIt it(g); it != INVALID; ++it) {
    60     ++ee;
    61   }
    62 
    63   check(ee == 2*e, "Wrong edge number.");
    64   check(countEdges(g) == 2*e, "Wrong edge number.");
    65 
    66   int uee = 0;
    67   for (typename Graph::UEdgeIt it(g); it != INVALID; ++it) {
    68     ++uee;
    69   }
    70 
    71   check(uee == e, "Wrong uedge number.");
    72   check(countUEdges(g) == e, "Wrong uedge number.");
    73 }
    74 
    75 template <typename Graph>
    76 void print_items(Graph &g) {
    77 
    78   typedef typename Graph::NodeIt NodeIt;
    79   typedef typename Graph::UEdgeIt UEdgeIt;
    80   typedef typename Graph::EdgeIt EdgeIt;
    81 
    82   std::cout << "Nodes" << std::endl;
    83   int i=0;
    84   for(NodeIt it(g); it!=INVALID; ++it, ++i) {
    85     std::cout << "  " << i << ": " << g.id(it) << std::endl;
    86   }
    87 
    88   std::cout << "UEdge" << std::endl;
    89   i=0;
    90   for(UEdgeIt it(g); it!=INVALID; ++it, ++i) {
    91     std::cout << "  " << i << ": " << g.id(it) 
    92 	 << " (" << g.id(g.source(it)) << ", " << g.id(g.target(it)) 
    93 	 << ")" << std::endl;
    94   }
    95 
    96   std::cout << "Edge" << std::endl;
    97   i=0;
    98   for(EdgeIt it(g); it!=INVALID; ++it, ++i) {
    99     std::cout << "  " << i << ": " << g.id(it)
   100 	 << " (" << g.id(g.source(it)) << ", " << g.id(g.target(it)) 
   101 	 << ")" << std::endl;
   102   }
   103 
   104 }
   105 
   106 template <typename Graph>
   107 void check_graph() {
   108 
   109   typedef typename Graph::Node Node;
   110   typedef typename Graph::UEdge UEdge;
   111   typedef typename Graph::Edge Edge;
   112   typedef typename Graph::NodeIt NodeIt;
   113   typedef typename Graph::UEdgeIt UEdgeIt;
   114   typedef typename Graph::EdgeIt EdgeIt;
   115 
   116   Graph g;
   117 
   118   check_item_counts(g,0,0);
   119 
   120   Node
   121     n1 = g.addNode(),
   122     n2 = g.addNode(),
   123     n3 = g.addNode();
   124 
   125   UEdge
   126     e1 = g.addEdge(n1, n2),
   127     e2 = g.addEdge(n2, n3);
   128 
   129   // print_items(g);
   130 
   131   check_item_counts(g,3,2);
   132 }
   133 
   134 void checkGridUGraph(const GridUGraph& g, int w, int h) {
   135   check(g.width() == w, "Wrong width");
   136   check(g.height() == h, "Wrong height");
   137 
   138   for (int i = 0; i < w; ++i) {
   139     for (int j = 0; j < h; ++j) {
   140       check(g.col(g(i, j)) == i, "Wrong col");
   141       check(g.row(g(i, j)) == j, "Wrong row");
   142     }
   143   }
   144   
   145   for (int i = 0; i < w; ++i) {
   146     for (int j = 0; j < h - 1; ++j) {
   147       check(g.source(g.down(g(i, j))) == g(i, j), "Wrong down");
   148       check(g.target(g.down(g(i, j))) == g(i, j + 1), "Wrong down");
   149     }
   150     check(g.down(g(i, h - 1)) == INVALID, "Wrong down");
   151   }
   152 
   153   for (int i = 0; i < w; ++i) {
   154     for (int j = 1; j < h; ++j) {
   155       check(g.source(g.up(g(i, j))) == g(i, j), "Wrong up");
   156       check(g.target(g.up(g(i, j))) == g(i, j - 1), "Wrong up");
   157     }
   158     check(g.up(g(i, 0)) == INVALID, "Wrong up");
   159   }
   160 
   161   for (int j = 0; j < h; ++j) {
   162     for (int i = 0; i < w - 1; ++i) {
   163       check(g.source(g.right(g(i, j))) == g(i, j), "Wrong right");
   164       check(g.target(g.right(g(i, j))) == g(i + 1, j), "Wrong right");      
   165     }
   166     check(g.right(g(w - 1, j)) == INVALID, "Wrong right");    
   167   }
   168 
   169   for (int j = 0; j < h; ++j) {
   170     for (int i = 1; i < w; ++i) {
   171       check(g.source(g.left(g(i, j))) == g(i, j), "Wrong left");
   172       check(g.target(g.left(g(i, j))) == g(i - 1, j), "Wrong left");      
   173     }
   174     check(g.left(g(0, j)) == INVALID, "Wrong left");    
   175   }
   176 }
   177 
   178 int main() {
   179   check_concepts();
   180 
   181   check_graph<ListUGraph>();
   182   check_graph<SmartUGraph>();
   183 
   184   {
   185     FullUGraph g(5);
   186     check_item_counts(g, 5, 10);
   187   }
   188 
   189   {
   190     GridUGraph g(5, 6);
   191     check_item_counts(g, 30, 49);
   192     checkGridUGraph(g, 5, 6);
   193   }
   194 
   195   std::cout << __FILE__ ": All tests passed.\n";
   196 
   197   return 0;
   198 }