<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function regular() {}
regular.displayName = "Regular";

let regularBoundOnce = regular.bind();
regularBoundOnce.displayName = "RegularBound";

let regularBoundTwice = regularBoundOnce.bind();

let arrow = () => {};
arrow.displayName = "Arrow";

let arrowBoundOnce = arrow.bind();
arrowBoundOnce.displayName = "ArrowBound";

let arrowBoundTwice = arrowBoundOnce.bind();

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

    suite.addTestCase({
        name: "Debugger.getFunctionDetails.Regular",
        async test() {
            let remoteObject = await InspectorTest.evaluateInPage(`regular`, {remoteObjectOnly: true});
            let {details} = await DebuggerAgent.getFunctionDetails(remoteObject.objectId);
            InspectorTest.assert(details, "Should get function details.");
            InspectorTest.expectEqual(details.location.lineNumber, 5, "Should have source code line.");
            InspectorTest.expectEqual(details.location.columnNumber, 16, "Should have source code column.");
            InspectorTest.expectEqual(details.name, "regular", "Should have name.");
            InspectorTest.expectEqual(details.displayName, "Regular", "Should have displayName.");
        },
    });

    suite.addTestCase({
        name: "Debugger.getFunctionDetails.Regular.Bound.Once",
        async test() {
            let remoteObject = await InspectorTest.evaluateInPage(`regularBoundOnce`, {remoteObjectOnly: true});
            let {details} = await DebuggerAgent.getFunctionDetails(remoteObject.objectId);
            InspectorTest.assert(details, "Should get function details.");
            InspectorTest.expectEqual(details.location.lineNumber, 5, "Should have source code line.");
            InspectorTest.expectEqual(details.location.columnNumber, 16, "Should have source code column.");
            InspectorTest.expectEqual(details.name, "regular", "Should have name.");
            InspectorTest.expectEqual(details.displayName, "RegularBound", "Should have displayName.");
        },
    });

    suite.addTestCase({
        name: "Debugger.getFunctionDetails.Regular.Bound.Twice",
        async test() {
            let remoteObject = await InspectorTest.evaluateInPage(`regularBoundTwice`, {remoteObjectOnly: true});
            let {details} = await DebuggerAgent.getFunctionDetails(remoteObject.objectId);
            InspectorTest.assert(details, "Should get function details.");
            InspectorTest.expectEqual(details.location.lineNumber, 5, "Should have source code line.");
            InspectorTest.expectEqual(details.location.columnNumber, 16, "Should have source code column.");
            InspectorTest.expectEqual(details.name, "bound regular", "Should have name.");
            InspectorTest.expectEqual(details.displayName, undefined, "Should not have displayName.");
        },
    });

    suite.addTestCase({
        name: "Debugger.getFunctionDetails.Arrow",
        async test() {
            let remoteObject = await InspectorTest.evaluateInPage(`arrow`, {remoteObjectOnly: true});
            let {details} = await DebuggerAgent.getFunctionDetails(remoteObject.objectId);
            InspectorTest.assert(details, "Should get function details.");
            InspectorTest.expectEqual(details.location.lineNumber, 13, "Should have source code line.");
            InspectorTest.expectEqual(details.location.columnNumber, 12, "Should have source code column.");
            InspectorTest.expectEqual(details.name, undefined, "Should not have name.");
            InspectorTest.expectEqual(details.displayName, "Arrow", "Should have displayName.");
        },
    });

    suite.addTestCase({
        name: "Debugger.getFunctionDetails.Arrow.Bound.Once",
        async test() {
            let remoteObject = await InspectorTest.evaluateInPage(`arrowBoundOnce`, {remoteObjectOnly: true});
            let {details} = await DebuggerAgent.getFunctionDetails(remoteObject.objectId);
            InspectorTest.assert(details, "Should get function details.");
            InspectorTest.expectEqual(details.location.lineNumber, 13, "Should have source code line.");
            InspectorTest.expectEqual(details.location.columnNumber, 12, "Should have source code column.");
            InspectorTest.expectEqual(details.name, "arrow", "Should have name.");
            InspectorTest.expectEqual(details.displayName, "ArrowBound", "Should have displayName.");
        },
    });

    suite.addTestCase({
        name: "Debugger.getFunctionDetails.Arrow.Bound.Twice",
        async test() {
            let remoteObject = await InspectorTest.evaluateInPage(`arrowBoundTwice`, {remoteObjectOnly: true});
            let {details} = await DebuggerAgent.getFunctionDetails(remoteObject.objectId);
            InspectorTest.assert(details, "Should get function details.");
            InspectorTest.expectEqual(details.location.lineNumber, 13, "Should have source code line.");
            InspectorTest.expectEqual(details.location.columnNumber, 12, "Should have source code column.");
            InspectorTest.expectEqual(details.name, "bound arrow", "Should have name.");
            InspectorTest.expectEqual(details.displayName, undefined, "Should not have displayName.");
        },
    });

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