<!DOCTYPE html>

<script src="../../resources/js-test.js"></script>

<pre id="console"></pre>
<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>

<script>
var canvas = document.getElementById("c");
var ctx = canvas.getContext("2d");

function clearContextToGreen() {
    ctx.globalCompositeOperation="source-over";
    ctx.fillStyle = "rgb(0, 255, 0)";
    ctx.fillRect(0, 0, canvas.width, canvas.height);
}

var testData = [
    {compositeMode: 'source-over', expected: [0, 0, 255]},
    {compositeMode: 'source-in', expected: [0, 0, 255]},
    {compositeMode: 'source-out', expected: [0, 0, 0]},
    {compositeMode: 'source-atop', expected: [0, 0, 255]},
    {compositeMode: 'destination-over', expected: [0, 255, 0]},
    {compositeMode: 'destination-in', expected: [0, 255, 0]},
    {compositeMode: 'destination-out', expected: [0, 0, 0]},
    {compositeMode: 'destination-atop', expected: [0, 255, 0]},
    {compositeMode: 'lighter', expected: [0, 255, 255]},
    {compositeMode: 'copy', expected: [0, 0, 255]},
    {compositeMode: 'xor', expected: [0, 0, 0]},
];

function toHexString(number) {
    var hexString = number.toString(16).toUpperCase();
    if (number <= 9)
        hexString = '0' + hexString;
    return hexString;
}

function doTest(dataItem, fillSize) {
    clearContextToGreen();
    ctx.fillStyle = "rgb(0, 0, 255)";
    ctx.globalCompositeOperation = dataItem.compositeMode;
    ctx.fillRect(0, 0, fillSize, fillSize);

    var data = ctx.getImageData(0, 0, canvas.width, canvas.height);
    var pixelOK = true;
    var pixelString = '#';
    var expectedString = '#';

    for (var x = 0; x < 3; x++) {
        pixelString = pixelString + toHexString(data.data[x]);
        expectedString = expectedString + toHexString(dataItem.expected[x]);
        if (data.data[x] != dataItem.expected[x])
            pixelOK = false;
    }

    var testName = "Fill Size " + fillSize + ', ' + dataItem.compositeMode;
    if (pixelOK)
        testPassed(testName + ': ' + pixelString);
    else
        testFailed(testName + ': EXPECTED ' + expectedString + ', GOT ' + pixelString);
}

debug("Tests that using the different composite modes to fill large rects doesn't crash and works as expected.");
[10000, 50000, 100000].forEach(function(fillSize) {
    testData.forEach(function(dataItem) {
        doTest(dataItem, fillSize)
    })});

</script>
</html>