src/test/graph_test.h
author deba
Mon, 20 Sep 2004 22:57:48 +0000
changeset 891 74589d20dbc3
parent 856 e9d73b8e3ab6
child 906 17f31d280385
permissions -rw-r--r--
template<typename CMap> Map(const CMap&) like constructors and
assigns are removed.
deba@891
     1
// -*- c++ -*-
alpar@800
     2
#ifndef HUGO_TEST_GRAPH_TEST_H
alpar@800
     3
#define HUGO_TEST_GRAPH_TEST_H
alpar@800
     4
alpar@800
     5
alpar@800
     6
#include "test_tools.h"
alpar@800
     7
alpar@800
     8
//! \ingroup misc
alpar@800
     9
//! \file
alpar@800
    10
//! \brief Some utility to  test graph classes.
alpar@800
    11
namespace hugo {
alpar@800
    12
deba@891
    13
  struct DummyType {
deba@891
    14
    int value;
deba@891
    15
    DummyType() {}
deba@891
    16
    DummyType(int p) : value(p) {}
deba@891
    17
    DummyType& operator=(int p) { value = p; return *this;}
deba@891
    18
  };
alpar@800
    19
deba@891
    20
deba@891
    21
  template<class Graph> void checkCompileStaticGraph(Graph &G) 
deba@891
    22
    {
deba@891
    23
      typedef typename Graph::Node Node;
deba@891
    24
      typedef typename Graph::NodeIt NodeIt;
deba@891
    25
      typedef typename Graph::Edge Edge;
deba@891
    26
      typedef typename Graph::EdgeIt EdgeIt;
deba@891
    27
      typedef typename Graph::InEdgeIt InEdgeIt;
deba@891
    28
      typedef typename Graph::OutEdgeIt OutEdgeIt;
alpar@800
    29
  
deba@891
    30
      {
deba@891
    31
	Node i; Node j(i); Node k(INVALID);
deba@891
    32
	i=j;
deba@891
    33
	bool b; b=true;
deba@891
    34
	b=(i==INVALID); b=(i!=INVALID);
deba@891
    35
	b=(i==j); b=(i!=j); b=(i<j);
deba@891
    36
      }
deba@891
    37
      {
deba@891
    38
	NodeIt i; NodeIt j(i); NodeIt k(INVALID); NodeIt l(G);
deba@891
    39
	i=j;
deba@891
    40
	j=G.first(i);
deba@891
    41
	j=++i;
deba@891
    42
	bool b; b=true;
deba@891
    43
	b=(i==INVALID); b=(i!=INVALID);
deba@891
    44
	Node n(i);
deba@891
    45
	n=i;
deba@891
    46
	b=(i==j); b=(i!=j); b=(i<j);
deba@891
    47
	//Node ->NodeIt conversion
deba@891
    48
	NodeIt ni(G,n);
deba@891
    49
      }
deba@891
    50
      {
deba@891
    51
	Edge i; Edge j(i); Edge k(INVALID);
deba@891
    52
	i=j;
deba@891
    53
	bool b; b=true;
deba@891
    54
	b=(i==INVALID); b=(i!=INVALID);
deba@891
    55
	b=(i==j); b=(i!=j); b=(i<j);
deba@891
    56
      }
deba@891
    57
      {
deba@891
    58
	EdgeIt i; EdgeIt j(i); EdgeIt k(INVALID); EdgeIt l(G);
deba@891
    59
	i=j;
deba@891
    60
	j=G.first(i);
deba@891
    61
	j=++i;
deba@891
    62
	bool b; b=true;
deba@891
    63
	b=(i==INVALID); b=(i!=INVALID);
deba@891
    64
	Edge e(i);
deba@891
    65
	e=i;
deba@891
    66
	b=(i==j); b=(i!=j); b=(i<j);
deba@891
    67
	//Edge ->EdgeIt conversion
deba@891
    68
	EdgeIt ei(G,e);
deba@891
    69
      }
deba@891
    70
      {
deba@891
    71
	Node n;
deba@891
    72
	InEdgeIt i; InEdgeIt j(i); InEdgeIt k(INVALID); InEdgeIt l(G,n);
deba@891
    73
	i=j;
deba@891
    74
	j=G.first(i,n);
deba@891
    75
	j=++i;
deba@891
    76
	bool b; b=true;
deba@891
    77
	b=(i==INVALID); b=(i!=INVALID);
deba@891
    78
	Edge e(i);
deba@891
    79
	e=i;
deba@891
    80
	b=(i==j); b=(i!=j); b=(i<j);
deba@891
    81
	//Edge ->InEdgeIt conversion
deba@891
    82
	InEdgeIt ei(G,e);
deba@891
    83
      }
deba@891
    84
      {
deba@891
    85
	Node n;
deba@891
    86
	OutEdgeIt i; OutEdgeIt j(i); OutEdgeIt k(INVALID); OutEdgeIt l(G,n);
deba@891
    87
	i=j;
deba@891
    88
	j=G.first(i,n);
deba@891
    89
	j=++i;
deba@891
    90
	bool b; b=true;
deba@891
    91
	b=(i==INVALID); b=(i!=INVALID);
deba@891
    92
	Edge e(i);
deba@891
    93
	e=i;
deba@891
    94
	b=(i==j); b=(i!=j); b=(i<j);
deba@891
    95
	//Edge ->OutEdgeIt conversion
deba@891
    96
	OutEdgeIt ei(G,e);
deba@891
    97
      }
deba@891
    98
      {
deba@891
    99
	Node n,m;
deba@891
   100
	n=m=INVALID;
deba@891
   101
	Edge e;
deba@891
   102
	e=INVALID;
deba@891
   103
	n=G.tail(e);
deba@891
   104
	n=G.head(e);
deba@891
   105
      }
deba@891
   106
      // id tests
deba@891
   107
      { Node n; int i=G.id(n); i=i; }
deba@891
   108
      { Edge e; int i=G.id(e); i=i; }
deba@891
   109
      //NodeMap tests
deba@891
   110
      {
deba@891
   111
	Node k;
deba@891
   112
	typename Graph::template NodeMap<int> m(G);
deba@891
   113
	//Const map
deba@891
   114
	typename Graph::template NodeMap<int> const &cm = m;
deba@891
   115
	//Inicialize with default value
deba@891
   116
	typename Graph::template NodeMap<int> mdef(G,12);
deba@891
   117
	//Copy
deba@891
   118
	typename Graph::template NodeMap<int> mm(cm);
deba@891
   119
	//Copy from another type
deba@891
   120
	typename Graph::template NodeMap<double> dm(cm);
deba@891
   121
	//Copy to more complex type
deba@891
   122
	typename Graph::template NodeMap<DummyType> em(cm);
deba@891
   123
	int v;
deba@891
   124
	v=m[k]; m[k]=v; m.set(k,v);
deba@891
   125
	v=cm[k];
alpar@800
   126
    
deba@891
   127
	m=cm;  
deba@891
   128
	dm=cm; //Copy from another type  
deba@891
   129
	em=cm; //Copy to more complex type
deba@891
   130
	{
deba@891
   131
	  //Check the typedef's
deba@891
   132
	  typename Graph::template NodeMap<int>::ValueType val;
deba@891
   133
	  val=1;
deba@891
   134
	  typename Graph::template NodeMap<int>::KeyType key;
deba@891
   135
	  key = typename Graph::NodeIt(G);
deba@891
   136
	}
deba@891
   137
      }  
deba@891
   138
      { //bool NodeMap
deba@891
   139
	Node k;
deba@891
   140
	typename Graph::template NodeMap<bool> m(G);
deba@891
   141
	typename Graph::template NodeMap<bool> const &cm = m;  //Const map
deba@891
   142
	//Inicialize with default value
deba@891
   143
	typename Graph::template NodeMap<bool> mdef(G,12);
deba@891
   144
	typename Graph::template NodeMap<bool> mm(cm);   //Copy
deba@891
   145
	typename Graph::template NodeMap<int> dm(cm); //Copy from another type
deba@891
   146
	bool v;
deba@891
   147
	v=m[k]; m[k]=v; m.set(k,v);
deba@891
   148
	v=cm[k];
deba@891
   149
    
deba@891
   150
	m=cm;  
deba@891
   151
	dm=cm; //Copy from another type
deba@891
   152
	m=dm; //Copy to another type
deba@891
   153
deba@891
   154
	{
deba@891
   155
	  //Check the typedef's
deba@891
   156
	  typename Graph::template NodeMap<bool>::ValueType val;
deba@891
   157
	  val=true;
deba@891
   158
	  typename Graph::template NodeMap<bool>::KeyType key;
deba@891
   159
	  key= typename Graph::NodeIt(G);
deba@891
   160
	}
deba@891
   161
      }
deba@891
   162
      //EdgeMap tests
deba@891
   163
      {
deba@891
   164
	Edge k;
deba@891
   165
	typename Graph::template EdgeMap<int> m(G);
deba@891
   166
	typename Graph::template EdgeMap<int> const &cm = m;  //Const map
deba@891
   167
	//Inicialize with default value
deba@891
   168
	typename Graph::template EdgeMap<int> mdef(G,12);
deba@891
   169
	typename Graph::template EdgeMap<int> mm(cm);   //Copy
deba@891
   170
	typename Graph::template EdgeMap<double> dm(cm); //Copy from another type
deba@891
   171
	int v;
deba@891
   172
	v=m[k]; m[k]=v; m.set(k,v);
deba@891
   173
	v=cm[k];
deba@891
   174
    
deba@891
   175
	m=cm;  
deba@891
   176
	dm=cm; //Copy from another type
deba@891
   177
	{
deba@891
   178
	  //Check the typedef's
deba@891
   179
	  typename Graph::template EdgeMap<int>::ValueType val;
deba@891
   180
	  val=1;
deba@891
   181
	  typename Graph::template EdgeMap<int>::KeyType key;
deba@891
   182
	  key= typename Graph::EdgeIt(G);
deba@891
   183
	}
deba@891
   184
      }  
deba@891
   185
      { //bool EdgeMap
deba@891
   186
	Edge k;
deba@891
   187
	typename Graph::template EdgeMap<bool> m(G);
deba@891
   188
	typename Graph::template EdgeMap<bool> const &cm = m;  //Const map
deba@891
   189
	//Inicialize with default value
deba@891
   190
	typename Graph::template EdgeMap<bool> mdef(G,12);
deba@891
   191
	typename Graph::template EdgeMap<bool> mm(cm);   //Copy
deba@891
   192
	typename Graph::template EdgeMap<int> dm(cm); //Copy from another type
deba@891
   193
	bool v;
deba@891
   194
	v=m[k]; m[k]=v; m.set(k,v);
deba@891
   195
	v=cm[k];
deba@891
   196
    
deba@891
   197
	m=cm;  
deba@891
   198
	dm=cm; //Copy from another type
deba@891
   199
	m=dm; //Copy to another type
deba@891
   200
	{
deba@891
   201
	  //Check the typedef's
deba@891
   202
	  typename Graph::template EdgeMap<bool>::ValueType val;
deba@891
   203
	  val=true;
deba@891
   204
	  typename Graph::template EdgeMap<bool>::KeyType key;
deba@891
   205
	  key= typename Graph::EdgeIt(G);
deba@891
   206
	}
deba@891
   207
      }
deba@891
   208
    }
deba@891
   209
deba@891
   210
  template<class Graph> void checkCompileGraph(Graph &G) 
alpar@800
   211
    {
deba@891
   212
      checkCompileStaticGraph(G);
deba@891
   213
deba@891
   214
      typedef typename Graph::Node Node;
deba@891
   215
      typedef typename Graph::NodeIt NodeIt;
deba@891
   216
      typedef typename Graph::Edge Edge;
deba@891
   217
      typedef typename Graph::EdgeIt EdgeIt;
deba@891
   218
      typedef typename Graph::InEdgeIt InEdgeIt;
deba@891
   219
      typedef typename Graph::OutEdgeIt OutEdgeIt;
deba@891
   220
  
deba@891
   221
      Node n,m;
deba@891
   222
      n=G.addNode();
deba@891
   223
      m=G.addNode();
deba@891
   224
      Edge e;
deba@891
   225
      e=G.addEdge(n,m); 
deba@891
   226
  
deba@891
   227
      //  G.clear();
alpar@800
   228
    }
alpar@800
   229
deba@891
   230
  template<class Graph> void checkCompileGraphEraseEdge(Graph &G) 
alpar@800
   231
    {
deba@891
   232
      typename Graph::Edge e;
deba@891
   233
      G.erase(e);
alpar@800
   234
    }
deba@891
   235
deba@891
   236
  template<class Graph> void checkCompileGraphEraseNode(Graph &G) 
alpar@800
   237
    {
deba@891
   238
      typename Graph::Node n;
deba@891
   239
      G.erase(n);
alpar@800
   240
    }
deba@891
   241
deba@891
   242
  template<class Graph> void checkCompileErasableGraph(Graph &G) 
alpar@800
   243
    {
deba@891
   244
      checkCompileGraph(G);
deba@891
   245
      checkCompileGraphEraseNode(G);
deba@891
   246
      checkCompileGraphEraseEdge(G);
alpar@800
   247
    }
alpar@800
   248
deba@891
   249
  template<class Graph> void checkCompileGraphFindEdge(Graph &G) 
deba@891
   250
    {
deba@891
   251
      typedef typename Graph::NodeIt Node;
deba@891
   252
      typedef typename Graph::NodeIt NodeIt;
alpar@800
   253
deba@891
   254
      G.findEdge(NodeIt(G),++NodeIt(G),G.findEdge(NodeIt(G),++NodeIt(G)));
deba@891
   255
      G.findEdge(Node(),Node(),G.findEdge(Node(),Node()));  
deba@891
   256
    }
alpar@800
   257
deba@891
   258
  template<class Graph> void checkGraphNodeList(Graph &G, int nn)
deba@891
   259
    {
deba@891
   260
      typename Graph::NodeIt n(G);
deba@891
   261
      for(int i=0;i<nn;i++) {
deba@891
   262
	check(n!=INVALID,"Wrong Node list linking.");
deba@891
   263
	++n;
deba@891
   264
      }
deba@891
   265
      check(n==INVALID,"Wrong Node list linking.");
deba@891
   266
    }
alpar@800
   267
deba@891
   268
  template<class Graph> void checkGraphEdgeList(Graph &G, int nn)
deba@891
   269
    {
deba@891
   270
      typedef typename Graph::EdgeIt EdgeIt;
alpar@800
   271
deba@891
   272
      EdgeIt e(G);
deba@891
   273
      for(int i=0;i<nn;i++) {
deba@891
   274
	check(e!=INVALID,"Wrong Edge list linking.");
deba@891
   275
	++e;
deba@891
   276
      }
deba@891
   277
      check(e==INVALID,"Wrong Edge list linking.");
deba@891
   278
    }
alpar@800
   279
deba@891
   280
  template<class Graph> void checkGraphOutEdgeList(Graph &G,
deba@891
   281
						   typename Graph::Node n,
deba@891
   282
						   int nn)
deba@891
   283
    {
deba@891
   284
      typename Graph::OutEdgeIt e(G,n);
deba@891
   285
      for(int i=0;i<nn;i++) {
deba@891
   286
	check(e!=INVALID,"Wrong OutEdge list linking.");
deba@891
   287
	++e;
deba@891
   288
      }
deba@891
   289
      check(e==INVALID,"Wrong OutEdge list linking.");
deba@891
   290
    }
alpar@800
   291
deba@891
   292
  template<class Graph> void checkGraphInEdgeList(Graph &G,
deba@891
   293
						  typename Graph::Node n,
deba@891
   294
						  int nn)
deba@891
   295
    {
deba@891
   296
      typename Graph::InEdgeIt e(G,n);
deba@891
   297
      for(int i=0;i<nn;i++) {
deba@891
   298
	check(e!=INVALID,"Wrong InEdge list linking.");
deba@891
   299
	++e;
deba@891
   300
      }
deba@891
   301
      check(e==INVALID,"Wrong InEdge list linking.");
deba@891
   302
    }
alpar@800
   303
deba@891
   304
  ///\file
deba@891
   305
  ///\todo Check head(), tail() as well;
alpar@800
   306
alpar@800
   307
  
alpar@800
   308
} //namespace hugo
alpar@800
   309
alpar@800
   310
alpar@800
   311
#endif