summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJasper van de Gronde <jasper.vandegronde@gmail.com>2008-08-06 14:31:46 +0000
committerjaspervdg <jaspervdg@users.sourceforge.net>2008-08-06 14:31:46 +0000
commitbdec1c2cc5876bab2278bfc16858844bb70901af (patch)
tree2c70cc5489229a245f6d4c279e3d5c8aee4bc60a /src
parentImprove comment in pen-context.cpp (diff)
downloadinkscape-bdec1c2cc5876bab2278bfc16858844bb70901af.tar.gz
inkscape-bdec1c2cc5876bab2278bfc16858844bb70901af.zip
2Geom version of the path tests + some additional small changes.
(bzr r6578)
Diffstat (limited to 'src')
-rw-r--r--src/svg/Makefile_insert3
-rw-r--r--src/svg/svg-length-test.h2
-rw-r--r--src/svg/svg-path-geom-test.h563
-rw-r--r--src/svg/svg-path-nr-test.h (renamed from src/svg/svg-path-test.h)8
4 files changed, 570 insertions, 6 deletions
diff --git a/src/svg/Makefile_insert b/src/svg/Makefile_insert
index e8f31b3c8..f7d2fcc5e 100644
--- a/src/svg/Makefile_insert
+++ b/src/svg/Makefile_insert
@@ -50,7 +50,8 @@ svg_test_svg_includes = \
$(srcdir)/svg/svg-affine-test.h \
$(srcdir)/svg/svg-color-test.h \
$(srcdir)/svg/svg-length-test.h \
- $(srcdir)/svg/svg-path-test.h
+ $(srcdir)/svg/svg-path-geom-test.h \
+ $(srcdir)/svg/svg-path-nr-test.h
svg_libtest_svg_a_SOURCES = \
svg/test-svg.cpp \
diff --git a/src/svg/svg-length-test.h b/src/svg/svg-length-test.h
index 0f1ca5c95..ce709b51d 100644
--- a/src/svg/svg-length-test.h
+++ b/src/svg/svg-length-test.h
@@ -131,7 +131,7 @@ public:
validStrings.erase(iter);
}
}
- TSM_ASSERT_EQUALS(validStrings, validStrings.size(), 0);
+ TSM_ASSERT_EQUALS(validStrings, validStrings.size(), 0u);
}
// TODO: More tests
diff --git a/src/svg/svg-path-geom-test.h b/src/svg/svg-path-geom-test.h
new file mode 100644
index 000000000..1bcc5fb17
--- /dev/null
+++ b/src/svg/svg-path-geom-test.h
@@ -0,0 +1,563 @@
+#include <cxxtest/TestSuite.h>
+#include "2geom/coord.h"
+#include "2geom/curves.h"
+#include "2geom/pathvector.h"
+#include "svg/svg.h"
+#include "prefs-utils.h"
+#include "streq.h"
+#include <stdio.h>
+#include <string>
+#include <vector>
+#include <glib/gmem.h>
+
+class SvgPathGeomTest : public CxxTest::TestSuite
+{
+private:
+ std::vector<std::string> rectanglesAbsoluteClosed;
+ std::vector<std::string> rectanglesRelativeClosed;
+ std::vector<std::string> rectanglesAbsoluteOpen;
+ std::vector<std::string> rectanglesRelativeOpen;
+ Geom::PathVector rectanglepv;
+public:
+ SvgPathGeomTest() {
+ // Lots of ways to define the same rectangle
+ rectanglesAbsoluteClosed.push_back("M 1,2 L 4,2 L 4,8 L 1,8 L 1,2 Z");
+ rectanglesAbsoluteClosed.push_back("M 1,2 L 4,2 L 4,8 L 1,8 z");
+ rectanglesAbsoluteClosed.push_back("M 1,2 4,2 4,8 1,8 z");
+ rectanglesAbsoluteClosed.push_back("M 1,2 H 4 V 8 H 1 z");
+ rectanglesRelativeClosed.push_back("m 1,2 l 3,0 l 0,6 l -3,0 z");
+ rectanglesRelativeClosed.push_back("m 1,2 3,0 0,6 -3,0 z");
+ rectanglesRelativeClosed.push_back("m 1,2 h 3 v 6 h -3 z");
+ rectanglesAbsoluteOpen.push_back("M 1,2 L 4,2 L 4,8 L 1,8 L 1,2");
+ rectanglesAbsoluteOpen.push_back("M 1,2 4,2 4,8 1,8 1,2");
+ rectanglesAbsoluteOpen.push_back("M 1,2 H 4 V 8 H 1 V 2");
+ rectanglesRelativeOpen.push_back("m 1,2 l 3,0 l 0,6 l -3,0 l 0,-6");
+ rectanglesRelativeOpen.push_back("m 1,2 3,0 0,6 -3,0 0,-6");
+ rectanglesRelativeOpen.push_back("m 1,2 h 3 v 6 h -3 v -6");
+ rectanglepv.push_back(Geom::Path(Geom::Point(1,2)));
+ rectanglepv.back().append(Geom::LineSegment(Geom::Point(1,2),Geom::Point(4,2)));
+ rectanglepv.back().append(Geom::LineSegment(Geom::Point(4,2),Geom::Point(4,8)));
+ rectanglepv.back().append(Geom::LineSegment(Geom::Point(4,8),Geom::Point(1,8)));
+ rectanglepv.back().append(Geom::LineSegment(Geom::Point(1,8),Geom::Point(1,2)));
+ // TODO: Also test some (smooth) cubic/quadratic beziers and elliptical arcs
+ }
+
+// createSuite and destroySuite get us per-suite setup and teardown
+// without us having to worry about static initialization order, etc.
+ static SvgPathGeomTest *createSuite() { return new SvgPathGeomTest(); }
+ static void destroySuite( SvgPathGeomTest *suite ) { delete suite; }
+
+ void testReadRectanglesAbsoluteClosed()
+ {
+ rectanglepv.back().close();
+ for(size_t i=0; i<rectanglesAbsoluteClosed.size(); i++) {
+ Geom::PathVector pv = sp_svg_read_pathv(rectanglesAbsoluteClosed[i].c_str());
+ TSM_ASSERT(rectanglesAbsoluteClosed[i].c_str(), bpathEqual(pv,rectanglepv));
+ }
+ }
+
+ void testReadRectanglesRelativeClosed()
+ {
+ rectanglepv.back().close();
+ for(size_t i=0; i<rectanglesRelativeClosed.size(); i++) {
+ Geom::PathVector pv = sp_svg_read_pathv(rectanglesRelativeClosed[i].c_str());
+ TSM_ASSERT(rectanglesRelativeClosed[i].c_str(), bpathEqual(pv,rectanglepv));
+ }
+ }
+
+ void testReadRectanglesAbsoluteOpen()
+ {
+ rectanglepv.back().close(false);
+ for(size_t i=0; i<rectanglesAbsoluteOpen.size(); i++) {
+ Geom::PathVector pv = sp_svg_read_pathv(rectanglesAbsoluteOpen[i].c_str());
+ TSM_ASSERT(rectanglesAbsoluteOpen[i].c_str(), bpathEqual(pv,rectanglepv));
+ }
+ }
+
+ void testReadRectanglesRelativeOpen()
+ {
+ rectanglepv.back().close(false);
+ for(size_t i=0; i<rectanglesRelativeOpen.size(); i++) {
+ Geom::PathVector pv = sp_svg_read_pathv(rectanglesRelativeOpen[i].c_str());
+ TSM_ASSERT(rectanglesRelativeOpen[i].c_str(), bpathEqual(pv,rectanglepv));
+ }
+ }
+
+ void testReadConcatenatedPaths()
+ {
+ Geom::PathVector pv_good;
+ pv_good.push_back(rectanglepv.back());
+ pv_good.push_back(rectanglepv.back()*Geom::Translate(pv_good[0].finalPoint()));
+ pv_good.push_back(rectanglepv.back()*Geom::Translate(pv_good[1].finalPoint()));
+ pv_good.push_back(rectanglepv.back());
+ pv_good[0].close();
+ pv_good[1].close(false);
+ pv_good[2].close();
+ pv_good[3].close(false);
+ std::string path_str = rectanglesAbsoluteClosed[0] + rectanglesRelativeOpen[0] + rectanglesRelativeClosed[0] + rectanglesAbsoluteOpen[0];
+ Geom::PathVector pv = sp_svg_read_pathv(path_str.c_str());
+ TS_ASSERT(bpathEqual(pv,pv_good));
+ }
+
+ void testReadZeroLengthSubpaths() {
+ // Per the SVG 1.1 specification (section F5) zero-length subpaths are relevant
+ Geom::PathVector pv_good;
+ pv_good.push_back(Geom::Path(Geom::Point(0,0)));
+ pv_good.push_back(Geom::Path(Geom::Point(1,1)));
+ pv_good.back().append(Geom::LineSegment(Geom::Point(1,1),Geom::Point(2,2)));
+ pv_good.push_back(Geom::Path(Geom::Point(3,3)));
+ pv_good.back().close();
+ pv_good.push_back(Geom::Path(Geom::Point(4,4)));
+ pv_good.back().append(Geom::LineSegment(Geom::Point(4,4),Geom::Point(5,5)));
+ pv_good.back().close();
+ pv_good.push_back(Geom::Path(Geom::Point(6,6)));
+ { // Test absolute version
+ char const * path_str = "M 0,0 M 1,1 L 2,2 M 3,3 z M 4,4 L 5,5 z M 6,6";
+ Geom::PathVector pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,pv_good));
+ }
+ { // Test relative version
+ char const * path_str = "m 0,0 m 1,1 l 1,1 m 1,1 z m 1,1 l 1,1 z m 2,2";
+ Geom::PathVector pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,pv_good));
+ }
+ }
+
+ void testReadImplicitMoveto() {
+ Geom::PathVector pv_good;
+ pv_good.push_back(Geom::Path(Geom::Point(1,1)));
+ pv_good.back().append(Geom::LineSegment(Geom::Point(1,1),Geom::Point(2,2)));
+ pv_good.back().close();
+ pv_good.push_back(Geom::Path(Geom::Point(1,1)));
+ pv_good.back().append(Geom::LineSegment(Geom::Point(1,1),Geom::Point(3,3)));
+ pv_good.back().close();
+ { // Test absolute version
+ char const * path_str = "M 1,1 L 2,2 z L 3,3 z";
+ Geom::PathVector pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,pv_good));
+ }
+ { // Test relative version
+ char const * path_str = "M 1,1 L 2,2 z L 3,3 z";
+ Geom::PathVector pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,pv_good));
+ }
+ }
+
+ void testReadFloatingPoint() {
+ Geom::PathVector pv_good;
+ pv_good.push_back(Geom::Path(Geom::Point(.01,.02)));
+ pv_good.back().append(Geom::LineSegment(Geom::Point(.01,.02),Geom::Point(.04,.02)));
+ pv_good.back().append(Geom::LineSegment(Geom::Point(.04,.02),Geom::Point(1.5,1.6)));
+ pv_good.back().append(Geom::LineSegment(Geom::Point(1.5,1.6),Geom::Point(.01,.08)));
+ pv_good.back().close();
+ { // Test decimals
+ char const * path_str = "M .01,.02 L.04.02 L1.5,1.6L0.01,0.08 .01.02 z";
+ Geom::PathVector pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,pv_good));
+ }
+ { // Test exponent
+ char const * path_str = "M 1e-2,.2e-1 L 0.004e1,0.0002e+2 L0150E-2,1.6e0L1.0e-2,80e-3 z";
+ Geom::PathVector pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,pv_good));
+ }
+ }
+
+ void testReadImplicitSeparation() {
+ // Coordinates need not be separated by whitespace if they can still be read unambiguously
+ Geom::PathVector pv_good;
+ pv_good.push_back(Geom::Path(Geom::Point(.1,.2)));
+ pv_good.back().append(Geom::LineSegment(Geom::Point(.1,.2),Geom::Point(.4,.2)));
+ pv_good.back().append(Geom::LineSegment(Geom::Point(.4,.2),Geom::Point(.4,.8)));
+ pv_good.back().append(Geom::LineSegment(Geom::Point(.4,.8),Geom::Point(.1,.8)));
+ pv_good.back().close();
+ { // Test absolute
+ char const * path_str = "M .1.2+0.4.2e0.4e0+8e-1.1.8 z";
+ Geom::PathVector pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,pv_good));
+ }
+ { // Test relative
+ char const * path_str = "m .1.2+0.3.0e0.0e0+6e-1-.3.0 z";
+ Geom::PathVector pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,pv_good));
+ }
+ }
+
+ void testReadErrorMisplacedCharacter() {
+ char const * path_str;
+ Geom::PathVector pv;
+ rectanglepv.back().close();
+ // Comma in the wrong place (commas may only appear between parameters)
+ path_str = "M 1,2 4,2 4,8 1,8 z , m 13,15";
+ pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepv));
+ // Comma in the wrong place (commas may only appear between parameters)
+ path_str = "M 1,2 4,2 4,8 1,8 z m,13,15";
+ pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepv));
+ // Period in the wrong place (no numbers after a 'z')
+ path_str = "M 1,2 4,2 4,8 1,8 z . m 13,15";
+ pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepv));
+ // Sign in the wrong place (no numbers after a 'z')
+ path_str = "M 1,2 4,2 4,8 1,8 z + - m 13,15";
+ pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepv));
+ // Digit in the wrong place (no numbers after a 'z')
+ path_str = "M 1,2 4,2 4,8 1,8 z 9809 m 13,15";
+ pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepv));
+ // Digit in the wrong place (no numbers after a 'z')
+ path_str = "M 1,2 4,2 4,8 1,8 z 9809 876 m 13,15";
+ pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepv));
+ }
+
+ void testReadErrorUnrecognizedCharacter() {
+ char const * path_str;
+ Geom::PathVector pv;
+ rectanglepv.back().close();
+ // Unrecognized character
+ path_str = "M 1,2 4,2 4,8 1,8 z&m 13,15";
+ pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepv));
+ // Unrecognized character
+ path_str = "M 1,2 4,2 4,8 1,8 z m &13,15";
+ pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepv));
+ }
+
+ void testReadErrorTypo() {
+ char const * path_str;
+ Geom::PathVector pv;
+ rectanglepv.back().close();
+ // Typo
+ path_str = "M 1,2 4,2 4,8 1,8 z j 13,15";
+ pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepv));
+
+ rectanglepv.back().close(false);
+ // Typo
+ path_str = "M 1,2 4,2 4,8 1,8 L 1,2 x m 13,15";
+ pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepv));
+ }
+
+ void testReadErrorIllformedNumbers() {
+ char const * path_str;
+ Geom::PathVector pv;
+ rectanglepv.back().close();
+ // Double exponent
+ path_str = "M 1,2 4,2 4,8 1,8 z m 13e4e5,15";
+ pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepv));
+ // Double sign
+ path_str = "M 1,2 4,2 4,8 1,8 z m +-13,15";
+ pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepv));
+ // Double sign
+ path_str = "M 1,2 4,2 4,8 1,8 z m 13e+-12,15";
+ pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepv));
+ // No digit
+ path_str = "M 1,2 4,2 4,8 1,8 z m .e12,15";
+ pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepv));
+ // No digit
+ path_str = "M 1,2 4,2 4,8 1,8 z m .,15";
+ pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepv));
+ // No digit
+ path_str = "M 1,2 4,2 4,8 1,8 z m +,15";
+ pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepv));
+ // No digit
+ path_str = "M 1,2 4,2 4,8 1,8 z m +.e+,15";
+ pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepv));
+ }
+
+ void testReadErrorJunk() {
+ char const * path_str;
+ Geom::PathVector pv;
+ rectanglepv.back().close();
+ // Junk
+ path_str = "M 1,2 4,2 4,8 1,8 z j 357 hkjh.,34e34 90ih6kj4 h5k6vlh4N.,6,45wikuyi3yere..3487 m 13,23";
+ pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepv));
+ }
+
+ void testReadErrorStopReading() {
+ char const * path_str;
+ Geom::PathVector pv;
+ rectanglepv.back().close();
+ // Unrecognized parameter
+ path_str = "M 1,2 4,2 4,8 1,8 z m #$%,23,34";
+ pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepv));
+ // Invalid parameter
+ path_str = "M 1,2 4,2 4,8 1,8 z m #$%,23,34";
+ pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepv));
+ // Illformed parameter
+ path_str = "M 1,2 4,2 4,8 1,8 z m +-12,23,34";
+ pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepv));
+
+ rectanglepv.back().close(false);
+ // "Third" parameter
+ path_str = "M 1,2 4,2 4,8 1,8 1,2,3 M 12,23";
+ pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepv));
+ }
+
+ void testRoundTrip() {
+ // This is the easiest way to (also) test writing path data, as a path can be written in more than one way.
+ Geom::PathVector pv;
+ Geom::PathVector new_pv;
+ std::string org_path_str;
+ char * path_str;
+ // Rectangle (closed)
+ org_path_str = rectanglesAbsoluteClosed[0];
+ pv = sp_svg_read_pathv(org_path_str.c_str());
+ path_str = sp_svg_write_path(pv);
+ new_pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(org_path_str.c_str(), bpathEqual(pv,new_pv));
+ g_free(path_str);
+ // Rectangle (open)
+ org_path_str = rectanglesAbsoluteOpen[0];
+ pv = sp_svg_read_pathv(org_path_str.c_str());
+ path_str = sp_svg_write_path(pv);
+ new_pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(org_path_str.c_str(), bpathEqual(pv,new_pv));
+ g_free(path_str);
+ // Concatenated rectangles
+ org_path_str = rectanglesAbsoluteClosed[0] + rectanglesRelativeOpen[0] + rectanglesRelativeClosed[0] + rectanglesAbsoluteOpen[0];
+ pv = sp_svg_read_pathv(org_path_str.c_str());
+ path_str = sp_svg_write_path(pv);
+ new_pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(org_path_str.c_str(), bpathEqual(pv,new_pv));
+ g_free(path_str);
+ // Zero-length subpaths
+ org_path_str = "M 0,0 M 1,1 L 2,2 M 3,3 z M 4,4 L 5,5 z M 6,6";
+ pv = sp_svg_read_pathv(org_path_str.c_str());
+ path_str = sp_svg_write_path(pv);
+ new_pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(org_path_str.c_str(), bpathEqual(pv,new_pv));
+ g_free(path_str);
+ // Floating-point
+ org_path_str = "M .01,.02 L 0.04,0.02 L.04,.08L0.01,0.08 z""M 1e-2,.2e-1 L 0.004e1,0.0002e+2 L04E-2,.08e0L1.0e-2,80e-3 z";
+ pv = sp_svg_read_pathv(org_path_str.c_str());
+ path_str = sp_svg_write_path(pv);
+ new_pv = sp_svg_read_pathv(path_str);
+ TSM_ASSERT(org_path_str.c_str(), bpathEqual(pv, new_pv, 1e-17));
+ g_free(path_str);
+ }
+
+ void testMinexpPrecision() {
+ Geom::PathVector pv;
+ char * path_str;
+ // Default values
+ prefs_set_int_attribute("options.svgoutput", "allowrelativecoordinates", 1);
+ prefs_set_int_attribute("options.svgoutput", "forcerepeatcommands", 0);
+ prefs_set_int_attribute("options.svgoutput", "numericprecision", 8);
+ prefs_set_int_attribute("options.svgoutput", "minimumexponent", -8);
+ pv = sp_svg_read_pathv("M 123456781,1.23456781e-8 L 123456782,1.23456782e-8 L 123456785,1.23456785e-8 L 10123456400,1.23456785e-8 L 123456789,1.23456789e-8 L 123456789,101.234564e-8 L 123456789,1.23456789e-8");
+ path_str = sp_svg_write_path(pv);
+ TS_ASSERT_RELATION( streq_rel , "m 123456780,1.2345678e-8 0,0 10,1e-15 9999999210,0 -9999999210,0 0,9.99999921e-7 0,-9.99999921e-7" , path_str );
+ g_free(path_str);
+ }
+
+private:
+ bool bpathEqual(Geom::PathVector const &a, Geom::PathVector const &b, double eps = 1e-16) {
+ if (a.size() != b.size()) {
+ char temp[100];
+ sprintf(temp, "PathVectors not the same size. (%u != %u)", a.size(), b.size());
+ TS_FAIL(temp);
+ return false;
+ }
+ for(size_t i=0; i<a.size(); i++) {
+ Geom::Path const &pa = a[i];
+ Geom::Path const &pb = b[i];
+ if (pa.closed() != pb.closed()) {
+ TS_FAIL("One path is closed, the other open.");
+ return false;
+ }
+ if (pa.size() != pb.size()) {
+ char temp[100];
+ sprintf(temp, "Not the same number of curves in path. (%u != %u)", pa.size(), pb.size());
+ TS_FAIL(temp);
+ return false;
+ }
+ for(size_t j=0; j<pa.size(); j++) {
+ Geom::Curve const* ca = &pa[j];
+ Geom::Curve const* cb = &pb[j];
+ if (typeid(*ca) == typeid(*cb))
+ {
+ if(Geom::LineSegment const *la = dynamic_cast<Geom::LineSegment const*>(ca))
+ {
+ Geom::LineSegment const *lb = dynamic_cast<Geom::LineSegment const*>(cb);
+ if (!Geom::are_near((*la)[0],(*lb)[0], eps)) {
+ char temp[200];
+ sprintf(temp, "Different start of segment: (%g,%g) != (%g,%g)", (*la)[0][Geom::X], (*la)[0][Geom::Y], (*lb)[0][Geom::X], (*lb)[0][Geom::Y]);
+ TS_FAIL(temp);
+ return false;
+ }
+ if (!Geom::are_near((*la)[1],(*lb)[1], eps)) {
+ char temp[200];
+ sprintf(temp, "Different end of segment: (%g,%g) != (%g,%g)", (*la)[1][Geom::X], (*la)[1][Geom::Y], (*lb)[1][Geom::X], (*lb)[1][Geom::Y]);
+ TS_FAIL(temp);
+ return false;
+ }
+ }
+ else if(Geom::HLineSegment const *la = dynamic_cast<Geom::HLineSegment const*>(ca))
+ {
+ Geom::HLineSegment const *lb = dynamic_cast<Geom::HLineSegment const*>(cb);
+ if (!Geom::are_near((*la).initialPoint(),(*lb).initialPoint(), eps)) {
+ char temp[200];
+ sprintf(temp, "Different start of segment: (%g,%g) != (%g,%g)", (*la).initialPoint()[Geom::X], (*la).initialPoint()[Geom::Y], (*lb).initialPoint()[Geom::X], (*lb).initialPoint()[Geom::Y]);
+ TS_FAIL(temp);
+ return false;
+ }
+ if (!Geom::are_near((*la).finalPoint(),(*lb).finalPoint(), eps)) {
+ char temp[200];
+ sprintf(temp, "Different end of segment: (%g,%g) != (%g,%g)", (*la).finalPoint()[Geom::X], (*la).finalPoint()[Geom::Y], (*lb).finalPoint()[Geom::X], (*lb).finalPoint()[Geom::Y]);
+ TS_FAIL(temp);
+ return false;
+ }
+ }
+ else if(Geom::VLineSegment const *la = dynamic_cast<Geom::VLineSegment const*>(ca))
+ {
+ Geom::VLineSegment const *lb = dynamic_cast<Geom::VLineSegment const*>(cb);
+ if (!Geom::are_near((*la).initialPoint(),(*lb).initialPoint(), eps)) {
+ char temp[200];
+ sprintf(temp, "Different start of segment: (%g,%g) != (%g,%g)", (*la).initialPoint()[Geom::X], (*la).initialPoint()[Geom::Y], (*lb).initialPoint()[Geom::X], (*lb).initialPoint()[Geom::Y]);
+ TS_FAIL(temp);
+ return false;
+ }
+ if (!Geom::are_near((*la).finalPoint(),(*lb).finalPoint(), eps)) {
+ char temp[200];
+ sprintf(temp, "Different end of segment: (%g,%g) != (%g,%g)", (*la).finalPoint()[Geom::X], (*la).finalPoint()[Geom::Y], (*lb).finalPoint()[Geom::X], (*lb).finalPoint()[Geom::Y]);
+ TS_FAIL(temp);
+ return false;
+ }
+ }
+ else if(Geom::CubicBezier const *la = dynamic_cast<Geom::CubicBezier const*>(ca))
+ {
+ Geom::CubicBezier const *lb = dynamic_cast<Geom::CubicBezier const*>(cb);
+ if (!Geom::are_near((*la)[0],(*lb)[0], eps)) {
+ char temp[200];
+ sprintf(temp, "Different start of segment: (%g,%g) != (%g,%g)", (*la)[0][Geom::X], (*la)[0][Geom::Y], (*lb)[0][Geom::X], (*lb)[0][Geom::Y]);
+ TS_FAIL(temp);
+ return false;
+ }
+ if (!Geom::are_near((*la)[1],(*lb)[1], eps)) {
+ char temp[200];
+ sprintf(temp, "Different 1st control point: (%g,%g) != (%g,%g)", (*la)[1][Geom::X], (*la)[1][Geom::Y], (*lb)[1][Geom::X], (*lb)[1][Geom::Y]);
+ TS_FAIL(temp);
+ return false;
+ }
+ if (!Geom::are_near((*la)[2],(*lb)[2], eps)) {
+ char temp[200];
+ sprintf(temp, "Different 2nd control point: (%g,%g) != (%g,%g)", (*la)[2][Geom::X], (*la)[2][Geom::Y], (*lb)[2][Geom::X], (*lb)[2][Geom::Y]);
+ TS_FAIL(temp);
+ return false;
+ }
+ if (!Geom::are_near((*la)[3],(*lb)[3], eps)) {
+ char temp[200];
+ sprintf(temp, "Different end of segment: (%g,%g) != (%g,%g)", (*la)[3][Geom::X], (*la)[3][Geom::Y], (*lb)[3][Geom::X], (*lb)[3][Geom::Y]);
+ TS_FAIL(temp);
+ return false;
+ }
+ }
+ else
+ {
+ TS_FAIL((std::string("Unknown curve type: ") + typeid(*ca).name()).c_str());
+ return false;
+ }
+ }
+ else // not same type
+ {
+ if(Geom::LineSegment const *la = dynamic_cast<Geom::LineSegment const*>(ca))
+ {
+ if (Geom::HLineSegment const *lb = dynamic_cast<Geom::HLineSegment const*>(cb)) {
+ if (!Geom::are_near((*la).initialPoint(),(*lb).initialPoint(), eps)) {
+ char temp[200];
+ sprintf(temp, "Different start of segment: (%g,%g) != (%g,%g)", (*la).initialPoint()[Geom::X], (*la).initialPoint()[Geom::Y], (*lb).initialPoint()[Geom::X], (*lb).initialPoint()[Geom::Y]);
+ TS_FAIL(temp);
+ return false;
+ }
+ if (!Geom::are_near((*la).finalPoint(),(*lb).finalPoint(), eps)) {
+ char temp[200];
+ sprintf(temp, "Different end of segment: (%g,%g) != (%g,%g)", (*la).finalPoint()[Geom::X], (*la).finalPoint()[Geom::Y], (*lb).finalPoint()[Geom::X], (*lb).finalPoint()[Geom::Y]);
+ TS_FAIL(temp);
+ return false;
+ }
+ } else if (Geom::VLineSegment const *lb = dynamic_cast<Geom::VLineSegment const*>(cb)) {
+ if (!Geom::are_near((*la).initialPoint(),(*lb).initialPoint(), eps)) {
+ char temp[200];
+ sprintf(temp, "Different start of segment: (%g,%g) != (%g,%g)", (*la).initialPoint()[Geom::X], (*la).initialPoint()[Geom::Y], (*lb).initialPoint()[Geom::X], (*lb).initialPoint()[Geom::Y]);
+ TS_FAIL(temp);
+ return false;
+ }
+ if (!Geom::are_near((*la).finalPoint(),(*lb).finalPoint(), eps)) {
+ char temp[200];
+ sprintf(temp, "Different end of segment: (%g,%g) != (%g,%g)", (*la).finalPoint()[Geom::X], (*la).finalPoint()[Geom::Y], (*lb).finalPoint()[Geom::X], (*lb).finalPoint()[Geom::Y]);
+ TS_FAIL(temp);
+ return false;
+ }
+ } else {
+ TS_FAIL((std::string("Different curve types: ") + typeid(*ca).name() + " != " + typeid(*cb).name()).c_str());
+ return false;
+ }
+ }
+ else if(Geom::LineSegment const *lb = dynamic_cast<Geom::LineSegment const*>(cb))
+ {
+ if (Geom::HLineSegment const *la = dynamic_cast<Geom::HLineSegment const*>(ca)) {
+ if (!Geom::are_near((*la).initialPoint(),(*lb).initialPoint(), eps)) {
+ char temp[200];
+ sprintf(temp, "Different start of segment: (%g,%g) != (%g,%g)", (*la).initialPoint()[Geom::X], (*la).initialPoint()[Geom::Y], (*lb).initialPoint()[Geom::X], (*lb).initialPoint()[Geom::Y]);
+ TS_FAIL(temp);
+ return false;
+ }
+ if (!Geom::are_near((*la).finalPoint(),(*lb).finalPoint(), eps)) {
+ char temp[200];
+ sprintf(temp, "Different end of segment: (%g,%g) != (%g,%g)", (*la).finalPoint()[Geom::X], (*la).finalPoint()[Geom::Y], (*lb).finalPoint()[Geom::X], (*lb).finalPoint()[Geom::Y]);
+ TS_FAIL(temp);
+ return false;
+ }
+ } else if (Geom::VLineSegment const *la = dynamic_cast<Geom::VLineSegment const*>(ca)) {
+ if (!Geom::are_near((*la).initialPoint(),(*lb).initialPoint(), eps)) {
+ char temp[200];
+ sprintf(temp, "Different start of segment: (%g,%g) != (%g,%g)", (*la).initialPoint()[Geom::X], (*la).initialPoint()[Geom::Y], (*lb).initialPoint()[Geom::X], (*lb).initialPoint()[Geom::Y]);
+ TS_FAIL(temp);
+ return false;
+ }
+ if (!Geom::are_near((*la).finalPoint(),(*lb).finalPoint(), eps)) {
+ char temp[200];
+ sprintf(temp, "Different end of segment: (%g,%g) != (%g,%g)", (*la).finalPoint()[Geom::X], (*la).finalPoint()[Geom::Y], (*lb).finalPoint()[Geom::X], (*lb).finalPoint()[Geom::Y]);
+ TS_FAIL(temp);
+ return false;
+ }
+ } else {
+ TS_FAIL((std::string("Different curve types: ") + typeid(*ca).name() + " != " + typeid(*cb).name()).c_str());
+ return false;
+ }
+ }
+ }
+ }
+ }
+ return true;
+ }
+};
+
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :
diff --git a/src/svg/svg-path-test.h b/src/svg/svg-path-nr-test.h
index 28173cbd1..df9c46051 100644
--- a/src/svg/svg-path-test.h
+++ b/src/svg/svg-path-nr-test.h
@@ -8,7 +8,7 @@
#include <vector>
#include <glib/gmem.h>
-class SvgPathTest : public CxxTest::TestSuite
+class SvgPathNRTest : public CxxTest::TestSuite
{
private:
std::vector<std::string> rectanglesAbsoluteClosed;
@@ -17,7 +17,7 @@ private:
std::vector<std::string> rectanglesRelativeOpen;
NArtBpath rectangleBpath[5+1];
public:
- SvgPathTest() {
+ SvgPathNRTest() {
// Lots of ways to define the same rectangle
rectanglesAbsoluteClosed.push_back("M 1,2 L 4,2 L 4,8 L 1,8 L 1,2 Z");
rectanglesAbsoluteClosed.push_back("M 1,2 L 4,2 L 4,8 L 1,8 z");
@@ -53,8 +53,8 @@ public:
// createSuite and destroySuite get us per-suite setup and teardown
// without us having to worry about static initialization order, etc.
- static SvgPathTest *createSuite() { return new SvgPathTest(); }
- static void destroySuite( SvgPathTest *suite ) { delete suite; }
+ static SvgPathNRTest *createSuite() { return new SvgPathNRTest(); }
+ static void destroySuite( SvgPathNRTest *suite ) { delete suite; }
void testReadRectanglesAbsoluteClosed()
{