<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function test()
{
    let suite = InspectorTest.createAsyncSuite("TimelineRecording");

    let exportData = null;

    suite.addTestCase({
        name: "TimelineRecording.Basic",
        description: "Make a basic Timeline recording.",
        async test() {
            async function awaitCapturingState(capturingState) {
                return new Promise((resolve, reject) => {
                    let listener = WI.timelineManager.addEventListener(WI.TimelineManager.Event.CapturingStateChanged, (event) => {
                        if (WI.timelineManager.capturingState !== capturingState)
                            return;

                        WI.timelineManager.removeEventListener(WI.TimelineManager.Event.CapturingStateChanged, listener);
                        resolve();
                    });
                });
            }

            let recording = WI.timelineManager.activeRecording;

            InspectorTest.log("Loaded");
            InspectorTest.expectFalse(WI.timelineManager.isCapturing(), "TimelineManager should not be capturing.");
            InspectorTest.expectFalse(recording.capturing, "TimelineRecording should not be capturing.");
            InspectorTest.expectFalse(recording.readonly, "TimelineRecording should not be readonly.");
            InspectorTest.expectFalse(recording.imported, "TimelineRecording should not be imported.");
            InspectorTest.expectThat(isNaN(recording.startTime), "TimelineRecording should not have a startTime.");
            InspectorTest.expectThat(isNaN(recording.endTime), "TimelineRecording should not have a endTime.");

            InspectorTest.log("Start");
            WI.timelineManager.startCapturing();

            await awaitCapturingState(WI.TimelineManager.CapturingState.Active);

            InspectorTest.expectTrue(WI.timelineManager.isCapturing(), "TimelineManager should be capturing.");
            InspectorTest.expectEqual(WI.timelineManager.activeRecording, recording, "TimelineManager active recording should not have changed.");
            InspectorTest.expectTrue(recording.capturing, "TimelineRecording should be capturing.");
            InspectorTest.expectFalse(recording.readonly, "TimelineRecording should not be readonly.");

            InspectorTest.log("Reload");
            await Promise.all([
                InspectorTest.awaitEvent(FrontendTestHarness.Event.TestPageDidLoad),
                InspectorTest.reloadPage(),
            ]);

            InspectorTest.log("Stop");
            WI.timelineManager.stopCapturing();

            await awaitCapturingState(WI.TimelineManager.CapturingState.Inactive);

            InspectorTest.expectFalse(WI.timelineManager.isCapturing(), "TimelineManager should not be capturing.");
            InspectorTest.expectFalse(recording.capturing, "TimelineRecording should not be capturing.");
            InspectorTest.expectFalse(recording.readonly, "TimelineRecording should not be readonly.");
            InspectorTest.expectFalse(recording.imported, "TimelineRecording should not be imported.");
            InspectorTest.expectThat(!isNaN(recording.startTime), "TimelineRecording should have a startTime.");
            InspectorTest.expectThat(!isNaN(recording.endTime), "TimelineRecording should have a endTime.");
        }
    });

    suite.addTestCase({
        name: "TimelineRecording.prototype.exportData",
        description: "Test for a recording export.",
        async test() {
            let recording = WI.timelineManager.activeRecording;
            InspectorTest.assert(!isNaN(recording.startTime), "FAIL: Previous test loading a recording failed.");
            InspectorTest.assert(!isNaN(recording.endTime), "FAIL: Previous test loading a recording failed.");

            InspectorTest.expectTrue(recording.canExport(), "TimelineRecording should be able to export.");

            exportData = recording.exportData();
            InspectorTest.expectThat(exportData, "TimelineRecording should be able to produce export data.");
            InspectorTest.expectThat(exportData.records.length > 10, "TimelineRecording should have at least 10 Timeline Records.");

            InspectorTest.log("Export Data:");
            let filterValue = new Set(["startTime", "endTime", "time", "displayName"]);
            let filterArray = new Set(["records", "markers", "sampleStackTraces", "sampleDurations"]);
            InspectorTest.json(exportData, (key, value) => {
                if (filterValue.has(key))
                    return "<filtered>";
                if (filterArray.has(key))
                    return ["<filtered>"];
                return value;
            });
        }
    });

    suite.addTestCase({
        name: "TimelineRecording.import",
        description: "Test for a recording import.",
        async test() {
            InspectorTest.assert(exportData, "FAIL: Previous test exporting a recording failed.");

            // NOTE: This runs the toJSON handlers on the timeline records and other model objects,
            // which is important because importing expects the serialized form of the objects, not
            // actual model objects.
            let jsonData = JSON.parse(JSON.stringify(exportData));

            const identifier = 999;
            let recording = await WI.TimelineRecording.import(identifier, jsonData, "TEST");
            InspectorTest.expectNotEqual(WI.timelineManager.activeRecording, recording, "TimelineManager active recording is not this imported recording.");
            InspectorTest.expectFalse(recording.capturing, "TimelineRecording should not be capturing.");
            InspectorTest.expectTrue(recording.readonly, "TimelineRecording should be readonly.");
            InspectorTest.expectTrue(recording.imported, "TimelineRecording should be imported.");
            InspectorTest.expectThat(!isNaN(recording.startTime), "TimelineRecording should have a startTime.");
            InspectorTest.expectThat(!isNaN(recording.endTime), "TimelineRecording should have a endTime.");
            InspectorTest.expectEqual(recording.identifier, identifier, `TimelineRecording identifier should be ${identifier}.`);

            InspectorTest.log("Display Name:");
            InspectorTest.log(recording.displayName);
        }
    });

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