Refactor Map.getTiles and Map.getUnvisitedTiles

master
Peter Babič 8 years ago
parent 3e81e4d424
commit 84c8dd2ef7
Signed by: peter.babic
GPG Key ID: 4BB075BC1884BA40
  1. 88
      .idea/workspace.xml
  2. 163
      src/Coffee/Map.php
  3. 4
      src/Coffee/Tile.php
  4. 129
      tests/Coffee/MapTest.php

@ -1,12 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="65f95bb6-3a86-4ed6-841e-441936291ad4" name="Default" comment="Implement Tile.representsVoid">
<list default="true" id="65f95bb6-3a86-4ed6-841e-441936291ad4" name="Default" comment="Refactor Map.getTiles and Map.getUn">
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/Coffee/Map.php" afterPath="$PROJECT_DIR$/src/Coffee/Map.php" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/Coffee/Tile.php" afterPath="$PROJECT_DIR$/src/Coffee/Tile.php" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/tests/Coffee/MapTest.php" afterPath="$PROJECT_DIR$/tests/Coffee/MapTest.php" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/tests/Coffee/TileTest.php" afterPath="$PROJECT_DIR$/tests/Coffee/TileTest.php" />
</list>
<ignored path="coffeetable.iws" />
<ignored path=".idea/workspace.xml" />
@ -35,8 +34,8 @@
<file leaf-file-name="index.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/index.php">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="7" column="0" selection-start-line="7" selection-start-column="2" selection-end-line="22" selection-end-column="5" />
<state vertical-scroll-proportion="-8.666667">
<caret line="13" column="2" selection-start-line="13" selection-start-column="2" selection-end-line="13" selection-end-column="2" />
<folding />
</state>
</provider>
@ -85,18 +84,18 @@
<file leaf-file-name="Map.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/Coffee/Map.php">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="-19.703703">
<caret line="133" column="0" selection-start-line="133" selection-start-column="0" selection-end-line="133" selection-end-column="0" />
<state vertical-scroll-proportion="-27.037037">
<caret line="97" column="5" selection-start-line="97" selection-start-column="5" selection-end-line="97" selection-end-column="5" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="MapTest.php" pinned="false" current-in-tab="false">
<file leaf-file-name="MapTest.php" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/tests/Coffee/MapTest.php">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="-12.0">
<caret line="33" column="71" selection-start-line="33" selection-start-column="71" selection-end-line="33" selection-end-column="71" />
<state vertical-scroll-proportion="0.7459893">
<caret line="31" column="69" selection-start-line="31" selection-start-column="69" selection-end-line="31" selection-end-column="69" />
<folding />
</state>
</provider>
@ -112,11 +111,11 @@
</provider>
</entry>
</file>
<file leaf-file-name="Tile.php" pinned="false" current-in-tab="true">
<file leaf-file-name="Tile.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/Coffee/Tile.php">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.30213904">
<caret line="58" column="0" selection-start-line="58" selection-start-column="0" selection-end-line="58" selection-end-column="0" />
<state vertical-scroll-proportion="8.777778">
<caret line="30" column="0" selection-start-line="30" selection-start-column="0" selection-end-line="30" selection-end-column="0" />
<folding />
</state>
</provider>
@ -176,12 +175,12 @@
<option value="$PROJECT_DIR$/tests/Coffee/TableTest.php" />
<option value="/usr/share/nginx/html/coffeetable/src/Coffee/Tile.php" />
<option value="$PROJECT_DIR$/tests/Coffee/PositionTest.php" />
<option value="$PROJECT_DIR$/tests/Coffee/MapTest.php" />
<option value="$PROJECT_DIR$/src/Coffee/Map.php" />
<option value="$PROJECT_DIR$/src/Coffee/Position.php" />
<option value="$PROJECT_DIR$/index.php" />
<option value="$PROJECT_DIR$/tests/Coffee/TileTest.php" />
<option value="$PROJECT_DIR$/src/Coffee/Tile.php" />
<option value="$PROJECT_DIR$/src/Coffee/Map.php" />
<option value="$PROJECT_DIR$/tests/Coffee/MapTest.php" />
</list>
</option>
</component>
@ -678,38 +677,44 @@
<option name="project" value="LOCAL" />
<updated>1458246771405</updated>
</task>
<option name="localTasksCounter" value="25" />
<task id="LOCAL-00025" summary="Implement Tile.isVisited">
<created>1458247367801</created>
<option name="number" value="00025" />
<option name="project" value="LOCAL" />
<updated>1458247367801</updated>
</task>
<option name="localTasksCounter" value="26" />
<servers />
</component>
<component name="TestHistory">
<history-entry file="Tests - 2016.03.17 at 21h 07m 14s.xml">
<history-entry file="Tests - 2016.03.17 at 21h 52m 22s.xml">
<configuration name="Tests" configurationId="PHPUnitRunConfigurationType" />
</history-entry>
<history-entry file="Tests - 2016.03.17 at 21h 08m 05s.xml">
<history-entry file="Tests - 2016.03.17 at 21h 53m 08s.xml">
<configuration name="Tests" configurationId="PHPUnitRunConfigurationType" />
</history-entry>
<history-entry file="Tests - 2016.03.17 at 21h 29m 32s.xml">
<history-entry file="Tests - 2016.03.17 at 21h 53m 58s.xml">
<configuration name="Tests" configurationId="PHPUnitRunConfigurationType" />
</history-entry>
<history-entry file="Tests - 2016.03.17 at 21h 29m 53s.xml">
<history-entry file="Tests - 2016.03.17 at 21h 54m 27s.xml">
<configuration name="Tests" configurationId="PHPUnitRunConfigurationType" />
</history-entry>
<history-entry file="Tests - 2016.03.17 at 21h 30m 49s.xml">
<history-entry file="Tests - 2016.03.17 at 21h 57m 44s.xml">
<configuration name="Tests" configurationId="PHPUnitRunConfigurationType" />
</history-entry>
<history-entry file="Tests - 2016.03.17 at 21h 31m 34s.xml">
<history-entry file="Tests - 2016.03.17 at 21h 57m 54s.xml">
<configuration name="Tests" configurationId="PHPUnitRunConfigurationType" />
</history-entry>
<history-entry file="Tests - 2016.03.17 at 21h 35m 51s.xml">
<history-entry file="Tests - 2016.03.17 at 22h 03m 41s.xml">
<configuration name="Tests" configurationId="PHPUnitRunConfigurationType" />
</history-entry>
<history-entry file="Tests - 2016.03.17 at 21h 41m 27s.xml">
<history-entry file="Tests - 2016.03.17 at 22h 07m 50s.xml">
<configuration name="Tests" configurationId="PHPUnitRunConfigurationType" />
</history-entry>
<history-entry file="Tests - 2016.03.17 at 21h 42m 03s.xml">
<history-entry file="Tests - 2016.03.17 at 22h 08m 10s.xml">
<configuration name="Tests" configurationId="PHPUnitRunConfigurationType" />
</history-entry>
<history-entry file="Tests - 2016.03.17 at 21h 42m 28s.xml">
<history-entry file="Tests - 2016.03.17 at 22h 08m 54s.xml">
<configuration name="Tests" configurationId="PHPUnitRunConfigurationType" />
</history-entry>
</component>
@ -776,7 +781,8 @@
<MESSAGE value="Normalize Position bounds for rows and columns" />
<MESSAGE value="Implement Map.getTileByPosition and do some refactoring" />
<MESSAGE value="Implement Tile.representsVoid" />
<option name="LAST_COMMIT_MESSAGE" value="Implement Tile.representsVoid" />
<MESSAGE value="Implement Tile.isVisited" />
<option name="LAST_COMMIT_MESSAGE" value="Implement Tile.isVisited" />
<option name="OPTIMIZE_IMPORTS_BEFORE_PROJECT_COMMIT" value="true" />
<option name="REFORMAT_BEFORE_PROJECT_COMMIT" value="true" />
<option name="REARRANGE_BEFORE_PROJECT_COMMIT" value="true" />
@ -1138,42 +1144,42 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/index.php">
<entry file="file://$PROJECT_DIR$/tests/Coffee/TileTest.php">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="7" column="0" selection-start-line="7" selection-start-column="2" selection-end-line="22" selection-end-column="5" />
<state vertical-scroll-proportion="-22.37037">
<caret line="36" column="44" selection-start-line="36" selection-start-column="44" selection-end-line="36" selection-end-column="44" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/Coffee/Map.php">
<entry file="file://$PROJECT_DIR$/src/Coffee/Tile.php">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="-19.703703">
<caret line="133" column="0" selection-start-line="133" selection-start-column="0" selection-end-line="133" selection-end-column="0" />
<state vertical-scroll-proportion="8.777778">
<caret line="30" column="0" selection-start-line="30" selection-start-column="0" selection-end-line="30" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/tests/Coffee/TileTest.php">
<entry file="file://$PROJECT_DIR$/src/Coffee/Map.php">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="-22.37037">
<caret line="36" column="44" selection-start-line="36" selection-start-column="44" selection-end-line="36" selection-end-column="44" />
<state vertical-scroll-proportion="-27.037037">
<caret line="97" column="5" selection-start-line="97" selection-start-column="5" selection-end-line="97" selection-end-column="5" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/tests/Coffee/MapTest.php">
<entry file="file://$PROJECT_DIR$/index.php">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="-12.0">
<caret line="33" column="71" selection-start-line="33" selection-start-column="71" selection-end-line="33" selection-end-column="71" />
<state vertical-scroll-proportion="-8.666667">
<caret line="13" column="2" selection-start-line="13" selection-start-column="2" selection-end-line="13" selection-end-column="2" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/Coffee/Tile.php">
<entry file="file://$PROJECT_DIR$/tests/Coffee/MapTest.php">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.30213904">
<caret line="58" column="0" selection-start-line="58" selection-start-column="0" selection-end-line="58" selection-end-column="0" />
<state vertical-scroll-proportion="0.7459893">
<caret line="31" column="69" selection-start-line="31" selection-start-column="69" selection-end-line="31" selection-end-column="69" />
<folding />
</state>
</provider>

@ -2,11 +2,11 @@
namespace Coffee;
/**
* Class Map
*
* @package Coffee
*/
/**
* Class Map
*
* @package Coffee
*/
/**
* Class Map
*
@ -17,12 +17,8 @@ class Map {
/**
* @var Tile[]
*/
private $unVisitedTiles = [];
private $tiles = [];
/**
* @var Tile[]
*/
private $visitedTiles = [];
/**
* @var int
*/
@ -51,9 +47,8 @@ class Map {
// but at a cost of reduced performance (minor).
foreach ($description as $rowIndex => $row) {
foreach ($row as $columnIndex => $tileRepresentation) {
// All tiles are inherently unvisited at first
// Also we need to convert indices to positions
$this->unVisitedTiles[] = new Tile($rowIndex + 1, $columnIndex + 1, $tileRepresentation);
// W need to convert indices to positions
$this->tiles[] = new Tile($rowIndex + 1, $columnIndex + 1, $tileRepresentation);
// Find maximum
$width = $columnIndex > $width ? $columnIndex : $width;
@ -68,90 +63,51 @@ class Map {
$this->width = $width + 1;
}
/**
* @param Position $position
* @return Tile|null
*/
public function getTileByPosition(Position $position) {
foreach ($this->getUnVisitedTiles() as $unVisitedTile) {
if ($unVisitedTile->isTheSamePosition($position)) {
return $unVisitedTile;
}
}
foreach ($this->getVisitedTiles() as $visitedTile) {
if ($visitedTile->isTheSamePosition($position)) {
return $visitedTile;
}
}
return null;
}
/**
* @return Tile[]
*/
public function getUnVisitedTiles() {
return $this->unVisitedTiles;
public function getTiles() {
return $this->tiles;
}
/**
* @return Tile[]
*/
public function getVisitedTiles() {
return $this->visitedTiles;
}
/**
* @return array
*/
public function describedByArray() {
public function getUnvisitedTiles() {
$array = [];
foreach ($this->getUnVisitedTiles() as $tile) {
$array[$tile->getRowIndex()][$tile->getColumnIndex()] = $tile->isRepresentingSpot();
}
foreach ($this->getVisitedTiles() as $tile) {
$array[$tile->getRowIndex()][$tile->getColumnIndex()] = $tile->isRepresentingSpot();
foreach ($this->getTiles() as $tile) {
if (!$tile->isVisited()) {
$array[] = $tile;
}
}
return $array;
}
/**
* @param Position $position
* @return bool
* @return Tile|null
*/
public function visitPosition(Position $position) {
if ($this->hasValidPosition($position)) {
foreach ($this->unVisitedTiles as $unVisitedTileIndex => $unVisitedTile) {
if ($unVisitedTile->isTheSamePosition($position)) {
// Move Tile from one group to another and reorder
$this->visitedTiles[] = $unVisitedTile;
array_splice($this->unVisitedTiles, $unVisitedTileIndex, 1);
return true;
}
public function getTileByPosition(Position $position) {
foreach ($this->getTiles() as $tile) {
if ($tile->isTheSamePosition($position)) {
return $tile;
}
}
return false;
return null;
}
/**
* Test the upper bound
*
* @param Position $position
* @return bool
* @return array
*/
public function hasValidPosition(Position $position) {
if ($position->getRow() > $this->getHeight() || $position->getColumn() > $this->getWidth()) {
return false;
public function describedByArray() {
$array = [];
foreach ($this->getTiles() as $tile) {
$array[$tile->getRowIndex()][$tile->getColumnIndex()] = $tile->isRepresentingSpot();
}
return true;
return $array;
}
/**
@ -167,19 +123,54 @@ class Map {
public function getWidth() {
return $this->width;
}
/**
* @param $position
* @return bool
*/
public function isVisitedPosition(Position $position) {
foreach ($this->visitedTiles as $visitedTile) {
if ($visitedTile->isTheSamePosition($position)) {
return true;
}
}
return false;
}
//
// /**
// * @param Position $position
// * @return bool
// */
// public function visitPosition(Position $position) {
// if ($this->hasValidPosition($position)) {
// foreach ($this->tiles as $unVisitedTileIndex => $unVisitedTile) {
// if ($unVisitedTile->isTheSamePosition($position)) {
//
// // Move Tile from one group to another and reorder
// $this->visitedTiles[] = $unVisitedTile;
// array_splice($this->tiles, $unVisitedTileIndex, 1);
//
// return true;
// }
// }
// }
//
// return false;
// }
//
// /**
// * Test the upper bound
// *
// * @param Position $position
// * @return bool
// */
// public function hasValidPosition(Position $position) {
// if ($position->getRow() > $this->getHeight() || $position->getColumn() > $this->getWidth()) {
// return false;
// }
//
// return true;
// }
//
// /**
// * @param $position
// * @return bool
// */
// public function isVisitedPosition(Position $position) {
// foreach ($this->visitedTiles as $visitedTile) {
// if ($visitedTile->isTheSamePosition($position)) {
// return true;
// }
// }
//
// return false;
// }
}

@ -28,7 +28,9 @@ class Tile extends Position {
private $representsElement = false;
/**
* @var bool
* Tiles are inherently unvisited
*
*@var bool
*/
private $visited = false;

@ -7,6 +7,31 @@ require __DIR__ . '/../../vendor/autoload.php';
class MapTest extends \PHPUnit_Framework_TestCase {
public function testGetTiles() {
$tileA = new Tile(1, 1, Tile::REPRESENTS_SPOT);
$tileB = new Tile(1, 2, Tile::REPRESENTS_VOID);
$map = new Map([[1, 0]]);
$this->assertEquals([$tileA, $tileB], $map->getTiles());
}
public function testUnVisitedTiles() {
$description = [
[1, 0],
[0, 1],
];
$map = new Map($description);
$tiles = $map->getTiles();
$tiles[2]->visit();
$tiles[3]->visit();
$tileA = new Tile(1, 1, Tile::REPRESENTS_SPOT);
$tileB = new Tile(1, 2, Tile::REPRESENTS_VOID);
$this->assertEquals([$tileA, $tileB], $map->getUnvisitedTiles());
}
public function testDescribedByArray() {
$description = [
[1, 0],
@ -59,57 +84,57 @@ class MapTest extends \PHPUnit_Framework_TestCase {
$this->assertEquals(4, $map->getWidth());
}
public function testValidPosition() {
$description = [
[0, 1, 0, 1],
[1, 0, 0, 0],
[0, 0, 0, 1],
[0, 0, 0, 1]
];
$map = new Map($description);
$position = new Position(3, 1);
$this->assertTrue($map->hasValidPosition($position));
}
public function testInvalidPosition() {
$description = [
[0, 1, 0, 1],
[1, 0, 0, 0],
[0, 0, 0, 1],
[0, 0, 0, 1]
];
$map = new Map($description);
$position = new Position(4, 5);
$this->assertFalse($map->hasValidPosition($position));
}
public function testUnvisitedPosition() {
$description = [
[0, 1, 0, 1],
[1, 0, 0, 0],
[0, 0, 0, 1],
[0, 0, 0, 1]
];
$map = new Map($description);
$position = new Position(1, 1);
$this->assertFalse($map->isVisitedPosition($position));
}
public function testVisitedPosition() {
$description = [
[0, 1, 0, 1],
[1, 0, 0, 0],
[0, 0, 0, 1],
[0, 0, 0, 1]
];
$map = new Map($description);
$position = new Position(1, 1);
$map->visitPosition($position);
$this->assertTrue($map->isVisitedPosition($position));
}
// public function testValidPosition() {
// $description = [
// [0, 1, 0, 1],
// [1, 0, 0, 0],
// [0, 0, 0, 1],
// [0, 0, 0, 1]
// ];
//
// $map = new Map($description);
// $position = new Position(3, 1);
// $this->assertTrue($map->hasValidPosition($position));
// }
//
// public function testInvalidPosition() {
// $description = [
// [0, 1, 0, 1],
// [1, 0, 0, 0],
// [0, 0, 0, 1],
// [0, 0, 0, 1]
// ];
//
// $map = new Map($description);
// $position = new Position(4, 5);
// $this->assertFalse($map->hasValidPosition($position));
// }
//
// public function testUnvisitedPosition() {
// $description = [
// [0, 1, 0, 1],
// [1, 0, 0, 0],
// [0, 0, 0, 1],
// [0, 0, 0, 1]
// ];
//
// $map = new Map($description);
// $position = new Position(1, 1);
// $this->assertFalse($map->isVisitedPosition($position));
// }
//
// public function testVisitedPosition() {
// $description = [
// [0, 1, 0, 1],
// [1, 0, 0, 0],
// [0, 0, 0, 1],
// [0, 0, 0, 1]
// ];
//
// $map = new Map($description);
// $position = new Position(1, 1);
// $map->visitPosition($position);
// $this->assertTrue($map->isVisitedPosition($position));
// }
}

Loading…
Cancel
Save