<!DOCTYPE html>
<html>
<head>
<script src="../../../http/tests/inspector/resources/inspector-test.js"></script>
<script src="../resources/log-pause-location.js"></script>
<script>
function a() { return "a"; }
function b() { return "b"; }
function c() { return "c"; }

function testStatements() {
    debugger;
    let x = 1;
    let y = 2;
}

function testFunctions() {
    debugger;
    let before = 1;
    a();
    let after = 2;
}

function testEval() {
    debugger;
    let before = 1;
    eval("1 + 1");
    let after = 2;
}

function testAnonymousFunction() {
    (function() {
        debugger;
        let inner = 1;
    })();
    let outer = 2;
}

function testCommas() {
    debugger;
    let x = 1,
        y = 2,
        z = 3;
    a(), b(), c();
    true && (a(), b(), c()) && true;
}

function testChainedExpressions() {
    debugger;
    a() && b() && c();
}

function testDeclarations() {
    debugger;
    let x = a(),
        y = b(),
        z = c();
}

function testInnerFunction() {
    function alpha() {
        beta();
    }
    function beta() {
        debugger;
    }
    alpha();
}

// ---------

function test()
{
    let suite = InspectorTest.createAsyncSuite("Debugger.stepInto");

    // Always step-into when call frames change.
    WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.CallFramesDidChange, (event) => {
        if (!WI.debuggerManager.activeCallFrame)
            return;
        logPauseLocation();
        WI.debuggerManager.stepInto();
    });

    function addTestCase({name, description, expression}) {
        suite.addTestCase({
            name, description,
            test(resolve, reject) {
                InspectorTest.evaluateInPage(expression);
                WI.debuggerManager.singleFireEventListener(WI.DebuggerManager.Event.Paused, (event) => {
                    InspectorTest.log(`PAUSED (${WI.debuggerManager.dataForTarget(WI.debuggerManager.activeCallFrame.target).pauseReason})`);
                });
                WI.debuggerManager.singleFireEventListener(WI.DebuggerManager.Event.Resumed, (event) => {
                    InspectorTest.log("RESUMED");
                    resolve();
                });
            }
        });
    }

    addTestCase({
        name: "Debugger.stepInto.statements",
        description: "step-into should step over statements.",
        expression: "setTimeout(testStatements)",
    });

    addTestCase({
        name: "Debugger.stepInto.functions",
        description: "step-into should step into function calls.",
        expression: "setTimeout(testFunctions)",
    });

    addTestCase({
        name: "Debugger.stepInto.eval",
        description: "step-into should step into an eval program.",
        expression: "setTimeout(testEval)",
    });

    addTestCase({
        name: "Debugger.stepInto.anonymousFunction",
        description: "step-into should step out of a function to its caller.",
        expression: "setTimeout(testAnonymousFunction)",
    });

    addTestCase({
        name: "Debugger.stepInto.commas",
        description: "step-into should step into each sub-expression within comma expressions.",
        expression: "setTimeout(testCommas)",
    });

    addTestCase({
        name: "Debugger.stepInto.chainedExpressions",
        description: "step-into should step into each sub-expression within chained expressions.",
        expression: "setTimeout(testChainedExpressions)",
    });

    addTestCase({
        name: "Debugger.stepInto.declarations",
        description: "step-into should step into each declaration.",
        expression: "setTimeout(testDeclarations)",
    });

    addTestCase({
        name: "Debugger.stepInto.innerFunction",
        description: "step-into should step out of a function to its caller.",
        expression: "setTimeout(testInnerFunction)",
    });

    loadMainPageContent().then(() => {
        suite.runTestCasesAndFinish();
    });
}
</script>
</head>
<body onload="runTest()">
<p>Checking pause locations when stepping with "stepInto".</p>
</body>
</html>
