<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function triggerMultiplePauses() {
    setTimeout(pause1, 0);
    setTimeout(pause2, 0);
}

function pause1() {
    debugger;
}

function pause2() {
    debugger;
}

function test()
{
    function topCallFrameName() {
        let targetData = WI.debuggerManager.dataForTarget(WI.mainTarget);
        return targetData.callFrames[0].functionName;
    }

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

    suite.addTestCase({
        name: "Debugger.Unpaused.continueUntilNextRunLoop",
        description: "Debugger.continueUntilNextRunLoop should only work when paused.",
        test(resolve, reject) {
            DebuggerAgent.continueUntilNextRunLoop((error) => {
                InspectorTest.expectThat(error, "Should produce an error if not paused.");
                InspectorTest.log(error);
                resolve();
            });
        }
    });

    suite.addTestCase({
        name: "Debugger.Unpaused.continueUntilNextRunLoop",
        description: "Debugger.continueUntilNextRunLoop should only work when paused.",
        test(resolve, reject) {
            InspectorTest.evaluateInPage("triggerMultiplePauses()");
            WI.debuggerManager.singleFireEventListener(WI.DebuggerManager.Event.Paused, (event) => {
                InspectorTest.pass("Received First Pause Event.");
                InspectorTest.expectEqual(topCallFrameName(), "pause1", "Should be paused in pause1.");
                WI.debuggerManager.continueUntilNextRunLoop(WI.mainTarget);
                WI.debuggerManager.singleFireEventListener(WI.DebuggerManager.Event.Paused, (event) => {
                    InspectorTest.pass("Received Second Pause Event.");
                    InspectorTest.expectEqual(topCallFrameName(), "pause2", "Should be paused in pause2.");
                    WI.debuggerManager.resume().then(resolve, reject);
                });
            });
        }
    });

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