1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/test/sym_graph_test.h Mon May 23 04:48:14 2005 +0000
1.3 @@ -0,0 +1,183 @@
1.4 +/* -*- C++ -*-
1.5 + * test/sym_graph_test.h - Part of LEMON, a generic C++ optimization library
1.6 + *
1.7 + * Copyright (C) 2005 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
1.8 + * (Egervary Research Group on Combinatorial Optimization, EGRES).
1.9 + *
1.10 + * Permission to use, modify and distribute this software is granted
1.11 + * provided that this copyright notice appears in all copies. For
1.12 + * precise terms see the accompanying LICENSE file.
1.13 + *
1.14 + * This software is provided "AS IS" with no warranty of any kind,
1.15 + * express or implied, and with no claim as to its suitability for any
1.16 + * purpose.
1.17 + *
1.18 + */
1.19 +#ifndef LEMON_TEST_SYM_GRAPH_TEST_H
1.20 +#define LEMON_TEST_SYM_GRAPH_TEST_H
1.21 +
1.22 +
1.23 +#include "graph_test.h"
1.24 +#include "test_tools.h"
1.25 +
1.26 +//! \ingroup misc
1.27 +//! \file
1.28 +//! \brief Some utility to test symmetric graph classes.
1.29 +namespace lemon {
1.30 +
1.31 + /// \e
1.32 +
1.33 + /// \todo This should go to lemon/concept/symgraph.h
1.34 + ///
1.35 + template<class Graph> void checkCompileStaticSymGraph(Graph &G)
1.36 + {
1.37 + typedef typename Graph::Node Node;
1.38 + typedef typename Graph::NodeIt NodeIt;
1.39 + typedef typename Graph::SymEdge SymEdge;
1.40 + typedef typename Graph::SymEdgeIt SymEdgeIt;
1.41 + typedef typename Graph::Edge Edge;
1.42 + typedef typename Graph::EdgeIt EdgeIt;
1.43 + typedef typename Graph::InEdgeIt InEdgeIt;
1.44 + typedef typename Graph::OutEdgeIt OutEdgeIt;
1.45 +
1.46 + lemon::concept::checkCompileStaticGraph(G);
1.47 +
1.48 + {
1.49 + SymEdge i; SymEdge j(i); SymEdge k(INVALID);
1.50 + i=j;
1.51 + bool b; b=true;
1.52 + b=(i==INVALID); b=(i!=INVALID);
1.53 + b=(i==j); b=(i!=j); b=(i<j);
1.54 + Edge e;
1.55 + e = G.forward(i);
1.56 + e = G.backward(i);
1.57 + }
1.58 + {
1.59 + SymEdgeIt i; SymEdgeIt j(i); SymEdgeIt k(INVALID); SymEdgeIt l(G);
1.60 + i=j;
1.61 + j=G.first(i);
1.62 + j=++i;
1.63 + bool b; b=true;
1.64 + b=(i==INVALID); b=(i!=INVALID);
1.65 + SymEdge n(i);
1.66 + n=i;
1.67 + b=(i==j); b=(i!=j); b=(i<j);
1.68 + //SymEdge ->SymEdgeIt conversion
1.69 + SymEdgeIt ni(G,n);
1.70 + }
1.71 + {
1.72 + Edge i, j;
1.73 + j = G.opposite(i);
1.74 + }
1.75 + {
1.76 + Node n;
1.77 + SymEdge se;
1.78 + se=INVALID;
1.79 + n=G.source(se);
1.80 + n=G.target(se);
1.81 + }
1.82 + // id tests
1.83 + { SymEdge n; int i=G.id(n); i=i; }
1.84 + //SymEdgeMap tests
1.85 + {
1.86 + SymEdge k;
1.87 + typename Graph::template SymEdgeMap<int> m(G);
1.88 + typename Graph::template SymEdgeMap<int> const &cm = m; //Const map
1.89 + //Inicialize with default value
1.90 + typename Graph::template SymEdgeMap<int> mdef(G,12);
1.91 + typename Graph::template SymEdgeMap<int> mm(cm); //Copy
1.92 + typename Graph::template SymEdgeMap<double> dm(cm); //Copy from another type
1.93 + int v;
1.94 + v=m[k]; m[k]=v; m.set(k,v);
1.95 + v=cm[k];
1.96 +
1.97 + m=cm;
1.98 + dm=cm; //Copy from another type
1.99 + {
1.100 + //Check the typedef's
1.101 + typename Graph::template SymEdgeMap<int>::Value val;
1.102 + val = 1;
1.103 + typename Graph::template SymEdgeMap<int>::Key key;
1.104 + key = typename Graph::SymEdgeIt(G);
1.105 + }
1.106 + }
1.107 + { //bool SymEdgeMap
1.108 + SymEdge k;
1.109 + typename Graph::template SymEdgeMap<bool> m(G);
1.110 + typename Graph::template SymEdgeMap<bool> const &cm = m; //Const map
1.111 + //Inicialize with default value
1.112 + typename Graph::template SymEdgeMap<bool> mdef(G,12);
1.113 + typename Graph::template SymEdgeMap<bool> mm(cm); //Copy
1.114 + typename Graph::template SymEdgeMap<int> dm(cm); //Copy from another type
1.115 + bool v;
1.116 + v=m[k]; m[k]=v; m.set(k,v);
1.117 + v=cm[k];
1.118 +
1.119 + m=cm;
1.120 + dm=cm; //Copy from another type
1.121 + m=dm; //Copy to another type
1.122 + {
1.123 + //Check the typedef's
1.124 + typename Graph::template SymEdgeMap<bool>::Value val;
1.125 + val=true;
1.126 + typename Graph::template SymEdgeMap<bool>::Key key;
1.127 + key= typename Graph::SymEdgeIt(G);
1.128 + }
1.129 + }
1.130 + }
1.131 +
1.132 + template<class Graph> void checkCompileSymGraph(Graph &G)
1.133 + {
1.134 + checkCompileStaticSymGraph(G);
1.135 +
1.136 + typedef typename Graph::Node Node;
1.137 + typedef typename Graph::NodeIt NodeIt;
1.138 + typedef typename Graph::SymEdge SymEdge;
1.139 + typedef typename Graph::SymEdgeIt SymEdgeIt;
1.140 + typedef typename Graph::Edge Edge;
1.141 + typedef typename Graph::EdgeIt EdgeIt;
1.142 + typedef typename Graph::InEdgeIt InEdgeIt;
1.143 + typedef typename Graph::OutEdgeIt OutEdgeIt;
1.144 +
1.145 + Node n,m;
1.146 + n=G.addNode();
1.147 + m=G.addNode();
1.148 + SymEdge e;
1.149 + e = G.addEdge(n,m);
1.150 +
1.151 + // G.clear();
1.152 + }
1.153 +
1.154 + template<class Graph> void checkCompileSymGraphEraseSymEdge(Graph &G)
1.155 + {
1.156 + typename Graph::SymEdge n;
1.157 + G.erase(n);
1.158 + }
1.159 +
1.160 + template<class Graph> void checkCompileErasableSymGraph(Graph &G)
1.161 + {
1.162 + checkCompileSymGraph(G);
1.163 + lemon::concept::checkCompileGraphEraseNode(G);
1.164 + checkCompileSymGraphEraseSymEdge(G);
1.165 + }
1.166 +
1.167 + template<class Graph> void checkGraphSymEdgeList(Graph &G, int nn)
1.168 + {
1.169 + typedef typename Graph::SymEdgeIt SymEdgeIt;
1.170 +
1.171 + SymEdgeIt e(G);
1.172 + for(int i=0;i<nn;i++) {
1.173 + check(e!=INVALID,"Wrong SymEdge list linking.");
1.174 + ++e;
1.175 + }
1.176 + check(e==INVALID,"Wrong SymEdge list linking.");
1.177 + }
1.178 +
1.179 + ///\file
1.180 + ///\todo Check target(), source() as well;
1.181 +
1.182 +
1.183 +} //namespace lemon
1.184 +
1.185 +
1.186 +#endif