<script src="../../resources/js-test-pre.js"></script>
<script>

var output;
const BUFFER_SIZE = 24 * 4;

const SHADER = `
enable f16;

@group(0) @binding(0) var<storage, read_write> buf: array<atomic<i32>, 24>;
@group(0) @binding(1) var<storage, read_write> buf2: array<atomic<u32>, 24>;

@compute @workgroup_size(1)
fn main() {
  { var x = -65504h; atomicStore(&buf[0], i32(x)); }
  { var x = -1.0e36f; atomicStore(&buf[1], i32(x)); }
  { var x = 65504.0h; atomicStore(&buf[2], i32(x)); }
  { var x = 1.0e36f; atomicStore(&buf[3], i32(x)); }
  { var x = 0h; atomicStore(&buf[4], i32(-x/x)); }
  { var x = 0h; atomicStore(&buf[5], i32(x/x)); }
  { var x = 0h; atomicStore(&buf[6], i32(-1/x)); }
  { var x = 0h; atomicStore(&buf[7], i32(1/x)); }
  { var x = 0f; atomicStore(&buf[8], i32(-x/x)); }
  { var x = 0f; atomicStore(&buf[9], i32(x/x)); }
  { var x = 0f; atomicStore(&buf[10], i32(-1/x)); }
  { var x = 0f; atomicStore(&buf[11], i32(1/x)); }

  { var x = -65504h; atomicStore(&buf[12], vec2i(vec2(x)).x); }
  { var x = -1.0e36f; atomicStore(&buf[13], vec2i(vec2(x)).x); }
  { var x = 65504.0h; atomicStore(&buf[14], vec2i(vec2(x)).x); }
  { var x = 1.0e36f; atomicStore(&buf[15], vec2i(vec2(x)).x); }
  { var x = 0h; atomicStore(&buf[16], vec2i(vec2(-x/x)).x); }
  { var x = 0h; atomicStore(&buf[17], vec2i(vec2(x/x)).x); }
  { var x = 0h; atomicStore(&buf[18], vec2i(vec2(-1/x)).x); }
  { var x = 0h; atomicStore(&buf[19], vec2i(vec2(1/x)).x); }
  { var x = 0f; atomicStore(&buf[20], vec2i(vec2(-x/x)).x); }
  { var x = 0f; atomicStore(&buf[21], vec2i(vec2(x/x)).x); }
  { var x = 0f; atomicStore(&buf[22], vec2i(vec2(-1/x)).x); }
  { var x = 0f; atomicStore(&buf[23], vec2i(vec2(1/x)).x); }


  { var x = -65504h; atomicStore(&buf2[0], u32(x)); }
  { var x = -1.0e36f; atomicStore(&buf2[1], u32(x)); }
  { var x = 65504h; atomicStore(&buf2[2], u32(x)); }
  { var x = 1.0e36f; atomicStore(&buf2[3], u32(x)); }
  { var x = 0h; atomicStore(&buf2[4], u32(-x/x)); }
  { var x = 0h; atomicStore(&buf2[5], u32(x/x)); }
  { var x = 0h; atomicStore(&buf2[6], u32(-1/x)); }
  { var x = 0h; atomicStore(&buf2[7], u32(1/x)); }
  { var x = 0f; atomicStore(&buf2[8], u32(-x/x)); }
  { var x = 0f; atomicStore(&buf2[9], u32(x/x)); }
  { var x = 0f; atomicStore(&buf2[10], u32(-1/x)); }
  { var x = 0f; atomicStore(&buf2[11], u32(1/x)); }

  { var x = -65504h; atomicStore(&buf2[12], vec2u(vec2h(x)).x); }
  { var x = -1.0e36f; atomicStore(&buf2[13], vec2u(vec2f(x)).x); }
  { var x = 65504h; atomicStore(&buf2[14], vec2u(vec2h(x)).x); }
  { var x = 1.0e36f; atomicStore(&buf2[15], vec2u(vec2f(x)).x); }
  { var x = 0h; atomicStore(&buf2[16], vec2u(vec2h(-x/x)).x); }
  { var x = 0h; atomicStore(&buf2[17], vec2u(vec2h(x/x)).x); }
  { var x = 0h; atomicStore(&buf2[18], vec2u(vec2h(-1/x)).x); }
  { var x = 0h; atomicStore(&buf2[19], vec2u(vec2h(1/x)).x); }
  { var x = 0f; atomicStore(&buf2[20], vec2u(vec2f(-x/x)).x); }
  { var x = 0f; atomicStore(&buf2[21], vec2u(vec2f(x/x)).x); }
  { var x = 0f; atomicStore(&buf2[22], vec2u(vec2f(-1/x)).x); }
  { var x = 0f; atomicStore(&buf2[23], vec2u(vec2f(1/x)).x); }

}
`;


async function main() {
    const adapter = await navigator.gpu.requestAdapter({});
    const device = await adapter.requestDevice({});

    device.pushErrorScope('validation');

    const shaderModule = device.createShaderModule({code: SHADER});
    const bindGroupLayout = device.createBindGroupLayout({
        entries: [
            {binding: 0, buffer: {type: 'storage'}, visibility: GPUShaderStage.COMPUTE},
            {binding: 1, buffer: {type: 'storage'}, visibility: GPUShaderStage.COMPUTE},
        ]
    });

    const buffer = device.createBuffer({
        usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
        size: BUFFER_SIZE
    });

    const buffer2 = device.createBuffer({
        usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
        size: BUFFER_SIZE
    });

    const outputBuffer = device.createBuffer({
        usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
        size: BUFFER_SIZE
    });

    const outputBuffer2 = device.createBuffer({
        usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
        size: BUFFER_SIZE
    });

    const bindGroup = device.createBindGroup({
        layout: bindGroupLayout, entries: [
            {binding: 0, resource: {buffer: buffer}},
            {binding: 1, resource: {buffer: buffer2}},
        ],
    });

    const commandEncoder = device.createCommandEncoder();
    const computePassEncoder = commandEncoder.beginComputePass({});
    const pipelineLayout = device.createPipelineLayout({bindGroupLayouts: [bindGroupLayout]});
    const computePipeline = device.createComputePipeline({layout: pipelineLayout, compute: {module: shaderModule}});
    computePassEncoder.setPipeline(computePipeline);
    computePassEncoder.setBindGroup(0, bindGroup);
    computePassEncoder.dispatchWorkgroups(1);
    computePassEncoder.end();

    commandEncoder.copyBufferToBuffer(buffer, 0, outputBuffer, 0, BUFFER_SIZE);
    commandEncoder.copyBufferToBuffer(buffer2, 0, outputBuffer2, 0, BUFFER_SIZE);

    device.queue.submit([commandEncoder.finish()]);

    await device.queue.onSubmittedWorkDone();

    await outputBuffer.mapAsync(GPUMapMode.READ);
    await outputBuffer2.mapAsync(GPUMapMode.READ);
    output = new Int32Array(outputBuffer.getMappedRange());
    output2 = new Uint32Array(outputBuffer2.getMappedRange());

    debug(output);
    debug(output2);

    shouldBe('output[0]', '-65504');
    shouldBe('output[1]', '-2147483648');
    shouldBe('output[2]', '65504');
    shouldBe('output[3]', '2147483520');
    shouldBe('output[4]', '0');
    shouldBe('output[5]', '0');
    shouldBe('output[6]', '-65504');
    shouldBe('output[7]', '65504');
    shouldBe('output[8]', '0');
    shouldBe('output[9]', '0');
    shouldBe('output[10]', '-2147483648');
    shouldBe('output[11]', '2147483520');
    shouldBe('output[12]', '-65504');
    shouldBe('output[13]', '-2147483648');
    shouldBe('output[14]', '65504');
    shouldBe('output[15]', '2147483520');
    shouldBe('output[16]', '0');
    shouldBe('output[17]', '0');
    shouldBe('output[18]', '-65504');
    shouldBe('output[19]', '65504');
    shouldBe('output[20]', '0');
    shouldBe('output[21]', '0');
    shouldBe('output[22]', '-2147483648');
    shouldBe('output[23]', '2147483520');

    shouldBe('output2[0]', '0');
    shouldBe('output2[1]', '0');
    shouldBe('output2[2]', '65504');
    shouldBe('output2[3]', '4294967040');
    shouldBe('output2[4]', '0');
    shouldBe('output2[5]', '0');
    shouldBe('output2[6]', '0');
    shouldBe('output2[7]', '65504');
    shouldBe('output2[8]', '0');
    shouldBe('output2[9]', '0');
    shouldBe('output2[10]', '0');
    shouldBe('output2[11]', '4294967040');
    shouldBe('output2[12]', '0');
    shouldBe('output2[13]', '0');
    shouldBe('output2[14]', '65504');
    shouldBe('output2[15]', '4294967040');
    shouldBe('output2[16]', '0');
    shouldBe('output2[17]', '0');
    shouldBe('output2[18]', '0');
    shouldBe('output2[19]', '65504');
    shouldBe('output2[20]', '0');
    shouldBe('output2[21]', '0');
    shouldBe('output2[22]', '0');
    shouldBe('output2[23]', '4294967040');

    outputBuffer.unmap();
    outputBuffer2.unmap();
}


globalThis.testRunner?.waitUntilDone();

main().catch(e => {
    debug(e);
}).finally(() => {
    globalThis.testRunner?.notifyDone();
});

</script>
