<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>

function createDetachedTest3()
{
    let div = document.createElement("div");
    div.id = "test3";
    return div;
}

function test()
{
    InspectorTest.debug();

    let suite = InspectorTest.createAsyncSuite("console.screenshot");

    function addTest({name, expression, imageMessageAddedCallback, shouldError}) {
        suite.addTestCase({
            name,
            test(resolve, reject) {
                let listener = WI.consoleManager.addEventListener(WI.ConsoleManager.Event.MessageAdded, async (event) => {
                    let {message} = event.data;

                    let isError = message.level === WI.ConsoleMessage.MessageLevel.Error;
                    if (isError || message.type === WI.ConsoleMessage.MessageType.Image) {
                        WI.consoleManager.removeEventListener(WI.ConsoleManager.Event.MessageAdded, listener);

                        if (isError)
                            InspectorTest.expectThat(shouldError, message.messageText);
                        else
                            InspectorTest.expectEqual(message.type, WI.ConsoleMessage.MessageType.Image, "The added message should be an image.");

                        if (imageMessageAddedCallback)
                            await imageMessageAddedCallback(message);

                        resolve();
                        return;
                    }
                });

                InspectorTest.evaluateInPage(expression)
                .catch(reject);
            },
        });
    }

    addTest({
        name: "console.screenshot.SingleNode",
        expression: `console.screenshot(document.querySelector("#test1"))`,
        async imageMessageAddedCallback(message) {
            InspectorTest.expectNotEqual(message.messageText, "data:", "The image should not be empty.");

            let img = await WI.ImageUtilities.promisifyLoad(message.messageText);
            InspectorTest.assert(img.width === 2, "The image width should be 2px.");
            InspectorTest.assert(img.height === 2, "The image height should be 2px.");
        },
    });

    addTest({
        name: "console.screenshot.MultipleNodes", 
        expression: `console.screenshot(document.querySelector("#test2"), document.querySelector("#test1"))`,
        async imageMessageAddedCallback(message) {
            InspectorTest.expectNotEqual(message.messageText, "data:", "The image should not be empty.");

            let img = await WI.ImageUtilities.promisifyLoad(message.messageText);
            InspectorTest.assert(img.width === 2, "The image width should be 2px.");
            InspectorTest.assert(img.height === 2, "The image height should be 2px.");
        },
    });

    addTest({
        name: "console.screenshot.DetachedNode",  
        expression: `console.screenshot(createDetachedTest3())`,
        shouldError: true,
    });

    addTest({
        name: "console.screenshot.NoArguments", 
        expression: `console.screenshot()`,
        async imageMessageAddedCallback(message) {
            InspectorTest.expectNotEqual(message.messageText, "data:", "The image should not be empty.");

            let img = await WI.ImageUtilities.promisifyLoad(message.messageText);
            InspectorTest.expectGreaterThan(img.width, 2, "The image width should be greater than 2px.");
            InspectorTest.expectGreaterThan(img.height, 2, "The image height should be greater than 2px.");
        },
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
    <p>Tests for the console.screenshot API.</p>
    <div id="test1"></div>
    <div id="test2"></div>
    <div id="test3"></div>
    <style>
    #test1 {
        width: 2px;
        height: 2px;
        background-color: red;
    }
    #test2 {
        width: 2px;
        height: 2px;
        background-color: blue;
    }
    #test3 {
        width: 2px;
        height: 2px;
        background-color: green;
    }
    </style>
</body>
</html>
