summaryrefslogtreecommitdiffstats
path: root/testfiles/src/svg-extension-test.cpp
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 11:50:49 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 11:50:49 +0000
commitc853ffb5b2f75f5a889ed2e3ef89b818a736e87a (patch)
tree7d13a0883bb7936b84d6ecdd7bc332b41ed04bee /testfiles/src/svg-extension-test.cpp
parentInitial commit. (diff)
downloadinkscape-c853ffb5b2f75f5a889ed2e3ef89b818a736e87a.tar.xz
inkscape-c853ffb5b2f75f5a889ed2e3ef89b818a736e87a.zip
Adding upstream version 1.3+ds.upstream/1.3+dsupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testfiles/src/svg-extension-test.cpp')
-rw-r--r--testfiles/src/svg-extension-test.cpp131
1 files changed, 131 insertions, 0 deletions
diff --git a/testfiles/src/svg-extension-test.cpp b/testfiles/src/svg-extension-test.cpp
new file mode 100644
index 0000000..4e4d3e5
--- /dev/null
+++ b/testfiles/src/svg-extension-test.cpp
@@ -0,0 +1,131 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/** @file
+ * SVG Extension test
+ *//*
+ * Authors: see git history
+ *
+ * Copyright (C) 2020 Authors
+ *
+ * Released under GNU GPL version 2 or later, read the file 'COPYING' for more information
+ */
+
+#include <gtest/gtest.h>
+
+#include <src/extension/db.h>
+#include <src/extension/input.h>
+#include <src/extension/internal/svg.h>
+#include <src/extension/internal/svg.cpp>
+#include <src/inkscape.h>
+#include <src/object/sp-text.h>
+#include <src/object/sp-tspan.h>
+
+#include <glib/gstdio.h>
+
+using namespace Inkscape;
+using namespace Inkscape::Extension;
+using namespace Inkscape::Extension::Internal;
+
+class SvgExtensionTest : public ::testing::Test {
+ public:
+ static std::string create_file(const std::string &filename, const std::string &content)
+ {
+ std::stringstream path_builder;
+ path_builder << "SvgExtensionTest_" << _files.size() << "_" << filename;
+ std::string path = path_builder.str();
+ GError *error = nullptr;
+ if (!g_file_set_contents(path.c_str(), content.c_str(), content.size(), &error)) {
+ std::stringstream msg;
+ msg << "SvgExtensionTest::create_file failed: GError(" << error->domain << ", " << error->code << ", "
+ << error->message << ")";
+ g_error_free(error);
+ throw std::runtime_error(msg.str());
+ }
+ _files.insert(path);
+ return path;
+ }
+
+ static std::set<std::string> _files;
+
+ protected:
+ void SetUp() override
+ {
+ // setup hidden dependency
+ Application::create(false);
+ }
+
+ static void TearDownTestCase()
+ {
+ for (auto file : _files) {
+ if (g_remove(file.c_str())) {
+ std::cout << "SvgExtensionTest was unable to remove file: " << file << std::endl;
+ }
+ }
+ }
+};
+
+std::set<std::string> SvgExtensionTest::_files;
+
+TEST_F(SvgExtensionTest, openingAsLinkInImageASizelessSvgFileReturnsNull)
+{
+ std::string sizeless_svg_file =
+ create_file("sizeless.svg",
+ "<svg><path d=\"M 71.527648,186.14229 A 740.48715,740.48715 0 0 0 696.31258,625.8041 Z\"/></svg>");
+
+ Svg::init();
+ Input *svg_input_extension(dynamic_cast<Input *>(db.get(SP_MODULE_KEY_INPUT_SVG)));
+
+ Preferences *prefs = Preferences::get();
+ prefs->setBool("/options/onimport", true);
+ prefs->setBool("/dialogs/import/ask_svg", false);
+ prefs->setString("/dialogs/import/import_mode_svg", "link");
+
+ ASSERT_EQ(svg_input_extension->open(sizeless_svg_file.c_str()), nullptr);
+}
+
+TEST_F(SvgExtensionTest, hiddenSvg2TextIsSaved)
+{
+ char const *docString = R"""(
+<svg width="100" height="200">
+ <defs>
+ <rect id="rect1" x="0" y="0" width="100" height="100" />
+ <rect id="rect2" x="0" y="100" width="100" height="100" />
+ </defs>
+ <g>
+ <text id="text1" style="shape-inside:url(#rect1);display:inline;">
+ <tspan id="tspan1" x="0" y="0">foo</tspan>
+ </text>
+ <text id="text2" style="shape-inside:url(#rect2);display:none;" >
+ <tspan id="tspan2" x="0" y="0">bar</tspan>
+ </text>
+ </g>
+</svg>
+)""";
+ SPDocument *doc = SPDocument::createNewDocFromMem(docString, static_cast<int>(strlen(docString)), false);
+ ASSERT_TRUE(doc);
+
+ std::map<std::string,std::string> textMap;
+ textMap["text1"] = "foo";
+ textMap["text2"] = "bar";
+
+ // otherwise the layout reports a size of 0
+ for (const auto& kv : textMap) {
+ auto textElement = cast<SPText>(doc->getObjectById(kv.first));
+ ASSERT_TRUE(textElement);
+ textElement->rebuildLayout();
+ }
+
+ Inkscape::XML::Document *rdoc = doc->getReprDoc();
+ ASSERT_TRUE(rdoc);
+
+ Inkscape::Extension::Internal::insert_text_fallback(rdoc->root(), doc);
+
+ for(const auto& kv : textMap) {
+ auto textElement = doc->getObjectById(kv.first);
+ ASSERT_TRUE(textElement);
+ auto tspanElement = textElement->firstChild();
+ ASSERT_TRUE(tspanElement);
+ auto stringElement = cast<SPString>(tspanElement->firstChild());
+ ASSERT_TRUE(stringElement);
+ ASSERT_EQ(kv.second, stringElement->string);
+ }
+}