1 description("This tests the SVG path parser by parsing and then re-serializing various paths.");
3 var pathElement = document.createElementNS("http://www.w3.org/2000/svg", "path");
16 "C": [ "x1", "y1", "x2", "y2", "x", "y" ],
17 "c": [ "x1", "y1", "x2", "y2", "x", "y" ],
18 "S": [ "x2", "y2", "x", "y" ],
19 "s": [ "x2", "y2", "x", "y" ],
20 "Q": [ "x1", "y1", "x", "y" ],
21 "q": [ "x1", "y1", "x", "y" ],
24 "A": [ "r1", "r2", "angle", "largeArcFlag", "sweepFlag", "x", "y" ],
25 "a": [ "r1", "r2", "angle", "largeArcFlag", "sweepFlag", "x", "y" ]
28 function printSegment(segment)
30 var letter = segment.pathSegTypeAsLetter;
31 var names = pathProperties[letter];
35 for (var i = 0; i < names.length; ++i) {
38 var value = segment[names[i]];
39 if (value == undefined) {
43 if (typeof(value) === "boolean") {
44 string += value ? 1 : 0;
47 string += value.toFixed(1).replace(/\.0$/, "");
52 function parsePath(string)
54 pathElement.setAttributeNS(null, "d", string);
56 var pathSegList = pathElement.pathSegList;
57 var numberOfItems = pathSegList.numberOfItems;
59 var pathCommands = "";
60 for (var i = 0; i < numberOfItems; i++) {
63 pathCommands += printSegment(pathSegList.getItem(i));
69 shouldBe("parsePath('M1,2')", "'M1,2'");
70 shouldBe("parsePath('m1,2')", "'m1,2'");
71 shouldBe("parsePath('M100,200 m3,4')", "'M100,200 m3,4'");
72 shouldBe("parsePath('M100,200 L3,4')", "'M100,200 L3,4'");
73 shouldBe("parsePath('M100,200 l3,4')", "'M100,200 l3,4'");
74 shouldBe("parsePath('M100,200 H3')", "'M100,200 H3'");
75 shouldBe("parsePath('M100,200 h3')", "'M100,200 h3'");
76 shouldBe("parsePath('M100,200 V3')", "'M100,200 V3'");
77 shouldBe("parsePath('M100,200 v3')", "'M100,200 v3'");
78 shouldBe("parsePath('M100,200 Z')", "'M100,200 Z'");
79 shouldBe("parsePath('M100,200 z')", "'M100,200 Z'");
80 shouldBe("parsePath('M100,200 C3,4,5,6,7,8')", "'M100,200 C3,4,5,6,7,8'");
81 shouldBe("parsePath('M100,200 c3,4,5,6,7,8')", "'M100,200 c3,4,5,6,7,8'");
82 shouldBe("parsePath('M100,200 S3,4,5,6')", "'M100,200 S3,4,5,6'");
83 shouldBe("parsePath('M100,200 s3,4,5,6')", "'M100,200 s3,4,5,6'");
84 shouldBe("parsePath('M100,200 Q3,4,5,6')", "'M100,200 Q3,4,5,6'");
85 shouldBe("parsePath('M100,200 q3,4,5,6')", "'M100,200 q3,4,5,6'");
86 shouldBe("parsePath('M100,200 T3,4')", "'M100,200 T3,4'");
87 shouldBe("parsePath('M100,200 t3,4')", "'M100,200 t3,4'");
88 shouldBe("parsePath('M100,200 A3,4,5,0,0,6,7')", "'M100,200 A3,4,5,0,0,6,7'");
89 shouldBe("parsePath('M100,200 A3,4,5,1,0,6,7')", "'M100,200 A3,4,5,1,0,6,7'");
90 shouldBe("parsePath('M100,200 A3,4,5,0,1,6,7')", "'M100,200 A3,4,5,0,1,6,7'");
91 shouldBe("parsePath('M100,200 A3,4,5,1,1,6,7')", "'M100,200 A3,4,5,1,1,6,7'");
92 shouldBe("parsePath('M100,200 a3,4,5,0,0,6,7')", "'M100,200 a3,4,5,0,0,6,7'");
93 shouldBe("parsePath('M100,200 a3,4,5,0,1,6,7')", "'M100,200 a3,4,5,0,1,6,7'");
94 shouldBe("parsePath('M100,200 a3,4,5,1,0,6,7')", "'M100,200 a3,4,5,1,0,6,7'");
95 shouldBe("parsePath('M100,200 a3,4,5,1,1,6,7')", "'M100,200 a3,4,5,1,1,6,7'");
96 shouldBe("parsePath('M100,200 a3,4,5,006,7')", "'M100,200 a3,4,5,0,0,6,7'");
97 shouldBe("parsePath('M100,200 a3,4,5,016,7')", "'M100,200 a3,4,5,0,1,6,7'");
98 shouldBe("parsePath('M100,200 a3,4,5,106,7')", "'M100,200 a3,4,5,1,0,6,7'");
99 shouldBe("parsePath('M100,200 a3,4,5,116,7')", "'M100,200 a3,4,5,1,1,6,7'");
100 shouldBe("parsePath('M100,200 a3,4,5,2,1,6,7')", "'M100,200'");
101 shouldBe("parsePath('M100,200 a3,4,5,1,2,6,7')", "'M100,200'");
103 // FIXME: This uses 'If rx = 0 or ry = 0 then this arc is treated as a straight line segment (a "lineto") joining the endpoints.'
104 // I think the SVG DOM should still show the arc segment, fix that!
105 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'");
107 shouldBe("parsePath('M1,2,3,4')", "'M1,2 L3,4'");
108 shouldBe("parsePath('m100,200,3,4')", "'m100,200 l3,4'");
110 shouldBe("parsePath('M 100-200')", "'M100,-200'");
111 shouldBe("parsePath('M 0.6.5')", "'M0.6,0.5'");
113 shouldBe("parsePath(' M1,2')", "'M1,2'");
114 shouldBe("parsePath(' M1,2')", "'M1,2'");
115 shouldBe("parsePath('\\tM1,2')", "'M1,2'");
116 shouldBe("parsePath('\\nM1,2')", "'M1,2'");
117 shouldBe("parsePath('\\rM1,2')", "'M1,2'");
118 shouldBe("parsePath('\\vM1,2')", "''");
119 shouldBe("parsePath('xM1,2')", "''");
120 shouldBe("parsePath('M1,2 ')", "'M1,2'");
121 shouldBe("parsePath('M1,2\\t')", "'M1,2'");
122 shouldBe("parsePath('M1,2\\n')", "'M1,2'");
123 shouldBe("parsePath('M1,2\\r')", "'M1,2'");
124 shouldBe("parsePath('M1,2\\v')", "'M1,2'");
125 shouldBe("parsePath('M1,2x')", "'M1,2'");
126 shouldBe("parsePath('M1,2 L40,0#90')", "'M1,2 L40,0'");
128 shouldBe("parsePath('')", "''");
129 shouldBe("parsePath(' ')", "''");
130 shouldBe("parsePath('x')", "''");
131 shouldBe("parsePath('L1,2')", "''");
132 shouldBe("parsePath('M.1 .2 L.3 .4 .5 .6')", "'M0.1,0.2 L0.3,0.4 L0.5,0.6'");
134 successfullyParsed = true;