]> granicus.if.org Git - graphviz/commitdiff
tests: SvgAnalyzer: GraphvizGraph: add retrieval of node by node_id
authorMagnus Jacobsson <Magnus.Jacobsson@berotec.se>
Tue, 16 Aug 2022 13:55:53 +0000 (15:55 +0200)
committerMagnus Jacobsson <Magnus.Jacobsson@berotec.se>
Tue, 23 Aug 2022 06:19:35 +0000 (08:19 +0200)
tests/graphviz_graph.cpp
tests/graphviz_graph.h
tests/graphviz_node.cpp
tests/graphviz_node.h
tests/test_rankdir.cpp

index 183a723adc3a85ae3ba89b2349850881e16d4e8b..434daec13ca5b0093184b067d48d366a00a1a2f3 100644 (file)
@@ -1,3 +1,7 @@
+#include <stdexcept>
+
+#include <fmt/format.h>
+
 #include "graphviz_graph.h"
 
 GraphvizGraph::GraphvizGraph(SVG::SVGElement &svg_g_element)
@@ -15,6 +19,16 @@ const SVG::SVGElement &GraphvizGraph::svg_g_element() const {
   return m_svg_g_element;
 }
 
+const GraphvizNode &GraphvizGraph::node(std::string_view node_id) const {
+  for (auto &node : m_nodes) {
+    if (node.node_id() == node_id) {
+      return node;
+    }
+  }
+  throw std::runtime_error{
+      fmt::format("Unknown node '{}' in graph '{}'", node_id, m_graph_id)};
+}
+
 void GraphvizGraph::add_edge(SVG::SVGElement &svg_g_element) {
   m_edges.emplace_back(svg_g_element);
 }
index e55551fa3cb4f891368c0e8d40a5f3c2d5762780..317ed32875597b2e8d5afa51307b5a441bf6651d 100644 (file)
@@ -23,6 +23,8 @@ public:
   void add_node(SVG::SVGElement &svg_g_element);
   /// Return a non-mutable reference to the list of Graphviz edges
   const std::vector<GraphvizEdge> &edges() const;
+  /// Return the node with the specified `node_id`
+  const GraphvizNode &node(std::string_view node_id) const;
   /// Return a non-mutable reference to the list of Graphviz nodes
   const std::vector<GraphvizNode> &nodes() const;
   /// Return a non-mutable reference to the SVG `g` element corresponding to the
index fe1f486b77bb8dc28425233e6fd0041c8919f5f8..b1857c04194ee50df3ffc399a8c71f6928931a76 100644 (file)
@@ -1,7 +1,9 @@
 #include "graphviz_node.h"
 
 GraphvizNode::GraphvizNode(SVG::SVGElement &svg_element)
-    : m_svg_g_element(svg_element) {}
+    : m_node_id(svg_element.graphviz_id), m_svg_g_element(svg_element) {}
+
+std::string_view GraphvizNode::node_id() const { return m_node_id; }
 
 const SVG::SVGElement &GraphvizNode::svg_g_element() const {
   return m_svg_g_element;
index 8574943704326c83752966c8cc9ee447ad5c146c..2de2c6c0cf74ccfdcaedf07cbb11192674458f65 100644 (file)
@@ -1,6 +1,7 @@
 #pragma once
 
 #include <string>
+#include <string_view>
 
 #include "svg_element.h"
 
@@ -14,11 +15,16 @@ public:
   GraphvizNode() = delete;
   explicit GraphvizNode(SVG::SVGElement &svg_element);
 
+  /// Return the node's `node_id` as defined by the DOT language
+  std::string_view node_id() const;
   /// Return a non-mutable reference to the SVG `g` element corresponding to the
   /// node
   const SVG::SVGElement &svg_g_element() const;
 
 private:
+  /// The `node_id` according to the DOT language specification. Note that this
+  /// is not the same as the `id` attribute of a node
+  std::string m_node_id;
   /// The SVG `g` element corresponding to the node
   SVG::SVGElement &m_svg_g_element;
 };
index 77cdd06040037d5dbfb3f4a99d2637ba7fca990f..2b39d52765fcb0a1cebc9513c09e8ce569b3f992 100644 (file)
@@ -38,4 +38,7 @@ TEST_CASE("Graph rankdir", "Test that the Graphviz `rankdir` attribute affects "
   SVGAnalyzer svgAnalyzer{result.c_str()};
 
   REQUIRE(svgAnalyzer.graphs().size() == 1);
+  const auto &graph = svgAnalyzer.graphs().back();
+  const auto node_a = graph.node("a");
+  const auto node_b = graph.node("b");
 }