<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
let worker;

function createWorker() {
    worker = new Worker("../worker/resources/worker-1.js");
}

function terminateWorker() {
    worker.terminate();
}

function test()
{
    function dumpTargets() {
        for (let target of WI.targets)
            InspectorTest.log(`Target - ${String(target.type)} - ${target.displayName}`);
    }

    let suite = InspectorTest.createAsyncSuite("TargetManager");

    suite.addTestCase({
        name: "TargetManager.MainTarget",
        description: "We should always have the main target.",
        async test() {
            InspectorTest.assert(WI.targets === WI.targetManager.targets);
            InspectorTest.expectEqual(WI.targets.size, 1, "Targets list should always start out with the main target.");
            InspectorTest.expectEqual([...WI.targets][0], WI.mainTarget, "Target list should always contain the main target.");
            InspectorTest.expectNotNull(WI.mainTarget.executionContext, "Main target should have an ExecutionContext.");
            InspectorTest.expectEqual(WI.mainTarget.RuntimeAgent, RuntimeAgent, "Main target should have the global RuntimeAgent.");
            dumpTargets();
        }
    });

    suite.addTestCase({
        name: "TargetManager.WorkerTarget.Create",
        description: "Creating a Worker should create a new Worker Target.",
        async test() {
            InspectorTest.evaluateInPage("createWorker()");
            let event = await WI.targetManager.awaitEvent(WI.TargetManager.Event.TargetAdded);
            let target = event.data.target;
            InspectorTest.assert(target instanceof WI.Target);
            InspectorTest.expectEqual(target.type, WI.Target.Type.Worker, "Added Target should have Worker type.");
            InspectorTest.expectNotNull(target.executionContext, "Added Target should have an ExecutionContext.");
            InspectorTest.expectNotNull(target.RuntimeAgent, "Added Target should have a RuntimeAgent.");
            InspectorTest.expectNotEqual(target.RuntimeAgent, RuntimeAgent, "Added Target RuntimeAgent should not be the global RuntimeAgent.");
            dumpTargets();
        }
    });

    suite.addTestCase({
        name: "TargetManager.WorkerTarget.Remove",
        description: "Creating a Worker should create a new Worker Target.",
        async test() {
            InspectorTest.evaluateInPage("terminateWorker()");
            let event = await WI.targetManager.awaitEvent(WI.TargetManager.Event.TargetRemoved);
            let target = event.data.target;
            InspectorTest.assert(target instanceof WI.Target);
            InspectorTest.expectEqual(target.type, WI.Target.Type.Worker, "Removed Target should have Worker type.");
            dumpTargets();
        }
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
<p>Test for TargetManager and other global WI.Target objects.</p>
</body>
</html>
