#include "tests/ClockTests.hpp"

#include "test/Test.hpp"
#include "utils/Clock.hpp"

static void testUpdate() {
    Core::Clock c;
    Core::Clock::Nanos n1 = 0;
    Core::Clock::Nanos n2 = 0;
    Core::Clock::Nanos n3 = 0;
    Core::Clock::Nanos n4 = 0;
    CORE_TEST_ERROR(c.update(n1));
    CORE_TEST_ERROR(c.update(n2));
    CORE_TEST_ERROR(c.update(n3));
    CORE_TEST_ERROR(c.update(n4));
    CORE_TEST_TRUE(n1 == 0);
    CORE_TEST_TRUE(n2 > 0);
    CORE_TEST_TRUE(n3 > 0);
    CORE_TEST_TRUE(n4 > 0);
}

static void testUpdatesPerSecond() {
    Core::Clock c;
    for(int i = 0; i < 1000; i++) {
        Core::Clock::Nanos n = 0;
        CORE_TEST_ERROR(c.update(n));
    }
    CORE_TEST_TRUE(c.getUpdatesPerSecond() > 0.0f);
}

static void testWait(Core::Clock::Nanos wait) {
    Core::Clock c;
    Core::Clock::Nanos n = 0;
    CORE_TEST_ERROR(c.update(n));
    CORE_TEST_ERROR(c.wait(wait));
    Core::Clock::Nanos n2 = 0;
    CORE_TEST_ERROR(c.update(n2));
    CORE_TEST_TRUE(n2 >= wait && n2 <= wait * 11 / 10);
}

void Core::ClockTests::test() {
    testUpdate();
    testUpdatesPerSecond();
    testWait(50'000'000);
    testWait(1'300'000'000);
}