diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 1f5796fab..5d1d15a16 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -32,7 +32,6 @@ alias graph_test_regular : [ run test_graphs.cpp ] [ run index_graph.cpp ] # TODO: Make this part of the test_graphs framework [ run labeled_graph.cpp ] - [ run finish_edge_bug.cpp ] [ run transitive_closure_test.cpp /boost/timer//boost_timer ] [ run transitive_closure_test2.cpp ] diff --git a/test/dfs.cpp b/test/dfs.cpp index d6b15908d..90e337e0f 100644 --- a/test/dfs.cpp +++ b/test/dfs.cpp @@ -184,6 +184,34 @@ template < typename Graph > struct dfs_test } }; +// regression guard: finish_edge must fire once per edge (it once never did) +struct finish_edge_counter : boost::dfs_visitor<> +{ + explicit finish_edge_counter(std::size_t& count) : m_count(&count) {} + template < class Edge, class Graph > void finish_edge(Edge, Graph&) const + { + ++*m_count; + } + std::size_t* m_count; +}; + +void test_finish_edge_is_called() +{ + using graph_t = boost::adjacency_list< boost::vecS, boost::vecS, boost::directedS >; + graph_t g; + graph_t::vertex_descriptor a = boost::add_vertex(g); + graph_t::vertex_descriptor b = boost::add_vertex(g); + graph_t::vertex_descriptor c = boost::add_vertex(g); + boost::add_edge(a, b, g); + boost::add_edge(b, c, g); + boost::add_edge(c, a, g); + boost::add_edge(a, c, g); + + std::size_t finish_edge_calls = 0; + boost::depth_first_search(g, boost::visitor(finish_edge_counter(finish_edge_calls))); + BOOST_TEST_EQ(finish_edge_calls, boost::num_edges(g)); +} + // usage: dfs.exe [max-vertices=15] int main(int argc, char* argv[]) @@ -202,5 +230,7 @@ int main(int argc, char* argv[]) boost::property< boost::vertex_color_t, boost::default_color_type > > >::go(max_V); + test_finish_edge_is_called(); + return boost::report_errors(); } diff --git a/test/finish_edge_bug.cpp b/test/finish_edge_bug.cpp deleted file mode 100644 index 34b9530bb..000000000 --- a/test/finish_edge_bug.cpp +++ /dev/null @@ -1,84 +0,0 @@ -// Author: Alex Lauser - -// Output (Note that 'finish_edge' is never printed): -// The example graph: -// 0 --> 1 2 -// 1 --> 2 -// 2 --> 0 - -#include -#include -#include -#include -#include - -template < typename graph_t > struct TalkativeVisitor : boost::dfs_visitor<> -{ - typedef typename boost::graph_traits< graph_t >::vertex_descriptor - vertex_descriptor; - typedef typename boost::graph_traits< graph_t >::edge_descriptor - edge_descriptor; - - // // Commented out to avoid clutter of the output. - // void discover_vertex(vertex_descriptor u, const graph_t&) { // check! - // std::cout << "discover_vertex: " << u << std::endl; - // } - // void finish_vertex(vertex_descriptor u, const graph_t&) { // check! - // std::cout << "finish_vertex: " << u << std::endl; - // } - // void initialize_vertex(vertex_descriptor u, const graph_t&) { // check! - // std::cout << "initialize_vertex: " << u << std::endl; - // } - // void start_vertex(vertex_descriptor u, const graph_t&) { // check! - // std::cout << "start_vertex: " << u << std::endl; - // } - // void examine_edge(edge_descriptor u, const graph_t&) { // check! - // std::cout << "examine_edge: " << u << std::endl; - // } - // void tree_edge(edge_descriptor u, const graph_t&) { // check! - // std::cout << "tree_edge: " << u << std::endl; - // } - // void back_edge(edge_descriptor u, const graph_t&) { // check! - // std::cout << "back_edge: " << u << std::endl; - // } - // void forward_or_cross_edge(edge_descriptor u, const graph_t&) { // check! - // std::cout << "forward_or_cross_edge: " << u << std::endl; - // } - void finish_edge(edge_descriptor u, const graph_t&) - { // uncalled! - std::cout << "finish_edge: " << u << std::endl; - } -}; - -template < typename t > -std::ostream& operator<<(std::ostream& os, const std::pair< t, t >& x) -{ - return os << "(" << x.first << ", " << x.second << ")"; -} - -int main(int, char*[]) -{ - using namespace boost; - - typedef adjacency_list< vecS, vecS, directedS > Graph; - Graph G; - - typedef graph_traits< - adjacency_list< vecS, vecS, directedS > >::vertex_descriptor Vertex; - Vertex a = add_vertex(G); - Vertex b = add_vertex(G); - Vertex c = add_vertex(G); - - add_edge(a, b, G); - add_edge(b, c, G); - add_edge(c, a, G); - add_edge(a, c, G); - - std::cout << "The example graph:" << std::endl; - print_graph(G); - - std::vector< default_color_type > color(num_vertices(G)); - depth_first_search(G, visitor(TalkativeVisitor< Graph >())); - - return 0; -}