src/test/graph_test.cc
author alpar
Fri, 03 Sep 2004 09:41:50 +0000
changeset 793 9cd0aeea47b0
parent 787 584270fba752
child 800 b70a494b4912
permissions -rw-r--r--
- BFD/DFS/Dijkstra compile test is done with skeleton::GraphSkeleton graph
and skeleton::ReadMap.
- 'skeleton::' is explicitely written instead of 'using namespace ...'
in graph_test.cc
- Output messages of type "makeRep(3)..." in unionfind_test.cc have been
changed in order not to confuse compiler output parsers.
alpar@503
     1
#include<iostream>
ladanyi@542
     2
#include<hugo/smart_graph.h>
alpar@564
     3
#include<hugo/skeletons/graph.h>
alpar@578
     4
#include<hugo/list_graph.h>
alpar@592
     5
#include<hugo/full_graph.h>
alpar@578
     6
alpar@567
     7
#include"test_tools.h"
alpar@567
     8
alpar@774
     9
/**
alpar@774
    10
\file
alpar@503
    11
This test makes consistency checks of list graph structures.
alpar@503
    12
alpar@774
    13
G.addNode(), G.addEdge(), G.tail(), G.head()
alpar@503
    14
alpar@592
    15
\todo Checks for empty graphs and isolated points.
alpar@774
    16
\todo Checks for Node->NodeIt, Edge->{EdgeIt,InEdgeIt,OutEdgeIt}
alpar@774
    17
conversion.
alpar@503
    18
*/
alpar@503
    19
alpar@503
    20
using namespace hugo;
alpar@503
    21
alpar@592
    22
template<class Graph> void checkCompileStaticGraph(Graph &G) 
alpar@503
    23
{
alpar@503
    24
  typedef typename Graph::Node Node;
alpar@503
    25
  typedef typename Graph::NodeIt NodeIt;
alpar@503
    26
  typedef typename Graph::Edge Edge;
alpar@503
    27
  typedef typename Graph::EdgeIt EdgeIt;
alpar@503
    28
  typedef typename Graph::InEdgeIt InEdgeIt;
alpar@503
    29
  typedef typename Graph::OutEdgeIt OutEdgeIt;
alpar@503
    30
  
alpar@503
    31
  {
alpar@503
    32
    Node i; Node j(i); Node k(INVALID);
alpar@503
    33
    i=j;
alpar@774
    34
    //    bool b=G.valid(i); b=b;
alpar@774
    35
    bool b; b=b;
alpar@774
    36
    b=(i==INVALID); b=(i!=INVALID);
alpar@503
    37
    b=(i==j); b=(i!=j); b=(i<j);
alpar@503
    38
  }
alpar@503
    39
  {
alpar@503
    40
    NodeIt i; NodeIt j(i); NodeIt k(INVALID); NodeIt l(G);
alpar@503
    41
    i=j;
alpar@503
    42
    j=G.first(i);
alpar@774
    43
    j=++i;
alpar@774
    44
    //    bool b=G.valid(i); b=b;
alpar@774
    45
    bool b; b=b;
alpar@774
    46
    b=(i==INVALID); b=(i!=INVALID);
alpar@503
    47
    Node n(i);
alpar@503
    48
    n=i;
alpar@503
    49
    b=(i==j); b=(i!=j); b=(i<j);
alpar@774
    50
    //Node ->NodeIt conversion
alpar@774
    51
    NodeIt ni(G,n);
alpar@503
    52
  }
alpar@503
    53
  {
alpar@503
    54
    Edge i; Edge j(i); Edge k(INVALID);
alpar@503
    55
    i=j;
alpar@774
    56
    //    bool b=G.valid(i); b=b;
alpar@774
    57
    bool b; b=b;
alpar@774
    58
    b=(i==INVALID); b=(i!=INVALID);
alpar@503
    59
    b=(i==j); b=(i!=j); b=(i<j);
alpar@503
    60
  }
alpar@503
    61
  {
alpar@503
    62
    EdgeIt i; EdgeIt j(i); EdgeIt k(INVALID); EdgeIt l(G);
alpar@503
    63
    i=j;
alpar@503
    64
    j=G.first(i);
alpar@774
    65
    j=++i;
alpar@774
    66
    //    bool b=G.valid(i); b=b;
alpar@774
    67
    bool b; b=b;
alpar@774
    68
    b=(i==INVALID); b=(i!=INVALID);
alpar@503
    69
    Edge e(i);
alpar@503
    70
    e=i;
alpar@503
    71
    b=(i==j); b=(i!=j); b=(i<j);
alpar@774
    72
    //Edge ->EdgeIt conversion
alpar@774
    73
    EdgeIt ei(G,e);
alpar@503
    74
  }
alpar@503
    75
  {
alpar@503
    76
    Node n;
alpar@503
    77
    InEdgeIt i; InEdgeIt j(i); InEdgeIt k(INVALID); InEdgeIt l(G,n);
alpar@503
    78
    i=j;
alpar@503
    79
    j=G.first(i,n);
alpar@774
    80
    j=++i;
alpar@774
    81
    //    bool b=G.valid(i); b=b;
alpar@774
    82
    bool b; b=b;
alpar@774
    83
    b=(i==INVALID); b=(i!=INVALID);
alpar@503
    84
    Edge e(i);
alpar@503
    85
    e=i;
alpar@503
    86
    b=(i==j); b=(i!=j); b=(i<j);
alpar@774
    87
    //Edge ->InEdgeIt conversion
alpar@774
    88
    InEdgeIt ei(G,e);
alpar@503
    89
  }
alpar@503
    90
  {
alpar@503
    91
    Node n;
alpar@503
    92
    OutEdgeIt i; OutEdgeIt j(i); OutEdgeIt k(INVALID); OutEdgeIt l(G,n);
alpar@503
    93
    i=j;
alpar@503
    94
    j=G.first(i,n);
alpar@774
    95
    j=++i;
alpar@774
    96
    //    bool b=G.valid(i); b=b;
alpar@774
    97
    bool b; b=b;
alpar@774
    98
    b=(i==INVALID); b=(i!=INVALID);
alpar@503
    99
    Edge e(i);
alpar@503
   100
    e=i;
alpar@503
   101
    b=(i==j); b=(i!=j); b=(i<j);
alpar@774
   102
    //Edge ->OutEdgeIt conversion
alpar@774
   103
    OutEdgeIt ei(G,e);
alpar@503
   104
  }
alpar@774
   105
  {
alpar@774
   106
    Node n,m;
alpar@774
   107
    n=m=INVALID;
alpar@774
   108
    Edge e;
alpar@774
   109
    e=INVALID;
alpar@774
   110
    n=G.tail(e);
alpar@774
   111
    n=G.head(e);
alpar@774
   112
  }
alpar@503
   113
  // id tests
alpar@774
   114
  { Node n; int i=G.id(n); i=i; }
alpar@774
   115
  { Edge e; int i=G.id(e); i=i; }
alpar@503
   116
  //NodeMap tests
alpar@503
   117
  {
alpar@503
   118
    Node k;
alpar@515
   119
    typename Graph::template NodeMap<int> m(G);
alpar@774
   120
    //Const map
alpar@774
   121
    typename Graph::template NodeMap<int> const &cm = m;
alpar@515
   122
    //Inicialize with default value
alpar@515
   123
    typename Graph::template NodeMap<int> mdef(G,12);
alpar@774
   124
    //Copy
alpar@774
   125
    typename Graph::template NodeMap<int> mm(cm);
alpar@774
   126
    //Copy from another type
alpar@774
   127
    typename Graph::template NodeMap<double> dm(cm);
alpar@503
   128
    int v;
alpar@503
   129
    v=m[k]; m[k]=v; m.set(k,v);
alpar@503
   130
    v=cm[k];
alpar@503
   131
    
alpar@503
   132
    m=cm;  
alpar@503
   133
    dm=cm; //Copy from another type
alpar@787
   134
    {
alpar@787
   135
      //Check the typedef's
alpar@787
   136
      typename Graph::template NodeMap<int>::ValueType val;
alpar@787
   137
      val=1;
alpar@787
   138
      typename Graph::template NodeMap<int>::KeyType key;
alpar@787
   139
      key = typename Graph::NodeIt(G);
alpar@787
   140
    }
alpar@503
   141
  }  
alpar@503
   142
  { //bool NodeMap
alpar@503
   143
    Node k;
alpar@515
   144
    typename Graph::template NodeMap<bool> m(G);
alpar@515
   145
    typename Graph::template NodeMap<bool> const &cm = m;  //Const map
alpar@515
   146
    //Inicialize with default value
alpar@515
   147
    typename Graph::template NodeMap<bool> mdef(G,12);
alpar@515
   148
    typename Graph::template NodeMap<bool> mm(cm);   //Copy
alpar@515
   149
    typename Graph::template NodeMap<int> dm(cm); //Copy from another type
alpar@503
   150
    bool v;
alpar@503
   151
    v=m[k]; m[k]=v; m.set(k,v);
alpar@503
   152
    v=cm[k];
alpar@503
   153
    
alpar@503
   154
    m=cm;  
alpar@503
   155
    dm=cm; //Copy from another type
alpar@504
   156
    m=dm; //Copy to another type
alpar@787
   157
alpar@787
   158
    {
alpar@787
   159
      //Check the typedef's
alpar@787
   160
      typename Graph::template NodeMap<bool>::ValueType val;
alpar@787
   161
      val=true;
alpar@787
   162
      typename Graph::template NodeMap<bool>::KeyType key;
alpar@787
   163
      key= typename Graph::NodeIt(G);
alpar@787
   164
    }
alpar@503
   165
  }
alpar@503
   166
  //EdgeMap tests
alpar@503
   167
  {
alpar@503
   168
    Edge k;
alpar@515
   169
    typename Graph::template EdgeMap<int> m(G);
alpar@515
   170
    typename Graph::template EdgeMap<int> const &cm = m;  //Const map
alpar@515
   171
    //Inicialize with default value
alpar@515
   172
    typename Graph::template EdgeMap<int> mdef(G,12);
alpar@515
   173
    typename Graph::template EdgeMap<int> mm(cm);   //Copy
alpar@515
   174
    typename Graph::template EdgeMap<double> dm(cm); //Copy from another type
alpar@503
   175
    int v;
alpar@503
   176
    v=m[k]; m[k]=v; m.set(k,v);
alpar@503
   177
    v=cm[k];
alpar@503
   178
    
alpar@503
   179
    m=cm;  
alpar@503
   180
    dm=cm; //Copy from another type
alpar@787
   181
    {
alpar@787
   182
      //Check the typedef's
alpar@787
   183
      typename Graph::template EdgeMap<int>::ValueType val;
alpar@787
   184
      val=1;
alpar@787
   185
      typename Graph::template EdgeMap<int>::KeyType key;
alpar@787
   186
      key= typename Graph::EdgeIt(G);
alpar@787
   187
    }
alpar@503
   188
  }  
alpar@503
   189
  { //bool EdgeMap
alpar@503
   190
    Edge k;
alpar@515
   191
    typename Graph::template EdgeMap<bool> m(G);
alpar@515
   192
    typename Graph::template EdgeMap<bool> const &cm = m;  //Const map
alpar@515
   193
    //Inicialize with default value
alpar@515
   194
    typename Graph::template EdgeMap<bool> mdef(G,12);
alpar@515
   195
    typename Graph::template EdgeMap<bool> mm(cm);   //Copy
alpar@515
   196
    typename Graph::template EdgeMap<int> dm(cm); //Copy from another type
alpar@503
   197
    bool v;
alpar@503
   198
    v=m[k]; m[k]=v; m.set(k,v);
alpar@503
   199
    v=cm[k];
alpar@503
   200
    
alpar@503
   201
    m=cm;  
alpar@503
   202
    dm=cm; //Copy from another type
alpar@504
   203
    m=dm; //Copy to another type
alpar@787
   204
    {
alpar@787
   205
      //Check the typedef's
alpar@787
   206
      typename Graph::template EdgeMap<bool>::ValueType val;
alpar@787
   207
      val=true;
alpar@787
   208
      typename Graph::template EdgeMap<bool>::KeyType key;
alpar@787
   209
      key= typename Graph::EdgeIt(G);
alpar@787
   210
    }
alpar@503
   211
  }
alpar@503
   212
}
alpar@503
   213
alpar@592
   214
template<class Graph> void checkCompile(Graph &G) 
alpar@592
   215
{
alpar@592
   216
  checkCompileStaticGraph(G);
alpar@592
   217
alpar@592
   218
  typedef typename Graph::Node Node;
alpar@592
   219
  typedef typename Graph::NodeIt NodeIt;
alpar@592
   220
  typedef typename Graph::Edge Edge;
alpar@592
   221
  typedef typename Graph::EdgeIt EdgeIt;
alpar@592
   222
  typedef typename Graph::InEdgeIt InEdgeIt;
alpar@592
   223
  typedef typename Graph::OutEdgeIt OutEdgeIt;
alpar@592
   224
  
alpar@592
   225
  Node n,m;
alpar@592
   226
  n=G.addNode();
alpar@592
   227
  m=G.addNode();
alpar@774
   228
  Edge e;
alpar@774
   229
  e=G.addEdge(n,m); 
alpar@592
   230
  
alpar@774
   231
  //  G.clear();
alpar@774
   232
}
alpar@774
   233
alpar@774
   234
template<class Graph> void checkCompileErase(Graph &G) 
alpar@774
   235
{
alpar@774
   236
  typedef typename Graph::Node Node;
alpar@774
   237
  typedef typename Graph::Edge Edge;
alpar@774
   238
  Node n;
alpar@774
   239
  Edge e;
alpar@774
   240
  G.erase(n);
alpar@774
   241
  G.erase(e);
alpar@774
   242
}
alpar@774
   243
alpar@774
   244
template<class Graph> void checkCompileEraseEdge(Graph &G) 
alpar@774
   245
{
alpar@774
   246
  typedef typename Graph::Edge Edge;
alpar@774
   247
  Edge e;
alpar@774
   248
  G.erase(e);
alpar@774
   249
}
alpar@774
   250
alpar@774
   251
template<class Graph> void checkCompileFindEdge(Graph &G) 
alpar@774
   252
{
alpar@774
   253
  typedef typename Graph::NodeIt Node;
alpar@774
   254
  typedef typename Graph::NodeIt NodeIt;
alpar@774
   255
alpar@774
   256
  G.findEdge(NodeIt(G),++NodeIt(G),G.findEdge(NodeIt(G),++NodeIt(G)));
alpar@774
   257
  G.findEdge(Node(),Node(),G.findEdge(Node(),Node()));  
alpar@592
   258
}
alpar@592
   259
alpar@592
   260
alpar@503
   261
template<class Graph> void checkNodeList(Graph &G, int nn)
alpar@503
   262
{
alpar@503
   263
  typename Graph::NodeIt n(G);
alpar@503
   264
  for(int i=0;i<nn;i++) {
alpar@774
   265
    check(n!=INVALID,"Wrong Node list linking.");
alpar@774
   266
    ++n;
alpar@503
   267
  }
alpar@774
   268
  check(n==INVALID,"Wrong Node list linking.");
alpar@503
   269
}
alpar@503
   270
alpar@503
   271
template<class Graph> void checkEdgeList(Graph &G, int nn)
alpar@503
   272
{
alpar@503
   273
  typedef typename Graph::EdgeIt EdgeIt;
alpar@503
   274
alpar@503
   275
  EdgeIt e(G);
alpar@503
   276
  for(int i=0;i<nn;i++) {
alpar@774
   277
    check(e!=INVALID,"Wrong Edge list linking.");
alpar@774
   278
    ++e;
alpar@503
   279
  }
alpar@774
   280
  check(e==INVALID,"Wrong Edge list linking.");
alpar@503
   281
}
alpar@503
   282
alpar@503
   283
template<class Graph> void checkOutEdgeList(Graph &G,
alpar@503
   284
					    typename Graph::Node n,
alpar@503
   285
					    int nn)
alpar@503
   286
{
alpar@503
   287
  typename Graph::OutEdgeIt e(G,n);
alpar@503
   288
  for(int i=0;i<nn;i++) {
alpar@774
   289
    check(e!=INVALID,"Wrong OutEdge list linking.");
alpar@774
   290
    ++e;
alpar@503
   291
  }
alpar@774
   292
  check(e==INVALID,"Wrong OutEdge list linking.");
alpar@503
   293
}
alpar@503
   294
alpar@503
   295
template<class Graph> void checkInEdgeList(Graph &G,
alpar@774
   296
					   typename Graph::Node n,
alpar@774
   297
					   int nn)
alpar@503
   298
{
alpar@503
   299
  typename Graph::InEdgeIt e(G,n);
alpar@503
   300
  for(int i=0;i<nn;i++) {
alpar@774
   301
    check(e!=INVALID,"Wrong InEdge list linking.");
alpar@774
   302
    ++e;
alpar@503
   303
  }
alpar@774
   304
  check(e==INVALID,"Wrong InEdge list linking.");
alpar@503
   305
}
alpar@503
   306
alpar@774
   307
///\file
alpar@774
   308
///\todo Checks head(), tail() as well;
alpar@774
   309
alpar@503
   310
template<class Graph> void bidirPetersen(Graph &G)
alpar@503
   311
{
alpar@503
   312
  typedef typename Graph::Edge Edge;
alpar@503
   313
  typedef typename Graph::EdgeIt EdgeIt;
alpar@503
   314
  
alpar@503
   315
  checkEdgeList(G,15);
alpar@503
   316
  
alpar@503
   317
  std::vector<Edge> ee;
alpar@503
   318
  
alpar@774
   319
  for(EdgeIt e(G);e!=INVALID;++e) ee.push_back(e);
alpar@503
   320
alpar@503
   321
  for(typename std::vector<Edge>::iterator p=ee.begin();p!=ee.end();p++)
alpar@503
   322
    G.addEdge(G.head(*p),G.tail(*p));
alpar@503
   323
}
alpar@503
   324
alpar@503
   325
template<class Graph> void checkPetersen(Graph &G)
alpar@503
   326
{
alpar@503
   327
  typedef typename Graph::Node Node;
alpar@503
   328
alpar@503
   329
  typedef typename Graph::EdgeIt EdgeIt;
alpar@503
   330
  typedef typename Graph::NodeIt NodeIt;
alpar@503
   331
alpar@503
   332
  checkNodeList(G,10);
alpar@503
   333
  checkEdgeList(G,30);
alpar@503
   334
alpar@774
   335
  for(NodeIt n(G);n!=INVALID;++n) {
alpar@503
   336
    checkInEdgeList(G,n,3);
alpar@503
   337
    checkOutEdgeList(G,n,3);
alpar@774
   338
    ++n;
alpar@503
   339
  }  
alpar@503
   340
}
alpar@503
   341
alpar@774
   342
//Compile GraphSkeleton
alpar@793
   343
template void checkCompileStaticGraph<skeleton::StaticGraphSkeleton>
alpar@793
   344
(skeleton::StaticGraphSkeleton &);
alpar@793
   345
alpar@793
   346
template void checkCompile<skeleton::GraphSkeleton>(skeleton::GraphSkeleton &);
alpar@793
   347
alpar@793
   348
template void checkCompileErase<skeleton::EraseableGraphSkeleton>
alpar@793
   349
(skeleton::EraseableGraphSkeleton &);
alpar@733
   350
alpar@774
   351
//Compile SmartGraph
alpar@503
   352
template void checkCompile<SmartGraph>(SmartGraph &);
deba@783
   353
alpar@774
   354
//Compile SymSmartGraph
alpar@503
   355
template void checkCompile<SymSmartGraph>(SymSmartGraph &);
alpar@774
   356
alpar@774
   357
//Compile ListGraph
alpar@578
   358
template void checkCompile<ListGraph>(ListGraph &);
alpar@774
   359
template void checkCompileErase<ListGraph>(ListGraph &);
alpar@774
   360
template void checkCompileFindEdge<ListGraph>(ListGraph &);
alpar@774
   361
deba@783
   362
alpar@774
   363
//Compile SymListGraph
alpar@578
   364
template void checkCompile<SymListGraph>(SymListGraph &);
alpar@774
   365
template void checkCompileErase<SymListGraph>(SymListGraph &);
alpar@774
   366
template void checkCompileFindEdge<SymListGraph>(SymListGraph &);
alpar@774
   367
alpar@774
   368
//Compile FullGraph
alpar@592
   369
template void checkCompileStaticGraph<FullGraph>(FullGraph &);
alpar@774
   370
template void checkCompileFindEdge<FullGraph>(FullGraph &);
alpar@550
   371
alpar@774
   372
//Compile EdgeSet <ListGraph>
alpar@579
   373
template void checkCompile<EdgeSet <ListGraph> >(EdgeSet <ListGraph> &);
alpar@774
   374
template
alpar@774
   375
void checkCompileEraseEdge<EdgeSet <ListGraph> >(EdgeSet <ListGraph> &);
alpar@774
   376
template
alpar@774
   377
void checkCompileFindEdge<EdgeSet <ListGraph> >(EdgeSet <ListGraph> &);
alpar@774
   378
alpar@774
   379
//Compile EdgeSet <NodeSet>
alpar@717
   380
template void checkCompile<EdgeSet <NodeSet> >(EdgeSet <NodeSet> &);
alpar@774
   381
template
alpar@774
   382
void checkCompileEraseEdge<EdgeSet <NodeSet> >(EdgeSet <NodeSet> &);
alpar@774
   383
template void checkCompileFindEdge<EdgeSet <NodeSet> >(EdgeSet <NodeSet> &);
alpar@774
   384
alpar@503
   385
alpar@503
   386
int main() 
alpar@503
   387
{
alpar@503
   388
  {
alpar@503
   389
    SmartGraph G;
alpar@503
   390
    addPetersen(G);
alpar@503
   391
    bidirPetersen(G);
alpar@503
   392
    checkPetersen(G);
alpar@503
   393
  }
alpar@578
   394
  {
alpar@578
   395
    ListGraph G;
alpar@578
   396
    addPetersen(G);
alpar@578
   397
    bidirPetersen(G);
alpar@578
   398
    checkPetersen(G);
alpar@578
   399
  }
alpar@503
   400
  {
alpar@503
   401
    SymSmartGraph G;
alpar@503
   402
    addPetersen(G);
alpar@503
   403
    checkPetersen(G);
alpar@503
   404
  }
alpar@578
   405
  {
alpar@578
   406
    SymListGraph G;
alpar@578
   407
    addPetersen(G);
alpar@578
   408
    checkPetersen(G);
alpar@578
   409
  }
alpar@503
   410
alpar@774
   411
  ///\file
alpar@774
   412
  ///\todo map tests.
alpar@774
   413
  ///\todo copy constr tests.
alpar@503
   414
alpar@503
   415
  std::cout << __FILE__ ": All tests passed.\n";
alpar@503
   416
alpar@579
   417
  return 0;
alpar@503
   418
}