svg-path-test.h revision e69f7d715a3db7f1fff1c8334714c8fab63852ab
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico std::vector<std::string> rectanglesAbsoluteClosed;
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico std::vector<std::string> rectanglesRelativeClosed;
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico // Lots of ways to define the same rectangle
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico rectanglesAbsoluteClosed.push_back("M 1,2 L 4,2 L 4,8 L 1,8 L 1,2 Z");
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico rectanglesAbsoluteClosed.push_back("M 1,2 L 4,2 L 4,8 L 1,8 z");
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner rectanglesAbsoluteClosed.push_back("M 1,2 4,2 4,8 1,8 z");
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner rectanglesAbsoluteClosed.push_back("M 1,2 H 4 V 8 H 1 z");
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner rectanglesRelativeClosed.push_back("m 1,2 l 3,0 l 0,6 l -3,0 z");
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner rectanglesRelativeClosed.push_back("m 1,2 3,0 0,6 -3,0 z");
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner rectanglesRelativeClosed.push_back("m 1,2 h 3 v 6 h -3 z");
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner rectanglesAbsoluteOpen.push_back("M 1,2 L 4,2 L 4,8 L 1,8 L 1,2");
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner rectanglesAbsoluteOpen.push_back("M 1,2 4,2 4,8 1,8 1,2");
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner rectanglesAbsoluteOpen.push_back("M 1,2 H 4 V 8 H 1 V 2");
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner rectanglesRelativeOpen.push_back("m 1,2 l 3,0 l 0,6 l -3,0 l 0,-6");
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner rectanglesRelativeOpen.push_back("m 1,2 3,0 0,6 -3,0 0,-6");
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner rectanglesRelativeOpen.push_back("m 1,2 h 3 v 6 h -3 v -6");
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico // TODO: Also test some (smooth) cubic/quadratic beziers and elliptical arcs
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico for(size_t i=0; i<rectanglesAbsoluteClosed.size(); i++) {
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico NArtBpath * bpath = sp_svg_read_path(rectanglesAbsoluteClosed[i].c_str());
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico for(size_t i=0; i<rectanglesRelativeClosed.size(); i++) {
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico NArtBpath * bpath = sp_svg_read_path(rectanglesRelativeClosed[i].c_str());
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico for(size_t i=0; i<rectanglesAbsoluteOpen.size(); i++) {
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico NArtBpath * bpath = sp_svg_read_path(rectanglesAbsoluteOpen[i].c_str());
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico for(size_t i=0; i<rectanglesRelativeOpen.size(); i++) {
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico NArtBpath * bpath = sp_svg_read_path(rectanglesRelativeOpen[i].c_str());
4a7ebbf91a516d588a7dcc45921c17a896b65f62JazzyNico memcpy(bpath_good+i*5,rectangleBpath,sizeof(rectangleBpath[0])*5);
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner std::string path_str = rectanglesAbsoluteClosed[0] + rectanglesRelativeOpen[0] + rectanglesRelativeClosed[0] + rectanglesAbsoluteOpen[0];
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner NArtBpath * bpath = sp_svg_read_path(path_str.c_str());
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner // Per the SVG 1.1 specification (section F5) zero-length subpaths are relevant
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner { // Test absolute version
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner 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";
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner { // Test relative version
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner 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";
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner { // Test absolute version
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner { // Test relative version
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner { // Test decimals
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner char const * path_str = "M .01,.02 L.04.02 L1.5,1.6L0.01,0.08 .01.02 z";
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner { // Test exponent
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner char const * path_str = "M 1e-2,.2e-1 L 0.004e1,0.0002e+2 L0150E-2,1.6e0L1.0e-2,80e-3 z";
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner // Coordinates need not be separated by whitespace if they can still be read unambiguously
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner { // Test absolute
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner char const * path_str = "M .1.2+0.4.2e0.4e0+8e-1.1.8 z";
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner { // Test relative
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner char const * path_str = "m .1.2+0.3.0e0.0e0+6e-1-.3.0 z";
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner char const * path_str;
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner // Comma in the wrong place (commas may only appear between parameters)
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner // Comma in the wrong place (commas may only appear between parameters)
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner // Period in the wrong place (no numbers after a 'z')
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner // Sign in the wrong place (no numbers after a 'z')
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner // Digit in the wrong place (no numbers after a 'z')
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner // Digit in the wrong place (no numbers after a 'z')
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner char const * path_str;
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner // Unrecognized character
ffbd2f8fa3a83d1d4ad8cd672cf738ffaa5cdfeeapenner // Unrecognized character
void testReadErrorTypo() {
char const * path_str;
void testReadErrorIllformedNumbers() {
char const * path_str;
void testReadErrorJunk() {
char const * path_str;
path_str = "M 1,2 4,2 4,8 1,8 z j 357 hkjh.,34e34 90ih6kj4 h5k6vlh4N.,6,45wikuyi3yere..3487 m 13,23";
void testReadErrorStopReading() {
char const * path_str;
void testRoundTrip() {
// This is the easiest way to (also) test writing path data, as a path can be written in more than one way.
char * path_str;
bpath = sp_svg_read_path((rectanglesAbsoluteClosed[0] + rectanglesRelativeOpen[0] + rectanglesRelativeClosed[0] + rectanglesAbsoluteOpen[0]).c_str());
bpath = sp_svg_read_path("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");
switch(a->code) {
case NR_MOVETO:
case NR_MOVETO_OPEN:
case NR_LINETO:
case NR_CURVETO: