summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/display/curve-test.h16
-rw-r--r--src/svg/svg-path-geom-test.h231
-rw-r--r--src/svg/svg-path-nr-test.h7
3 files changed, 164 insertions, 90 deletions
diff --git a/src/display/curve-test.h b/src/display/curve-test.h
index cca77e063..a45f01afd 100644
--- a/src/display/curve-test.h
+++ b/src/display/curve-test.h
@@ -15,11 +15,11 @@ private:
public:
CurveTest() : path4(Geom::Point(3,5)) // Just a moveto
{
- // Closed path which needs a closing segment
+ // Closed path
path1.append(Geom::HLineSegment(Geom::Point(0,0),1));
path1.append(Geom::VLineSegment(Geom::Point(1,0),1));
path1.close();
- // Closed path that doesn't need a closing segment
+ // Closed path (ClosingSegment is zero length)
path2.append(Geom::LineSegment(Geom::Point(2,0),Geom::Point(3,0)));
path2.append(Geom::BezierCurve<3>(Geom::Point(3,0),Geom::Point(2,1),Geom::Point(1,1),Geom::Point(2,0)));
path2.close();
@@ -53,11 +53,13 @@ public:
pv[0] = path1;
TS_ASSERT_EQUALS(SPCurve(pv).get_segment_count() , 3u);
pv[0] = path2;
- TS_ASSERT_EQUALS(SPCurve(pv).get_segment_count() , 2u);
+ TS_ASSERT_EQUALS(SPCurve(pv).get_segment_count() , 3u);
pv[0] = path3;
TS_ASSERT_EQUALS(SPCurve(pv).get_segment_count() , 4u);
pv[0] = path4;
TS_ASSERT_EQUALS(SPCurve(pv).get_segment_count() , 0u);
+ pv[0].close();
+ TS_ASSERT_EQUALS(SPCurve(pv).get_segment_count() , 1u);
}
{ // Combination
Geom::PathVector pv;
@@ -66,7 +68,7 @@ public:
pv.push_back(path3);
pv.push_back(path4);
SPCurve curve(pv);
- TS_ASSERT_EQUALS(curve.get_segment_count() , 9u);
+ TS_ASSERT_EQUALS(curve.get_segment_count() , 10u);
}
}
@@ -88,11 +90,13 @@ public:
pv[0] = path1;
TS_ASSERT_EQUALS(SPCurve(pv).nodes_in_path() , 3u);
pv[0] = path2;
- TS_ASSERT_EQUALS(SPCurve(pv).nodes_in_path() , 2u);
+ TS_ASSERT_EQUALS(SPCurve(pv).nodes_in_path() , 3u);
pv[0] = path3;
TS_ASSERT_EQUALS(SPCurve(pv).nodes_in_path() , 5u);
pv[0] = path4;
TS_ASSERT_EQUALS(SPCurve(pv).nodes_in_path() , 1u);
+ pv[0].close();
+ TS_ASSERT_EQUALS(SPCurve(pv).nodes_in_path() , 1u);
}
{ // Combination
Geom::PathVector pv;
@@ -101,7 +105,7 @@ public:
pv.push_back(path3);
pv.push_back(path4);
SPCurve curve(pv);
- TS_ASSERT_EQUALS(curve.nodes_in_path() , 11u);
+ TS_ASSERT_EQUALS(curve.nodes_in_path() , 12u);
}
}
diff --git a/src/svg/svg-path-geom-test.h b/src/svg/svg-path-geom-test.h
index 1bcc5fb17..32a2ed231 100644
--- a/src/svg/svg-path-geom-test.h
+++ b/src/svg/svg-path-geom-test.h
@@ -17,11 +17,14 @@ private:
std::vector<std::string> rectanglesRelativeClosed;
std::vector<std::string> rectanglesAbsoluteOpen;
std::vector<std::string> rectanglesRelativeOpen;
- Geom::PathVector rectanglepv;
+ std::vector<std::string> rectanglesAbsoluteClosed2;
+ std::vector<std::string> rectanglesRelativeClosed2;
+ Geom::PathVector rectanglepvopen;
+ Geom::PathVector rectanglepvclosed;
+ Geom::PathVector rectanglepvclosed2;
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");
@@ -34,12 +37,31 @@ public:
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)));
+ rectanglesAbsoluteClosed2.push_back("M 1,2 L 4,2 L 4,8 L 1,8 L 1,2 z");
+ rectanglesAbsoluteClosed2.push_back("M 1,2 4,2 4,8 1,8 1,2 z");
+ rectanglesAbsoluteClosed2.push_back("M 1,2 H 4 V 8 H 1 V 2 z");
+ rectanglesRelativeClosed2.push_back("m 1,2 l 3,0 l 0,6 l -3,0 l 0,-6 z");
+ rectanglesRelativeClosed2.push_back("m 1,2 3,0 0,6 -3,0 0,-6 z");
+ rectanglesRelativeClosed2.push_back("m 1,2 h 3 v 6 h -3 v -6 z");
+ rectanglepvopen.push_back(Geom::Path(Geom::Point(1,2)));
+ rectanglepvopen.back().append(Geom::LineSegment(Geom::Point(1,2),Geom::Point(4,2)));
+ rectanglepvopen.back().append(Geom::LineSegment(Geom::Point(4,2),Geom::Point(4,8)));
+ rectanglepvopen.back().append(Geom::LineSegment(Geom::Point(4,8),Geom::Point(1,8)));
+ rectanglepvopen.back().append(Geom::LineSegment(Geom::Point(1,8),Geom::Point(1,2)));
+ rectanglepvclosed.push_back(Geom::Path(Geom::Point(1,2)));
+ rectanglepvclosed.back().append(Geom::LineSegment(Geom::Point(1,2),Geom::Point(4,2)));
+ rectanglepvclosed.back().append(Geom::LineSegment(Geom::Point(4,2),Geom::Point(4,8)));
+ rectanglepvclosed.back().append(Geom::LineSegment(Geom::Point(4,8),Geom::Point(1,8)));
+ rectanglepvclosed.back().close();
+ rectanglepvclosed2.push_back(Geom::Path(Geom::Point(1,2)));
+ rectanglepvclosed2.back().append(Geom::LineSegment(Geom::Point(1,2),Geom::Point(4,2)));
+ rectanglepvclosed2.back().append(Geom::LineSegment(Geom::Point(4,2),Geom::Point(4,8)));
+ rectanglepvclosed2.back().append(Geom::LineSegment(Geom::Point(4,8),Geom::Point(1,8)));
+ rectanglepvclosed2.back().append(Geom::LineSegment(Geom::Point(1,8),Geom::Point(1,2)));
+ rectanglepvclosed2.back().close();
// TODO: Also test some (smooth) cubic/quadratic beziers and elliptical arcs
+ // TODO: Should we make it mandatory that h/v in the path data results in a H/VLineSegment?
+ // If so, the tests should be modified to reflect this.
}
// createSuite and destroySuite get us per-suite setup and teardown
@@ -49,47 +71,60 @@ public:
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));
+ TSM_ASSERT(rectanglesAbsoluteClosed[i].c_str(), bpathEqual(pv,rectanglepvclosed));
}
}
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));
+ TSM_ASSERT(rectanglesRelativeClosed[i].c_str(), bpathEqual(pv,rectanglepvclosed));
}
}
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));
+ TSM_ASSERT(rectanglesAbsoluteOpen[i].c_str(), bpathEqual(pv,rectanglepvopen));
}
}
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));
+ TSM_ASSERT(rectanglesRelativeOpen[i].c_str(), bpathEqual(pv,rectanglepvopen));
+ }
+ }
+
+ void testReadRectanglesAbsoluteClosed2()
+ {
+ for(size_t i=0; i<rectanglesAbsoluteClosed2.size(); i++) {
+ Geom::PathVector pv = sp_svg_read_pathv(rectanglesAbsoluteClosed2[i].c_str());
+ TSM_ASSERT(rectanglesAbsoluteClosed2[i].c_str(), bpathEqual(pv,rectanglepvclosed2));
+ }
+ }
+
+ void testReadRectanglesRelativeClosed2()
+ {
+ for(size_t i=0; i<rectanglesRelativeClosed2.size(); i++) {
+ Geom::PathVector pv = sp_svg_read_pathv(rectanglesRelativeClosed2[i].c_str());
+ TSM_ASSERT(rectanglesRelativeClosed2[i].c_str(), bpathEqual(pv,rectanglepvclosed2));
}
}
void testReadConcatenatedPaths()
{
+ // Note that finalPoint doesn't actually return the final point of the path, just the last given point... (but since this might be intentional and we're not testing lib2geom here, we just specify the final point explicitly
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.push_back(rectanglepvclosed.back());
+ pv_good.push_back(rectanglepvopen.back() * Geom::Translate(1,2)/* * Geom::Translate(pv_good[0].finalPoint())*/);
+ pv_good.push_back(rectanglepvclosed.back() * Geom::Translate(2,4)/* *Geom::Translate(pv_good[1].finalPoint())*/);
+ pv_good.push_back(rectanglepvopen.back());
pv_good[0].close();
pv_good[1].close(false);
pv_good[2].close();
@@ -124,6 +159,7 @@ public:
}
void testReadImplicitMoveto() {
+ TS_WARN("Currently lib2geom (/libnr) has no way of specifying the difference between '... z M 0,0 L 1,0' and '... z L 1,0', the SVG specification does state that these should be handled differently with respect to markers however, see the description of the 'orient' attribute of the 'marker' element.");
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)));
@@ -144,21 +180,28 @@ public:
}
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();
+ Geom::PathVector pv_good1;
+ pv_good1.push_back(Geom::Path(Geom::Point(.01,.02)));
+ pv_good1.back().append(Geom::LineSegment(Geom::Point(.01,.02),Geom::Point(.04,.02)));
+ pv_good1.back().append(Geom::LineSegment(Geom::Point(.04,.02),Geom::Point(1.5,1.6)));
+ pv_good1.back().append(Geom::LineSegment(Geom::Point(1.5,1.6),Geom::Point(.01,.08)));
+ pv_good1.back().append(Geom::LineSegment(Geom::Point(.01,.08),Geom::Point(.01,.02)));
+ pv_good1.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));
+ TSM_ASSERT(path_str, bpathEqual(pv,pv_good1));
}
+ Geom::PathVector pv_good2;
+ pv_good2.push_back(Geom::Path(Geom::Point(.01,.02)));
+ pv_good2.back().append(Geom::LineSegment(Geom::Point(.01,.02),Geom::Point(.04,.02)));
+ pv_good2.back().append(Geom::LineSegment(Geom::Point(.04,.02),Geom::Point(1.5,1.6)));
+ pv_good2.back().append(Geom::LineSegment(Geom::Point(1.5,1.6),Geom::Point(.01,.08)));
+ pv_good2.back().close();
{ // 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));
+ TSM_ASSERT(path_str, bpathEqual(pv,pv_good2));
}
}
@@ -185,129 +228,121 @@ public:
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));
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepvclosed));
// 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));
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepvclosed));
// 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));
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepvclosed));
// 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));
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepvclosed));
// 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));
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepvclosed));
// 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));
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepvclosed));
}
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));
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepvclosed));
// 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));
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepvclosed));
}
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));
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepvclosed));
- 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));
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepvopen));
}
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));
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepvclosed));
// 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));
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepvclosed));
// 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));
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepvclosed));
// 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));
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepvclosed));
// 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));
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepvclosed));
// 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));
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepvclosed));
// 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));
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepvclosed));
}
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));
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepvclosed));
}
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));
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepvclosed));
// 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));
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepvclosed));
// 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));
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepvclosed));
- 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));
+ TSM_ASSERT(path_str, bpathEqual(pv,rectanglepvopen));
}
void testRoundTrip() {
@@ -371,20 +406,28 @@ 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());
+ 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.");
+ if (pa.closed() && !pb.closed()) {
+ char temp[100];
+ sprintf(temp, "Left subpath is closed, right subpath is open. Subpath: %u", i);
+ TS_FAIL(temp);
+ return false;
+ }
+ if (!pa.closed() && pb.closed()) {
+ char temp[100];
+ sprintf(temp, "Right subpath is closed, left subpath is open. Subpath: %u", i);
+ TS_FAIL(temp);
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());
+ sprintf(temp, "Not the same number of segments: %u != %u, subpath: %u", pa.size(), pb.size(), i);
TS_FAIL(temp);
return false;
}
@@ -398,13 +441,13 @@ private:
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]);
+ sprintf(temp, "Different start of segment: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la)[0][Geom::X], (*la)[0][Geom::Y], (*lb)[0][Geom::X], (*lb)[0][Geom::Y], i, j);
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]);
+ sprintf(temp, "Different end of segment: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la)[1][Geom::X], (*la)[1][Geom::Y], (*lb)[1][Geom::X], (*lb)[1][Geom::Y], i, j);
TS_FAIL(temp);
return false;
}
@@ -414,13 +457,13 @@ private:
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]);
+ sprintf(temp, "Different start of segment: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la).initialPoint()[Geom::X], (*la).initialPoint()[Geom::Y], (*lb).initialPoint()[Geom::X], (*lb).initialPoint()[Geom::Y], i, j);
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]);
+ sprintf(temp, "Different end of segment: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la).finalPoint()[Geom::X], (*la).finalPoint()[Geom::Y], (*lb).finalPoint()[Geom::X], (*lb).finalPoint()[Geom::Y], i, j);
TS_FAIL(temp);
return false;
}
@@ -430,13 +473,13 @@ private:
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]);
+ sprintf(temp, "Different start of segment: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la).initialPoint()[Geom::X], (*la).initialPoint()[Geom::Y], (*lb).initialPoint()[Geom::X], (*lb).initialPoint()[Geom::Y], i, j);
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]);
+ sprintf(temp, "Different end of segment: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la).finalPoint()[Geom::X], (*la).finalPoint()[Geom::Y], (*lb).finalPoint()[Geom::X], (*lb).finalPoint()[Geom::Y], i, j);
TS_FAIL(temp);
return false;
}
@@ -446,33 +489,34 @@ private:
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]);
+ sprintf(temp, "Different start of segment: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la)[0][Geom::X], (*la)[0][Geom::Y], (*lb)[0][Geom::X], (*lb)[0][Geom::Y], i, j);
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]);
+ sprintf(temp, "Different 1st control point: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la)[1][Geom::X], (*la)[1][Geom::Y], (*lb)[1][Geom::X], (*lb)[1][Geom::Y], i, j);
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]);
+ sprintf(temp, "Different 2nd control point: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la)[2][Geom::X], (*la)[2][Geom::Y], (*lb)[2][Geom::X], (*lb)[2][Geom::Y], i, j);
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]);
+ sprintf(temp, "Different end of segment: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la)[3][Geom::X], (*la)[3][Geom::Y], (*lb)[3][Geom::X], (*lb)[3][Geom::Y], i, j);
TS_FAIL(temp);
return false;
}
}
else
{
- TS_FAIL((std::string("Unknown curve type: ") + typeid(*ca).name()).c_str());
- return false;
+ char temp[200];
+ sprintf(temp, "Unknown curve type: %s, subpath: %u, segment: %u", typeid(*ca).name(), i, j);
+ TS_FAIL(temp);
}
}
else // not same type
@@ -482,32 +526,39 @@ private:
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]);
+ sprintf(temp, "Different start of segment: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la).initialPoint()[Geom::X], (*la).initialPoint()[Geom::Y], (*lb).initialPoint()[Geom::X], (*lb).initialPoint()[Geom::Y], i, j);
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]);
+ sprintf(temp, "Different end of segment: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la).finalPoint()[Geom::X], (*la).finalPoint()[Geom::Y], (*lb).finalPoint()[Geom::X], (*lb).finalPoint()[Geom::Y], i, j);
TS_FAIL(temp);
return false;
}
+ char temp[200];
+ sprintf(temp, "A LineSegment and an HLineSegment have been considered equal. Subpath: %u, segment: %u", i, j);
+ TS_TRACE(temp);
} 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]);
+ sprintf(temp, "Different start of segment: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la).initialPoint()[Geom::X], (*la).initialPoint()[Geom::Y], (*lb).initialPoint()[Geom::X], (*lb).initialPoint()[Geom::Y], i, j);
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]);
+ sprintf(temp, "Different end of segment: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la).finalPoint()[Geom::X], (*la).finalPoint()[Geom::Y], (*lb).finalPoint()[Geom::X], (*lb).finalPoint()[Geom::Y], i, j);
TS_FAIL(temp);
return false;
}
+ char temp[200];
+ sprintf(temp, "A LineSegment and a VLineSegment have been considered equal. Subpath: %u, segment: %u", i, j);
+ TS_TRACE(temp);
} else {
- TS_FAIL((std::string("Different curve types: ") + typeid(*ca).name() + " != " + typeid(*cb).name()).c_str());
- return false;
+ char temp[200];
+ sprintf(temp, "Different curve types: %s != %s, subpath: %u, segment: %u", typeid(*ca).name(), typeid(*cb).name(), i, j);
+ TS_FAIL(temp);
}
}
else if(Geom::LineSegment const *lb = dynamic_cast<Geom::LineSegment const*>(cb))
@@ -515,33 +566,45 @@ private:
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]);
+ sprintf(temp, "Different start of segment: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la).initialPoint()[Geom::X], (*la).initialPoint()[Geom::Y], (*lb).initialPoint()[Geom::X], (*lb).initialPoint()[Geom::Y], i, j);
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]);
+ sprintf(temp, "Different end of segment: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la).finalPoint()[Geom::X], (*la).finalPoint()[Geom::Y], (*lb).finalPoint()[Geom::X], (*lb).finalPoint()[Geom::Y], i, j);
TS_FAIL(temp);
return false;
}
+ char temp[200];
+ sprintf(temp, "An HLineSegment and a LineSegment have been considered equal. Subpath: %u, segment: %u", i, j);
+ TS_TRACE(temp);
} 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]);
+ sprintf(temp, "Different start of segment: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la).initialPoint()[Geom::X], (*la).initialPoint()[Geom::Y], (*lb).initialPoint()[Geom::X], (*lb).initialPoint()[Geom::Y], i, j);
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]);
+ sprintf(temp, "Different end of segment: (%g,%g) != (%g,%g), subpath: %u, segment: %u", (*la).finalPoint()[Geom::X], (*la).finalPoint()[Geom::Y], (*lb).finalPoint()[Geom::X], (*lb).finalPoint()[Geom::Y], i, j);
TS_FAIL(temp);
return false;
}
+ char temp[200];
+ sprintf(temp, "A VLineSegment and a LineSegment have been considered equal. Subpath: %u, segment: %u", i, j);
+ TS_TRACE(temp);
} else {
- TS_FAIL((std::string("Different curve types: ") + typeid(*ca).name() + " != " + typeid(*cb).name()).c_str());
+ char temp[200];
+ sprintf(temp, "Different curve types: %s != %s, subpath: %u, segment: %u", typeid(*ca).name(), typeid(*cb).name(), i, j);
+ TS_FAIL(temp);
return false;
}
+ } else {
+ char temp[200];
+ sprintf(temp, "Different curve types: %s != %s, subpath: %u, segment: %u", typeid(*ca).name(), typeid(*cb).name(), i, j);
+ TS_FAIL(temp);
}
}
}
diff --git a/src/svg/svg-path-nr-test.h b/src/svg/svg-path-nr-test.h
index df9c46051..58f7cd0e7 100644
--- a/src/svg/svg-path-nr-test.h
+++ b/src/svg/svg-path-nr-test.h
@@ -1,3 +1,10 @@
+/* WARNING: These tests are not completely correct!
+ * Specifically, 'M 0,0 L 1,1 z' and 'M 0,0 L 1,1 L 0,0 z' are treated as equal, but aren't.
+ * This difference is (probably?) only relevant in the context of markers.
+ * However, since NArtBpath has no (valid) way to distinguish these two and is being retired,
+ * these tests have not been updated to reflect this.
+ */
+
#include <cxxtest/TestSuite.h>
#include "libnr/n-art-bpath.h"
#include "svg/svg.h"