diff --git a/src/main/java/inf112/fiasko/roborally/abstractions/Direction.java b/src/main/java/inf112/fiasko/roborally/abstractions/Direction.java new file mode 100644 index 0000000..67415c8 --- /dev/null +++ b/src/main/java/inf112/fiasko/roborally/abstractions/Direction.java @@ -0,0 +1,47 @@ +package inf112.fiasko.roborally.abstractions; + +/** + * This enum represents all possible directions for an element on the board + */ +public enum Direction { + NORTH (1), + NORTH_EAST (2), + EAST (3), + SOUTH_EAST (4), + SOUTH (5), + SOUTH_WEST (6), + WEST (7), + NORTH_WEST (8); + + private final int directionID; + + /** + * Constructor to let a direction to be represented by a numerical identifier + * @param directionID

The numerical identifier assigned to the direction

+ */ + Direction(int directionID) { + this.directionID = directionID; + } + + /** + * Gets the numerical identifier used for alternate identification of a direction + * @return

The numerical id of the direction

+ */ + public int getDirectionID() { + return this.directionID; + } + + /** + * Gets a direction from its numerical id + * @param directionID

The numerical representation of a direction

+ * @return

The enum value representing the direction, or null if the id is invalid

+ */ + public static Direction getDirectionFromID(int directionID) { + for (Direction direction : Direction.values()) { + if (direction.directionID == directionID) { + return direction; + } + } + return null; + } +} \ No newline at end of file diff --git a/src/test/java/inf112/fiasko/roborally/DirectionTest.java b/src/test/java/inf112/fiasko/roborally/DirectionTest.java new file mode 100644 index 0000000..9b797fd --- /dev/null +++ b/src/test/java/inf112/fiasko/roborally/DirectionTest.java @@ -0,0 +1,60 @@ +package inf112.fiasko.roborally; + +import inf112.fiasko.roborally.abstractions.Direction; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +public class DirectionTest { + + @Test + public void getDirectionIdForNorth() { + assertEquals(1, Direction.NORTH.getDirectionID()); + } + + @Test + public void getDirectionFromNorthID() { + assertEquals(Direction.NORTH, Direction.getDirectionFromID(1)); + } + + @Test + public void getDirectionIdForSouthWest() { + assertEquals(6, Direction.SOUTH_WEST.getDirectionID()); + } + + @Test + public void getDirectionFromSouthWestID() { + assertEquals(Direction.SOUTH_WEST, Direction.getDirectionFromID(6)); + } + + @Test + public void allDirectionsIDConversionToIDAndBack() { + for (Direction direction : Direction.values()) { + assertEquals(direction, Direction.getDirectionFromID(direction.getDirectionID())); + } + } + + @Test + public void invalidDirectionIDReturnsNull() { + assertNull(Direction.getDirectionFromID(-1)); + } + + @Test + public void allDirectionsHaveUniqueId() { + /* This test is also done implicitly by the allDirectionsIDConversionToIDAndBack test, but that test may fail + even if this test passes, so this test is needed for clarity. */ + Set set = new HashSet<>(); + List list = new ArrayList<>(); + for (Direction direction : Direction.values()) { + set.add(direction.getDirectionID()); + list.add(direction.getDirectionID()); + } + assertEquals(list.size(), set.size()); + } +}