<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
if (window.internals)
    window.internals.settings.setWebGPUEnabled(true);

function createDevice() {
    navigator.gpu.requestAdapter().then(function adapterRequested(adapter) {
        adapter.requestDevice().then(function deviceRequested(device) {
            window.contextWebGPU = device;
        });
    });
}

function test()
{
    let suite = InspectorTest.createAsyncSuite("Canvas.resolveContextWebGPU");

    suite.addTestCase({
        name: `Canvas.resolveContextWebGPU.validIdentifier`,
        description: "Should return a valid object for the given canvas identifier.",
        async test() {
            InspectorTest.assert(!WI.canvasManager.canvases.length, "There should be no canvases.");

            let [canvasAddedEvent] = await Promise.all([
                WI.canvasManager.awaitEvent(WI.CanvasManager.Event.CanvasAdded),
                InspectorTest.evaluateInPage(`createDevice()`),
            ]);

            let {canvas} = canvasAddedEvent.data;
            InspectorTest.assert(canvas.contextType, WI.Canvas.ContextType.WebGPU, "Added canvas should be a WebGPU device.");

            const objectGroup = "test";
            let {object} = await CanvasAgent.resolveContext(canvas.identifier, objectGroup)
            InspectorTest.expectEqual(object.type, "object", `Payload should have type "object".`);
            InspectorTest.expectEqual(object.className, "GPUDevice", `Payload should have className "GPUDevice".`);
        }
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
    <p>Tests for the Canvas.resolveContext command for WebGPU devices.</p>
</body>
</html>
