klao@946: /* -*- C++ -*-
klao@946:  * src/test/graph_test.cc - Part of LEMON, a generic C++ optimization library
klao@946:  *
alpar@1164:  * Copyright (C) 2005 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
klao@946:  * (Egervary Combinatorial Optimization Research Group, EGRES).
klao@946:  *
klao@946:  * Permission to use, modify and distribute this software is granted
klao@946:  * provided that this copyright notice appears in all copies. For
klao@946:  * precise terms see the accompanying LICENSE file.
klao@946:  *
klao@946:  * This software is provided "AS IS" with no warranty of any kind,
klao@946:  * express or implied, and with no claim as to its suitability for any
klao@946:  * purpose.
klao@946:  *
klao@946:  */
klao@946: 
klao@946: #include<iostream>
klao@946: #include<lemon/smart_graph.h>
klao@959: #include<lemon/concept/graph.h>
klao@959: #include<lemon/concept/maps.h>
klao@946: #include<lemon/list_graph_base.h>
klao@946: #include<lemon/full_graph.h>
klao@946: 
klao@946: #include"test_tools.h"
klao@946: #include"graph_test.h"
klao@946: 
klao@946: /**
klao@946: \file
klao@946: This test makes consistency checks of list graph structures.
klao@946: 
alpar@986: G.addNode(), G.addEdge(), G.source(), G.target()
klao@946: 
klao@946: \todo Checks for empty graphs and isolated points.
klao@946: conversion.
klao@946: */
klao@946: 
klao@946: using namespace lemon;
klao@946: 
klao@946: template<class Graph> void bidirPetersen(Graph &G)
klao@946: {
klao@946:   typedef typename Graph::Edge Edge;
klao@946:   typedef typename Graph::EdgeIt EdgeIt;
klao@946:   
klao@946:   checkGraphEdgeList(G,15);
klao@946:   
klao@946:   std::vector<Edge> ee;
klao@946:   
klao@946:   for(EdgeIt e(G);e!=INVALID;++e) ee.push_back(e);
klao@946: 
klao@946:   for(typename std::vector<Edge>::iterator p=ee.begin();p!=ee.end();p++)
alpar@986:     G.addEdge(G.target(*p),G.source(*p));
klao@946: }
klao@946: 
klao@946: template<class Graph> void checkPetersen(Graph &G)
klao@946: {
klao@946:   typedef typename Graph::Node Node;
klao@946: 
klao@946:   typedef typename Graph::EdgeIt EdgeIt;
klao@946:   typedef typename Graph::NodeIt NodeIt;
klao@946: 
klao@946:   checkGraphNodeList(G,10);
klao@946:   checkGraphEdgeList(G,30);
klao@946: 
klao@946:   for(NodeIt n(G);n!=INVALID;++n) {
klao@946:     checkGraphInEdgeList(G,n,3);
klao@946:     checkGraphOutEdgeList(G,n,3);
klao@946:   }  
klao@946: }
klao@946: 
klao@946: //Compile Graph
klao@959: template void lemon::concept::checkCompileStaticGraph<concept::StaticGraph>
klao@959: (concept::StaticGraph &);
klao@946: 
klao@946: template
klao@959: void lemon::concept::checkCompileExtendableGraph<concept::ExtendableGraph>
klao@959: (concept::ExtendableGraph &);
klao@946: 
klao@946: template
klao@959: void lemon::concept::checkCompileErasableGraph<concept::ErasableGraph>
klao@959: (concept::ErasableGraph &);
klao@946: 
klao@946: //Compile SmartGraph
klao@946: template
klao@959: void lemon::concept::checkCompileExtendableGraph<SmartGraph>(SmartGraph &);
klao@946: template
klao@959: void lemon::concept::checkCompileGraphFindEdge<SmartGraph>(SmartGraph &);
klao@946: 
klao@946: //Compile SymSmartGraph
klao@946: //template void hugo::checkCompileGraph<SymSmartGraph>(SymSmartGraph &);
klao@946: //template void hugo::checkCompileGraphFindEdge<SymSmartGraph>(SymSmartGraph &);
klao@946: 
klao@946: //Compile ListGraph
klao@946: template
klao@959: void lemon::concept::checkCompileExtendableGraph<ListGraph>(ListGraph &);
klao@946: template
klao@959: void lemon::concept::checkCompileErasableGraph<ListGraph>(ListGraph &);
klao@946: template
klao@959: void lemon::concept::checkCompileGraphFindEdge<ListGraph>(ListGraph &);
klao@946: 
klao@946: 
klao@946: //Compile SymListGraph
klao@946: //template void hugo::checkCompileGraph<SymListGraph>(SymListGraph &);
klao@946: //template void hugo::checkCompileErasableGraph<SymListGraph>(SymListGraph &);
klao@946: //template void hugo::checkCompileGraphFindEdge<SymListGraph>(SymListGraph &);
klao@946: 
klao@946: //Compile FullGraph
klao@959: template void lemon::concept::checkCompileStaticGraph<FullGraph>(FullGraph &);
klao@946: template
klao@959: void lemon::concept::checkCompileGraphFindEdge<FullGraph>(FullGraph &);
klao@946: 
klao@946: 
klao@946: int main() 
klao@946: {
klao@946:   {
klao@946:     SmartGraph G;
klao@946:     addPetersen(G);
klao@946:     bidirPetersen(G);
klao@946:     checkPetersen(G);
klao@946:   }
klao@946:   {
klao@946:     ListGraph G;
klao@946:     addPetersen(G);
klao@946:     bidirPetersen(G);
klao@946:     checkPetersen(G);
klao@946:   }
klao@946:   {
klao@946:     //    SymSmartGraph G;
klao@946:     //    addPetersen(G);
klao@946:     //    checkPetersen(G);
klao@946:   }
klao@946:   {
klao@946:     //    SymListGraph G;
klao@946:     //    addPetersen(G);
klao@946:     //    checkPetersen(G);
klao@946:   }
klao@946: 
klao@946:   ///\file
klao@946:   ///\todo map tests.
klao@946:   ///\todo copy constr tests.
klao@946: 
klao@946: 
klao@946:   // Some map tests.
klao@946:   // FIXME: These shouldn't be here.
klao@959:   using namespace concept;
klao@946:   function_requires< ReadMapConcept< ReadMap<int,int> > >();
klao@946:   function_requires< WriteMapConcept< WriteMap<int,int> > >();
klao@946:   function_requires< ReadWriteMapConcept< ReadWriteMap<int,int> > >();
klao@946:   function_requires< ReferenceMapConcept< ReferenceMap<int,int> > >();
klao@946: 
klao@946: 
klao@946:   std::cout << __FILE__ ": All tests passed.\n";
klao@946: 
klao@946:   return 0;
klao@946: }