100 lines
3.0 KiB
HTML
100 lines
3.0 KiB
HTML
<html>
|
|
<head>
|
|
<script src="../../resources/js-test-pre.js"></script>
|
|
<script src="resources/scripted-random.js"></script>
|
|
</head>
|
|
<body>
|
|
<p id="description"></p>
|
|
<div id="console"></div>
|
|
<script>
|
|
description("This test fuzzes the path parser with semi-random attribute values and dumps the results.");
|
|
|
|
var characters = [
|
|
[ "m", 2 ], // maps a character to the number of arguments it requires
|
|
[ "M", 2 ],
|
|
[ "l", 2 ],
|
|
[ "L", 2 ],
|
|
[ "h", 1 ],
|
|
[ "H", 1 ],
|
|
[ "v", 1 ],
|
|
[ "V", 1 ],
|
|
[ "z", 0 ],
|
|
[ "Z", 0 ],
|
|
[ "c", 6 ],
|
|
[ "C", 6 ],
|
|
[ "s", 4 ],
|
|
[ "S", 4 ],
|
|
[ "q", 4 ],
|
|
[ "Q", 4 ],
|
|
[ "t", 2 ],
|
|
[ "T", 2 ],
|
|
[ "a", 7 ],
|
|
[ "A", 7 ]
|
|
];
|
|
|
|
var separators = [
|
|
" ",
|
|
","
|
|
];
|
|
|
|
var pathElement = document.createElementNS("http://www.w3.org/2000/svg", "path");
|
|
function parsePath(string)
|
|
{
|
|
pathElement.setAttributeNS(null, "d", string);
|
|
|
|
var pathSegList = pathElement.pathSegList;
|
|
var numberOfItems = pathSegList.numberOfItems;
|
|
|
|
if (!numberOfItems) {
|
|
debug("Could not parse: " + string);
|
|
return;
|
|
}
|
|
|
|
var pathCommands = "";
|
|
for (var i = 0; i < numberOfItems; i++) { //>
|
|
pathCommands += pathSegList.getItem(i).pathSegTypeAsLetter;
|
|
}
|
|
debug("Parsed as " + numberOfItems + " command(s) [" + pathCommands + "]: " + string);
|
|
}
|
|
|
|
function fuzz()
|
|
{
|
|
// Random assortments of valid characters with semi-valid argument counts
|
|
for (var i = 0; i < 250; i++) { //>
|
|
var pathString = "M1,1"; // path must start with moveto
|
|
|
|
var numPathCommands = Math.scriptedRandomInt(20);
|
|
for (var j = 0; j < numPathCommands; j++) { //>
|
|
var characterIndex = Math.scriptedRandomInt(characters.length);
|
|
pathString += characters[characterIndex][0];
|
|
|
|
var numArguments;
|
|
var argumentRandomizer = Math.scriptedRandomInt(10);
|
|
if (argumentRandomizer < 8) //>
|
|
numArguments = characters[characterIndex][1];
|
|
else if (argumentRandomizer < 9) //>
|
|
numArguments = characters[characterIndex][1] + 1;
|
|
else
|
|
numArguments = Math.max(characters[characterIndex][1] - 1, 0);
|
|
|
|
for (var k = 0; k < numArguments; k++) { //>
|
|
pathString += String(Math.scriptedRandomInt(10));
|
|
pathString += separators[Math.scriptedRandomInt(separators.length)];
|
|
}
|
|
}
|
|
parsePath(pathString);
|
|
}
|
|
// Empty-ish paths
|
|
parsePath("");
|
|
parsePath(" ");
|
|
parsePath("M");
|
|
parsePath("M" + String.fromCharCode(0));
|
|
// Edge case paths:
|
|
parsePath("M1,1Z0");
|
|
}
|
|
fuzz();
|
|
|
|
</script>
|
|
<script src="../../resources/js-test-post.js"></script>
|
|
</html>
|