<!doctype html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function test()
{
    let suite = InspectorTest.createAsyncSuite("Console.messagesCleared");

    suite.addTestCase({
        name: "ClearViaConsoleClearMessagesAPI",
        description: "Calling Console.clearMessages should trigger Console.messagesCleared.",
        test(resolve, reject) {
            WI.logManager.awaitEvent(WI.LogManager.Event.Cleared)
            .then((event) => {
                InspectorTest.expectThat(event, "Cleared event should fire.");
            })
            .then(resolve, reject);

            ConsoleAgent.clearMessages();
        }
    });

    suite.addTestCase({
        name: "ClearViaConsoleAPI",
        description: "Calling console.clear() should trigger Console.messagesCleared.",
        test(resolve, reject) {
            WI.logManager.awaitEvent(WI.LogManager.Event.Cleared)
            .then((event) => {
                InspectorTest.expectThat(event, "Cleared event should fire.");
            })
            .then(resolve, reject);

            InspectorTest.evaluateInPage("console.clear()");
        }
    });

    suite.addTestCase({
        name: "ClearViaCommandLineAPI",
        description: "Calling `clear()` in the command line API should trigger Console.messagesCleared.",
        test(resolve, reject) {
            WI.logManager.awaitEvent(WI.LogManager.Event.Cleared)
            .then((event) => {
                InspectorTest.expectThat(event, "Cleared event should fire.");
            })
            .then(resolve, reject);

            WI.runtimeManager.evaluateInInspectedWindow("clear()", {objectGroup: "test", includeCommandLineAPI: true}, function(){});
        }
    });

    suite.addTestCase({
        name: "ClearViaPageReload",
        description: "Reloading the page should trigger Console.messagesCleared.",
        test(resolve, reject) {
            WI.logManager.awaitEvent(WI.LogManager.Event.Cleared)
            .then((event) => {
                InspectorTest.expectThat(event, "Cleared event should fire.");
            })
            .then(resolve, reject);

            InspectorTest.reloadPage();
        }
    });

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