<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function triggerCreateObjects() {
    window.list = [];
    for (let i = 0; i < 100; ++i)
        window.list.push({key: "value" + i});
}

function triggerRemoveObjects() {
    window.list = null;
}

function test()
{
    let suite = InspectorTest.createAsyncSuite("HeapSnapshot.CollectionEvent");

    let snapshot = null;

    suite.addTestCase({
        name: "HeapSnapshot",
        test(resolve, reject) {
            InspectorTest.evaluateInPage("triggerCreateObjects()");
            HeapAgent.snapshot((error, timestamp, snapshotStringData) => {
                InspectorTest.expectThat(!error, "Should not have an error creating a snapshot.");
                let workerProxy = WI.HeapSnapshotWorkerProxy.singleton();
                workerProxy.createSnapshot(snapshotStringData, ({objectId, snapshot: serializedSnapshot}) => {
                    snapshot = WI.HeapSnapshotProxy.deserialize(objectId, serializedSnapshot);
                    InspectorTest.expectThat(snapshot, "Should create HeapSnapshotProxy snapshot.");
                    resolve();
                });
            });
        }
    });

    suite.addTestCase({
        name: "HeapSnapshotCollectionEvent",
        test(resolve, reject) {
            InspectorTest.evaluateInPage("triggerRemoveObjects()");

            let workerProxy = WI.HeapSnapshotWorkerProxy.singleton();
            HeapAgent.snapshot((error, timestamp, snapshotStringData) => {
                InspectorTest.expectThat(!error, "Should not have an error creating a snapshot.");
                workerProxy.createSnapshot(snapshotStringData, ({objectId, snapshot: serializedSnapshot}) => {
                    // Ignore result. This should trigger the collection event.
                });
            });

            workerProxy.addEventListener("HeapSnapshot.CollectionEvent", (event) => {
                InspectorTest.pass("Received HeapSnapshot.CollectionEvent.");
                InspectorTest.expectThat(Object.keys(event.data.collectedNodes).length >= 200, "Collection should include at least 200 nodes (100 objects and 100 strings).");
                InspectorTest.expectThat(event.data.affectedSnapshots.includes(snapshot.identifier), "Collection should affect the first snapshot.");
                resolve();
            });
        }
    });

    suite.addTestCase({
        name: "HeapSnapshot.prototype.update",
        test(resolve, reject) {
            let categoriesBefore = snapshot.categories;
            snapshot.update(() => {
                let categoriesAfter = snapshot.categories;
                InspectorTest.expectThat(categoriesBefore.get("Object").deadCount === 0, "0 Objects were dead before.");
                InspectorTest.expectThat(categoriesAfter.get("Object").deadCount >= 100, "At least 100 Objects are dead after.");
                InspectorTest.expectThat(categoriesBefore.get("string").deadCount === 0, "0 strings were dead before.");
                InspectorTest.expectThat(categoriesAfter.get("string").deadCount >= 100, "At least 100 strings are dead after.");
                resolve();
            });
        }
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
    <p>Testing HeapSnapshot CollectionEvent between snapshots.</p>
</body>
</html>
