<!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.length, 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, WI.pageTarget.RuntimeAgent, "Main target should have the page target's 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>
