diff --git a/pom.xml b/pom.xml
index 8860594..5be2fdb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -22,6 +22,12 @@
1.16.14
+
+ org.apache.commons
+ commons-lang3
+ 3.4
+
+
junit
junit
diff --git a/src/main/java/de/dj_steam/bot/cli/InvalidUserInputException.java b/src/main/java/de/dj_steam/bot/cli/InvalidUserInputException.java
new file mode 100644
index 0000000..51be78a
--- /dev/null
+++ b/src/main/java/de/dj_steam/bot/cli/InvalidUserInputException.java
@@ -0,0 +1,8 @@
+package de.dj_steam.bot.cli;
+
+/**
+ * @author steam
+ */
+public class InvalidUserInputException extends RuntimeException {
+ public InvalidUserInputException(String message) { super(message); }
+}
diff --git a/src/main/java/de/dj_steam/bot/cli/LoopingConsole.java b/src/main/java/de/dj_steam/bot/cli/LoopingConsole.java
index 21a3e91..b97a520 100644
--- a/src/main/java/de/dj_steam/bot/cli/LoopingConsole.java
+++ b/src/main/java/de/dj_steam/bot/cli/LoopingConsole.java
@@ -3,7 +3,11 @@ package de.dj_steam.bot.cli;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
+import java.util.Optional;
+import org.apache.commons.lang3.StringUtils;
+
+import de.dj_steam.bot.domain.Command;
import de.dj_steam.bot.engine.RobotEngine;
/**
@@ -13,6 +17,7 @@ import de.dj_steam.bot.engine.RobotEngine;
public class LoopingConsole {
private static final String EXIT_COMMAND = "exit";
+ public static final String COMMAND_DELIMITER = " ";
public static void main(final String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
@@ -24,7 +29,7 @@ public class LoopingConsole {
while (true) {
System.out.print("> ");
String input = br.readLine();
- robotEngine.commandBot(input);
+ robotEngine.commandBot(createCommand(input));
if (input.trim().toLowerCase().equals(EXIT_COMMAND)) {
System.out.println("exiting");
@@ -33,6 +38,22 @@ public class LoopingConsole {
}
}
+ static Command createCommand(final String input) {
+ String[] split = input.split(COMMAND_DELIMITER);
+
+ Command command;
+
+ if(split.length == 2) {
+ command = new Command(split[0], Optional.of(split[1]));
+ } else if(split.length == 1 && !StringUtils.isEmpty(split[0])){
+ command = new Command(split[0], Optional.empty());
+ } else {
+ throw new InvalidUserInputException("Invalid user input");
+ }
+
+ return command;
+ }
+
private static void printUsageBanner() {
System.out.println("####################################################");
System.out.println("Commands:");
diff --git a/src/main/java/de/dj_steam/bot/domain/Command.java b/src/main/java/de/dj_steam/bot/domain/Command.java
new file mode 100644
index 0000000..d52104a
--- /dev/null
+++ b/src/main/java/de/dj_steam/bot/domain/Command.java
@@ -0,0 +1,29 @@
+package de.dj_steam.bot.domain;
+
+import java.util.Optional;
+
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+
+/**
+ * @author steam
+ */
+
+@Getter
+@EqualsAndHashCode
+public class Command {
+
+ public static final String TURN_LEFT = "LEFT";
+ public static final String TURN_RIGHT = "RIGHT";
+ public static final String MOVE = "MOVE";
+ public static final String PLACE = "PLACE";
+ public static final String REPORT = "REPORT";
+
+ private String command;
+ private Optional arguments;
+
+ public Command(final String command, Optional arguments) {
+ this.command = command;
+ this.arguments = arguments;
+ }
+}
diff --git a/src/main/java/de/dj_steam/bot/engine/RobotEngine.java b/src/main/java/de/dj_steam/bot/engine/RobotEngine.java
index b198c66..2c707f9 100644
--- a/src/main/java/de/dj_steam/bot/engine/RobotEngine.java
+++ b/src/main/java/de/dj_steam/bot/engine/RobotEngine.java
@@ -3,6 +3,7 @@ package de.dj_steam.bot.engine;
import java.util.ArrayList;
import java.util.List;
+import de.dj_steam.bot.domain.Command;
import de.dj_steam.bot.domain.Direction;
import de.dj_steam.bot.domain.Position;
import de.dj_steam.bot.domain.ToyBot;
@@ -16,12 +17,6 @@ import de.dj_steam.bot.moving.strategy.TurnStrategy;
*/
public class RobotEngine {
- public static final String TURN_LEFT = "LEFT";
- public static final String TURN_RIGHT = "RIGHT";
- public static final String MOVE = "MOVE";
- public static final String PLACE = "PLACE";
- public static final String REPORT = "REPORT";
-
private final ToyBotField toyBotField;
private final ToyBot toyBot;
private List changingStrategies;
@@ -38,7 +33,7 @@ public class RobotEngine {
initChangingStrategies();
}
- public void commandBot(String command) {
+ public void commandBot(Command command) {
for (ChangingStrategy strategy : changingStrategies) {
strategy.change(toyBot, toyBotField, command);
}
diff --git a/src/main/java/de/dj_steam/bot/moving/DirectionCalculator.java b/src/main/java/de/dj_steam/bot/moving/DirectionCalculator.java
index 38691d2..56fcdcf 100644
--- a/src/main/java/de/dj_steam/bot/moving/DirectionCalculator.java
+++ b/src/main/java/de/dj_steam/bot/moving/DirectionCalculator.java
@@ -2,9 +2,9 @@ package de.dj_steam.bot.moving;
import java.util.Arrays;
+import de.dj_steam.bot.domain.Command;
import de.dj_steam.bot.domain.Direction;
import de.dj_steam.bot.domain.ToyBot;
-import de.dj_steam.bot.engine.RobotEngine;
/**
* @author steam
@@ -18,13 +18,13 @@ public class DirectionCalculator {
directions.addAll(Arrays.asList(Direction.values()));
}
- public Direction calculateNewDirection(ToyBot toyBot, String turnDirection) {
+ public Direction calculateNewDirection(ToyBot toyBot, Command turnDirection) {
Direction actualDirection = toyBot.getDirection();
- if (turnDirection.equals(RobotEngine.TURN_LEFT)) {
+ if (turnDirection.getCommand().equals(Command.TURN_LEFT)) {
return directions.get(directions.indexOf(actualDirection) - 1);
- } else if (turnDirection.equals(RobotEngine.TURN_RIGHT)) {
+ } else if (turnDirection.getCommand().equals(Command.TURN_RIGHT)) {
return directions.get(directions.indexOf(actualDirection) + 1);
}
return toyBot.getDirection();
diff --git a/src/main/java/de/dj_steam/bot/moving/strategy/ChangingStrategy.java b/src/main/java/de/dj_steam/bot/moving/strategy/ChangingStrategy.java
index f771ac9..4bee235 100644
--- a/src/main/java/de/dj_steam/bot/moving/strategy/ChangingStrategy.java
+++ b/src/main/java/de/dj_steam/bot/moving/strategy/ChangingStrategy.java
@@ -1,5 +1,6 @@
package de.dj_steam.bot.moving.strategy;
+import de.dj_steam.bot.domain.Command;
import de.dj_steam.bot.domain.ToyBot;
import de.dj_steam.bot.domain.ToyBotField;
@@ -7,5 +8,5 @@ import de.dj_steam.bot.domain.ToyBotField;
* @author steam
*/
public interface ChangingStrategy {
- void change(ToyBot toyBot, ToyBotField toyBotField, String command);
+ void change(ToyBot toyBot, ToyBotField toyBotField, Command command);
}
diff --git a/src/main/java/de/dj_steam/bot/moving/strategy/ReportStrategy.java b/src/main/java/de/dj_steam/bot/moving/strategy/ReportStrategy.java
index b7baab6..22e5825 100644
--- a/src/main/java/de/dj_steam/bot/moving/strategy/ReportStrategy.java
+++ b/src/main/java/de/dj_steam/bot/moving/strategy/ReportStrategy.java
@@ -1,16 +1,16 @@
package de.dj_steam.bot.moving.strategy;
+import de.dj_steam.bot.domain.Command;
import de.dj_steam.bot.domain.ToyBot;
import de.dj_steam.bot.domain.ToyBotField;
-import de.dj_steam.bot.engine.RobotEngine;
/**
* @author steam
*/
public class ReportStrategy implements ChangingStrategy {
@Override
- public void change(ToyBot toyBot, ToyBotField toyBotField, String command) {
- if (command.equals(RobotEngine.REPORT)) {
+ public void change(ToyBot toyBot, ToyBotField toyBotField, Command command) {
+ if (command.getCommand().equals(Command.REPORT)) {
printReport(toyBot);
}
}
diff --git a/src/main/java/de/dj_steam/bot/moving/strategy/TurnStrategy.java b/src/main/java/de/dj_steam/bot/moving/strategy/TurnStrategy.java
index 559d8a2..8155461 100644
--- a/src/main/java/de/dj_steam/bot/moving/strategy/TurnStrategy.java
+++ b/src/main/java/de/dj_steam/bot/moving/strategy/TurnStrategy.java
@@ -1,8 +1,8 @@
package de.dj_steam.bot.moving.strategy;
+import de.dj_steam.bot.domain.Command;
import de.dj_steam.bot.domain.ToyBot;
import de.dj_steam.bot.domain.ToyBotField;
-import de.dj_steam.bot.engine.RobotEngine;
import de.dj_steam.bot.moving.DirectionCalculator;
/**
@@ -17,8 +17,8 @@ public class TurnStrategy implements ChangingStrategy {
}
@Override
- public void change(ToyBot toyBot, ToyBotField toyBotField, String command) {
- if (command.equals(RobotEngine.TURN_LEFT) || command.equals(RobotEngine.TURN_RIGHT)) {
+ public void change(ToyBot toyBot, ToyBotField toyBotField, Command command) {
+ if (command.getCommand().equals(Command.TURN_LEFT) || command.getCommand().equals(Command.TURN_RIGHT)) {
toyBot.setDirection(directionCalculator.calculateNewDirection(toyBot, command));
}
}
diff --git a/src/test/java/de/dj_steam/bot/cli/LoopingConsoleTest.java b/src/test/java/de/dj_steam/bot/cli/LoopingConsoleTest.java
new file mode 100644
index 0000000..dcb3914
--- /dev/null
+++ b/src/test/java/de/dj_steam/bot/cli/LoopingConsoleTest.java
@@ -0,0 +1,42 @@
+package de.dj_steam.bot.cli;
+
+import static junit.framework.TestCase.assertFalse;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+import de.dj_steam.bot.domain.Command;
+
+/**
+ * @author steam
+ */
+public class LoopingConsoleTest {
+
+
+ @Test(expected = InvalidUserInputException.class)
+ public void createCommandExpectedUserInputExceptionOnEmptyInput() throws Exception {
+ LoopingConsole.createCommand("");
+ }
+
+ @Test(expected = InvalidUserInputException.class)
+ public void createCommandExpectedUserInputExceptionOnMoreThenTwoParams() throws Exception {
+ LoopingConsole.createCommand("INPUT X,Y,F WRONG_PARAM");
+ }
+
+ @Test
+ public void createCommandWithoutParam() {
+ Command command = LoopingConsole.createCommand("INPUT");
+ assertEquals("INPUT", command.getCommand());
+ assertFalse(command.getArguments().isPresent());
+ }
+
+ @Test
+ public void createCommandWithParam() {
+ Command command = LoopingConsole.createCommand("INPUT X,Y,F");
+ assertEquals("INPUT", command.getCommand());
+ assertTrue(command.getArguments().isPresent());
+ assertEquals("X,Y,F", command.getArguments().get());
+ }
+
+}
\ No newline at end of file
diff --git a/src/test/java/de/dj_steam/bot/engine/RobotEngineTest.java b/src/test/java/de/dj_steam/bot/engine/RobotEngineTest.java
index a69e880..65579d6 100644
--- a/src/test/java/de/dj_steam/bot/engine/RobotEngineTest.java
+++ b/src/test/java/de/dj_steam/bot/engine/RobotEngineTest.java
@@ -2,9 +2,12 @@ package de.dj_steam.bot.engine;
import static org.junit.Assert.assertEquals;
+import java.util.Optional;
+
import org.junit.Before;
import org.junit.Test;
+import de.dj_steam.bot.domain.Command;
import de.dj_steam.bot.domain.Direction;
import de.dj_steam.bot.domain.Position;
import de.dj_steam.bot.domain.ToyBot;
@@ -28,35 +31,39 @@ public class RobotEngineTest {
@Test
public void testTurnLeftCommand() {
+ Command turnLeftCommand = new Command(Command.TURN_LEFT, Optional.empty());
+
assertEquals(Direction.NORTH, toyBot.getDirection());
- robotEngine.commandBot(RobotEngine.TURN_LEFT);
+ robotEngine.commandBot(turnLeftCommand);
assertEquals(Direction.WEST, toyBot.getDirection());
- robotEngine.commandBot(RobotEngine.TURN_LEFT);
+ robotEngine.commandBot(turnLeftCommand);
assertEquals(Direction.SOUTH, toyBot.getDirection());
- robotEngine.commandBot(RobotEngine.TURN_LEFT);
+ robotEngine.commandBot(turnLeftCommand);
assertEquals(Direction.EAST, toyBot.getDirection());
- robotEngine.commandBot(RobotEngine.TURN_LEFT);
+ robotEngine.commandBot(turnLeftCommand);
assertEquals(Direction.NORTH, toyBot.getDirection());
}
@Test
public void testTurnRightCommand() {
+
+ Command turnRightCommand = new Command(Command.TURN_RIGHT, Optional.empty());
assertEquals(Direction.NORTH, toyBot.getDirection());
- robotEngine.commandBot(RobotEngine.TURN_RIGHT);
+ robotEngine.commandBot(turnRightCommand);
assertEquals(Direction.EAST, toyBot.getDirection());
- robotEngine.commandBot(RobotEngine.TURN_RIGHT);
+ robotEngine.commandBot(turnRightCommand);
assertEquals(Direction.SOUTH, toyBot.getDirection());
- robotEngine.commandBot(RobotEngine.TURN_RIGHT);
+ robotEngine.commandBot(turnRightCommand);
assertEquals(Direction.WEST, toyBot.getDirection());
- robotEngine.commandBot(RobotEngine.TURN_RIGHT);
+ robotEngine.commandBot(turnRightCommand);
assertEquals(Direction.NORTH, toyBot.getDirection());
}
}
\ No newline at end of file
diff --git a/src/test/java/de/dj_steam/bot/moving/DirectionCalculatorTest.java b/src/test/java/de/dj_steam/bot/moving/DirectionCalculatorTest.java
index 9a33baa..5c2d25b 100644
--- a/src/test/java/de/dj_steam/bot/moving/DirectionCalculatorTest.java
+++ b/src/test/java/de/dj_steam/bot/moving/DirectionCalculatorTest.java
@@ -2,13 +2,15 @@ package de.dj_steam.bot.moving;
import static org.junit.Assert.assertEquals;
+import java.util.Optional;
+
import org.junit.Before;
import org.junit.Test;
+import de.dj_steam.bot.domain.Command;
import de.dj_steam.bot.domain.Direction;
import de.dj_steam.bot.domain.Position;
import de.dj_steam.bot.domain.ToyBot;
-import de.dj_steam.bot.engine.RobotEngine;
/**
* @author steam
@@ -25,13 +27,13 @@ public class DirectionCalculatorTest {
@Test
public void testCalculateOnTurnLeft() {
ToyBot toyBot = new ToyBot(Direction.NORTH, new Position());
- assertEquals(Direction.WEST, directionCalculator.calculateNewDirection(toyBot, RobotEngine.TURN_LEFT));
+ assertEquals(Direction.WEST, directionCalculator.calculateNewDirection(toyBot, new Command(Command.TURN_LEFT, Optional.empty())));
}
@Test
public void testCalculateOnTurnRight() {
ToyBot toyBot = new ToyBot(Direction.NORTH, new Position());
- assertEquals(Direction.EAST, directionCalculator.calculateNewDirection(toyBot, RobotEngine.TURN_RIGHT));
+ assertEquals(Direction.EAST, directionCalculator.calculateNewDirection(toyBot, new Command( Command.TURN_RIGHT, Optional.empty())));
}
}
\ No newline at end of file
diff --git a/src/test/java/de/dj_steam/bot/moving/strategy/TurnStrategyTest.java b/src/test/java/de/dj_steam/bot/moving/strategy/TurnStrategyTest.java
index 6b8d855..a80ec3e 100644
--- a/src/test/java/de/dj_steam/bot/moving/strategy/TurnStrategyTest.java
+++ b/src/test/java/de/dj_steam/bot/moving/strategy/TurnStrategyTest.java
@@ -2,17 +2,19 @@ package de.dj_steam.bot.moving.strategy;
import static org.junit.Assert.assertEquals;
+import java.util.Optional;
+
import org.junit.Before;
import org.junit.Test;
+import de.dj_steam.bot.domain.Command;
import de.dj_steam.bot.domain.Direction;
import de.dj_steam.bot.domain.Position;
import de.dj_steam.bot.domain.ToyBot;
import de.dj_steam.bot.domain.ToyBotField;
-import de.dj_steam.bot.engine.RobotEngine;
/**
- * @author stanislav.nowogrudski
+ * @author steam
*/
public class TurnStrategyTest {
@@ -28,14 +30,14 @@ public class TurnStrategyTest {
@Test
public void testTurnLeft() {
assertEquals(Direction.NORTH, toyBot.getDirection());
- turnStrategy.change(toyBot, new ToyBotField(), RobotEngine.TURN_LEFT);
+ turnStrategy.change(toyBot, new ToyBotField(), new Command(Command.TURN_LEFT, Optional.empty()));
assertEquals(Direction.WEST, toyBot.getDirection());
}
@Test
public void testTurnRight() {
assertEquals(Direction.NORTH, toyBot.getDirection());
- turnStrategy.change(toyBot, new ToyBotField(), RobotEngine.TURN_RIGHT);
+ turnStrategy.change(toyBot, new ToyBotField(), new Command(Command.TURN_RIGHT, Optional.empty()));
assertEquals(Direction.EAST, toyBot.getDirection());
}