<!doctype html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script src="resources/script-for-breakpoint-actions.js"></script>
<script>
function runBreakpointActions()
{
    breakpointActions(42, {x:1, y:2});
}

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

    suite.addTestCase({
        name: "TemplateLiteralPlaceholders",
        description: "Evaluate breakpoint with logging actions that include placeholders.",
        test(resolve, reject) {
            let breakpointPromise = new WI.WrappedPromise;
            WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.ScriptAdded, (event) => {
                let scriptObject = event.data.script;
                if (!/script\-for\-breakpoint\-actions\.js$/.test(scriptObject.url))
                    return;

                let location = scriptObject.createSourceCodeLocation(4, 0);
                let breakpoint = new WI.JavaScriptBreakpoint(location);
                breakpoint.autoContinue = true;

                function addLogAction(data) {
                    breakpoint.addAction(new WI.BreakpointAction(WI.BreakpointAction.Type.Log, {data}));
                }

                addLogAction("`${a}`");
                addLogAction("'${a}'");
                addLogAction("${'ab' + 'c'}");
                addLogAction("${\"{abc}\"}");
                addLogAction("${'{abc}'}");
                addLogAction("${`{abc}`}");
                addLogAction("${`ab${'c'}`}");
                addLogAction("${({a: 137}).a}");
                addLogAction("close curly brace in RegExp: ${/\\}/.test('}')}");
                addLogAction("${a} and ${JSON.stringify(b)}");

                WI.debuggerManager.addBreakpoint(breakpoint);
                breakpointPromise.resolve();
            });

            let reloadPromise = InspectorTest.awaitEvent(FrontendTestHarness.Event.TestPageDidLoad);
            InspectorTest.reloadPage();
            Promise.all([
                reloadPromise,
                breakpointPromise.promise
            ])
            .then(() => {
                return InspectorTest.evaluateInPage("runBreakpointActions()");
            })
            .then(resolve);;
        }
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
    <p>Testing that "Log" breakpoint actions work correctly.</p>
</body>
</html>
