// (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_DESTRUCTION_HPP #define TEST_DESTRUCTION_HPP #include #include /** @name Destroy Graph * Destroy the graph by removing vertices (if possible). */ //@{ // This will basically catch adjacency matrices, which don't get torn down. template void destroy_graph(Graph&, VertexSet const&, Remove, Label) { } // This matches MutableGraph, so just remove a vertex and then clear. template void destroy_graph(Graph& g, VertexSet const& verts, boost::mpl::true_, boost::mpl::false_) { using namespace boost; BOOST_CONCEPT_ASSERT((VertexListGraphConcept)); BOOST_CONCEPT_ASSERT((VertexMutableGraphConcept)); std::cout << "...destroy_normal\n"; // Remove the roof vertex remove_vertex(verts[0], g); BOOST_ASSERT(num_vertices(g) == N - 1); } // This will match labeled graphs. template void destroy_graph(Graph& g, VertexSet const&, boost::mpl::false_, boost::mpl::true_) { using namespace boost; BOOST_CONCEPT_ASSERT((VertexListGraphConcept)); // BOOST_CONCEPT_ASSERT(( VeretexMutableGraphConcept )); std::cout << "...destroy_labeled\n"; // Remove the roof vertex remove_vertex(0, g); BOOST_ASSERT(num_vertices(g) == N - 1); } //@} /** @name Disconnect Graph * Disconnect edges in the graph. Note that this doesn't fully disconnect the * graph. It simply determines if we can disconnect an edge or two and verify * that the resulting graph is valid. The Labeled type parameter is used to * dispatch for unlabeled and labeled graphs. * * @todo This doesn't quite work for multigraphs... */ //@{ template void disconnect_graph(Graph& g, VertexSet const& verts, boost::mpl::false_) { using namespace boost; BOOST_CONCEPT_ASSERT((EdgeListGraphConcept)); BOOST_CONCEPT_ASSERT((EdgeMutableGraphConcept)); std::cout << "...disconnect_normal\n"; typedef typename graph_traits::edge_descriptor Edge; // Disconnect the "lollipop" from the house. Edge e = edge(verts[5], verts[3], g).first; remove_edge(e, g); BOOST_ASSERT(num_edges(g) == M - 1); // Remove the "floor" edge from the house. remove_edge(verts[3], verts[2], g); BOOST_ASSERT(num_edges(g) == M - 2); // Fully disconnect the roof vertex. clear_vertex(verts[0], g); BOOST_ASSERT(num_edges(g) == M - 4); // What happens if we try to remove an edge that doesn't exist? remove_edge(verts[5], verts[0], g); BOOST_ASSERT(num_edges(g) == M - 4); } template void disconnect_graph(Graph& g, VertexSet const&, boost::mpl::true_) { using namespace boost; BOOST_CONCEPT_ASSERT((EdgeListGraphConcept)); // BOOST_CONCEPT_ASSERT((EdgeMutableGraphConcept)); std::cout << "...disconnect_labeled\n"; typedef typename boost::graph_traits::edge_descriptor Edge; // Disconnect the "lollipop" from the house. Edge e = boost::edge_by_label(5, 3, g).first; boost::remove_edge(e, g); BOOST_ASSERT(boost::num_edges(g) == M - 1); // Remove the "floor" edge from the house. boost::remove_edge_by_label(3, 2, g); BOOST_ASSERT(boost::num_edges(g) == M - 2); // Fully disconnect the roof vertex. clear_vertex_by_label(0, g); BOOST_ASSERT(boost::num_edges(g) == M - 4); // What happens if we try to remove an edge that doesn't exist? boost::remove_edge_by_label(5, 0, g); BOOST_ASSERT(boost::num_edges(g) == M - 4); } //@} #endif