From e8bb53470524d7d555df32f8a92b121840bd623b Mon Sep 17 00:00:00 2001 From: arnaudlabourel <arnaud.labourel@univ-amu.fr> Date: Tue, 9 Nov 2021 09:59:10 +0100 Subject: [PATCH] Added MapSquare --- src/main/java/model/AbstractSquare.java | 53 +++++++++++++++ src/main/java/model/ArraySquare.java | 44 +------------ src/main/java/model/ListGrid.java | 2 +- src/main/java/model/MapSquare.java | 18 +++++ src/test/java/model/MapSquareTest.java | 88 +++++++++++++++++++++++++ 5 files changed, 161 insertions(+), 44 deletions(-) create mode 100644 src/main/java/model/AbstractSquare.java create mode 100644 src/main/java/model/MapSquare.java create mode 100644 src/test/java/model/MapSquareTest.java diff --git a/src/main/java/model/AbstractSquare.java b/src/main/java/model/AbstractSquare.java new file mode 100644 index 0000000..38becc3 --- /dev/null +++ b/src/main/java/model/AbstractSquare.java @@ -0,0 +1,53 @@ +package model; + +import java.util.ArrayList; +import java.util.List; + +public abstract class AbstractSquare implements Square { + private Tile tile = EmptyTile.EMPTY_TILE; + + public Tile getTile(){ + return tile; + } + + @Override + public List<Tile> compatibleTiles(List<Tile> tiles) { + List<Tile> compatibleTiles = new ArrayList<>(); + for(Tile tile : tiles) + if(accept(tile)) + compatibleTiles.add(tile); + return compatibleTiles; + } + + @Override + public void put(Tile tile) { + this.tile = tile; + } + + @Override + public abstract void setNeighbor(Square neighbor, CardinalDirection direction); + + @Override + public abstract Square getNeighbor(CardinalDirection direction); + + private boolean accept(Tile tile) { + for(CardinalDirection direction : CardinalDirection.values()){ + if(!accept(tile, direction)) + return false; + } + return true; + } + + private boolean accept(Tile tile, CardinalDirection direction) { + return getIncidentNeighboringSide(direction).accept(tile.side(direction)); + } + + private Side getIncidentNeighboringSide(CardinalDirection direction) { + return getNeighbor(direction).getTile().side(direction.oppositeDirection()); + } + + @Override + public List<Side> compatibleSides(List<Side> sides, CardinalDirection direction) { + return getIncidentNeighboringSide(direction).compatibleSides(sides); + } +} diff --git a/src/main/java/model/ArraySquare.java b/src/main/java/model/ArraySquare.java index 3f77c2b..6a48b16 100644 --- a/src/main/java/model/ArraySquare.java +++ b/src/main/java/model/ArraySquare.java @@ -1,10 +1,6 @@ package model; -import java.util.ArrayList; -import java.util.List; - -public class ArraySquare implements Square { - private Tile tile = EmptyTile.EMPTY_TILE; +public class ArraySquare extends AbstractSquare { private final Square[] neighbors = new Square[CardinalDirection.NUMBER_OF_DIRECTIONS]; public ArraySquare() { @@ -16,24 +12,6 @@ public class ArraySquare implements Square { setNeighbor(EmptySquare.EMPTY_SQUARE, direction); } - public Tile getTile(){ - return tile; - } - - @Override - public List<Tile> compatibleTiles(List<Tile> tiles) { - List<Tile> compatibleTiles = new ArrayList<>(); - for(Tile tile : tiles) - if(accept(tile)) - compatibleTiles.add(tile); - return compatibleTiles; - } - - @Override - public void put(Tile tile) { - this.tile = tile; - } - @Override public void setNeighbor(Square neighbor, CardinalDirection direction) { this.neighbors[direction.ordinal()] = neighbor; @@ -44,24 +22,4 @@ public class ArraySquare implements Square { return this.neighbors[direction.ordinal()]; } - private boolean accept(Tile tile) { - for(CardinalDirection direction : CardinalDirection.values()){ - if(!accept(tile, direction)) - return false; - } - return true; - } - - private boolean accept(Tile tile, CardinalDirection direction) { - return getIncidentNeighboringSide(direction).accept(tile.side(direction)); - } - - private Side getIncidentNeighboringSide(CardinalDirection direction) { - return getNeighbor(direction).getTile().side(direction.oppositeDirection()); - } - - @Override - public List<Side> compatibleSides(List<Side> sides, CardinalDirection direction) { - return getIncidentNeighboringSide(direction).compatibleSides(sides); - } } diff --git a/src/main/java/model/ListGrid.java b/src/main/java/model/ListGrid.java index e9e9bdf..a8995c7 100644 --- a/src/main/java/model/ListGrid.java +++ b/src/main/java/model/ListGrid.java @@ -17,7 +17,7 @@ public class ListGrid extends AbstractGrid{ for(int row = 0; row < getNumberOfRows(); row++){ List<Square> squareRow = new ArrayList<>(); for(int column = 0; column < getNumberOfColumns(); column++) - squareRow.add(new ArraySquare()); + squareRow.add(new MapSquare()); squares.add(squareRow); } } diff --git a/src/main/java/model/MapSquare.java b/src/main/java/model/MapSquare.java new file mode 100644 index 0000000..ac8b521 --- /dev/null +++ b/src/main/java/model/MapSquare.java @@ -0,0 +1,18 @@ +package model; + +import java.util.HashMap; +import java.util.Map; + +public class MapSquare extends AbstractSquare{ + private final Map<CardinalDirection,Square> neighbors = new HashMap<>(); + + @Override + public void setNeighbor(Square neighbor, CardinalDirection direction) { + neighbors.put(direction, neighbor); + } + + @Override + public Square getNeighbor(CardinalDirection direction) { + return neighbors.getOrDefault(direction, EmptySquare.EMPTY_SQUARE); + } +} diff --git a/src/test/java/model/MapSquareTest.java b/src/test/java/model/MapSquareTest.java new file mode 100644 index 0000000..0d0ca5e --- /dev/null +++ b/src/test/java/model/MapSquareTest.java @@ -0,0 +1,88 @@ +package model; + +import javafx.scene.paint.Color; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class MapSquareTest { + Square arraySquare1; + Square arraySquare2; + ColoredSide redSide; + ColoredSide blueSide; + Tile redTile; + Tile blueTile; + + @BeforeEach + void initialize(){ + arraySquare1 = new MapSquare(); + arraySquare2 = new MapSquare(); + redTile = new UniformTile(new ColoredSide(Color.RED)); + blueTile = new UniformTile(new ColoredSide(Color.BLUE)); + redSide = new ColoredSide(Color.RED); + blueSide = new ColoredSide(Color.BLUE); + } + + @Test + void testGetNeighbors_afterConstruction(){ + for(CardinalDirection direction : CardinalDirection.values()) + assertThat(arraySquare1.getNeighbor(direction)).isEqualTo(EmptySquare.EMPTY_SQUARE); + } + + @Test + void testEmptyTile_afterConstruction(){ + assertThat(arraySquare1.getTile()).isEqualTo(EmptyTile.EMPTY_TILE); + } + + @Test + void testPut(){ + arraySquare1.put(redTile); + arraySquare2.put(blueTile); + assertThat(arraySquare1.getTile()).isEqualTo(redTile); + assertThat(arraySquare2.getTile()).isEqualTo(blueTile); + } + + @Test + void testGetNeighbors_afterSetNeighbor(){ + arraySquare1.setNeighbor(arraySquare2, CardinalDirection.NORTH); + arraySquare2.setNeighbor(arraySquare1, CardinalDirection.SOUTH); + assertThat(arraySquare1.getNeighbor(CardinalDirection.NORTH)).isEqualTo(arraySquare2); + assertThat(arraySquare2.getNeighbor(CardinalDirection.SOUTH)).isEqualTo(arraySquare1); + } + + @Test + void testCompatibleSides(){ + arraySquare1.put(redTile); + arraySquare2.put(blueTile); + arraySquare1.setNeighbor(arraySquare2, CardinalDirection.NORTH); + arraySquare2.setNeighbor(arraySquare1, CardinalDirection.SOUTH); + List<Side> sides = List.of(blueSide, redSide); + assertThat(arraySquare1.compatibleSides(sides, CardinalDirection.NORTH)) + .containsExactly(blueSide); + assertThat(arraySquare2.compatibleSides(sides, CardinalDirection.SOUTH)) + .containsExactly(redSide); + assertThat(arraySquare1.compatibleSides(sides, CardinalDirection.SOUTH)) + .containsExactly(blueSide, redSide); + } + + @Test + void testCompatibleTiles(){ + List<Tile> tiles = List.of(blueTile, redTile); + assertThat(arraySquare1.compatibleTiles(tiles)) + .containsExactly(blueTile, redTile); + + arraySquare1.put(redTile); + arraySquare2.put(blueTile); + arraySquare1.setNeighbor(arraySquare2, CardinalDirection.NORTH); + arraySquare2.setNeighbor(arraySquare1, CardinalDirection.SOUTH); + + assertThat(arraySquare1.compatibleTiles(tiles)) + .containsExactly(blueTile); + assertThat(arraySquare2.compatibleTiles(tiles)) + .containsExactly(redTile); + } +} + -- GitLab