<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script src="resources/shaderProgram-utilities-webgpu.js"></script>
<script>
function test() {
    let suite = InspectorTest.createAsyncSuite("Canvas.updateShader.WebGPU");

    function test({name, programType, shaderType, source, shouldThrow}) {
        suite.addTestCase({
            name,
            async test() {
                let shaderProgram = InspectorTest.ShaderProgram.programForType(programType);
                if (!shaderProgram)
                    throw "Missing shader program";

                let originalSource = await CanvasAgent.requestShaderSource(shaderProgram.identifier, shaderType);

                if (shouldThrow) {
                    await InspectorTest.expectException(async () => {
                        await CanvasAgent.updateShader(shaderProgram.identifier, shaderType, source);
                    });
                } else
                    await CanvasAgent.updateShader(shaderProgram.identifier, shaderType, source);

                let newSource = await CanvasAgent.requestShaderSource(shaderProgram.identifier, shaderType);

                InspectorTest.expectNotShallowEqual(originalSource, newSource, "Source should have changed.");
            }
        });
    }

    test({
        name: "Canvas.updateShader.WebGPU.Compute.Valid",
        programType: WI.ShaderProgram.ProgramType.Compute,
        shaderType: WI.ShaderProgram.ShaderType.Compute,
        source: `// CHANGED COMPUTE
[numthreads(2, 1, 1)]
compute void computeShader(device float[] buffer : register(u0), float3 threadID : SV_DispatchThreadID) {
    buffer[uint(threadID.x)] = buffer[uint(threadID.x)] * 2.0;
}
`,
    });

    test({
        name: "Canvas.updateShader.WebGPU.Compute.Invalid",
        programType: WI.ShaderProgram.ProgramType.Compute,
        shaderType: WI.ShaderProgram.ShaderType.Compute,
        source: "INVALID",
        shouldThrow: true,
    });

    test({
        name: "Canvas.updateShader.WebGPU.Vertex.Valid",
        programType: WI.ShaderProgram.ProgramType.Render,
        shaderType: WI.ShaderProgram.ShaderType.Vertex,
        source: `// CHANGED VERTEX
vertex float4 vertexShader(float4 position : attribute(0), float i : attribute(1)) : SV_Position {
    return position;
}

fragment float4 fragmentShader(float4 position : SV_Position) : SV_Target 0 {
    return position;
}
`,
    });

    test({
        name: "Canvas.updateShader.WebGPU.Vertex.Invalid",
        programType: WI.ShaderProgram.ProgramType.Render,
        shaderType: WI.ShaderProgram.ShaderType.Vertex,
        source: "INVALID",
        shouldThrow: true,
    });

    test({
        name: "Canvas.updateShader.WebGPU.Fragment.Valid",
        programType: WI.ShaderProgram.ProgramType.Render,
        shaderType: WI.ShaderProgram.ShaderType.Fragment,
        source: `// CHANGED FRAGMENT
vertex float4 vertexShader(float4 position : attribute(0), float i : attribute(1)) : SV_Position {
    return position;
}

fragment float4 fragmentShader(float4 position : SV_Position) : SV_Target 0 {
    return position;
}
`,
    });

    test({
        name: "Canvas.updateShader.WebGPU.Fragment.Invalid",
        programType: WI.ShaderProgram.ProgramType.Render,
        shaderType: WI.ShaderProgram.ShaderType.Fragment,
        source: "INVALID",
        shouldThrow: true,
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="load()">
<p>WebGPU tests for Canvas.updateShader command.</p>
</body>
</html>
