#include "../Tests.h"
#include "core/View.h"

#define CV3(a, b, c) (&(CoreVector3){{a, b, c}})

static void testFromAngles() {
    CoreView v = CORE_VIEW;
    coreUpdateDirections(&v, 0.0f, 0.0f);
    CORE_TEST_V3(CV3(0.0f, 1.0f, 0.0f), &v.up);
    CORE_TEST_V3(CV3(0.0f, -1.0f, 0.0f), &v.down);
    CORE_TEST_V3(CV3(0.0f, 0.0f, -1.0f), &v.left);
    CORE_TEST_V3(CV3(0.0f, 0.0f, 1.0f), &v.right);
    CORE_TEST_V3(CV3(1.0f, 0.0f, 0.0f), &v.front);
    CORE_TEST_V3(CV3(-1.0f, 0.0f, 0.0f), &v.back);
}

static void testFromQuaternion() {
    CoreView v = CORE_VIEW;
    coreUpdateDirectionsQ(&v, &CORE_UNIT_QUATERNION);
    CORE_TEST_V3(CV3(0.0f, 1.0f, 0.0f), &v.up);
    CORE_TEST_V3(CV3(0.0f, -1.0f, 0.0f), &v.down);
    CORE_TEST_V3(CV3(0.0f, 0.0f, -1.0f), &v.left);
    CORE_TEST_V3(CV3(0.0f, 0.0f, 1.0f), &v.right);
    CORE_TEST_V3(CV3(1.0f, 0.0f, 0.0f), &v.front);
    CORE_TEST_V3(CV3(-1.0f, 0.0f, 0.0f), &v.back);
}

static void testUpdateMatrix() {
    CoreView v = CORE_VIEW;
    CoreMatrix* m = coreUpdateMatrix(&v, CV3(1.0f, 2.0f, 3.0f));

    char buffer[128];
    coreToStringMatrix(m, buffer, sizeof(buffer));

    CORE_TEST_STRING("[[0.000, 0.000, 0.000, -0.000], "
                     "[0.000, 0.000, 0.000, -0.000], "
                     "[0.000, 0.000, 0.000, -0.000], "
                     "[0.000, 0.000, 0.000, 1.000]]",
                     buffer);
}

void coreTestView() {
    testFromAngles();
    testFromQuaternion();
    testUpdateMatrix();
}