#include "../Tests.hpp"
#include "core/Test.hpp"
#include "core/View.hpp"

using V3 = Core::Vector3;
using Core::View;

static void testFromAngles() {
    View v;
    v.updateDirections(0.0f, 0.0f);
    TEST(V3(0.0f, 1.0f, 0.0f), v.getUp());
    TEST(V3(0.0f, -1.0f, 0.0f), v.getDown());
    TEST(V3(0.0f, 0.0f, -1.0f), v.getLeft());
    TEST(V3(0.0f, 0.0f, 1.0f), v.getRight());
    TEST(V3(1.0f, 0.0f, 0.0f), v.getFront());
    TEST(V3(-1.0f, 0.0f, 0.0f), v.getBack());
}

static void testFromQuaternion() {
    View v;
    v.updateDirections(Core::Quaternion());
    TEST(V3(0.0f, 1.0f, 0.0f), v.getUp());
    TEST(V3(0.0f, -1.0f, 0.0f), v.getDown());
    TEST(V3(0.0f, 0.0f, -1.0f), v.getLeft());
    TEST(V3(0.0f, 0.0f, 1.0f), v.getRight());
    TEST(V3(1.0f, 0.0f, 0.0f), v.getFront());
    TEST(V3(-1.0f, 0.0f, 0.0f), v.getBack());
}

static void testUpdateMatrix() {
    View v;
    const Core::Matrix& m = v.updateMatrix(V3(1.0f, 2.0f, 3.0f));
    TEST_STRING(
        "[[0.00, 0.00, 0.00, -0.00], "
        "[0.00, 0.00, 0.00, -0.00], "
        "[0.00, 0.00, 0.00, -0.00], "
        "[0.00, 0.00, 0.00, 1.00]]",
        m);
}

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