summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/graph/test/test_properties.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/graph/test/test_properties.hpp')
-rw-r--r--src/boost/libs/graph/test/test_properties.hpp126
1 files changed, 126 insertions, 0 deletions
diff --git a/src/boost/libs/graph/test/test_properties.hpp b/src/boost/libs/graph/test/test_properties.hpp
new file mode 100644
index 00000000..751a838d
--- /dev/null
+++ b/src/boost/libs/graph/test/test_properties.hpp
@@ -0,0 +1,126 @@
+// (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_PROPERTIES_HPP
+#define TEST_PROPERTIES_HPP
+
+#include <boost/concept/assert.hpp>
+
+template<typename T> T const& as_const(T& x) { return x; }
+template<typename T> void ignore(T const&) { }
+
+template<typename Graph>
+void test_graph_bundle(Graph& g, boost::mpl::true_) {
+ using namespace boost;
+ std::cout << "...test_graph_bundle\n";
+
+ GraphBundle& b1 = g[graph_bundle];
+ GraphBundle& b2 = get_property(g);
+ ignore(b1); ignore(b2);
+
+ GraphBundle const& cb1 = ::as_const(g)[graph_bundle];
+ GraphBundle const& cb2 = get_property(g);
+ ignore(cb1); ignore(cb2);
+}
+
+template<typename Graph>
+void test_graph_bundle(Graph& g, boost::mpl::false_)
+{ }
+
+/** @name Test Vertex Bundle
+ * Exercise the vertex bundle. Note that this is expected to be of type
+ * VertexBundle.
+ */
+//@{
+template <typename Graph, typename VertexSet>
+void test_vertex_bundle(Graph& g, VertexSet const& verts, boost::mpl::true_) {
+ using namespace boost;
+ BOOST_CONCEPT_ASSERT((GraphConcept<Graph>));
+ typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+ BOOST_CONCEPT_ASSERT((PropertyGraphConcept<Graph, Vertex, vertex_bundle_t>));
+
+ // Test bundling via the graph object on the lollipop vertex.
+ Vertex v = verts[5];
+ VertexBundle& b = g[v];
+ b.value = 10;
+ BOOST_ASSERT(g[v].value == 10);
+
+ // Test bundling via the property map.
+ typedef typename property_map<Graph, int VertexBundle::*>::type BundleMap;
+ BOOST_CONCEPT_ASSERT((ReadWritePropertyMapConcept<BundleMap, Vertex>));
+ BundleMap map = get(&VertexBundle::value, g);
+ put(map, v, 5);
+ BOOST_ASSERT(get(map, v) == 5);
+
+ typedef typename property_map<Graph, int VertexBundle::*>::const_type ConstBundleMap;
+ BOOST_CONCEPT_ASSERT((ReadablePropertyMapConcept<ConstBundleMap, Vertex>));
+ ConstBundleMap cmap = get(&VertexBundle::value, (Graph const&)g);
+ BOOST_ASSERT(get(cmap, v) == 5);
+}
+
+template <typename Graph, typename VertexSet>
+void test_vertex_bundle(Graph&, VertexSet const&, boost::mpl::false_)
+{ }
+//@}
+
+/** @name Test Edge Bundle
+ * Exercise the edge bundle. Note that this is expected to be of type
+ * EdgeBundle.
+ */
+//@{
+template <typename Graph, typename VertexSet>
+void test_edge_bundle(Graph& g, VertexSet const& verts, boost::mpl::true_) {
+ using namespace boost;
+ BOOST_CONCEPT_ASSERT((GraphConcept<Graph>));
+ typedef typename boost::graph_traits<Graph>::edge_descriptor Edge;
+ BOOST_CONCEPT_ASSERT((PropertyGraphConcept<Graph, Edge, edge_bundle_t>));
+
+ std::cout << "...test_edge_bundle\n";
+
+ // Test bundling via the graph object on the lollipop edge.
+ Edge e = boost::edge(verts[5], verts[3], g).first;
+ EdgeBundle& b = g[e];
+ b.value = 10;
+ BOOST_ASSERT(g[e].value == 10);
+
+ // Test bundling via the property map.
+ typedef typename boost::property_map<Graph, int EdgeBundle::*>::type BundleMap;
+ BOOST_CONCEPT_ASSERT((ReadWritePropertyMapConcept<BundleMap, Edge>));
+ BundleMap map = get(&EdgeBundle::value, g);
+ put(map, e, 5);
+ BOOST_ASSERT(get(map, e) == 5);
+
+ typedef typename boost::property_map<Graph, int EdgeBundle::*>::const_type ConstBundleMap;
+ BOOST_CONCEPT_ASSERT((ReadablePropertyMapConcept<BundleMap, Edge>));
+ ConstBundleMap cmap = get(&EdgeBundle::value, (Graph const&)g);
+ BOOST_ASSERT(get(cmap, e) == 5);
+}
+
+template <typename Graph, typename VertexSet>
+void test_edge_bundle(Graph&, VertexSet const&, boost::mpl::false_)
+{ }
+//@}
+
+/**
+ * Test the properties of a graph. Basically, we expect these to be one of
+ * bundled or not. This test could also be expanded to test non-bundled
+ * properties. This just bootstraps the tests.
+ */
+template <typename Graph, typename VertexSet>
+void test_properties(Graph& g, VertexSet const& verts) {
+ using namespace boost;
+
+ typename has_bundled_graph_property<Graph>::type graph_bundled;
+ typename has_bundled_vertex_property<Graph>::type vertex_bundled;
+ typename has_bundled_edge_property<Graph>::type edge_bundled;
+
+ test_graph_bundle(g, graph_bundled);
+ test_vertex_bundle(g, verts, vertex_bundled);
+ test_edge_bundle(g, verts, edge_bundled);
+}
+//@}
+
+#endif