<!DOCTYPE html>
<html>
<meta charset=utf-8>
<meta name="timeout" content="long">
<title>Minus.</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 = {};
const epsilon = 0.0001;

whlslTests.vectorMinus = async () => {
    const program = `
        int foo() {
            int2 x = int2(10, 25);
            int2 y = int2(20, 30);
            int2 r = y - x;
            return r.x / r.y;
        }
    `;
    assert_equals(await callIntFunction(program,  "foo", []), 2);
};

whlslTests.vectorNegate = async () => {
    const program = `
        int foo() {
            int2 x = int2(10, 25);
            x = -x;
            return x.x + x.y;
        }
    `;
    assert_equals(await callIntFunction(program,  "foo", []), -35);
};

whlslTests.vectorMinusScalar = async () => {
    const program = `
        float foo() {
            float2 x = float2(10.0, 25.0);
            x = x - 5.0;
            return x.y / x.x;
        }
    `;
    assert_approx_equals(await callFloatFunction(program,  "foo", []), 20/5, epsilon);
};

whlslTests.vectorMinusScalar2 = async () => {
    const program = `
        float foo() {
            float2 x = float2(-10.0, -25.0);
            x = 5.0 - x;
            return x.y / x.x;
        }
    `;
    assert_approx_equals(await callFloatFunction(program,  "foo", []), 30/15, epsilon);
};

whlslTests.matrixMinus = async () => {
    const program = `
        bool foo() {
            float2x2 m;
            m[0] = float2(20, 30);
            m[1] = float2(40, 50);
            m = m - m;
            if (m[0][0] == 0 && m[0][1] == 0 && m[1][0] == 0 && m[1][1] == 0)
                return true;
            return false;
        }
    `;
    assert_equals(await callBoolFunction(program,  "foo", []), true);
};

whlslTests.matrixMinusScalar = async () => {
    const program = `
        bool foo() {
            float2x2 m;
            m[0] = float2(20, 30);
            m[1] = float2(40, 50);

            m = m - 1.0;

            if (m[0][0] == 19.0 && m[0][1] == 29.0 && m[1][0] == 39.0 && m[1][1] == 49.0)
                return true;
            return false;
        }
    `;
    assert_equals(await callBoolFunction(program,  "foo", []), true);
};

whlslTests.matrixMinusScalar2 = async () => {
    const program = `
        bool foo() {
            float2x2 m;
            m[0] = float2(20, 30);
            m[1] = float2(40, 50);

            m = 0.0 - m;

            if (m[0][0] == -20.0 && m[0][1] == -30.0 && m[1][0] == -40.0 && m[1][1] == -50.0)
                return true;
            return false;
        }
    `;
    assert_equals(await callBoolFunction(program,  "foo", []), true);
};

whlslTests.matrixNegate = async () => {
    const program = `
        bool foo() {
            float2x2 m;
            m[0] = float2(20, 30);
            m[1] = float2(40, 50);

            m = -m;

            if (m[0][0] == -20.0 && m[0][1] == -30.0 && m[1][0] == -40.0 && m[1][1] == -50.0)
                return true;
            return false;
        }
    `;
    assert_equals(await callBoolFunction(program,  "foo", []), true);
};

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