<!DOCTYPE html>
<html>
<meta charset=utf-8>
<meta name="timeout" content="long">
<title>Test the WHLSL test harness.</title>
<script src="js/whlsl-test-harness.js"></script>
<script src="js/webgpu-functions.js"></script>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script>
const whlslTests = {};

whlslTests.arrayRefToArrayRef = async () => {
    let program = `
        int foo()
        {
            int x;
            thread int[] p = @x;
            thread int[][] pp = @p;
            int[]thread[]thread qq = pp;
            int result = 0;
            x = 42;
            p[0] = 76;
            result += x;
            pp[0][0] = 39;
            result += x;
            qq[0][0] = 83;
            result += x;
            return result;
        }
    `;
    assert_equals(await callIntFunction(program, "foo", []), 76 + 39 + 83);
}

whlslTests.assignLength = async () => {
    await checkFail(
        `
            void foo()
            {
                float[754] array;
                (@array).length = 42;
            }
        `);
        
}

whlslTests.assignLengthHelper = async () => {
    await checkFail(
        `
            void bar(thread float[] array)
            {
                array.length = 42;
            }
            void foo()
            {
                float[754] array;
                bar(@array);
            }
        `);
}

whlslTests.buildArrayThenSumIt = async () => {
    let program = `
        int foo()
        {
            int[42] array;
            for (uint i = 0; i < 42; i = i + 1)
                array[i] = int(i + 5);
            int result;
            for (uint i = 0; i < 42; i = i + 1)
                result = result + array[i];
            return result;
        }
    `;
    assert_equals(await callIntFunction(program, "foo", []), 42 * 5 + 42 * 41 / 2);
}

whlslTests.buildArrayThenSumItUsingArrayReference = async () => {
    let program = `
        int bar(thread int[] array)
        {
            for (uint i = 0; i < 42; i = i + 1)
                array[i] = int(i + 5);
            int result;
            for (uint i = 0; i < 42; i = i + 1)
                result = result + array[i];
            return result;
        }
        int foo()
        {
            int[42] array;
            return bar(@array);
        }
    `;
    assert_equals(await callIntFunction(program, "foo", []), 42 * 5 + 42 * 41 / 2);
}

whlslTests.passingArrayToFunction = async () =>
{
    let program = `
        int foo()
        {
            int[10] arr;
            for (uint i = 0; i < arr.length; i++)
                arr[i] = int(i) + 1;
            return sum(arr);
        }

        int sum(int[10] xs)
        {
            int t = 0;
            for (uint i = 0; i < xs.length; i++)
                t = t + xs[i];
            return t;
        }
    `;
    assert_equals(await callIntFunction(program, "foo", []), 55);
}

runTests(whlslTests);
</script>
</html>
