Skip to content

Commit

Permalink
test: added: Direction path reservation using NX and change direction…
Browse files Browse the repository at this point in the history
… state
  • Loading branch information
reinder authored and gfgit committed Jun 11, 2024
1 parent f5b29b5 commit cd42b12
Showing 1 changed file with 98 additions and 0 deletions.
98 changes: 98 additions & 0 deletions server/test/board/path.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#include "../../src/board/nx/nxmanager.hpp"
#include "../../src/board/tile/rail/blockrailtile.hpp"
#include "../../src/board/tile/rail/bridge90railtile.hpp"
#include "../../src/board/tile/rail/directioncontrolrailtile.hpp"
#include "../../src/board/tile/rail/nxbuttonrailtile.hpp"
#include "../../src/board/tile/rail/turnout/turnoutleft45railtile.hpp"
#include "../../src/board/tile/rail/turnout/turnoutright45railtile.hpp"
Expand Down Expand Up @@ -157,3 +158,100 @@ TEST_CASE("Board: Bridge path resevation using NX", "[board][board-path]")
REQUIRE(train1.expired());
REQUIRE(train2.expired());
}

TEST_CASE("Board: Direction path reservation using NX and change direction state", "[board][board-path]")
{
auto world = World::create();
std::weak_ptr<World> worldWeak = world;

// Board:
// +--------+ +--------+
// | block1 |--(nx1)--(-)--(nx2)--| block2 |
// +--------+ +--------+
std::weak_ptr<Board> boardWeak = world->boards->create();

REQUIRE(boardWeak.lock()->addTile(0, 0, TileRotate::Deg90, BlockRailTile::classId, false));
REQUIRE(boardWeak.lock()->addTile(1, 0, TileRotate::Deg90, NXButtonRailTile::classId, false));
REQUIRE(boardWeak.lock()->addTile(2, 0, TileRotate::Deg90, DirectionControlRailTile::classId, false));
REQUIRE(boardWeak.lock()->addTile(3, 0, TileRotate::Deg90, NXButtonRailTile::classId, false));
REQUIRE(boardWeak.lock()->addTile(4, 0, TileRotate::Deg90, BlockRailTile::classId, false));

std::weak_ptr<BlockRailTile> block1 = std::dynamic_pointer_cast<BlockRailTile>(boardWeak.lock()->getTile({0, 0}));
REQUIRE_FALSE(block1.expired());
std::weak_ptr<BlockRailTile> block2 = std::dynamic_pointer_cast<BlockRailTile>(boardWeak.lock()->getTile({4, 0}));
REQUIRE_FALSE(block2.expired());

std::weak_ptr<NXButtonRailTile> nx1 = std::dynamic_pointer_cast<NXButtonRailTile>(boardWeak.lock()->getTile({1, 0}));
REQUIRE_FALSE(nx1.expired());
std::weak_ptr<NXButtonRailTile> nx2 = std::dynamic_pointer_cast<NXButtonRailTile>(boardWeak.lock()->getTile({3, 0}));
REQUIRE_FALSE(nx2.expired());

std::weak_ptr<DirectionControlRailTile> directionControl = std::dynamic_pointer_cast<DirectionControlRailTile>(boardWeak.lock()->getTile({2, 0}));
REQUIRE_FALSE(directionControl.expired());
REQUIRE(directionControl.lock()->state.value() == DirectionControlState::Both);

// Change direction control states (no reservation, so all valuese are allowed):
REQUIRE(directionControl.lock()->setState(DirectionControlState::AtoB));
REQUIRE(directionControl.lock()->state.value() == DirectionControlState::AtoB);
REQUIRE(directionControl.lock()->setState(DirectionControlState::BtoA));
REQUIRE(directionControl.lock()->state.value() == DirectionControlState::BtoA);
REQUIRE(directionControl.lock()->setState(DirectionControlState::None));
REQUIRE(directionControl.lock()->state.value() == DirectionControlState::None);
REQUIRE(directionControl.lock()->setState(DirectionControlState::Both));
REQUIRE(directionControl.lock()->state.value() == DirectionControlState::Both);

// Set block free:
REQUIRE(block2.lock()->state == BlockState::Unknown);
REQUIRE(block2.lock()->setStateFree());
REQUIRE(block2.lock()->state == BlockState::Free);

// Create train:
std::weak_ptr<RailVehicle> locomotive = world->railVehicles->create(Locomotive::classId);
std::weak_ptr<Train> train = world->trains->create();
REQUIRE(train.lock()->vehicles->length == 0);
train.lock()->vehicles->add(locomotive.lock());
REQUIRE(train.lock()->vehicles->length == 1);

// Assign train to block 1:
block1.lock()->assignTrain(train.lock());
REQUIRE(block1.lock()->state == BlockState::Reserved);
block1.lock()->flipTrain();

// Set world in RUN state (required for selecting paths using NX buttons):
world->run();

// Set path for train from block 1 to block 2:
world->nxManager->select(nx1.lock(), nx2.lock());
REQUIRE(block2.lock()->state == BlockState::Reserved);
REQUIRE(block2.lock()->trains.size() == 1);
REQUIRE(block2.lock()->trains[0]->train.value() == train.lock());

// Change direction control state:

// A -> B = allowed as that is the train direction.
REQUIRE(directionControl.lock()->setState(DirectionControlState::AtoB));
REQUIRE(directionControl.lock()->state.value() == DirectionControlState::AtoB);

// B -> A = not allowed as that is opposite of the the train direction.
REQUIRE_FALSE(directionControl.lock()->setState(DirectionControlState::BtoA));
REQUIRE(directionControl.lock()->state.value() == DirectionControlState::AtoB);

// None = not allowed when reserved.
REQUIRE_FALSE(directionControl.lock()->setState(DirectionControlState::None));
REQUIRE(directionControl.lock()->state.value() == DirectionControlState::AtoB);

// Both = always allowed.
REQUIRE(directionControl.lock()->setState(DirectionControlState::Both));
REQUIRE(directionControl.lock()->state.value() == DirectionControlState::Both);

world.reset();
REQUIRE(worldWeak.expired());
REQUIRE(boardWeak.expired());
REQUIRE(block1.expired());
REQUIRE(block2.expired());
REQUIRE(nx1.expired());
REQUIRE(nx2.expired());
REQUIRE(directionControl.expired());
REQUIRE(locomotive.expired());
REQUIRE(train.expired());
}

0 comments on commit cd42b12

Please sign in to comment.