<html>
<head>
<script src="../../http/tests/inspector-protocol/resources/protocol-test.js"></script>
<script src="resources/breakpoint.js"></script>
<script>
function test()
{
    InspectorTest.importScript("../../../../inspector-protocol/resources/probe-helper.js");

    InspectorTest.sendCommand("Debugger.enable", {});

    var samples = [];
    const expectedSampleCount = 4;

    function receivedAllExpectedSamples() {
        return samples.length === expectedSampleCount;
    }

    function dumpSamples() {
        for (var i = 0; i < samples.length; i++)
            InspectorTest.log("Sample " + (i + 1) + ": " + JSON.stringify(samples[i]));
    }

    var tests = [
        {
            message: "Samples from different probe actions should have unique action identifiers.",
            predicate: function samplesHaveUniqueActionIds() {
                return samples[0].probeId !== samples[1].probeId;
            },
            error: dumpSamples
        },
        {
            message: "Samples from probe actions on the same breakpoint should have the same batch identifiers.",
            predicate: function samplesHaveEqualBatchIds() {
                return samples[0].batchId === samples[1].batchId;
            },
            error: dumpSamples
        },
        {
            message: "SampleIds from a any probe are sequential and start counting from one.",
            predicate: function samplesHaveSequentialIds() {
                return samples.every(function(sample, idx) { return sample.sampleId === idx + 1; });
            },
            error: dumpSamples
        },
    ];

    InspectorTest.eventHandler["Debugger.scriptParsed"] = function(messageObject)
    {
        if (/resources\/breakpoint\.js$/.test(messageObject.params.url)) {
            InspectorTest.log("Found breakpoint.js");
            var scriptIdentifier = messageObject.params.scriptId;
            var location = {scriptId: scriptIdentifier, lineNumber: 18, columnNumber: 0};
            var options = {
                autoContinue: true,
                actions: [
                    {"type": "probe", "data": "a", "id": 1},
                    {"type": "probe", "data": "a", "id": 2}
                ]
            };

            InspectorTest.sendCommand("Debugger.setBreakpoint", {location: location, options: options}, function(responseObject) {
                InspectorTest.checkForError(responseObject);

                InspectorTest.log("Running breakpointActions to trigger probe samples.");
                InspectorTest.sendCommand("Runtime.evaluate", {expression: "breakpointActions(12, {x:1,y:2})"});
                InspectorTest.sendCommand("Runtime.evaluate", {expression: "breakpointActions(12, {x:1,y:2})"});
            });
        }
    }

    InspectorTest.eventHandler["Debugger.didSampleProbe"] = function(messageObject)
    {
        var sample = ProbeHelper.simplifiedProbeSample(messageObject);
        samples.push(sample);
        InspectorTest.log("Received probe sample payload: " + JSON.stringify(sample.payload));

        if (receivedAllExpectedSamples()) {
            tests.forEach(function(test) {
                var result = test.predicate();
                InspectorTest.assert(result, test.message);
                if (!result)
                    test.error();
            });
            InspectorTest.completeTest();
        }
    }
}
</script>
</head>
<body onload="runTest()">
<p>Debugger.setBreakpoint with multiple probe actions at the same breakpoint. Test Debugger.didSampleProbe events for the probe samples.</p>
</body>
</html>
