#include "shared.rsh"

rs_allocation aRaw;
int dimX;
int dimY;
static bool failed = false;

void root(int *out, uint32_t x, uint32_t y) {
    *out = x + y * dimX;
}

void foo(const int *in, int *out, uint32_t x, uint32_t y) {
    _RS_ASSERT(*in == (x + y * dimX));
    *out = 99 + x + y * dimX;
    _RS_ASSERT(*out == (99 + x + y * dimX));
}

static bool test_root_output() {
    bool failed = false;
    int i, j;

    for (j = 0; j < dimY; j++) {
        for (i = 0; i < dimX; i++) {
            int v = rsGetElementAt_int(aRaw, i, j);
            _RS_ASSERT(v == (i + j * dimX));
        }
    }

    if (failed) {
        rsDebug("test_root_output FAILED", 0);
    }
    else {
        rsDebug("test_root_output PASSED", 0);
    }

    return failed;
}

static bool test_foo_output() {
    bool failed = false;
    int i, j;

    for (j = 0; j < dimY; j++) {
        for (i = 0; i < dimX; i++) {
            int v = rsGetElementAt_int(aRaw, i, j);
            _RS_ASSERT(v == (99 + i + j * dimX));
        }
    }

    if (failed) {
        rsDebug("test_foo_output FAILED", 0);
    }
    else {
        rsDebug("test_foo_output PASSED", 0);
    }

    return failed;
}

void verify_root() {
    failed |= test_root_output();
}

void verify_foo() {
    failed |= test_foo_output();
}

void foreach_test() {
    if (failed) {
        rsSendToClientBlocking(RS_MSG_TEST_FAILED);
    }
    else {
        rsSendToClientBlocking(RS_MSG_TEST_PASSED);
    }
}

