<!doctype html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function test()
{
    const testMessage = "console.log('test message')";
    const differentMessage = "console.log('different message')";

    let suite = InspectorTest.createAsyncSuite("Console.messageRepeatCountUpdated");

    suite.addTestCase({
        name: "AddTestMessage",
        description: "Add a new message, it should have a single repeat count.",
        test(resolve, reject) {
            let listener = WI.consoleManager.singleFireEventListener(WI.ConsoleManager.Event.PreviousMessageRepeatCountUpdated, (event) => {
                InspectorTest.assert(false, "Should not fire PreviousMessageRepeatCountUpdated yet.");
                reject();
            });

            WI.consoleManager.awaitEvent(WI.ConsoleManager.Event.MessageAdded)
            .then((event) => {
                InspectorTest.expectThat(event.data.message instanceof WI.ConsoleMessage, "MessageAdded event should fire.");
                InspectorTest.expectThat(event.data.message.repeatCount === 1, "ConsoleMessage repeatCount is 1.");
                WI.consoleManager.removeEventListener(WI.ConsoleManager.Event.PreviousMessageRepeatCountUpdated, listener, null);
            })
            .then(resolve, reject);

            InspectorTest.evaluateInPage(testMessage);
        }
    });

    for (let i = 1; i <= 5; ++i) {
        suite.addTestCase({
            name: `RepeatTestMessage${i}`,
            description: "Repeat the last message, it should trigger messageRepeatCountUpdated.",
            test(resolve, reject) {
                let listener = WI.consoleManager.singleFireEventListener(WI.ConsoleManager.Event.MessageAdded, (event) => {
                    InspectorTest.assert(false, "Should not fire MessageAdded, this should be a repeat.");
                    reject();
                });

                WI.consoleManager.awaitEvent(WI.ConsoleManager.Event.PreviousMessageRepeatCountUpdated)
                .then((event) => {
                    InspectorTest.expectThat(event, "PreviousMessageRepeatCountUpdated should fire.");
                    InspectorTest.expectThat(event.data.count === (i + 1), `Count should be ${i + 1}.`);
                    WI.consoleManager.removeEventListener(WI.ConsoleManager.Event.MessageAdded, listener, null);
                })
                .then(resolve, reject);

                InspectorTest.evaluateInPage(testMessage);
            }
        });
    }

    suite.addTestCase({
        name: "AddDifferentMessage",
        description: "Add a different message, it should reset the repeat count.",
        test(resolve, reject) {
            let listener = WI.consoleManager.singleFireEventListener(WI.ConsoleManager.Event.PreviousMessageRepeatCountUpdated, (event) => {
                InspectorTest.assert(false, "Should not fire PreviousMessageRepeatCountUpdated, this message is different.");
                reject();
            });

            WI.consoleManager.awaitEvent(WI.ConsoleManager.Event.MessageAdded)
            .then((event) => {
                InspectorTest.expectThat(event.data.message instanceof WI.ConsoleMessage, "MessageAdded event should fire.");
                InspectorTest.expectThat(event.data.message.repeatCount === 1, "ConsoleMessage repeatCount is 1.");
                WI.consoleManager.removeEventListener(WI.ConsoleManager.Event.PreviousMessageRepeatCountUpdated, listener, null);
            })
            .then(resolve, reject);

            InspectorTest.evaluateInPage(differentMessage);
        }
    });

    suite.addTestCase({
        name: "RepeatDifferentMessage",
        description: "Repeat this different message, it should increment the repeat count.",
        test(resolve, reject) {
            let listener = WI.consoleManager.singleFireEventListener(WI.ConsoleManager.Event.MessageAdded, (event) => {
                InspectorTest.assert(false, "Should not fire MessageAdded, this should be a repeat.");
                reject();
            });

            WI.consoleManager.awaitEvent(WI.ConsoleManager.Event.PreviousMessageRepeatCountUpdated)
            .then((event) => {
                InspectorTest.expectThat(event, "PreviousMessageRepeatCountUpdated should fire.");
                InspectorTest.expectThat(event.data.count === 2, "Count should be 2.");
                WI.consoleManager.removeEventListener(WI.ConsoleManager.Event.MessageAdded, listener, null);
            })
            .then(resolve, reject);

            InspectorTest.evaluateInPage(differentMessage);
        }
    });

    suite.addTestCase({
        name: "AddTestMessageAgain",
        description: "Add the original message again, it should have a single repeat count.",
        test(resolve, reject) {
            let listener = WI.consoleManager.singleFireEventListener(WI.ConsoleManager.Event.PreviousMessageRepeatCountUpdated, (event) => {
                InspectorTest.assert(false, "Should not fire PreviousMessageRepeatCountUpdated yet.");
                reject();
            });

            WI.consoleManager.awaitEvent(WI.ConsoleManager.Event.MessageAdded)
            .then((event) => {
                InspectorTest.expectThat(event.data.message instanceof WI.ConsoleMessage, "MessageAdded event should fire.");
                InspectorTest.expectThat(event.data.message.repeatCount === 1, "ConsoleMessage repeatCount is 1.");
                WI.consoleManager.removeEventListener(WI.ConsoleManager.Event.PreviousMessageRepeatCountUpdated, listener, null);
            })
            .then(resolve, reject);

            InspectorTest.evaluateInPage(testMessage);
        }
    });

    // --------

    suite.addTestCase({
        name: "MessagesWithEqualValuesRepeats",
        description: "Repeat messages with equal values should trigger messageRepeatCountUpdated.",
        test(resolve, reject) {
            WI.consoleManager.awaitEvent(WI.ConsoleManager.Event.PreviousMessageRepeatCountUpdated)
            .then((event) => {
                InspectorTest.expectThat(event, "PreviousMessageRepeatCountUpdated should fire for repeat messages with equal values.");
            })
            .then(resolve, reject);

            const messageWithValues = "console.log('equal parameter values', 1, 2)";
            InspectorTest.evaluateInPage(messageWithValues);
            InspectorTest.evaluateInPage(messageWithValues);
        }
    });

    suite.addTestCase({
        name: "MessagesWithObjectsDoNotRepeat",
        description: "Repeat messages with objects should not trigger messageRepeatCountUpdated.",
        test(resolve, reject) {
            let repeatListener = WI.consoleManager.singleFireEventListener(WI.ConsoleManager.Event.PreviousMessageRepeatCountUpdated, (event) => {
                InspectorTest.assert(false, "PreviousMessageRepeatCountUpdated should not fire for repeat messages with object arguments.");
                reject();
            });

            let remaining = 2;
            WI.consoleManager.addEventListener(WI.ConsoleManager.Event.MessageAdded, function addListener(event) {
                InspectorTest.expectThat(event.data.message instanceof WI.ConsoleMessage, "MessageAdded event should fire.");
                remaining--;
                if (!remaining) {
                    WI.consoleManager.removeEventListener(WI.ConsoleManager.Event.PreviousMessageRepeatCountUpdated, repeatListener, null);
                    WI.consoleManager.removeEventListener(WI.ConsoleManager.Event.MessageAdded, addListener, null);
                    resolve();
                }
            });

            const messageWithObject = "console.log('object', window)";
            InspectorTest.evaluateInPage(messageWithObject);
            InspectorTest.evaluateInPage(messageWithObject);
        }
    });

    suite.addTestCase({
        name: "MessagesWithDifferentLevelsDoNotRepeat",
        description: "Repeat messages with different levels should not trigger messageRepeatCountUpdated.",
        test(resolve, reject) {
            let repeatListener = WI.consoleManager.singleFireEventListener(WI.ConsoleManager.Event.PreviousMessageRepeatCountUpdated, (event) => {
                InspectorTest.assert(false, "PreviousMessageRepeatCountUpdated should not fire for repeat messages with different levels.");
                reject();
            });

            let remaining = 2;
            WI.consoleManager.addEventListener(WI.ConsoleManager.Event.MessageAdded, function addListener(event) {
                InspectorTest.expectThat(event.data.message instanceof WI.ConsoleMessage, "MessageAdded event should fire.");
                remaining--;
                if (!remaining) {
                    WI.consoleManager.removeEventListener(WI.ConsoleManager.Event.PreviousMessageRepeatCountUpdated, repeatListener, null);
                    WI.consoleManager.removeEventListener(WI.ConsoleManager.Event.MessageAdded, addListener, null);
                    resolve();
                }
            });

            InspectorTest.evaluateInPage("console.warn('level')");
            InspectorTest.evaluateInPage("console.error('level')");
        }
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
<p>Test for the Console.messageRepeatCountUpdated event.</p>
</body>
</html>
