// Pruebas del núcleo. No usan raylib. #include #include #include #include #include "core/Constants.hpp" #include "core/Frame.hpp" #include "core/Project.hpp" namespace { int g_failures = 0; void check(bool condition, const char* expression, int line) { if (!condition) { std::fprintf(stderr, "FALLO (línea %d): %s\n", line, expression); ++g_failures; } } bool near(double a, double b) { return std::fabs(a - b) < 1e-9; } } // namespace #define CHECK(expr) check((expr), #expr, __LINE__) int main() { using namespace tahgibu; // --- Límite de FPS ----------------------------------------------------- CHECK(Frame::clampFps(120.0f) == kMaxFps); CHECK(Frame::clampFps(60.0f) == 60.0f); CHECK(Frame::clampFps(1.0f) == 1.0f); CHECK(Frame::clampFps(0.0f) == kMinFps); CHECK(Frame::clampFps(-5.0f) == kMinFps); CHECK(Frame::clampFps(std::numeric_limits::quiet_NaN()) == kDefaultFps); CHECK(Frame::clampFps(std::numeric_limits::infinity()) == kDefaultFps); // --- Frame --------------------------------------------------------------- Frame frame; CHECK(!frame.hasFpsOverride()); CHECK(near(frame.durationSeconds(24.0f), 1.0 / 24.0)); frame.setFpsOverride(1.0f); CHECK(frame.hasFpsOverride()); CHECK(near(frame.durationSeconds(60.0f), 1.0)); frame.setFpsOverride(1000.0f); // nunca por encima de 60 CHECK(frame.effectiveFps(24.0f) == kMaxFps); frame.clearFpsOverride(); CHECK(!frame.hasFpsOverride()); CHECK(frame.effectiveFps(30.0f) == 30.0f); CHECK(frame.effectiveFps(500.0f) == kMaxFps); // la base también se limita // --- Project ------------------------------------------------------------- Project project; CHECK(project.frameCount() == 1); CHECK(project.baseFps() == kDefaultFps); project.setBaseFps(999.0f); CHECK(project.baseFps() == kMaxFps); project.setBaseFps(std::numeric_limits::quiet_NaN()); CHECK(project.baseFps() == kDefaultFps); // Ejemplo de la especificación: A(60) B(60) C(1) D(60) Project example; example.setBaseFps(60.0f); example.addFrame(); // B const std::size_t c = example.addFrame(); // C example.addFrame(); // D example.frame(c).setFpsOverride(1.0f); CHECK(example.frameCount() == 4); CHECK(near(example.frameDurationSeconds(0), 1.0 / 60.0)); CHECK(near(example.frameDurationSeconds(c), 1.0)); CHECK(near(example.totalDurationSeconds(), 3.0 / 60.0 + 1.0)); // Cambiar el FPS base afecta a los frames sin FPS propio, pero no al de C. example.setBaseFps(30.0f); CHECK(near(example.frameDurationSeconds(0), 1.0 / 30.0)); CHECK(near(example.frameDurationSeconds(c), 1.0)); bool threw = false; try { example.frame(99); } catch (const std::out_of_range&) { threw = true; } CHECK(threw); if (g_failures == 0) { std::puts("OK: todas las pruebas del núcleo pasaron."); return 0; } std::fprintf(stderr, "%d prueba(s) fallaron.\n", g_failures); return 1; }