alpar@503: #include ladanyi@542: #include alpar@564: #include alpar@578: #include alpar@592: #include alpar@578: alpar@567: #include"test_tools.h" alpar@567: alpar@503: /* alpar@503: This test makes consistency checks of list graph structures. alpar@503: alpar@503: G.addNode(), G.addEdge(), G.valid(), G.tail(), G.head() alpar@503: alpar@592: \todo Checks for empty graphs and isolated points. alpar@503: */ alpar@503: alpar@503: using namespace hugo; alpar@503: alpar@592: template void checkCompileStaticGraph(Graph &G) alpar@503: { alpar@503: typedef typename Graph::Node Node; alpar@503: typedef typename Graph::NodeIt NodeIt; alpar@503: typedef typename Graph::Edge Edge; alpar@503: typedef typename Graph::EdgeIt EdgeIt; alpar@503: typedef typename Graph::InEdgeIt InEdgeIt; alpar@503: typedef typename Graph::OutEdgeIt OutEdgeIt; alpar@503: alpar@503: { alpar@503: Node i; Node j(i); Node k(INVALID); alpar@503: i=j; alpar@503: bool b=G.valid(i); b=b; alpar@503: b=(i==j); b=(i!=j); b=(i m(G); alpar@515: typename Graph::template NodeMap const &cm = m; //Const map alpar@515: //Inicialize with default value alpar@515: typename Graph::template NodeMap mdef(G,12); alpar@515: typename Graph::template NodeMap mm(cm); //Copy alpar@515: typename Graph::template NodeMap dm(cm); //Copy from another type alpar@503: int v; alpar@503: v=m[k]; m[k]=v; m.set(k,v); alpar@503: v=cm[k]; alpar@503: alpar@503: m=cm; alpar@503: dm=cm; //Copy from another type alpar@503: } alpar@503: { //bool NodeMap alpar@503: Node k; alpar@515: typename Graph::template NodeMap m(G); alpar@515: typename Graph::template NodeMap const &cm = m; //Const map alpar@515: //Inicialize with default value alpar@515: typename Graph::template NodeMap mdef(G,12); alpar@515: typename Graph::template NodeMap mm(cm); //Copy alpar@515: typename Graph::template NodeMap dm(cm); //Copy from another type alpar@503: bool v; alpar@503: v=m[k]; m[k]=v; m.set(k,v); alpar@503: v=cm[k]; alpar@503: alpar@503: m=cm; alpar@503: dm=cm; //Copy from another type alpar@504: m=dm; //Copy to another type alpar@503: } alpar@503: //EdgeMap tests alpar@503: { alpar@503: Edge k; alpar@515: typename Graph::template EdgeMap m(G); alpar@515: typename Graph::template EdgeMap const &cm = m; //Const map alpar@515: //Inicialize with default value alpar@515: typename Graph::template EdgeMap mdef(G,12); alpar@515: typename Graph::template EdgeMap mm(cm); //Copy alpar@515: typename Graph::template EdgeMap dm(cm); //Copy from another type alpar@503: int v; alpar@503: v=m[k]; m[k]=v; m.set(k,v); alpar@503: v=cm[k]; alpar@503: alpar@503: m=cm; alpar@503: dm=cm; //Copy from another type alpar@503: } alpar@503: { //bool EdgeMap alpar@503: Edge k; alpar@515: typename Graph::template EdgeMap m(G); alpar@515: typename Graph::template EdgeMap const &cm = m; //Const map alpar@515: //Inicialize with default value alpar@515: typename Graph::template EdgeMap mdef(G,12); alpar@515: typename Graph::template EdgeMap mm(cm); //Copy alpar@515: typename Graph::template EdgeMap dm(cm); //Copy from another type alpar@503: bool v; alpar@503: v=m[k]; m[k]=v; m.set(k,v); alpar@503: v=cm[k]; alpar@503: alpar@503: m=cm; alpar@503: dm=cm; //Copy from another type alpar@504: m=dm; //Copy to another type alpar@503: } alpar@503: alpar@503: } alpar@503: alpar@592: template void checkCompile(Graph &G) alpar@592: { alpar@592: checkCompileStaticGraph(G); alpar@592: alpar@592: typedef typename Graph::Node Node; alpar@592: typedef typename Graph::NodeIt NodeIt; alpar@592: typedef typename Graph::Edge Edge; alpar@592: typedef typename Graph::EdgeIt EdgeIt; alpar@592: typedef typename Graph::InEdgeIt InEdgeIt; alpar@592: typedef typename Graph::OutEdgeIt OutEdgeIt; alpar@592: alpar@592: Node n,m; alpar@592: n=G.addNode(); alpar@592: m=G.addNode(); alpar@592: alpar@592: G.addEdge(n,m); alpar@592: } alpar@592: alpar@592: alpar@503: template void checkNodeList(Graph &G, int nn) alpar@503: { alpar@503: typename Graph::NodeIt n(G); alpar@503: for(int i=0;i void checkEdgeList(Graph &G, int nn) alpar@503: { alpar@503: typedef typename Graph::EdgeIt EdgeIt; alpar@503: alpar@503: EdgeIt e(G); alpar@503: for(int i=0;i void checkOutEdgeList(Graph &G, alpar@503: typename Graph::Node n, alpar@503: int nn) alpar@503: { alpar@503: typename Graph::OutEdgeIt e(G,n); alpar@503: for(int i=0;i void checkInEdgeList(Graph &G, alpar@503: typename Graph::Node n, alpar@503: int nn) alpar@503: { alpar@503: typename Graph::InEdgeIt e(G,n); alpar@503: for(int i=0;i void bidirPetersen(Graph &G) alpar@503: { alpar@503: typedef typename Graph::Edge Edge; alpar@503: typedef typename Graph::EdgeIt EdgeIt; alpar@503: alpar@503: checkEdgeList(G,15); alpar@503: alpar@503: std::vector ee; alpar@503: alpar@503: for(EdgeIt e(G);G.valid(e);G.next(e)) ee.push_back(e); alpar@503: alpar@503: for(typename std::vector::iterator p=ee.begin();p!=ee.end();p++) alpar@503: G.addEdge(G.head(*p),G.tail(*p)); alpar@503: } alpar@503: alpar@503: template void checkPetersen(Graph &G) alpar@503: { alpar@503: typedef typename Graph::Node Node; alpar@503: alpar@503: typedef typename Graph::EdgeIt EdgeIt; alpar@503: typedef typename Graph::NodeIt NodeIt; alpar@503: alpar@503: checkNodeList(G,10); alpar@503: checkEdgeList(G,30); alpar@503: alpar@503: for(NodeIt n(G);G.valid(n);G.next(n)) { alpar@503: checkInEdgeList(G,n,3); alpar@503: checkOutEdgeList(G,n,3); alpar@503: G.next(n); alpar@503: } alpar@503: } alpar@503: alpar@564: template void checkCompile(GraphSkeleton &); alpar@503: template void checkCompile(SmartGraph &); alpar@503: template void checkCompile(SymSmartGraph &); alpar@578: template void checkCompile(ListGraph &); alpar@578: template void checkCompile(SymListGraph &); alpar@592: template void checkCompileStaticGraph(FullGraph &); alpar@550: alpar@579: //Due to some mysterious problems it does not work. alpar@579: template void checkCompile >(EdgeSet &); alpar@579: //template void checkCompile >(EdgeSet &); alpar@503: alpar@503: int main() alpar@503: { alpar@503: { alpar@503: SmartGraph G; alpar@503: addPetersen(G); alpar@503: bidirPetersen(G); alpar@503: checkPetersen(G); alpar@503: } alpar@578: { alpar@578: ListGraph G; alpar@578: addPetersen(G); alpar@578: bidirPetersen(G); alpar@578: checkPetersen(G); alpar@578: } alpar@503: { alpar@503: SymSmartGraph G; alpar@503: addPetersen(G); alpar@503: checkPetersen(G); alpar@503: } alpar@578: { alpar@578: SymListGraph G; alpar@578: addPetersen(G); alpar@578: checkPetersen(G); alpar@578: } alpar@503: alpar@503: //\todo map tests. alpar@503: //\todo copy constr tests. alpar@503: alpar@503: std::cout << __FILE__ ": All tests passed.\n"; alpar@503: alpar@579: return 0; alpar@503: }