<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script src="../../resources/js-test-pre.js"></script>
</head>
<body onload="run()">
<svg id="svg" xmlns="http://www.w3.org/2000/svg" width="200" height="200">
    <path id="p1" d="M-100 -100L100 -100 L100 100 L-100 100 z"/>
    <path id="p2" d="M-100 -100L100 -100 L100 100 L-100 100 z" transform="translate(-1000, -1000)"/>
    <path id="p3" d="M100 100L300 100 L300 300 L100 300 z"/>
    <path id="p4" d="M-100 -100L100 -100 L100 100 L-100 100 z" style="display: none"/>
    <path id="p5" d="M-100 -100L100 -100 L100 100 L-100 100 z" style="visibility: hidden"/>
    <path id="p6" d="M-100 -100L100 -100 L100 100 L-100 100 z" style="opacity: 0"/>
    <g style="opacity: 0">
        <path id="p7" d="M-100 -100L100 -100 L100 100 L-100 100 z"/>
    </g>
    <path id="p8" d="M-100 -100L100 -100 L100 100 L-100 100 z M-50 -50L50 -50 L50 50 L-50 50 z" fill-rule="nonzero"/>
    <path id="p9" d="M-100 -100L100 -100 L100 100 L-100 100 z M-50 -50L50 -50 L50 50 L-50 50 z" fill-rule="evenodd"/>
    <clipPath>
        <path id="p10" d="M-100 -100L100 -100 L100 100 L-100 100 z M-50 -50L50 -50 L50 50 L-50 50 z" fill-rule="nonzero" clip-rule="evenodd"/>
        <path id="p11" d="M-100 -100L100 -100 L100 100 L-100 100 z M-50 -50L50 -50 L50 50 L-50 50 z" fill-rule="evenodd" clip-rule="nonzero"/>
    </clipPath>
</svg>
<p id="description"></p>
<div id="console"></div>
<script type="text/javascript">
<![CDATA[
window.enablePixelTesting = false;
window.jsTestIsAsync = true;
var svg = document.getElementById("svg");
var p1 = document.getElementById("p1"),
    p2 = document.getElementById("p2"),
    p3 = document.getElementById("p3"),
    p4 = document.getElementById("p4"),
    p5 = document.getElementById("p5"),
    p6 = document.getElementById("p6"),
    p7 = document.getElementById("p7"),
    p8 = document.getElementById("p8"),
    p9 = document.getElementById("p9"),
    p10 = document.getElementById("p10"),
    p11 = document.getElementById("p11");
var svgPoint = svg.createSVGPoint();

function run() {
    description("Test isPointInFill() on path.");

    debug("");
    debug("Test simple different coordinates");

    shouldBe("p1.isPointInFill()", "true");
    var point = {};
    shouldBe("p1.isPointInFill({})", "true");
    shouldBe("p1.isPointInFill({x: 0, y: 0})", "true");
    shouldBe("p1.isPointInFill({x: 200, y: 200})", "false");
    shouldBe("p1.isPointInFill({x: -200, y: -200})", "false");
    shouldBe("p1.isPointInFill({x: -100, y: -100})", "true");
    shouldBe("p1.isPointInFill(new DOMPoint())", "true");
    shouldBe("p1.isPointInFill(new DOMPoint(100, 100))", "true");
    shouldBe("p1.isPointInFill(new DOMPoint(-200, -200))", "false");
    shouldBe("p1.isPointInFill(new DOMPointReadOnly())", "true");
    shouldBe("p1.isPointInFill(new DOMPointReadOnly(-200, -200))", "false");
    shouldBe("p1.isPointInFill(svgPoint)", "true");
    svgPoint.x = -200;
    svgPoint.y = -200;
    shouldBe("p1.isPointInFill(svgPoint)", "false");
    shouldBe("p1.isPointInFill(new DOMPoint(NaN))", "false");
    shouldBe("p1.isPointInFill(new DOMPoint(Infinity))", "false");
    shouldBe("p1.isPointInFill({x: 'string', y: 'string'})", "false");
    shouldThrow("p1.isPointInFill('string')");

    debug("");
    debug("Test that transform doesn't affect result");
    shouldBe("p2.isPointInFill()", "true");

    debug("");
    debug("Verify that no argument or empty dictionary is the same as 0,0 and may return false");
    shouldBe("p3.isPointInFill()", "false");
    shouldBe("p3.isPointInFill({})", "false");

    debug("");
    debug("display: none; should not affect isPointInFill");
    shouldBe("p4.isPointInFill()", "true");

    debug("");
    debug("visibility: hidden; should not affect isPointInFill");
    shouldBe("p5.isPointInFill()", "true");

    debug("");
    debug("opacity: 0; should not affect isPointInFill");
    shouldBe("p6.isPointInFill()", "true");

    debug("");
    debug("opacity: 0; on group should not affect isPointInFill");
    shouldBe("p7.isPointInFill()", "true");

    debug("");
    debug("isPointInFill should respect fill-rule: nonzero");
    shouldBe("p8.isPointInFill()", "true");

    debug("");
    debug("isPointInFill should respect fill-rule: evenodd");
    shouldBe("p9.isPointInFill()", "false");

    debug("");
    debug("isPointInFill should not respect clip-rule 1");
    shouldBe("p10.isPointInFill()", "true");

    debug("");
    debug("isPointInFill should not respect clip-rule 2");
    shouldBe("p11.isPointInFill()", "false");

    finishJSTest();
}
]]>
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>
