alpar@503: #include alpar@503: #include alpar@503: #include alpar@503: #include<../work/alpar/list_graph.h> alpar@503: 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@503: */ alpar@503: alpar@503: using namespace hugo; alpar@503: alpar@503: // void check(bool rc, const char *msg) { alpar@503: // if(!rc) { alpar@503: // std::cerr << msg << std::endl; alpar@503: // exit(1); alpar@503: // } alpar@503: // } alpar@503: alpar@503: #define check(rc, msg) \ alpar@503: if(!rc) { \ alpar@503: std::cerr << __FILE__ ":" << __LINE__ << ": error: " << msg << std::endl; \ alpar@503: exit(1); \ alpar@503: } else { } \ alpar@503: alpar@503: alpar@503: template void checkCompile(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@503: alpar@503: alpar@503: template void addPetersen(Graph &G) alpar@503: { alpar@503: std::vector outer, inner; alpar@503: alpar@503: for(int i=0;i<5;i++) { alpar@503: outer.push_back(G.addNode()); alpar@503: inner.push_back(G.addNode()); alpar@503: } alpar@503: alpar@503: for(int i=0;i<5;i++) { alpar@503: G.addEdge(outer[i],inner[i]); alpar@503: G.addEdge(outer[i],outer[(i+1)%5]); alpar@503: G.addEdge(inner[i],inner[(i+2)%5]); alpar@503: } alpar@503: } alpar@503: 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@503: template void checkCompile(GraphSkeleton &); alpar@503: template void checkCompile(SmartGraph &); alpar@503: template void checkCompile(SymSmartGraph &); alpar@503: template void checkCompile(ListGraph &); alpar@503: template void checkCompile(SymListGraph &); alpar@503: //Due to some mysterious and some conceptual problems it does not work. alpar@503: //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@503: { alpar@503: ListGraph G; alpar@503: addPetersen(G); alpar@503: bidirPetersen(G); alpar@503: checkPetersen(G); alpar@503: } alpar@503: { alpar@503: SymSmartGraph G; alpar@503: addPetersen(G); alpar@503: checkPetersen(G); alpar@503: } alpar@503: { alpar@503: SymListGraph G; alpar@503: addPetersen(G); alpar@503: checkPetersen(G); alpar@503: } 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@503: }