<!DOCTYPE html>
<html>
<meta charset=utf-8>
<meta name="timeout" content="long">
<title>Test prefix/postfix.</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.indexAnderDoesntReturnPointer = async () =>
{
    await checkFail(
        `
            struct Foo {
                int x;
            }
            int operator&[](thread Foo* foo, uint)
            {
                return foo->x;
            }
        `);
}

whlslTests.indexAnderDoesntTakeReference = async () =>
{
    await checkFail(
        `
            struct Foo {
                int x;
            }
            thread int* operator&[](Foo foo, uint)
            {
                return &foo.x;
            }
        `);
}

whlslTests.anderDoesntReturnPointer = async () => {
    await checkFail(
        `
            struct Foo {
                int x;
            }
            int operator&.foo(thread Foo* foo)
            {
                return foo->x;
            }
        `);
}

whlslTests.anderDoesntTakeReference = async () =>
{
    await checkFail(
        `
            struct Foo {
                int x;
            }
            thread int* operator&.foo(Foo foo)
            {
                return &foo.x;
            }
        `);
}

whlslTests.anderWithBadIndex = async () =>
{
    await checkFail(`int foo(thread int[] x) { return x[-1]; }`);

    await checkFail(`int foo(thread int[] x) { return x[1.f]; }`);

    await checkFail(`int foo(thread int[] x, int y) { return x[y]; }`);

    await checkFail(`int foo(thread int[] x, float y) { return x[y]; }`);
}

whlslTests.anderWithNothingWrong = async () =>
{
    let program = `
        struct Foo {
            int x;
        }
        thread int* operator&.foo(thread Foo* foo)
        {
            return &foo->x;
        }
        int foo()
        {
            Foo x;
            x.x = 13;
            return x.foo;
        }
    `;
    assert_equals(await callIntFunction(program, "foo", []), 13);
}

whlslTests.anderWithWrongNumberOfArguments = async () => {
    await checkFail(
        `
            thread int* operator&.foo()
            {
                int x;
                return &x;
            }
        `);

    await checkFail(
        `
            struct Foo {
                int x;
            }
            thread int* operator&.foo(thread Foo* foo, int blah)
            {
                return &foo->x;
            }
        `);
}

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