mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-10-17 05:09:20 +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>
46 lines
1.6 KiB
C++
46 lines
1.6 KiB
C++
#include "stdafx.h"
|
|
#include "doctest.h"
|
|
#include "vehicle.h"
|
|
|
|
using test::definition;
|
|
using test::vehicle;
|
|
|
|
TEST_CASE("definition: the wagon from data/wagon.json loads with its values") {
|
|
vehicle wagon{definition::load("wagon")};
|
|
|
|
CHECK(wagon->Mass == doctest::Approx(42200.0));
|
|
CHECK(wagon->Vmax == doctest::Approx(120.0));
|
|
CHECK(wagon->Dim.L == doctest::Approx(26.8));
|
|
CHECK(wagon->WheelDiameter == doctest::Approx(0.96));
|
|
CHECK(wagon->NAxles == 4);
|
|
CHECK(wagon->MaxBrakePress[3] == doctest::Approx(3.8));
|
|
CHECK(wagon->BrakeSystem == TBrakeSystem::Pneumatic);
|
|
}
|
|
|
|
TEST_CASE("definition: keys set by the test reach the vehicle") {
|
|
vehicle heavy{definition::load("wagon").set("Param", "M", 60000).set("Wheels", "D", 1.0)};
|
|
|
|
CHECK(heavy->Mass == doctest::Approx(60000.0));
|
|
CHECK(heavy->WheelDiameter == doctest::Approx(1.0));
|
|
}
|
|
|
|
TEST_CASE("definition: an unknown test vehicle is an error, not a silently empty one") {
|
|
CHECK_THROWS(definition::load("no such vehicle"));
|
|
}
|
|
|
|
TEST_CASE("definition: a misspelt section is an error, not silently skipped by the loader") {
|
|
CHECK_THROWS(definition::load("wagon").set("Brakes", "MBF", 30));
|
|
}
|
|
|
|
TEST_CASE("definition: rows of a table section reach the vehicle") {
|
|
auto const pc1{light::headlight_left | light::headlight_upper | light::headlight_right};
|
|
vehicle wagon{definition::load("wagon")
|
|
.set("LightsList", "Size", 2)
|
|
.set("LightsList", "Default", 1)
|
|
.set("LightsList", "rows", {{0, 0}, {pc1, 0}})};
|
|
|
|
CHECK(wagon->LightsPosNo == 2);
|
|
CHECK(wagon->LightsPos == 1);
|
|
CHECK(wagon->Lights[end::front][1] == pc1);
|
|
}
|