// -*- c++ -*-

#include <iostream>
#include <vector>

#include <lemon/concept/graph.h>
#include <lemon/list_graph.h>
#include <lemon/smart_graph.h>
#include <lemon/full_graph.h>

#include "test_tools.h"
#include "graph_test.h"
#include "map_test.h"


using namespace lemon;
using namespace lemon::concept;


int main() {
  { // checking graph components
    checkConcept<BaseGraphComponent, BaseGraphComponent >();

    checkConcept<BaseIterableGraphComponent, BaseIterableGraphComponent >();

    checkConcept<IDableGraphComponent, IDableGraphComponent >();
    checkConcept<MaxIDableGraphComponent, MaxIDableGraphComponent >();

    checkConcept<BaseExtendableGraphComponent, BaseExtendableGraphComponent >();
    checkConcept<BaseErasableGraphComponent, BaseErasableGraphComponent >();

    checkConcept<IterableGraphComponent, IterableGraphComponent >();

    checkConcept<MappableGraphComponent, MappableGraphComponent >();

    checkConcept<ExtendableGraphComponent, ExtendableGraphComponent >();
    checkConcept<ErasableGraphComponent, ErasableGraphComponent >();
    checkConcept<ClearableGraphComponent, ClearableGraphComponent >();
  }
  { // checking skeleton graphs
    checkConcept<StaticGraph, StaticGraph >();
    checkConcept<ExtendableGraph, ExtendableGraph >();
    checkConcept<ErasableGraph, ErasableGraph >();
  }
  { // checking list graph
    checkConcept<ErasableGraph, ListGraph >();

    checkGraph<ListGraph>();
    checkGraphNodeMap<ListGraph>();
    checkGraphEdgeMap<ListGraph>();
  }
  { // checking smart graph
    checkConcept<ExtendableGraph, SmartGraph >();

    checkGraph<SmartGraph>();
    checkGraphNodeMap<SmartGraph>();
    checkGraphEdgeMap<SmartGraph>();
  }
  { // checking full graph
    checkConcept<StaticGraph, FullGraph >();
  }

  std::cout << __FILE__ ": All tests passed.\n";

  return 0;
}
