<!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 filterKeys = new Set(["startTime", "endTime", "time", "records", "displayName"]);
            InspectorTest.json(exportData, (key, value) => {
                if (filterKeys.has(key))
                    return "<filtered>";
                if (key === "markers")
                    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 = 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>
