Virgule fixe Q16.16, générateur PCG32 à graine explicite, horloge à pas fixe exacte, simulation d'un micro-mode de démonstration (marqué SIMULÉ), empreinte FNV-1a de l'état, enregistrement binaire versionné des entrées, rejeu avec d'autres réglages de ressenti et détection du premier tick divergent. Empreinte de référence multiplateforme figée. 22 tests (Debug, Release, ASan).
41 lines
1.2 KiB
C++
41 lines
1.2 KiB
C++
// SPDX-License-Identifier: MPL-2.0
|
|
#include "sequa/core/sim/clock.hpp"
|
|
|
|
#include <doctest/doctest.h>
|
|
|
|
#include <cstdint>
|
|
|
|
using sequa::core::sim::FixedStepClock;
|
|
|
|
TEST_CASE("FixedStepClock : 60 Hz exacts sur une seconde decoupee irregulierement")
|
|
{
|
|
FixedStepClock clock(60, 1000);
|
|
std::uint64_t steps = 0;
|
|
// 1 s = 7 tranches de 142 857 142 ns + reste : aucun pas perdu ni gagne.
|
|
for (int i = 0; i < 7; ++i) {
|
|
steps += clock.advance(142'857'142);
|
|
}
|
|
steps += clock.advance(1'000'000'000ull - 7ull * 142'857'142ull);
|
|
CHECK(steps == 60);
|
|
}
|
|
|
|
TEST_CASE("FixedStepClock : 144 Hz d'affichage, 60 Hz de simulation")
|
|
{
|
|
FixedStepClock clock(60, 1000);
|
|
std::uint64_t steps = 0;
|
|
const std::uint64_t frame_ns = 1'000'000'000ull / 144; // arrondi : 6 944 444 ns
|
|
for (int frame = 0; frame < 144 * 10; ++frame) {
|
|
steps += clock.advance(frame_ns);
|
|
}
|
|
// 1440 images * 6 944 444 ns = 9,99999936 s -> 599 pas complets.
|
|
CHECK(steps == 599);
|
|
}
|
|
|
|
TEST_CASE("FixedStepClock : un gros retard est plafonne et compte")
|
|
{
|
|
FixedStepClock clock(60, 8);
|
|
CHECK(clock.advance(1'000'000'000ull) == 8);
|
|
CHECK(clock.dropped_steps() == 52);
|
|
CHECK(clock.advance(0) == 0);
|
|
}
|