<!doctype html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script src="resources/async-stack-trace-test.js"></script>
<script>

function triggerChainedRequestAnimationFrame(count) {
    if (count <= 0)
        return;

    function handleAnimationFrame() {
        if (!--count) {
            debugger;
            return;
        }
        requestAnimationFrame(handleAnimationFrame);
    }

    requestAnimationFrame(handleAnimationFrame);
}

function test()
{
    let suite = InspectorTest.createAsyncSuite("AsyncStackTrace.Truncate");

    function addTruncateTestCase(suite, args) {
        function setup(resolve) {
            this.savedStackTraceDepth = WI.debuggerManager.asyncStackTraceDepth;
            InspectorTest.log(`Set maximum stack trace depth = ${args.maximumStackTraceSize}.`);
            WI.debuggerManager.asyncStackTraceDepth = args.maximumStackTraceSize;
            resolve();
        }
        function teardown(resolve) {
            WI.debuggerManager.asyncStackTraceDepth = this.savedStackTraceDepth;
            resolve();
        }
        addAsyncStackTraceTestCase(suite, {...args, setup, teardown});
    }

    function isTruncated(stackTrace) {
        while (stackTrace) {
            if (stackTrace.truncated)
                return true;
            stackTrace = stackTrace.parentStackTrace;
        }
        return false;
    }

    addTruncateTestCase(suite, {
        name: "AsyncStackTrace.DisableAsyncStackTrace",
        description: "Check that no async stack trace is present when the maximum depth is set to zero.",
        expression: "triggerChainedRequestAnimationFrame(1)",
        maximumStackTraceSize: 0,
        pausedHandler(stackTrace) {
            InspectorTest.expectNull(stackTrace.parentStackTrace, "Async stack trace should be null.");
        }
    });

    addTruncateTestCase(suite, {
        name: "AsyncStackTrace.CheckTruncated",
        description: "Check that an async stack trace that exceeds the maximum depth is truncated.",
        expression: "triggerChainedRequestAnimationFrame(20)",
        maximumStackTraceSize: 10,
        pausedHandler(stackTrace) {
            InspectorTest.expectThat(isTruncated(stackTrace), "Async stack trace should be truncated.");
        }
    });

    addTruncateTestCase(suite, {
        name: "AsyncStackTrace.CheckNotTruncated",
        description: "Check that an async stack trace is not truncated when below the maximum depth.",
        expression: "triggerChainedRequestAnimationFrame(1)",
        maximumStackTraceSize: 10,
        pausedHandler(stackTrace) {
            InspectorTest.expectFalse(isTruncated(stackTrace), "Async stack trace should not be truncated.");
        }
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
<p>Tests for truncating async stack traces that exceed the maximum async stack trace depth.</p>
</body>
</html>
