blob: a83038918166aadf58f208f26eeae9a61c01d157 [file] [log] [blame]
<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>