<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function triggerAssertions() {
    console.assert(true, "Passing assertion");
    console.assert(false, "Failing assertion");
}

function test()
{
    // Pause on all exceptions should not affect pausing on assertions.
    WI.debuggerManager.allExceptionsBreakpoint.disabled = false;

    let suite = InspectorTest.createAsyncSuite("Debugger.setPauseOnAssertions");

    suite.addTestCase({
        name: "Debugger.setPauseOnAssertions.Disabled",
        description: "Do not pause on assertions when disabled.",
        test(resolve, reject) {
            WI.debuggerManager.assertionsBreakpoint.disabled = true;

            let listener = WI.debuggerManager.singleFireEventListener(WI.DebuggerManager.Event.Paused, (event) => {
                InspectorTest.fail("Should not have paused.");
                reject();
            });

            InspectorTest.evaluateInPage("triggerAssertions()", () => {
                InspectorTest.pass("Should not pause.");
                WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, listener);
                resolve();
            });
        }
    });

    suite.addTestCase({
        name: "Debugger.setPauseOnAssertions.Enabled",
        description: "Pause on assertions when enabled.",
        test(resolve, reject) {
            WI.debuggerManager.assertionsBreakpoint.disabled = false;

            let didPause = false;
            let listener = WI.debuggerManager.singleFireEventListener(WI.DebuggerManager.Event.Paused, (event) => {
                InspectorTest.pass("Should paused.");
                WI.debuggerManager.resume();
                didPause = true;
            });

            InspectorTest.evaluateInPage("triggerAssertions()", () => {
                if (!didPause)
                    InspectorTest.fail("Should have paused.");
                resolve();
            });
        }
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
<p>Debugger.setPauseOnAssertions</p>
</body>
</html>
