]> granicus.if.org Git - graphviz/commitdiff
tests: SVGAnalyzer: add 'make_from_dot' static method and use in test_rankdir
authorMagnus Jacobsson <Magnus.Jacobsson@berotec.se>
Tue, 23 Aug 2022 07:11:02 +0000 (09:11 +0200)
committerMagnus Jacobsson <Magnus.Jacobsson@berotec.se>
Fri, 2 Sep 2022 11:31:30 +0000 (13:31 +0200)
Upcoming commits will add several new test cases doing exactly
that. This change will keep those tests short and DRY.

tests/CMakeLists.txt
tests/svg_analyzer.cpp
tests/svg_analyzer.h
tests/test_rankdir.cpp

index 08bbf5b3a365770500c8468af5fe1406faf4c1da..0b962959bb3af0c64efdbb10b7408637611c196b 100644 (file)
@@ -34,6 +34,7 @@ set_target_properties(test_common PROPERTIES CXX_STANDARD 20)
 set_target_properties(test_common PROPERTIES CXX_STANDARD_REQUIRED ON)
 target_include_directories(test_common PRIVATE
   ../lib
+  ../lib/cgraph++
 )
 target_include_directories(test_common SYSTEM PRIVATE
   ${Boost_INCLUDE_DIRS}
index 3f4017487b93026ada377640a6dd047f9a36c15d..3e5db3edf0f92587de5027886ff6cfb0794dda80 100644 (file)
@@ -5,6 +5,10 @@
 #include "svg_analyzer.h"
 #include "svgpp_context.h"
 #include "svgpp_document_traverser.h"
+#include <cgraph++/AGraph.h>
+#include <gvc++/GVContext.h>
+#include <gvc++/GVLayout.h>
+#include <gvc++/GVRenderData.h>
 
 SVGAnalyzer::SVGAnalyzer(char *text)
     : m_svg(SVG::SVGElement(SVG::SVGElementType::Svg)) {
@@ -242,6 +246,19 @@ void SVGAnalyzer::set_x(double x) { current_element().attributes.x = x; }
 
 void SVGAnalyzer::set_y(double y) { current_element().attributes.y = y; }
 
+SVGAnalyzer SVGAnalyzer::make_from_dot(const std::string &dot_source,
+                                       const std::string &engine) {
+  auto g = CGraph::AGraph{dot_source};
+
+  const auto demand_loading = false;
+  auto gvc = GVC::GVContext{lt_preloaded_symbols, demand_loading};
+
+  const auto layout = GVC::GVLayout(std::move(gvc), std::move(g), engine);
+
+  const auto result = layout.render("svg");
+  return SVGAnalyzer{result.c_str()};
+}
+
 void SVGAnalyzer::set_transform(double a, double b, double c, double d,
                                 double e, double f) {
   current_element().attributes.transform = {a, b, c, d, e, f};
index 033b4ee68a2558f99ab40c15527347d5854c3937..22f7e3be8eb262ad365e94ecc5979b6b741db06c 100644 (file)
@@ -55,6 +55,12 @@ public:
   void set_width(double width) override;
   void set_x(double x) override;
   void set_y(double y) override;
+  /// Create an SVGAnalyzer from DOT source using the `engine` layout engine.
+  ///
+  /// \param dot_source The DOT source
+  /// \param engine The Graphviz layout engine
+  static SVGAnalyzer make_from_dot(const std::string &dot_source,
+                                   const std::string &engine = "dot");
   std::size_t num_svgs() const { return m_num_svgs; };
   std::size_t num_groups() const { return m_num_groups; };
   std::size_t num_circles() const { return m_num_circles; };
index 7e17c37c7ea1ff5be76be2954a1c74fb491edcd6..34c194cfd763b2f7d80d4c54760a651261a3471a 100644 (file)
@@ -5,10 +5,6 @@
 
 #include "svg_analyzer.h"
 #include "test_utilities.h"
-#include <cgraph++/AGraph.h>
-#include <gvc++/GVContext.h>
-#include <gvc++/GVLayout.h>
-#include <gvc++/GVRenderData.h>
 
 TEST_CASE("Graph rankdir", "Test that the Graphviz `rankdir` attribute affects "
                            "the relative placement of nodes and edges "
@@ -27,15 +23,9 @@ TEST_CASE("Graph rankdir", "Test that the Graphviz `rankdir` attribute affects "
   auto dot = fmt::format(
       "digraph g1 {{rankdir={}; node [shape={} fontname=Courier]; a -> b}}",
       rankdir, shape);
-  auto g = CGraph::AGraph{dot};
 
-  const auto demand_loading = false;
-  auto gvc = GVC::GVContext{lt_preloaded_symbols, demand_loading};
-
-  const auto layout = GVC::GVLayout(std::move(gvc), std::move(g), "dot");
-
-  const auto result = layout.render("svg");
-  SVGAnalyzer svg_analyzer{result.c_str()};
+  const auto engine = "dot";
+  auto svg_analyzer = SVGAnalyzer::make_from_dot(dot, engine);
 
   REQUIRE(svg_analyzer.graphs().size() == 1);
   const auto &graph = svg_analyzer.graphs().back();