18
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-11-14 23:09:09 +01:00
Files
maszyna/tests/unit/test_lights_preset_cablight.cpp
jerrrrycho d3dd883700 feat: light programmer positions can switch the cab light (eu07/maszyna#529)
An optional third column in the LightsList rows of the .fiz sets the cab
interior light when the driver moves the light preset selector to that
position: 0 off, 1 on, 3 on dimmed (bit 2 the dimmer). Rows without the
column, or with a negative value, leave the cab light to its own switch,
so the existing tables work as before; a stray note after the two light
columns (e.g. "38 38 / A") is not read as the flag.

The light follows the occupied cab, or all cabs of a JointCabs vehicle,
as with the interior light commands; the dimmer switch is moved along.
The lightsset custom position and the AI leave the cab light alone.

Covered by tests/unit/test_lights_preset_cablight.cpp.

(eu07/maszyna#529)
2026-11-07 23:13:00 +01:00

97 lines
3.7 KiB
C++

#include "stdafx.h"
#include "doctest.h"
#include "vehicle.h"
// the cab interior light set by the positions of the light preset selector: an optional third column of LightsList,
// 1 the cab light on, 2 dimmed, 0 off; a row without it leaves the cab light to its own switch (eu07/maszyna#529)
using test::definition;
using test::vehicle;
namespace {
auto const shunting{light::headlight_left | light::headlight_right};
} // namespace
TEST_CASE("lights preset cab light: a table without the column sets no position's cab light") {
vehicle wagon{definition::load("wagon")
.set("LightsList", "Size", 2)
.set("LightsList", "Default", 1)
.set("LightsList", "rows", {{0, 0}, {shunting, shunting}})};
REQUIRE(wagon->LightsPosNo == 2);
CHECK(wagon->Lights[end::front][1] == shunting);
CHECK_FALSE(wagon->LightsPresetCabLight(1).has_value());
CHECK_FALSE(wagon->LightsPresetCabLight(2).has_value());
}
TEST_CASE("lights preset cab light: the third column turns the cab light off, on, or on dimmed") {
// off - shunting - shunting with the cab lit - shunting with the cab lit dimmed - shunting leaving the cab light
vehicle wagon{definition::load("wagon")
.set("LightsList", "Size", 5)
.set("LightsList", "Default", 1)
.set("LightsList", "rows", {{0, 0, 0}, {shunting, shunting}, {shunting, shunting, 1}, {shunting, shunting, 3}, {shunting, 0, -1}})};
REQUIRE(wagon->LightsPosNo == 5);
// the light columns read as before
CHECK(wagon->Lights[end::front][2] == shunting);
CHECK(wagon->Lights[end::rear][2] == shunting);
CHECK(wagon->Lights[end::rear][4] == 0);
auto const off{wagon->LightsPresetCabLight(1)};
REQUIRE(off.has_value());
CHECK_FALSE(off->light);
CHECK_FALSE(off->dim);
CHECK_FALSE(wagon->LightsPresetCabLight(2).has_value());
auto const lit{wagon->LightsPresetCabLight(3)};
REQUIRE(lit.has_value());
CHECK(lit->light);
CHECK_FALSE(lit->dim);
auto const dimmed{wagon->LightsPresetCabLight(4)};
REQUIRE(dimmed.has_value());
CHECK(dimmed->light);
CHECK(dimmed->dim);
// a negative value is the same as no value
CHECK_FALSE(wagon->LightsPresetCabLight(5).has_value());
}
TEST_CASE("lights preset cab light: positions outside the table, and the lightsset custom one, set nothing") {
vehicle wagon{definition::load("wagon")
.set("LightsList", "Size", 1)
.set("LightsList", "Default", 1)
.set("LightsList", "rows", {{shunting, shunting, 1}})};
CHECK(wagon->LightsPresetCabLight(1).has_value());
CHECK_FALSE(wagon->LightsPresetCabLight(0).has_value());
CHECK_FALSE(wagon->LightsPresetCabLight(2).has_value());
CHECK_FALSE(wagon->LightsPresetCabLight(18).has_value());
CHECK_FALSE(wagon->LightsPresetCabLight(19).has_value());
}
TEST_CASE("lights preset cab light: a stray note after the two columns is not read as the cab light") {
// some vehicles of the game carry rows like "38 38 / A"
auto text{definition::load("wagon")
.set("LightsList", "Size", 2)
.set("LightsList", "Default", 1)
.set("LightsList", "rows", {{0, 0}, {38, 38}})
.text()};
auto const list{text.find("LightsList")};
REQUIRE(list != std::string::npos);
auto const row{text.find("38", list)};
REQUIRE(row != std::string::npos);
auto const rowend{text.find('\n', row)};
REQUIRE(rowend != std::string::npos);
text.insert(rowend, " / A");
TMoverParameters wagon(0.0, "wagon", "test", 0);
REQUIRE(wagon.LoadFIZ_Text(text));
REQUIRE(wagon.LightsPosNo == 2);
CHECK(wagon.Lights[end::front][1] == 38);
CHECK(wagon.Lights[end::rear][1] == 38);
CHECK_FALSE(wagon.LightsPresetCabLight(2).has_value());
}