<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script src="resources/condition-ignoreCount.js"></script>
<script>
function test() {
    function isHelperScript(script) {
        return /resources\/condition-ignoreCount\.js/.test(script.url);
    }

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

    suite.addTestCase({
        name: "Debugger.setBreakpoint.ConditionIgnoreCount",
        description: "Check that `condition` is evaluated before `ignoreCount`.",
        async test() {
            let pauseCount = 0;

            let listener = WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.Paused, (event) => {
                ++pauseCount;
                WI.debuggerManager.resume();
            });

            let debuggerData = WI.debuggerManager.dataForTarget(WI.mainTarget);

            let script = debuggerData.scripts.filter(isHelperScript)[0];
            if (!script) {
                await new Promise((resolve, reject) => {
                    let listener = WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.ScriptAdded, (event) => {
                        script = event.data.script;
                        if (isHelperScript(script)) {
                            WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.ScriptAdded, listener);
                            resolve();
                        }
                    });
                });
            }

            let breakpoint = new WI.JavaScriptBreakpoint(new WI.SourceCodeLocation(script, 4, 0), {
                condition: `window.CONDITION_TEST > 2`,
                ignoreCount: 2,
            });

            InspectorTest.log("Adding breakpoint...");
            await Promise.all([
                breakpoint.awaitEvent(WI.JavaScriptBreakpoint.Event.ResolvedStateDidChange),
                WI.debuggerManager.addBreakpoint(breakpoint),
            ]);

            for (let i = 1; i <= 6; ++i) {
                InspectorTest.newline();

                InspectorTest.log("Triggering breakpoint...");
                await Promise.all([
                    InspectorTest.awaitEvent("TestPage_trigger"),
                    InspectorTest.evaluateInPage(`trigger()`),
                ]);

                if (i <= 4)
                    InspectorTest.expectEqual(pauseCount, 0, "Should not pause.");
                else
                    InspectorTest.expectEqual(pauseCount, i - 4, "Should pause.");
            }

            breakpoint.remove();
            WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, listener);
        },
    });

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