From 479ccbb1de1f971d66a3772f315729e81c95d3bd Mon Sep 17 00:00:00 2001 From: Jasper van de Gronde Date: Fri, 8 Aug 2008 14:18:02 +0000 Subject: Fixed svg-path (and display/curve) tests to properly handle closepath and made a check target. (bzr r6592) --- src/display/curve-test.h | 16 +-- src/svg/svg-path-geom-test.h | 231 +++++++++++++++++++++++++++---------------- src/svg/svg-path-nr-test.h | 7 ++ 3 files changed, 164 insertions(+), 90 deletions(-) (limited to 'src') 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 rectanglesRelativeClosed; std::vector rectanglesAbsoluteOpen; std::vector rectanglesRelativeOpen; - Geom::PathVector rectanglepv; + std::vector rectanglesAbsoluteClosed2; + std::vector 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(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(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(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(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(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(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(cb)) @@ -515,33 +566,45 @@ private: if (Geom::HLineSegment const *la = dynamic_cast(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(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 #include "libnr/n-art-bpath.h" #include "svg/svg.h" -- cgit v1.2.3