<!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.Breakpoint(location);
                breakpoint.autoContinue = true;

                function addLogAction(data) {
                    breakpoint.createAction(WI.BreakpointAction.Type.Log, breakpoint.actions.lastValue, 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>
