blob: 6c8786c3290aac204d557be5d3b63d396c3f0802 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
</head>
<body>
<p id="description"></p>
<div id="console"></div>
<script>
description("This tests the SVG path parser by parsing and then re-serializing various paths.");
var pathElement = document.createElementNS("http://www.w3.org/2000/svg", "path");
var pathProperties = {
"M": [ "x", "y" ],
"m": [ "x", "y" ],
"L": [ "x", "y" ],
"l": [ "x", "y" ],
"H": [ "x" ],
"h": [ "x" ],
"V": [ "y" ],
"v": [ "y" ],
"Z": [ ],
"z": [ ],
"C": [ "x1", "y1", "x2", "y2", "x", "y" ],
"c": [ "x1", "y1", "x2", "y2", "x", "y" ],
"S": [ "x2", "y2", "x", "y" ],
"s": [ "x2", "y2", "x", "y" ],
"Q": [ "x1", "y1", "x", "y" ],
"q": [ "x1", "y1", "x", "y" ],
"T": [ "x", "y" ],
"t": [ "x", "y" ],
"A": [ "r1", "r2", "angle", "largeArcFlag", "sweepFlag", "x", "y" ],
"a": [ "r1", "r2", "angle", "largeArcFlag", "sweepFlag", "x", "y" ]
};
function printSegment(segment)
{
var letter = segment.pathSegTypeAsLetter;
var names = pathProperties[letter];
if (!names)
return letter + "?";
var string = letter;
for (var i = 0; i < names.length; ++i) {
if (i)
string += ",";
var value = segment[names[i]];
if (value == undefined) {
string += "?";
continue;
}
if (typeof(value) === "boolean") {
string += value ? 1 : 0;
continue;
}
string += value.toFixed(1).replace(/\.0$/, "");
}
return string;
}
function parsePath(string)
{
pathElement.setAttributeNS(null, "d", string);
var pathSegList = pathElement.pathSegList;
var numberOfItems = pathSegList.numberOfItems;
var pathCommands = "";
for (var i = 0; i < numberOfItems; i++) {
if (i)
pathCommands += " ";
pathCommands += printSegment(pathSegList.getItem(i));
}
return pathCommands;
}
shouldBe("parsePath('M1,2')", "'M1,2'");
shouldBe("parsePath('m1,2')", "'m1,2'");
shouldBe("parsePath('M100,200 m3,4')", "'M100,200 m3,4'");
shouldBe("parsePath('M100,200 L3,4')", "'M100,200 L3,4'");
shouldBe("parsePath('M100,200 l3,4')", "'M100,200 l3,4'");
shouldBe("parsePath('M100,200 H3')", "'M100,200 H3'");
shouldBe("parsePath('M100,200 h3')", "'M100,200 h3'");
shouldBe("parsePath('M100,200 V3')", "'M100,200 V3'");
shouldBe("parsePath('M100,200 v3')", "'M100,200 v3'");
shouldBe("parsePath('M100,200 Z')", "'M100,200 Z'");
shouldBe("parsePath('M100,200 z')", "'M100,200 Z'");
shouldBe("parsePath('M100,200 C3,4,5,6,7,8')", "'M100,200 C3,4,5,6,7,8'");
shouldBe("parsePath('M100,200 c3,4,5,6,7,8')", "'M100,200 c3,4,5,6,7,8'");
shouldBe("parsePath('M100,200 S3,4,5,6')", "'M100,200 S3,4,5,6'");
shouldBe("parsePath('M100,200 s3,4,5,6')", "'M100,200 s3,4,5,6'");
shouldBe("parsePath('M100,200 Q3,4,5,6')", "'M100,200 Q3,4,5,6'");
shouldBe("parsePath('M100,200 q3,4,5,6')", "'M100,200 q3,4,5,6'");
shouldBe("parsePath('M100,200 T3,4')", "'M100,200 T3,4'");
shouldBe("parsePath('M100,200 t3,4')", "'M100,200 t3,4'");
shouldBe("parsePath('M100,200 A3,4,5,0,0,6,7')", "'M100,200 A3,4,5,0,0,6,7'");
shouldBe("parsePath('M100,200 A3,4,5,1,0,6,7')", "'M100,200 A3,4,5,1,0,6,7'");
shouldBe("parsePath('M100,200 A3,4,5,0,1,6,7')", "'M100,200 A3,4,5,0,1,6,7'");
shouldBe("parsePath('M100,200 A3,4,5,1,1,6,7')", "'M100,200 A3,4,5,1,1,6,7'");
shouldBe("parsePath('M100,200 a3,4,5,0,0,6,7')", "'M100,200 a3,4,5,0,0,6,7'");
shouldBe("parsePath('M100,200 a3,4,5,0,1,6,7')", "'M100,200 a3,4,5,0,1,6,7'");
shouldBe("parsePath('M100,200 a3,4,5,1,0,6,7')", "'M100,200 a3,4,5,1,0,6,7'");
shouldBe("parsePath('M100,200 a3,4,5,1,1,6,7')", "'M100,200 a3,4,5,1,1,6,7'");
shouldBe("parsePath('M100,200 a3,4,5,006,7')", "'M100,200 a3,4,5,0,0,6,7'");
shouldBe("parsePath('M100,200 a3,4,5,016,7')", "'M100,200 a3,4,5,0,1,6,7'");
shouldBe("parsePath('M100,200 a3,4,5,106,7')", "'M100,200 a3,4,5,1,0,6,7'");
shouldBe("parsePath('M100,200 a3,4,5,116,7')", "'M100,200 a3,4,5,1,1,6,7'");
shouldBe("parsePath('M100,200 a3,4,5,2,1,6,7')", "'M100,200'");
shouldBe("parsePath('M100,200 a3,4,5,1,2,6,7')", "'M100,200'");
// FIXME: This uses 'If rx = 0 or ry = 0 then this arc is treated as a straight line segment (a "lineto") joining the endpoints.'
// I think the SVG DOM should still show the arc segment, fix that!
shouldBe("parsePath('M100,200 a0,4,5,0,0,10,0 a4,0,5,0,0,0,10 a0,0,5,0,0,-10,0 z')", "'M100,200 l10,0 l0,10 l-10,0 Z'");
shouldBe("parsePath('M1,2,3,4')", "'M1,2 L3,4'");
shouldBe("parsePath('m100,200,3,4')", "'m100,200 l3,4'");
shouldBe("parsePath('M 100-200')", "'M100,-200'");
shouldBe("parsePath('M 0.6.5')", "'M0.6,0.5'");
shouldBe("parsePath(' M1,2')", "'M1,2'");
shouldBe("parsePath(' M1,2')", "'M1,2'");
shouldBe("parsePath('\\tM1,2')", "'M1,2'");
shouldBe("parsePath('\\nM1,2')", "'M1,2'");
shouldBe("parsePath('\\rM1,2')", "'M1,2'");
shouldBe("parsePath('\\vM1,2')", "''");
shouldBe("parsePath('xM1,2')", "''");
shouldBe("parsePath('M1,2 ')", "'M1,2'");
shouldBe("parsePath('M1,2\\t')", "'M1,2'");
shouldBe("parsePath('M1,2\\n')", "'M1,2'");
shouldBe("parsePath('M1,2\\r')", "'M1,2'");
shouldBe("parsePath('M1,2\\v')", "'M1,2'");
shouldBe("parsePath('M1,2x')", "'M1,2'");
shouldBe("parsePath('M1,2 L40,0#90')", "'M1,2 L40,0'");
shouldBe("parsePath('')", "''");
shouldBe("parsePath(' ')", "''");
shouldBe("parsePath('x')", "''");
shouldBe("parsePath('L1,2')", "''");
shouldBe("parsePath('M.1 .2 L.3 .4 .5 .6')", "'M0.1,0.2 L0.3,0.4 L0.5,0.6'");
successfullyParsed = true;
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>