Adding board unit tests.
This commit is contained in:
parent
f916953056
commit
3a02ae2316
3 changed files with 91 additions and 26 deletions
|
@ -60,7 +60,7 @@ static Cell cellAtPosition(GridPosition point) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isWalkableForPacMan(GridPosition point) {
|
bool isWalkableForPacMan(GridPosition point) {
|
||||||
return cellAtPosition(point) != Cell::wall;
|
return cellAtPosition(point) != Cell::wall && cellAtPosition(point) != Cell::pen;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isWalkableForGhost(GridPosition point, GridPosition origin, bool isEyes) {
|
bool isWalkableForGhost(GridPosition point, GridPosition origin, bool isEyes) {
|
||||||
|
@ -79,6 +79,26 @@ bool isPortal(GridPosition point, Direction direction) {
|
||||||
(cellAtPosition(point) == Cell::right_portal && direction == Direction::RIGHT);
|
(cellAtPosition(point) == Cell::right_portal && direction == Direction::RIGHT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool isIntersection(GridPosition point) {
|
||||||
|
if (!isWalkableForPacMan(point) || cellAtPosition(point) == Cell::left_portal || cellAtPosition(point) == Cell::right_portal) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const GridPosition right{ point.x + 1, point.y };
|
||||||
|
const bool rightWalkable = isWalkableForPacMan(right);
|
||||||
|
|
||||||
|
const GridPosition left{ point.x - 1, point.y };
|
||||||
|
const bool leftWalkable = isWalkableForPacMan(left);
|
||||||
|
|
||||||
|
const GridPosition top{ point.x, point.y - 1 };
|
||||||
|
const bool topWalkable = isWalkableForPacMan(top);
|
||||||
|
|
||||||
|
const GridPosition bottom{ point.x, point.y + 1 };
|
||||||
|
const bool bottomWalkable = isWalkableForPacMan(bottom);
|
||||||
|
|
||||||
|
return (topWalkable && rightWalkable) || (rightWalkable && bottomWalkable) || (bottomWalkable && leftWalkable) || (leftWalkable && topWalkable);
|
||||||
|
}
|
||||||
|
|
||||||
GridPosition teleport(GridPosition point) {
|
GridPosition teleport(GridPosition point) {
|
||||||
size_t right = COLUMNS - 1;
|
size_t right = COLUMNS - 1;
|
||||||
size_t left = 0;
|
size_t left = 0;
|
||||||
|
@ -124,26 +144,4 @@ std::vector<GridPosition> initialSuperPelletPositions() {
|
||||||
return positions;
|
return positions;
|
||||||
}
|
}
|
||||||
|
|
||||||
// AI
|
|
||||||
|
|
||||||
bool isIntersection(GridPosition point) {
|
|
||||||
if (!isWalkableForPacMan(point) || cellAtPosition(point) == Cell::left_portal || cellAtPosition(point) == Cell::right_portal) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const GridPosition right{ point.x + 1, point.y };
|
|
||||||
const bool rightWalkable = isWalkableForPacMan(right);
|
|
||||||
|
|
||||||
const GridPosition left{ point.x - 1, point.y };
|
|
||||||
const bool leftWalkable = isWalkableForPacMan(left);
|
|
||||||
|
|
||||||
const GridPosition top{ point.x, point.y - 1 };
|
|
||||||
const bool topWalkable = isWalkableForPacMan(top);
|
|
||||||
|
|
||||||
const GridPosition bottom{ point.x, point.y + 1 };
|
|
||||||
const bool bottomWalkable = isWalkableForPacMan(bottom);
|
|
||||||
|
|
||||||
return (topWalkable && rightWalkable) || (rightWalkable && bottomWalkable) || (bottomWalkable && leftWalkable) || (leftWalkable && topWalkable);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace pacman
|
} // namespace pacman
|
||||||
|
|
|
@ -12,10 +12,11 @@ bool isWalkableForPacMan(GridPosition point);
|
||||||
bool isWalkableForGhost(GridPosition point, GridPosition origin, bool isEyes);
|
bool isWalkableForGhost(GridPosition point, GridPosition origin, bool isEyes);
|
||||||
bool isInPen(GridPosition point);
|
bool isInPen(GridPosition point);
|
||||||
bool isPortal(GridPosition point, Direction direction);
|
bool isPortal(GridPosition point, Direction direction);
|
||||||
|
bool isIntersection(GridPosition point);
|
||||||
|
|
||||||
GridPosition teleport(GridPosition point);
|
GridPosition teleport(GridPosition point);
|
||||||
|
|
||||||
std::vector<GridPosition> initialPelletPositions();
|
std::vector<GridPosition> initialPelletPositions();
|
||||||
|
|
||||||
std::vector<GridPosition> initialSuperPelletPositions();
|
std::vector<GridPosition> initialSuperPelletPositions();
|
||||||
|
|
||||||
inline Position penDoorPosition() {
|
inline Position penDoorPosition() {
|
||||||
|
@ -25,6 +26,4 @@ inline Position initialPacManPosition() {
|
||||||
return { 13.5, 23 };
|
return { 13.5, 23 };
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isIntersection(GridPosition point);
|
|
||||||
|
|
||||||
} // namespace pacman
|
} // namespace pacman
|
||||||
|
|
68
test/testBoard.cpp
Normal file
68
test/testBoard.cpp
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
#include "Board.hpp"
|
||||||
|
#include <catch2/catch.hpp>
|
||||||
|
|
||||||
|
// These tests assume a static game board.
|
||||||
|
|
||||||
|
TEST_CASE("Is walkable for Pac-Man", "[board]") {
|
||||||
|
REQUIRE_FALSE(pacman::isWalkableForPacMan(pacman::GridPosition{ 0, 0 })); // wall
|
||||||
|
REQUIRE_FALSE(pacman::isWalkableForPacMan(pacman::GridPosition{ 27, 0 })); // wall
|
||||||
|
REQUIRE_FALSE(pacman::isWalkableForPacMan(pacman::GridPosition{ 0, 30 })); // wall
|
||||||
|
REQUIRE_FALSE(pacman::isWalkableForPacMan(pacman::GridPosition{ 27, 30 })); // wall
|
||||||
|
REQUIRE_FALSE(pacman::isWalkableForPacMan(pacman::GridPosition{ 11, 13 })); // pen
|
||||||
|
|
||||||
|
REQUIRE(pacman::isWalkableForPacMan(pacman::GridPosition{ 1, 1 })); // pellet
|
||||||
|
REQUIRE(pacman::isWalkableForPacMan(pacman::GridPosition{ 1, 3 })); // power pellet
|
||||||
|
REQUIRE(pacman::isWalkableForPacMan(pacman::GridPosition{ 1, 14 })); // nothing
|
||||||
|
REQUIRE(pacman::isWalkableForPacMan(pacman::GridPosition{ 0, 14 })); // portal left
|
||||||
|
REQUIRE(pacman::isWalkableForPacMan(pacman::GridPosition{ 27, 14 })); // portal right
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("Is walkable for Ghost", "[board]") {
|
||||||
|
const pacman::GridPosition pen = pacman::GridPosition{ 11, 13 };
|
||||||
|
const pacman::GridPosition outside = pacman::GridPosition{ 1, 1 };
|
||||||
|
|
||||||
|
// wall check
|
||||||
|
REQUIRE_FALSE(pacman::isWalkableForGhost(pacman::GridPosition{ 0, 0 }, outside, false)); // wall
|
||||||
|
REQUIRE_FALSE(pacman::isWalkableForGhost(pacman::GridPosition{ 27, 0 }, outside, false)); // wall
|
||||||
|
REQUIRE_FALSE(pacman::isWalkableForGhost(pacman::GridPosition{ 0, 30 }, outside, false)); // wall
|
||||||
|
REQUIRE_FALSE(pacman::isWalkableForGhost(pacman::GridPosition{ 27, 30 }, outside, false)); // wall
|
||||||
|
|
||||||
|
// eyes can walk anywhere except walls
|
||||||
|
REQUIRE(pacman::isWalkableForGhost(pacman::GridPosition{ 11, 13 }, outside, true)); // pen
|
||||||
|
REQUIRE(pacman::isWalkableForGhost(pacman::GridPosition{ 1, 1 }, outside, true)); // pellet
|
||||||
|
REQUIRE(pacman::isWalkableForGhost(pacman::GridPosition{ 1, 3 }, outside, true)); // power pellet
|
||||||
|
REQUIRE(pacman::isWalkableForGhost(pacman::GridPosition{ 1, 14 }, outside, true)); // nothing
|
||||||
|
REQUIRE(pacman::isWalkableForGhost(pacman::GridPosition{ 0, 14 }, outside, true)); // portal left
|
||||||
|
REQUIRE(pacman::isWalkableForGhost(pacman::GridPosition{ 27, 14 }, outside, true)); // portal right
|
||||||
|
|
||||||
|
// can only walk in pen if that is your origin or current location
|
||||||
|
REQUIRE_FALSE(pacman::isWalkableForGhost(pacman::GridPosition{ 11, 13 }, outside, false)); // in pen, origin outside
|
||||||
|
REQUIRE(pacman::isWalkableForGhost(pacman::GridPosition{ 1, 1 }, outside, false)); // outside, origin outside
|
||||||
|
REQUIRE(pacman::isWalkableForGhost(pacman::GridPosition{ 1, 1 }, pen, false)); // outside, origin pen
|
||||||
|
REQUIRE(pacman::isWalkableForGhost(pacman::GridPosition{ 11, 13 }, pen, false)); // in pen, origin pen
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("Is portal", "[board]") {
|
||||||
|
const pacman::GridPosition portalRight = pacman::GridPosition{ 27, 14 };
|
||||||
|
const pacman::GridPosition portalLeft = pacman::GridPosition{ 0, 14 };
|
||||||
|
|
||||||
|
REQUIRE(pacman::isPortal(portalRight, pacman::Direction::RIGHT)); // right into right portal
|
||||||
|
REQUIRE(pacman::isPortal(portalLeft, pacman::Direction::LEFT)); // left into left portal
|
||||||
|
REQUIRE_FALSE(pacman::isPortal(portalRight, pacman::Direction::LEFT)); // left into right portal
|
||||||
|
REQUIRE_FALSE(pacman::isPortal(portalLeft, pacman::Direction::RIGHT)); // right into left portal
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("Teleport", "[board]") {
|
||||||
|
const pacman::GridPosition portalRight = pacman::GridPosition{ 27, 14 };
|
||||||
|
const pacman::GridPosition portalLeft = pacman::GridPosition{ 0, 14 };
|
||||||
|
|
||||||
|
if (pacman::isPortal(portalRight, pacman::Direction::RIGHT)) {
|
||||||
|
const pacman::GridPosition result = pacman::teleport(portalRight);
|
||||||
|
REQUIRE(result.x == portalLeft.x);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pacman::isPortal(portalLeft, pacman::Direction::LEFT)) {
|
||||||
|
const pacman::GridPosition result = pacman::teleport(portalLeft);
|
||||||
|
REQUIRE(result.x == portalRight.x);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue