<!DOCTYPE html>
<html>
<meta charset=utf-8>
<meta name="timeout" content="long">
<title>Test int bit math.</title>
<script src="js/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.intBitAnd = async () =>
{
    let program = `
        int foo(int a, int b)
        {
            return a & b;
        }
    `;
    assert_equals(await callIntFunction(program, "foo", [makeInt(1), makeInt(7)]), 1);
    assert_equals(await callIntFunction(program, "foo", [makeInt(65535), makeInt(42)]), 42);
    assert_equals(await callIntFunction(program, "foo", [makeInt(-1), makeInt(-7)]), -7);
    assert_equals(await callIntFunction(program, "foo", [makeInt(0), makeInt(85732)]), 0);
}

whlslTests.intBitOr = async () =>
{
    let program = `
        int foo(int a, int b)
        {
            return a | b;
        }
    `;
    assert_equals(await callIntFunction(program, "foo", [makeInt(1), makeInt(7)]), 7);
    assert_equals(await callIntFunction(program, "foo", [makeInt(65535), makeInt(42)]), 65535);
    assert_equals(await callIntFunction(program, "foo", [makeInt(-1), makeInt(-7)]), -1);
    assert_equals(await callIntFunction(program, "foo", [makeInt(0), makeInt(85732)]), 85732);
}

whlslTests.intBitXor = async () =>
{
    let program = `
        int foo(int a, int b)
        {
            return a ^ b;
        }
    `;
    assert_equals(await callIntFunction(program, "foo", [makeInt(1), makeInt(7)]), 6);
    assert_equals(await callIntFunction(program, "foo", [makeInt(65535), makeInt(42)]), 65493);
    assert_equals(await callIntFunction(program, "foo", [makeInt(-1), makeInt(-7)]), 6);
    assert_equals(await callIntFunction(program, "foo", [makeInt(0), makeInt(85732)]), 85732);
}

whlslTests.intBitNot = async () =>
{
    let program = `
        int foo(int a)
        {
            return ~a;
        }
    `;
    assert_equals(await callIntFunction(program, "foo", [makeInt(1)]), -2);
    assert_equals(await callIntFunction(program, "foo", [makeInt(65535)]), -65536);
    assert_equals(await callIntFunction(program, "foo", [makeInt(-1)]), 0);
    assert_equals(await callIntFunction(program, "foo", [makeInt(0)]), -1);
}

whlslTests.intLShift = async () =>
{
    let program = `
        int foo(int a, uint b)
        {
            return a << b;
        }
    `;
    assert_equals(await callIntFunction(program, "foo", [makeInt(1), makeUint(7)]), 128);
    assert_equals(await callIntFunction(program, "foo", [makeInt(65535), makeUint(2)]), 262140);
    assert_equals(await callIntFunction(program, "foo", [makeInt(-1), makeUint(5)]), -32);
    assert_equals(await callIntFunction(program, "foo", [makeInt(0), makeUint(3)]), 0);
}

whlslTests.intRShift = async () =>
{
    let program = `
        int foo(int a, uint b)
        {
            return a >> b;
        }
    `;
    assert_equals(await callIntFunction(program, "foo", [makeInt(1), makeUint(7)]), 0);
    assert_equals(await callIntFunction(program, "foo", [makeInt(65535), makeUint(2)]), 16383);
    assert_equals(await callIntFunction(program, "foo", [makeInt(-1), makeUint(5)]), -1);
    assert_equals(await callIntFunction(program, "foo", [makeInt(0), makeUint(3)]), 0);
}

whlslTests.intSimpleMath = async () => {
    let program = "int foo(int x, int y) { return x + y; }";
    assert_equals(await callIntFunction(program, "foo", [makeInt(7), makeInt(5)]), 12);
    program = "int foo(int x, int y) { return x - y; }";
    assert_equals(await callIntFunction(program, "foo", [makeInt(7), makeInt(5)]), 2);
    assert_equals(await callIntFunction(program, "foo", [makeInt(5), makeInt(7)]), -2);
    program = "int foo(int x, int y) { return x * y; }";
    assert_equals(await callIntFunction(program, "foo", [makeInt(7), makeInt(5)]), 35);
    assert_equals(await callIntFunction(program, "foo", [makeInt(7), makeInt(-5)]), -35);
}

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