17
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-10-17 07:29:20 +02:00
Files
maszyna/tests/unit/engine_stubs.cpp
jerrrrycho 3365d42c3a test: unit tests of the simulation core, run as part of the build
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>
2026-10-14 20:31:25 +02:00

72 lines
1.9 KiB
C++

// stand-ins for the parts of the engine which the core library (eu07_core) links against, but which the
// unit tests don't exercise. when a change makes the library use something new from the engine and the
// test build fails to link, either move the real source into the library (CORE_SOURCES in the main
// CMakeLists.txt, if it stands on its own) or add a stub here.
#include "stdafx.h"
#include "utilities/Globals.h"
#include "utilities/Logs.h"
#include "scene/scenenodegroups.h"
#include "scene/scenelayers.h"
#include <cstdlib>
#include <iostream>
// settings ---------------------------------------------------------------------------------------
global_settings &GetGlobalSettings() {
// defaults, as before reading eu07.ini
static global_settings settings;
return settings;
}
// logs: quiet, unless EU07_UNIT_TESTS_LOG is set --------------------------------------------------
namespace {
bool log_enabled() {
static bool const enabled{std::getenv("EU07_UNIT_TESTS_LOG") != nullptr};
return enabled;
}
} // namespace
void WriteLog(const char *str, logtype const, bool const isError) {
if (log_enabled() && str != nullptr) {
(isError ? std::cerr : std::cout) << str << "\n";
}
}
void WriteLog(const std::string &str, logtype const Type) {
WriteLog(str.c_str(), Type, false);
}
void ErrorLog(const std::string &str, logtype const Type) {
WriteLog(str.c_str(), Type, true);
}
// scenery structure, which the parser reports include directives to --------------------------------
namespace scene {
node_groups Groups;
node_layers Layers;
group_handle node_groups::create(bool const) {
return null_handle;
}
group_handle node_groups::close() {
return null_handle;
}
layer_handle node_layers::open(std::string const &, include_site) {
return null_handle;
}
layer_handle node_layers::close() {
return null_handle;
}
void node_layers::instance_begin(std::string const &, source_span const &) {}
} // namespace scene