mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-10-17 09:49:19 +02:00
eu07_unit_tests: C++ tests (doctest) of the simulation, which set up the
conditions, run the code and check the outcome. No game data, no window.
- the code under test is the core library (eu07_core), the very objects
the game links, built with the game's settings; engine_stubs.cpp stands
in for the logs, settings and scenery layers the library reaches for.
python gets linked with the settings but isn't needed to run the tests
- test vehicles are JSON definitions in tests/unit/data, with the sections
and keys of the game's vehicle definitions (tables as "rows", _keys are
comments), changed by the tests where needed and loaded from memory by
the game's own loader; an unknown section is an error rather than
silently skipped
- test::vehicle creates the mover the way TDynamicObject::Init() does and
steps it the way the simulation loop does, on a straight track of given
friction and gradient, optionally holding the brake pipe pressure the
way a coupled locomotive would
- the random numbers of the simulation are reseeded before every test
case, so a test gives the same result alone (IDE) or among the others
- building the game runs the tests at the end, once the game is linked,
and prints a one line summary ("Unit tests: 11/11 passed (80 checks)").
A failure prints the full report and fails the build, in CI and locally
alike, and removes the game binary so the next build reruns them. A
change of the tests alone relinks the game so they run (Ninja and
Makefile generators). -DWITH_TESTS=OFF leaves them out
- first tests: definitions reach the vehicle, KE service application and
release, deeper reduction brakes harder, every implemented distributor
valve charges/applies/releases, service braking stops a moving wagon
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
40 lines
1.5 KiB
C++
40 lines
1.5 KiB
C++
#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
|
|
#include "stdafx.h"
|
|
#include "doctest.h"
|
|
|
|
#include "utilities/Globals.h"
|
|
|
|
namespace {
|
|
|
|
// the simulation draws random numbers (brake delays, pressures, wheel damage) from engines shared by
|
|
// everything. reseeding them before every run of a test case, subcases included, gives each test the
|
|
// same numbers whether it runs alone from the IDE or among all the others
|
|
class deterministic_random : public doctest::IReporter {
|
|
public:
|
|
explicit deterministic_random(doctest::ContextOptions const &) {}
|
|
|
|
void test_case_start(doctest::TestCaseData const &) override { reseed(); }
|
|
void test_case_reenter(doctest::TestCaseData const &) override { reseed(); }
|
|
|
|
void report_query(doctest::QueryData const &) override {}
|
|
void test_run_start() override {}
|
|
void test_run_end(doctest::TestRunStats const &) override {}
|
|
void test_case_end(doctest::CurrentTestCaseStats const &) override {}
|
|
void test_case_exception(doctest::TestCaseException const &) override {}
|
|
void subcase_start(doctest::SubcaseSignature const &) override {}
|
|
void subcase_end() override {}
|
|
void log_assert(doctest::AssertData const &) override {}
|
|
void log_message(doctest::MessageData const &) override {}
|
|
void test_case_skipped(doctest::TestCaseData const &) override {}
|
|
|
|
private:
|
|
static void reseed() {
|
|
Global.random_engine.seed(1);
|
|
Global.local_random_engine.seed(1);
|
|
}
|
|
};
|
|
|
|
} // namespace
|
|
|
|
DOCTEST_REGISTER_LISTENER("deterministic_random", 1, deterministic_random);
|