// (C) Copyright 2009 Andrew Sutton
//
// Use, modification and distribution are subject to the
// Boost Software License, Version 1.0 (See accompanying file
// LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)

#ifndef TEST_ITERATION_HPP
#define TEST_ITERATION_HPP

#include <algorithm>

/** @name Test Vertex List
 * Test the vertex list interface. Note that there are currently no graphs that
 * do not expose this interface.
 */
//@{
template <typename Graph>
void test_vertex_list_graph(Graph const& g) {
    using namespace boost;
    BOOST_CONCEPT_ASSERT((VertexListGraphConcept<Graph>));

    std::cout << "...test_vertex_list_graph\n";
    typedef typename graph_traits<Graph>::vertex_iterator Iterator;
    typedef std::pair<Iterator, Iterator> Range;

    Range rng = vertices(g);
    BOOST_ASSERT(num_vertices(g) == N);
    BOOST_ASSERT(rng.first != rng.second);
    BOOST_ASSERT(std::distance(rng.first, rng.second) == int(N));
}
//@}

/** @name Test Edge List
 * Test the edge list interface. Note that there are currently no graphs that
 * do not expose this interface.
 */
//@{
template <typename Graph>
void test_edge_list_graph(Graph const& g) {
    using namespace boost;
    BOOST_CONCEPT_ASSERT((EdgeListGraphConcept<Graph>));

    std::cout << "...test_edge_list_graph\n";
    typedef typename graph_traits<Graph>::edge_iterator Iterator;
    typedef std::pair<Iterator, Iterator> Range;

    Range rng = edges(g);
    BOOST_ASSERT(num_edges(g) == M);
    BOOST_ASSERT(rng.first != rng.second);
    BOOST_ASSERT(std::distance(rng.first, rng.second) == int(M));
}
//@}

#endif
