graph/test/test_graphs.cpp
Peter Kerzum b0be1f7087 Make adjacency_matrix implement BidirectionalGraph concept
Adjacency matrix is by nature bidirectional and one can see that the
concept was mostly implemented before. That implementation missed
the degree function(s). These functions are implemented in this commit
and the traversal_category is updated to meet the concept requirements.

Tests are also added, though they are a bit shallow in the sense that
they seem to omit intensive algorithms.
2024-12-12 03:33:26 +01:00

213 lines
9.3 KiB
C++

// (C) Copyright 2009-2010 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)
#include <iostream>
#include "typestr.hpp"
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/adjacency_matrix.hpp>
#include <boost/graph/undirected_graph.hpp>
#include <boost/graph/directed_graph.hpp>
#include <boost/graph/compressed_sparse_row_graph.hpp>
#include <boost/graph/labeled_graph.hpp>
#include <boost/graph/subgraph.hpp>
#include "test_graph.hpp"
// This test module is a testing ground to determine if graphs and graph
// adaptors actually implement the graph concepts correctly.
using namespace boost;
int main()
{
// Bootstrap all of the tests by declaring a kind graph and asserting some
// basic properties about it.
{
typedef undirected_graph< VertexBundle, EdgeBundle, GraphBundle > Graph;
BOOST_META_ASSERT(is_undirected_graph< Graph >);
BOOST_META_ASSERT(is_multigraph< Graph >);
BOOST_META_ASSERT(is_incidence_graph< Graph >);
BOOST_META_ASSERT(is_bidirectional_graph< Graph >);
BOOST_META_ASSERT(has_vertex_property< Graph >);
BOOST_META_ASSERT(has_bundled_vertex_property< Graph >);
BOOST_META_ASSERT(has_edge_property< Graph >);
BOOST_META_ASSERT(has_bundled_edge_property< Graph >);
BOOST_META_ASSERT(is_mutable_graph< Graph >);
BOOST_META_ASSERT(is_mutable_property_graph< Graph >);
Graph g;
test_graph(g);
}
{
typedef directed_graph< VertexBundle, EdgeBundle, GraphBundle > Graph;
BOOST_META_ASSERT(is_directed_graph< Graph >);
BOOST_META_ASSERT(is_multigraph< Graph >);
BOOST_META_ASSERT(is_incidence_graph< Graph >);
BOOST_META_ASSERT(is_bidirectional_graph< Graph >);
BOOST_META_ASSERT(is_directed_bidirectional_graph< Graph >);
BOOST_META_ASSERT(has_vertex_property< Graph >);
BOOST_META_ASSERT(has_bundled_vertex_property< Graph >);
BOOST_META_ASSERT(has_edge_property< Graph >);
BOOST_META_ASSERT(has_bundled_edge_property< Graph >);
BOOST_META_ASSERT(is_mutable_graph< Graph >);
BOOST_META_ASSERT(is_mutable_property_graph< Graph >);
Graph g;
test_graph(g);
}
{
typedef adjacency_list< vecS, vecS, undirectedS, VertexBundle,
EdgeBundle, GraphBundle >
Graph;
BOOST_META_ASSERT(is_undirected_graph< Graph >);
BOOST_META_ASSERT(is_multigraph< Graph >);
BOOST_META_ASSERT(is_incidence_graph< Graph >);
BOOST_META_ASSERT(is_bidirectional_graph< Graph >);
BOOST_META_ASSERT(has_vertex_property< Graph >);
BOOST_META_ASSERT(has_bundled_vertex_property< Graph >);
BOOST_META_ASSERT(has_edge_property< Graph >);
BOOST_META_ASSERT(has_bundled_edge_property< Graph >);
BOOST_META_ASSERT(is_add_only_property_graph< Graph >);
Graph g;
test_graph(g);
}
{
typedef adjacency_list< vecS, vecS, directedS, VertexBundle, EdgeBundle,
GraphBundle >
Graph;
Graph g;
BOOST_META_ASSERT(is_directed_graph< Graph >);
BOOST_META_ASSERT(is_multigraph< Graph >);
BOOST_META_ASSERT(is_incidence_graph< Graph >);
BOOST_META_ASSERT(!is_bidirectional_graph< Graph >);
BOOST_META_ASSERT(is_directed_unidirectional_graph< Graph >);
BOOST_META_ASSERT(has_vertex_property< Graph >);
BOOST_META_ASSERT(has_bundled_vertex_property< Graph >);
BOOST_META_ASSERT(has_edge_property< Graph >);
BOOST_META_ASSERT(has_bundled_edge_property< Graph >);
BOOST_META_ASSERT(is_add_only_property_graph< Graph >);
test_graph(g);
}
{
// Common bidi adjlist
typedef adjacency_list< vecS, vecS, bidirectionalS, VertexBundle,
EdgeBundle, GraphBundle >
Graph;
BOOST_META_ASSERT(is_directed_graph< Graph >);
BOOST_META_ASSERT(is_multigraph< Graph >);
BOOST_META_ASSERT(is_incidence_graph< Graph >);
BOOST_META_ASSERT(is_bidirectional_graph< Graph >);
BOOST_META_ASSERT(is_directed_bidirectional_graph< Graph >);
BOOST_META_ASSERT(has_vertex_property< Graph >);
BOOST_META_ASSERT(has_bundled_vertex_property< Graph >);
BOOST_META_ASSERT(has_edge_property< Graph >);
BOOST_META_ASSERT(has_bundled_edge_property< Graph >);
BOOST_META_ASSERT(is_add_only_property_graph< Graph >);
Graph g;
test_graph(g);
}
{
// Same as above, but testing VL==listS
typedef adjacency_list< vecS, listS, bidirectionalS, VertexBundle,
EdgeBundle, GraphBundle >
Graph;
BOOST_META_ASSERT(is_directed_graph< Graph >);
BOOST_META_ASSERT(is_multigraph< Graph >);
BOOST_META_ASSERT(is_incidence_graph< Graph >);
BOOST_META_ASSERT(is_bidirectional_graph< Graph >);
BOOST_META_ASSERT(is_directed_bidirectional_graph< Graph >);
BOOST_META_ASSERT(has_vertex_property< Graph >);
BOOST_META_ASSERT(has_bundled_vertex_property< Graph >);
BOOST_META_ASSERT(has_edge_property< Graph >);
BOOST_META_ASSERT(has_bundled_edge_property< Graph >);
BOOST_META_ASSERT(is_mutable_property_graph< Graph >);
Graph g;
test_graph(g);
}
{
typedef adjacency_matrix< directedS, VertexBundle, EdgeBundle,
GraphBundle >
Graph;
BOOST_META_ASSERT(is_directed_graph< Graph >);
BOOST_META_ASSERT(!is_multigraph< Graph >);
BOOST_META_ASSERT(is_bidirectional_graph< Graph >);
BOOST_META_ASSERT(is_directed_bidirectional_graph< Graph >);
BOOST_META_ASSERT(has_vertex_property< Graph >);
BOOST_META_ASSERT(has_bundled_vertex_property< Graph >);
BOOST_META_ASSERT(has_edge_property< Graph >);
BOOST_META_ASSERT(has_bundled_edge_property< Graph >);
BOOST_META_ASSERT(is_mutable_edge_graph< Graph >);
BOOST_META_ASSERT(is_mutable_edge_property_graph< Graph >);
Graph g(N);
test_graph(g);
}
{
typedef adjacency_matrix< directedS, VertexBundle, EdgeBundle > Graph;
BOOST_META_ASSERT(is_directed_graph< Graph >);
BOOST_META_ASSERT(!is_multigraph< Graph >);
BOOST_META_ASSERT(is_bidirectional_graph< Graph >);
BOOST_META_ASSERT(is_directed_bidirectional_graph< Graph >);
BOOST_META_ASSERT(has_vertex_property< Graph >);
BOOST_META_ASSERT(has_bundled_vertex_property< Graph >);
BOOST_META_ASSERT(has_edge_property< Graph >);
BOOST_META_ASSERT(has_bundled_edge_property< Graph >);
BOOST_META_ASSERT(is_mutable_edge_graph< Graph >);
BOOST_META_ASSERT(is_mutable_edge_property_graph< Graph >);
Graph g(N);
test_graph(g);
}
{
typedef labeled_graph< directed_graph<>, unsigned > Graph;
BOOST_META_ASSERT(is_directed_graph< Graph >);
BOOST_META_ASSERT(is_multigraph< Graph >);
BOOST_META_ASSERT(is_incidence_graph< Graph >);
BOOST_META_ASSERT(is_bidirectional_graph< Graph >);
BOOST_META_ASSERT(is_directed_bidirectional_graph< Graph >);
BOOST_META_ASSERT(is_labeled_mutable_property_graph< Graph >);
BOOST_META_ASSERT(is_labeled_graph< Graph >);
BOOST_META_ASSERT(!has_vertex_property< Graph >);
BOOST_META_ASSERT(!has_bundled_vertex_property< Graph >);
BOOST_META_ASSERT(!has_edge_property< Graph >);
BOOST_META_ASSERT(!has_bundled_edge_property< Graph >);
BOOST_META_ASSERT(is_labeled_mutable_graph< Graph >);
Graph g;
test_graph(g);
}
// FIXME: CSR doesn't have mutability traits so we can't generalize the
// constructions of the required graph. Just assert the properties for now.
// NOTE: CSR graphs are also atypical in that they don't have "normal"
// vertex and edge properties. They're "abnormal" in the sense that they
// have a valid bundled type, but the property types are no_property.
{
typedef compressed_sparse_row_graph< directedS, VertexBundle,
EdgeBundle, GraphBundle >
Graph;
BOOST_META_ASSERT(is_directed_graph< Graph >);
BOOST_META_ASSERT(is_multigraph< Graph >);
BOOST_META_ASSERT(has_graph_property< Graph >);
BOOST_META_ASSERT(has_bundled_graph_property< Graph >);
BOOST_META_ASSERT(!has_vertex_property< Graph >);
BOOST_META_ASSERT(has_bundled_vertex_property< Graph >);
BOOST_META_ASSERT(!has_edge_property< Graph >);
BOOST_META_ASSERT(has_bundled_edge_property< Graph >);
}
{
typedef compressed_sparse_row_graph< bidirectionalS, VertexBundle,
EdgeBundle, GraphBundle >
Graph;
BOOST_META_ASSERT(is_directed_graph< Graph >);
BOOST_META_ASSERT(is_multigraph< Graph >);
BOOST_META_ASSERT(has_graph_property< Graph >);
BOOST_META_ASSERT(has_bundled_graph_property< Graph >);
BOOST_META_ASSERT(!has_vertex_property< Graph >);
BOOST_META_ASSERT(has_bundled_vertex_property< Graph >);
BOOST_META_ASSERT(!has_edge_property< Graph >);
BOOST_META_ASSERT(has_bundled_edge_property< Graph >);
}
// TODO: What other kinds of graphs do we have here...
}