Add tests and add validity check to labyrinth dimensions.
This commit is contained in:
parent
15f93310e4
commit
ad0759b36f
3 changed files with 192 additions and 6 deletions
|
@ -2,21 +2,22 @@ package ch.fritteli.labyrinth.model;
|
||||||
|
|
||||||
public enum Direction {
|
public enum Direction {
|
||||||
TOP,
|
TOP,
|
||||||
|
RIGHT,
|
||||||
BOTTOM,
|
BOTTOM,
|
||||||
LEFT,
|
LEFT;
|
||||||
RIGHT;
|
|
||||||
|
|
||||||
public Direction invert() {
|
public Direction invert() {
|
||||||
switch (this) {
|
switch (this) {
|
||||||
case TOP:
|
case TOP:
|
||||||
return BOTTOM;
|
return BOTTOM;
|
||||||
case LEFT:
|
|
||||||
return RIGHT;
|
|
||||||
case RIGHT:
|
case RIGHT:
|
||||||
return LEFT;
|
return LEFT;
|
||||||
case BOTTOM:
|
case BOTTOM:
|
||||||
return TOP;
|
return TOP;
|
||||||
}
|
case LEFT:
|
||||||
|
return RIGHT;
|
||||||
|
default:
|
||||||
throw new IllegalStateException("Programming error: Not all enum values covered in enum Direction#invert()!");
|
throw new IllegalStateException("Programming error: Not all enum values covered in enum Direction#invert()!");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,10 +28,13 @@ public class Labyrinth {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Labyrinth(final int width, final int height, final long randomSeed) {
|
public Labyrinth(final int width, final int height, final long randomSeed) {
|
||||||
|
if (width <= 0 || height <= 0) {
|
||||||
|
throw new IllegalArgumentException("widht and height must be >=1");
|
||||||
|
}
|
||||||
this.width = width;
|
this.width = width;
|
||||||
this.height = height;
|
this.height = height;
|
||||||
this.randomSeed = randomSeed;
|
this.randomSeed = randomSeed;
|
||||||
this.random = new Random(this.randomSeed);
|
this.random = new Random(randomSeed);
|
||||||
this.field = new Tile[width][height];
|
this.field = new Tile[width][height];
|
||||||
this.start = new Position(0, 0);
|
this.start = new Position(0, 0);
|
||||||
this.end = new Position(this.width - 1, this.height - 1);
|
this.end = new Position(this.width - 1, this.height - 1);
|
||||||
|
|
182
src/test/java/ch/fritteli/labyrinth/model/TileTest.java
Normal file
182
src/test/java/ch/fritteli/labyrinth/model/TileTest.java
Normal file
|
@ -0,0 +1,182 @@
|
||||||
|
package ch.fritteli.labyrinth.model;
|
||||||
|
|
||||||
|
import io.vavr.control.Option;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
class TileTest {
|
||||||
|
@Test
|
||||||
|
void testConstruct() {
|
||||||
|
// arrange / act
|
||||||
|
final Tile sut = new Tile();
|
||||||
|
|
||||||
|
//assert
|
||||||
|
assertTrue(sut.hasWallAt(Direction.TOP));
|
||||||
|
assertTrue(sut.hasWallAt(Direction.RIGHT));
|
||||||
|
assertTrue(sut.hasWallAt(Direction.BOTTOM));
|
||||||
|
assertTrue(sut.hasWallAt(Direction.LEFT));
|
||||||
|
assertFalse(sut.isSolution());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testDigFrom() {
|
||||||
|
// arrange
|
||||||
|
final Tile sut = new Tile();
|
||||||
|
|
||||||
|
// act
|
||||||
|
boolean result = sut.digFrom(Direction.TOP);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
assertTrue(result);
|
||||||
|
assertFalse(sut.hasWallAt(Direction.TOP));
|
||||||
|
|
||||||
|
// act: can not dig from when already dug
|
||||||
|
result = sut.digFrom(Direction.BOTTOM);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
assertFalse(result);
|
||||||
|
assertTrue(sut.hasWallAt(Direction.BOTTOM));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testDigTo() {
|
||||||
|
// arrange
|
||||||
|
final Tile sut = new Tile();
|
||||||
|
|
||||||
|
// act / assert
|
||||||
|
assertTrue(sut.digTo(Direction.TOP));
|
||||||
|
assertTrue(sut.digTo(Direction.RIGHT));
|
||||||
|
assertTrue(sut.digTo(Direction.BOTTOM));
|
||||||
|
assertTrue(sut.digTo(Direction.LEFT));
|
||||||
|
// digging a second time does not succeed
|
||||||
|
assertFalse(sut.digTo(Direction.LEFT));
|
||||||
|
|
||||||
|
// assert
|
||||||
|
assertFalse(sut.hasWallAt(Direction.TOP));
|
||||||
|
assertFalse(sut.hasWallAt(Direction.RIGHT));
|
||||||
|
assertFalse(sut.hasWallAt(Direction.BOTTOM));
|
||||||
|
assertFalse(sut.hasWallAt(Direction.LEFT));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testPreventDiggingToOrFrom() {
|
||||||
|
// arrange
|
||||||
|
final Tile sut = new Tile();
|
||||||
|
|
||||||
|
// act
|
||||||
|
sut.preventDiggingToOrFrom(Direction.LEFT);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
assertFalse(sut.digTo(Direction.LEFT));
|
||||||
|
assertFalse(sut.digFrom(Direction.LEFT));
|
||||||
|
assertTrue(sut.hasWallAt(Direction.LEFT));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testEnableDiggingToOrFrom() {
|
||||||
|
// arrange
|
||||||
|
final Tile sut = new Tile();
|
||||||
|
|
||||||
|
// act: fist, prevent digging
|
||||||
|
sut.preventDiggingToOrFrom(Direction.LEFT);
|
||||||
|
// then, re-enable digging
|
||||||
|
sut.enableDiggingToOrFrom(Direction.LEFT);
|
||||||
|
// also, enable it from a previously non-disabled direction
|
||||||
|
|
||||||
|
sut.enableDiggingToOrFrom(Direction.BOTTOM);
|
||||||
|
// assert
|
||||||
|
assertTrue(sut.digTo(Direction.LEFT));
|
||||||
|
assertFalse(sut.hasWallAt(Direction.LEFT));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testUndigTo() {
|
||||||
|
// arrange
|
||||||
|
final Tile sut = new Tile();
|
||||||
|
sut.digTo(Direction.BOTTOM);
|
||||||
|
|
||||||
|
// act
|
||||||
|
sut.undigTo(Direction.BOTTOM);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
assertTrue(sut.hasWallAt(Direction.BOTTOM));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testSetSolution() {
|
||||||
|
// arrange
|
||||||
|
final Tile sut = new Tile();
|
||||||
|
|
||||||
|
// act
|
||||||
|
sut.setSolution();
|
||||||
|
|
||||||
|
// assert
|
||||||
|
assertTrue(sut.isSolution());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testGetRandomAvailableDirection() {
|
||||||
|
// arrange
|
||||||
|
final Tile sut = new Tile();
|
||||||
|
// MyDummyRandom always returns 0
|
||||||
|
final MyDummyRandom dummyRandom = new MyDummyRandom();
|
||||||
|
|
||||||
|
// act
|
||||||
|
Option<Direction> result = sut.getRandomAvailableDirection(dummyRandom);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
assertTrue(result.isDefined());
|
||||||
|
assertEquals(Direction.TOP, result.get());
|
||||||
|
|
||||||
|
// re-arrange
|
||||||
|
sut.preventDiggingToOrFrom(Direction.TOP);
|
||||||
|
|
||||||
|
// act
|
||||||
|
result = sut.getRandomAvailableDirection(dummyRandom);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
assertTrue(result.isDefined());
|
||||||
|
assertEquals(Direction.RIGHT, result.get());
|
||||||
|
|
||||||
|
// re-arrange
|
||||||
|
sut.preventDiggingToOrFrom(Direction.RIGHT);
|
||||||
|
|
||||||
|
// act
|
||||||
|
result = sut.getRandomAvailableDirection(dummyRandom);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
assertTrue(result.isDefined());
|
||||||
|
assertEquals(Direction.BOTTOM, result.get());
|
||||||
|
|
||||||
|
// re-arrange
|
||||||
|
sut.preventDiggingToOrFrom(Direction.BOTTOM);
|
||||||
|
|
||||||
|
// act
|
||||||
|
result = sut.getRandomAvailableDirection(dummyRandom);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
assertTrue(result.isDefined());
|
||||||
|
assertEquals(Direction.LEFT, result.get());
|
||||||
|
|
||||||
|
// re-arrange
|
||||||
|
sut.preventDiggingToOrFrom(Direction.LEFT);
|
||||||
|
|
||||||
|
// act
|
||||||
|
result = sut.getRandomAvailableDirection(dummyRandom);
|
||||||
|
|
||||||
|
// assert
|
||||||
|
assertFalse(result.isDefined());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class MyDummyRandom extends Random {
|
||||||
|
@Override
|
||||||
|
protected int next(final int bits) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue