From fcfafa203506389343170d75e7d0fd88ff8a5c49 Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Fri, 8 Mar 2019 13:34:31 +0100 Subject: [PATCH] test: add a unit test of real::cbrt() and fix the camera unit test. --- src/t/entity/camera.cpp | 205 +++++++++++++++++++++------------------- src/t/math/real.cpp | 43 ++++++++- 2 files changed, 149 insertions(+), 99 deletions(-) diff --git a/src/t/entity/camera.cpp b/src/t/entity/camera.cpp index 8836a1e8..ab94c5b0 100644 --- a/src/t/entity/camera.cpp +++ b/src/t/entity/camera.cpp @@ -1,7 +1,7 @@ // // Lol Engine — Unit tests for the camera object // -// Copyright © 2010—2015 Sam Hocevar +// Copyright © 2010—2019 Sam Hocevar // © 2013 Benjamin “Touky” Huet // // Lol Engine is free software. It comes without any warranty, to @@ -15,12 +15,14 @@ #include +#include + namespace lol { lolunit_declare_fixture(camera_test) { - Camera tc; + Camera *tc; // FIXME: this should be a shared ptr or something vec3 eye, target, up; mat4 m_lookat; quat q_lookat; @@ -30,6 +32,9 @@ lolunit_declare_fixture(camera_test) void setup() { + ticker::setup(60.f); + tc = new Camera(); + eye = vec3(0.f, 0.f, 50.f); target = vec3::zero; up = vec3::axis_y; @@ -44,6 +49,12 @@ lolunit_declare_fixture(camera_test) is_shifted = false; } + void teardown() + { + //ticker::Unref(tc.get()); + ticker::teardown(); + } + #define TEST_VECTOR(v0, v1) \ lolunit_assert_doubles_equal(v0.x, v1.x, 1.e-5f); \ lolunit_assert_doubles_equal(v0.y, v1.y, 1.e-5f); \ @@ -51,28 +62,28 @@ lolunit_declare_fixture(camera_test) lolunit_declare_test(set_view_test) { - tc.SetView(eye, target, up); - TEST_VECTOR(eye, tc.GetPosition()); - TEST_VECTOR(target, tc.GetTarget()); - TEST_VECTOR(up, tc.GetUp()); - - tc.SetView(eye, q_lookat); - TEST_VECTOR(eye, tc.GetPosition()); - TEST_VECTOR(target, tc.GetTarget()); - TEST_VECTOR(up, tc.GetUp()); - - tc.SetView(eye, v_lookat); - TEST_VECTOR(eye, tc.GetPosition()); - TEST_VECTOR(target, tc.GetTarget()); - TEST_VECTOR(up, tc.GetUp()); - - tc.SetView(m_lookat); - TEST_VECTOR(eye, tc.GetPosition()); - TEST_VECTOR(target, tc.GetTarget()); - TEST_VECTOR(up, tc.GetUp()); - - tc.UseTarget(false); - TEST_VECTOR(vec3(0.f, 0.f, 49.f), tc.GetTarget()); + tc->SetView(eye, target, up); + TEST_VECTOR(eye, tc->GetPosition()); + TEST_VECTOR(target, tc->GetTarget()); + TEST_VECTOR(up, tc->GetUp()); + + tc->SetView(eye, q_lookat); + TEST_VECTOR(eye, tc->GetPosition()); + TEST_VECTOR(target, tc->GetTarget()); + TEST_VECTOR(up, tc->GetUp()); + + tc->SetView(eye, v_lookat); + TEST_VECTOR(eye, tc->GetPosition()); + TEST_VECTOR(target, tc->GetTarget()); + TEST_VECTOR(up, tc->GetUp()); + + tc->SetView(m_lookat); + TEST_VECTOR(eye, tc->GetPosition()); + TEST_VECTOR(target, tc->GetTarget()); + TEST_VECTOR(up, tc->GetUp()); + + tc->UseTarget(false); + TEST_VECTOR(vec3(0.f, 0.f, 49.f), tc->GetTarget()); } #define TEST_MATRIX(m0, m1) \ @@ -101,83 +112,83 @@ lolunit_declare_fixture(camera_test) { mat4 refmx = mat4::perspective(fov, screen_size, screen_size * screen_ratio, near, far); - tc.SetProjection(fov, near, far, screen_size, screen_ratio); - TEST_MATRIX(refmx, tc.GetProjection()); - lolunit_assert_doubles_equal(fov, tc.GetFov(), 1.e-5f); - lolunit_assert_doubles_equal(screen_size, tc.GetScreenSize(), 1.e-5f); - lolunit_assert_doubles_equal(screen_ratio, tc.GetScreenRatio(), 1.e-5f); - lolunit_assert_doubles_equal(near, tc.GetNear(), 1.e-5f); - lolunit_assert_doubles_equal(far, tc.GetFar(), 1.e-5f); - lolunit_assert(is_shifted == tc.IsShifted()); - - tc.SetProjection(fov, near, far); - TEST_MATRIX(refmx, tc.GetProjection()); - lolunit_assert_doubles_equal(fov, tc.GetFov(), 1.e-5f); - lolunit_assert_doubles_equal(screen_size, tc.GetScreenSize(), 1.e-5f); - lolunit_assert_doubles_equal(screen_ratio, tc.GetScreenRatio(), 1.e-5f); - lolunit_assert_doubles_equal(near, tc.GetNear(), 1.e-5f); - lolunit_assert_doubles_equal(far, tc.GetFar(), 1.e-5f); - lolunit_assert(is_shifted == tc.IsShifted()); - - tc.SetProjection(refmx); - TEST_MATRIX(refmx, tc.GetProjection()); - - tc.SetFov(fov); - TEST_MATRIX(refmx, tc.GetProjection()); - lolunit_assert_doubles_equal(fov, tc.GetFov(), 1.e-5f); - lolunit_assert_doubles_equal(screen_size, tc.GetScreenSize(), 1.e-5f); - lolunit_assert_doubles_equal(screen_ratio, tc.GetScreenRatio(), 1.e-5f); - lolunit_assert_doubles_equal(near, tc.GetNear(), 1.e-5f); - lolunit_assert_doubles_equal(far, tc.GetFar(), 1.e-5f); - lolunit_assert(is_shifted == tc.IsShifted()); - - tc.SetScreenInfos(screen_size); - TEST_MATRIX(refmx, tc.GetProjection()); - lolunit_assert_doubles_equal(fov, tc.GetFov(), 1.e-5f); - lolunit_assert_doubles_equal(screen_size, tc.GetScreenSize(), 1.e-5f); - lolunit_assert_doubles_equal(screen_ratio, tc.GetScreenRatio(), 1.e-5f); - lolunit_assert_doubles_equal(near, tc.GetNear(), 1.e-5f); - lolunit_assert_doubles_equal(far, tc.GetFar(), 1.e-5f); - lolunit_assert(is_shifted == tc.IsShifted()); - - tc.SetScreenInfos(screen_size, screen_ratio); - TEST_MATRIX(refmx, tc.GetProjection()); - lolunit_assert_doubles_equal(fov, tc.GetFov(), 1.e-5f); - lolunit_assert_doubles_equal(screen_size, tc.GetScreenSize(), 1.e-5f); - lolunit_assert_doubles_equal(screen_ratio, tc.GetScreenRatio(), 1.e-5f); - lolunit_assert_doubles_equal(near, tc.GetNear(), 1.e-5f); - lolunit_assert_doubles_equal(far, tc.GetFar(), 1.e-5f); - lolunit_assert(is_shifted == tc.IsShifted()); - - tc.SetDrawInfos(far); - TEST_MATRIX(refmx, tc.GetProjection()); - lolunit_assert_doubles_equal(fov, tc.GetFov(), 1.e-5f); - lolunit_assert_doubles_equal(screen_size, tc.GetScreenSize(), 1.e-5f); - lolunit_assert_doubles_equal(screen_ratio, tc.GetScreenRatio(), 1.e-5f); - lolunit_assert_doubles_equal(near, tc.GetNear(), 1.e-5f); - lolunit_assert_doubles_equal(far, tc.GetFar(), 1.e-5f); - lolunit_assert(is_shifted == tc.IsShifted()); - - tc.SetDrawInfos(near, far); - TEST_MATRIX(refmx, tc.GetProjection()); - lolunit_assert_doubles_equal(fov, tc.GetFov(), 1.e-5f); - lolunit_assert_doubles_equal(screen_size, tc.GetScreenSize(), 1.e-5f); - lolunit_assert_doubles_equal(screen_ratio, tc.GetScreenRatio(), 1.e-5f); - lolunit_assert_doubles_equal(near, tc.GetNear(), 1.e-5f); - lolunit_assert_doubles_equal(far, tc.GetFar(), 1.e-5f); - lolunit_assert(is_shifted == tc.IsShifted()); + tc->SetProjection(fov, near, far, screen_size, screen_ratio); + TEST_MATRIX(refmx, tc->GetProjection()); + lolunit_assert_doubles_equal(fov, tc->GetFov(), 1.e-5f); + lolunit_assert_doubles_equal(screen_size, tc->GetScreenSize(), 1.e-5f); + lolunit_assert_doubles_equal(screen_ratio, tc->GetScreenRatio(), 1.e-5f); + lolunit_assert_doubles_equal(near, tc->GetNear(), 1.e-5f); + lolunit_assert_doubles_equal(far, tc->GetFar(), 1.e-5f); + lolunit_assert(is_shifted == tc->IsShifted()); + + tc->SetProjection(fov, near, far); + TEST_MATRIX(refmx, tc->GetProjection()); + lolunit_assert_doubles_equal(fov, tc->GetFov(), 1.e-5f); + lolunit_assert_doubles_equal(screen_size, tc->GetScreenSize(), 1.e-5f); + lolunit_assert_doubles_equal(screen_ratio, tc->GetScreenRatio(), 1.e-5f); + lolunit_assert_doubles_equal(near, tc->GetNear(), 1.e-5f); + lolunit_assert_doubles_equal(far, tc->GetFar(), 1.e-5f); + lolunit_assert(is_shifted == tc->IsShifted()); + + tc->SetProjection(refmx); + TEST_MATRIX(refmx, tc->GetProjection()); + + tc->SetFov(fov); + TEST_MATRIX(refmx, tc->GetProjection()); + lolunit_assert_doubles_equal(fov, tc->GetFov(), 1.e-5f); + lolunit_assert_doubles_equal(screen_size, tc->GetScreenSize(), 1.e-5f); + lolunit_assert_doubles_equal(screen_ratio, tc->GetScreenRatio(), 1.e-5f); + lolunit_assert_doubles_equal(near, tc->GetNear(), 1.e-5f); + lolunit_assert_doubles_equal(far, tc->GetFar(), 1.e-5f); + lolunit_assert(is_shifted == tc->IsShifted()); + + tc->SetScreenInfos(screen_size); + TEST_MATRIX(refmx, tc->GetProjection()); + lolunit_assert_doubles_equal(fov, tc->GetFov(), 1.e-5f); + lolunit_assert_doubles_equal(screen_size, tc->GetScreenSize(), 1.e-5f); + lolunit_assert_doubles_equal(screen_ratio, tc->GetScreenRatio(), 1.e-5f); + lolunit_assert_doubles_equal(near, tc->GetNear(), 1.e-5f); + lolunit_assert_doubles_equal(far, tc->GetFar(), 1.e-5f); + lolunit_assert(is_shifted == tc->IsShifted()); + + tc->SetScreenInfos(screen_size, screen_ratio); + TEST_MATRIX(refmx, tc->GetProjection()); + lolunit_assert_doubles_equal(fov, tc->GetFov(), 1.e-5f); + lolunit_assert_doubles_equal(screen_size, tc->GetScreenSize(), 1.e-5f); + lolunit_assert_doubles_equal(screen_ratio, tc->GetScreenRatio(), 1.e-5f); + lolunit_assert_doubles_equal(near, tc->GetNear(), 1.e-5f); + lolunit_assert_doubles_equal(far, tc->GetFar(), 1.e-5f); + lolunit_assert(is_shifted == tc->IsShifted()); + + tc->SetDrawInfos(far); + TEST_MATRIX(refmx, tc->GetProjection()); + lolunit_assert_doubles_equal(fov, tc->GetFov(), 1.e-5f); + lolunit_assert_doubles_equal(screen_size, tc->GetScreenSize(), 1.e-5f); + lolunit_assert_doubles_equal(screen_ratio, tc->GetScreenRatio(), 1.e-5f); + lolunit_assert_doubles_equal(near, tc->GetNear(), 1.e-5f); + lolunit_assert_doubles_equal(far, tc->GetFar(), 1.e-5f); + lolunit_assert(is_shifted == tc->IsShifted()); + + tc->SetDrawInfos(near, far); + TEST_MATRIX(refmx, tc->GetProjection()); + lolunit_assert_doubles_equal(fov, tc->GetFov(), 1.e-5f); + lolunit_assert_doubles_equal(screen_size, tc->GetScreenSize(), 1.e-5f); + lolunit_assert_doubles_equal(screen_ratio, tc->GetScreenRatio(), 1.e-5f); + lolunit_assert_doubles_equal(near, tc->GetNear(), 1.e-5f); + lolunit_assert_doubles_equal(far, tc->GetFar(), 1.e-5f); + lolunit_assert(is_shifted == tc->IsShifted()); is_shifted = true; refmx = mat4::shifted_perspective(fov, screen_size, screen_ratio, near, far); - tc.UseShift(is_shifted); - TEST_MATRIX(refmx, tc.GetProjection()); - lolunit_assert_doubles_equal(fov, tc.GetFov(), 1.e-5f); - lolunit_assert_doubles_equal(screen_size, tc.GetScreenSize(), 1.e-5f); - lolunit_assert_doubles_equal(screen_ratio, tc.GetScreenRatio(), 1.e-5f); - lolunit_assert_doubles_equal(near, tc.GetNear(), 1.e-5f); - lolunit_assert_doubles_equal(far, tc.GetFar(), 1.e-5f); - lolunit_assert(is_shifted == tc.IsShifted()); + tc->UseShift(is_shifted); + TEST_MATRIX(refmx, tc->GetProjection()); + lolunit_assert_doubles_equal(fov, tc->GetFov(), 1.e-5f); + lolunit_assert_doubles_equal(screen_size, tc->GetScreenSize(), 1.e-5f); + lolunit_assert_doubles_equal(screen_ratio, tc->GetScreenRatio(), 1.e-5f); + lolunit_assert_doubles_equal(near, tc->GetNear(), 1.e-5f); + lolunit_assert_doubles_equal(far, tc->GetFar(), 1.e-5f); + lolunit_assert(is_shifted == tc->IsShifted()); } }; diff --git a/src/t/math/real.cpp b/src/t/math/real.cpp index da927e00..e7235e99 100644 --- a/src/t/math/real.cpp +++ b/src/t/math/real.cpp @@ -1,7 +1,7 @@ // // Lol Engine — Unit tests // -// Copyright © 2010—2015 Sam Hocevar +// Copyright © 2010—2019 Sam Hocevar // // Lol Engine is free software. It comes without any warranty, to // the extent permitted by applicable law. You can redistribute it @@ -316,7 +316,7 @@ lolunit_declare_fixture(real_test) lolunit_assert_lequal((double)fabs(b), 1.0); } - lolunit_declare_test(sqrt_cbrt) + lolunit_declare_test(real_sqrt) { double sqrt0 = sqrt(real(0)); double sqrt1 = sqrt(real(1)); @@ -339,6 +339,45 @@ lolunit_declare_fixture(real_test) lolunit_assert_doubles_equal(sqrt8, sqrt(8.0), 1e-8); } + lolunit_declare_test(real_cbrt) + { + double cbrtm8 = cbrt(real(-8)); + double cbrtm7 = cbrt(real(-7)); + double cbrtm6 = cbrt(real(-6)); + double cbrtm5 = cbrt(real(-5)); + double cbrtm4 = cbrt(real(-4)); + double cbrtm3 = cbrt(real(-3)); + double cbrtm2 = cbrt(real(-2)); + double cbrtm1 = cbrt(real(-1)); + double cbrt0 = cbrt(real(0)); + double cbrt1 = cbrt(real(1)); + double cbrt2 = cbrt(real(2)); + double cbrt3 = cbrt(real(3)); + double cbrt4 = cbrt(real(4)); + double cbrt5 = cbrt(real(5)); + double cbrt6 = cbrt(real(6)); + double cbrt7 = cbrt(real(7)); + double cbrt8 = cbrt(real(8)); + + lolunit_assert_doubles_equal(cbrtm8, cbrt(-8.0), 1e-8); + lolunit_assert_doubles_equal(cbrtm7, cbrt(-7.0), 1e-8); + lolunit_assert_doubles_equal(cbrtm6, cbrt(-6.0), 1e-8); + lolunit_assert_doubles_equal(cbrtm5, cbrt(-5.0), 1e-8); + lolunit_assert_doubles_equal(cbrtm4, cbrt(-4.0), 1e-8); + lolunit_assert_doubles_equal(cbrtm3, cbrt(-3.0), 1e-8); + lolunit_assert_doubles_equal(cbrtm2, cbrt(-2.0), 1e-8); + lolunit_assert_doubles_equal(cbrtm1, cbrt(-1.0), 1e-8); + lolunit_assert_doubles_equal(cbrt0, cbrt(0.0), 1e-8); + lolunit_assert_doubles_equal(cbrt1, cbrt(1.0), 1e-8); + lolunit_assert_doubles_equal(cbrt2, cbrt(2.0), 1e-8); + lolunit_assert_doubles_equal(cbrt3, cbrt(3.0), 1e-8); + lolunit_assert_doubles_equal(cbrt4, cbrt(4.0), 1e-8); + lolunit_assert_doubles_equal(cbrt5, cbrt(5.0), 1e-8); + lolunit_assert_doubles_equal(cbrt6, cbrt(6.0), 1e-8); + lolunit_assert_doubles_equal(cbrt7, cbrt(7.0), 1e-8); + lolunit_assert_doubles_equal(cbrt8, cbrt(8.0), 1e-8); + } + lolunit_declare_test(real_ldexp) { real a1(1.5);