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()); }