From 4fbf1b912bf16ece05ea7b59e4463cb972d7f368 Mon Sep 17 00:00:00 2001 From: poweronoff Date: Fri, 21 Apr 2017 22:42:44 +0200 Subject: [PATCH 01/23] added intelliJ stuff to the .gitognore --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 32858aa..f0546f8 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,7 @@ # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* + +# intelliJ stuff +*.iml +.idea/* \ No newline at end of file From 435c48713bdfe2f1621fa1fbac0a2049b00dd82d Mon Sep 17 00:00:00 2001 From: poweronoff Date: Fri, 21 Apr 2017 22:50:48 +0200 Subject: [PATCH 02/23] initial setup and turn strategy is working --- pom.xml | 50 +++++++++++++++ .../de/dj_steam/bot/cli/LoopingConsole.java | 47 ++++++++++++++ .../de/dj_steam/bot/domain/Direction.java | 11 ++++ .../java/de/dj_steam/bot/domain/Position.java | 26 ++++++++ .../java/de/dj_steam/bot/domain/ToyBot.java | 24 +++++++ .../de/dj_steam/bot/domain/ToyBotField.java | 12 ++++ .../de/dj_steam/bot/engine/RobotEngine.java | 50 +++++++++++++++ .../bot/moving/DirectionCalculator.java | 32 ++++++++++ .../bot/moving/LoopedDirectionsArrayList.java | 20 ++++++ .../bot/moving/strategy/ChangingStrategy.java | 11 ++++ .../bot/moving/strategy/TurnStrategy.java | 25 ++++++++ .../java/de/dj_steam/bot/RobotEngineTest.java | 63 +++++++++++++++++++ .../bot/moving/DirectionCalculatorTest.java | 37 +++++++++++ .../moving/LoopedDirectionsArrayListTest.java | 45 +++++++++++++ 14 files changed, 453 insertions(+) create mode 100644 pom.xml create mode 100644 src/main/java/de/dj_steam/bot/cli/LoopingConsole.java create mode 100644 src/main/java/de/dj_steam/bot/domain/Direction.java create mode 100644 src/main/java/de/dj_steam/bot/domain/Position.java create mode 100644 src/main/java/de/dj_steam/bot/domain/ToyBot.java create mode 100644 src/main/java/de/dj_steam/bot/domain/ToyBotField.java create mode 100644 src/main/java/de/dj_steam/bot/engine/RobotEngine.java create mode 100644 src/main/java/de/dj_steam/bot/moving/DirectionCalculator.java create mode 100644 src/main/java/de/dj_steam/bot/moving/LoopedDirectionsArrayList.java create mode 100644 src/main/java/de/dj_steam/bot/moving/strategy/ChangingStrategy.java create mode 100644 src/main/java/de/dj_steam/bot/moving/strategy/TurnStrategy.java create mode 100644 src/test/java/de/dj_steam/bot/RobotEngineTest.java create mode 100644 src/test/java/de/dj_steam/bot/moving/DirectionCalculatorTest.java create mode 100644 src/test/java/de/dj_steam/bot/moving/LoopedDirectionsArrayListTest.java diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..8860594 --- /dev/null +++ b/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + + toy-bot + de.dj_steam.toybot + 1.0-SNAPSHOT + + + + + org.slf4j + slf4j-simple + 1.7.25 + + + + org.projectlombok + lombok + 1.16.14 + + + + junit + junit + 4.12 + test + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + \ No newline at end of file diff --git a/src/main/java/de/dj_steam/bot/cli/LoopingConsole.java b/src/main/java/de/dj_steam/bot/cli/LoopingConsole.java new file mode 100644 index 0000000..a0be10b --- /dev/null +++ b/src/main/java/de/dj_steam/bot/cli/LoopingConsole.java @@ -0,0 +1,47 @@ +package de.dj_steam.bot.cli; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +import de.dj_steam.bot.engine.RobotEngine; + +/** + * @author steam + */ + +public class LoopingConsole { + + private static final String EXIT_COMMAND = "exit"; + + public static void main(final String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + printUsageBanner(); + + while (true) { + RobotEngine robotEngine = new RobotEngine(); + System.out.print("> "); + String input = br.readLine(); + robotEngine.commandBot(input); + + if (input.trim().toLowerCase().equals(EXIT_COMMAND)) { + System.out.println("exiting"); + return; + } + } + } + + private static void printUsageBanner() { + System.out.println("####################################################"); + System.out.println("Commands:"); + System.out.println("PLACE X,Y,F - place robot on position X,Y - coordinates, and direction (NORTH|SOUTH|WEST|EAST)"); + System.out.println("MOVE - change the robot to the next field in facing direction"); + System.out.println("LEFT - turn the robot to the left"); + System.out.println("RIGHT - turn the robot to the right"); + System.out.println("REPORT - show robots position and facing direction"); + System.out.println("exit - exit the application"); + System.out.println("####################################################"); + System.out.println("Enter a command or '" + EXIT_COMMAND + "' to quit"); + } +} diff --git a/src/main/java/de/dj_steam/bot/domain/Direction.java b/src/main/java/de/dj_steam/bot/domain/Direction.java new file mode 100644 index 0000000..1105363 --- /dev/null +++ b/src/main/java/de/dj_steam/bot/domain/Direction.java @@ -0,0 +1,11 @@ +package de.dj_steam.bot.domain; + +/** + * @author steam + */ +public enum Direction { + NORTH, + EAST, + SOUTH, + WEST +} diff --git a/src/main/java/de/dj_steam/bot/domain/Position.java b/src/main/java/de/dj_steam/bot/domain/Position.java new file mode 100644 index 0000000..4331245 --- /dev/null +++ b/src/main/java/de/dj_steam/bot/domain/Position.java @@ -0,0 +1,26 @@ +package de.dj_steam.bot.domain; + +import lombok.Getter; +import lombok.ToString; + +/** + * @author steam + */ + +@Getter +@ToString +public class Position { + private int x; + private int y; + + public Position() { + this.x = 0; + this.y = 0; + } + + public Position(final int x, final int y) { + this.x = x; + this.y = y; + } + +} diff --git a/src/main/java/de/dj_steam/bot/domain/ToyBot.java b/src/main/java/de/dj_steam/bot/domain/ToyBot.java new file mode 100644 index 0000000..d02e197 --- /dev/null +++ b/src/main/java/de/dj_steam/bot/domain/ToyBot.java @@ -0,0 +1,24 @@ +package de.dj_steam.bot.domain; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +/** + * @author steam + */ + +@Getter +@Setter +@ToString +public class ToyBot { + + private Direction direction; + private Position position; + + public ToyBot(final Direction direction, final Position position) { + this.direction = direction; + this.position = position; + } + +} diff --git a/src/main/java/de/dj_steam/bot/domain/ToyBotField.java b/src/main/java/de/dj_steam/bot/domain/ToyBotField.java new file mode 100644 index 0000000..5cfa608 --- /dev/null +++ b/src/main/java/de/dj_steam/bot/domain/ToyBotField.java @@ -0,0 +1,12 @@ +package de.dj_steam.bot.domain; + +import lombok.Getter; + +/** + * @author steam + */ +@Getter +public class ToyBotField { + private int width = 5; + private int height = 5; +} diff --git a/src/main/java/de/dj_steam/bot/engine/RobotEngine.java b/src/main/java/de/dj_steam/bot/engine/RobotEngine.java new file mode 100644 index 0000000..3519b27 --- /dev/null +++ b/src/main/java/de/dj_steam/bot/engine/RobotEngine.java @@ -0,0 +1,50 @@ +package de.dj_steam.bot.engine; + +import java.util.ArrayList; +import java.util.List; + +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.moving.strategy.ChangingStrategy; +import de.dj_steam.bot.moving.strategy.TurnStrategy; + +/** + * @author steam + */ +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; + + public RobotEngine() { + this.toyBot = new ToyBot(Direction.NORTH, new Position()); + this.toyBotField = new ToyBotField(); + initChangingStrategies(); + } + + public RobotEngine(final ToyBotField toyBotField, final ToyBot toyBot) { + this.toyBotField = toyBotField; + this.toyBot = toyBot; + initChangingStrategies(); + } + + public void commandBot(String command) { + for (ChangingStrategy strategy : changingStrategies) { + strategy.change(toyBot, toyBotField, command); + } + } + + private void initChangingStrategies() { + changingStrategies = new ArrayList<>(); + changingStrategies.add(new TurnStrategy()); + } +} diff --git a/src/main/java/de/dj_steam/bot/moving/DirectionCalculator.java b/src/main/java/de/dj_steam/bot/moving/DirectionCalculator.java new file mode 100644 index 0000000..38691d2 --- /dev/null +++ b/src/main/java/de/dj_steam/bot/moving/DirectionCalculator.java @@ -0,0 +1,32 @@ +package de.dj_steam.bot.moving; + +import java.util.Arrays; + +import de.dj_steam.bot.domain.Direction; +import de.dj_steam.bot.domain.ToyBot; +import de.dj_steam.bot.engine.RobotEngine; + +/** + * @author steam + */ +public class DirectionCalculator { + + private LoopedDirectionsArrayList directions; + + public DirectionCalculator() { + directions = new LoopedDirectionsArrayList(); + directions.addAll(Arrays.asList(Direction.values())); + } + + public Direction calculateNewDirection(ToyBot toyBot, String turnDirection) { + + Direction actualDirection = toyBot.getDirection(); + + if (turnDirection.equals(RobotEngine.TURN_LEFT)) { + return directions.get(directions.indexOf(actualDirection) - 1); + } else if (turnDirection.equals(RobotEngine.TURN_RIGHT)) { + return directions.get(directions.indexOf(actualDirection) + 1); + } + return toyBot.getDirection(); + } +} diff --git a/src/main/java/de/dj_steam/bot/moving/LoopedDirectionsArrayList.java b/src/main/java/de/dj_steam/bot/moving/LoopedDirectionsArrayList.java new file mode 100644 index 0000000..dbf4759 --- /dev/null +++ b/src/main/java/de/dj_steam/bot/moving/LoopedDirectionsArrayList.java @@ -0,0 +1,20 @@ +package de.dj_steam.bot.moving; + +import java.util.ArrayList; + +/** + * @author steam + */ +public class LoopedDirectionsArrayList extends ArrayList { + + @Override + public Direction get(int index) { + if (index < 0) { + return super.get(size() - Math.abs(index)); + } else if (index >= size()) { + return super.get(index - size()); + } else { + return super.get(index); + } + } +} 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 new file mode 100644 index 0000000..f771ac9 --- /dev/null +++ b/src/main/java/de/dj_steam/bot/moving/strategy/ChangingStrategy.java @@ -0,0 +1,11 @@ +package de.dj_steam.bot.moving.strategy; + +import de.dj_steam.bot.domain.ToyBot; +import de.dj_steam.bot.domain.ToyBotField; + +/** + * @author steam + */ +public interface ChangingStrategy { + void change(ToyBot toyBot, ToyBotField toyBotField, String command); +} 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 new file mode 100644 index 0000000..559d8a2 --- /dev/null +++ b/src/main/java/de/dj_steam/bot/moving/strategy/TurnStrategy.java @@ -0,0 +1,25 @@ +package de.dj_steam.bot.moving.strategy; + +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; + +/** + * @author steam + */ +public class TurnStrategy implements ChangingStrategy { + + private DirectionCalculator directionCalculator; + + public TurnStrategy() { + directionCalculator = new DirectionCalculator(); + } + + @Override + public void change(ToyBot toyBot, ToyBotField toyBotField, String command) { + if (command.equals(RobotEngine.TURN_LEFT) || command.equals(RobotEngine.TURN_RIGHT)) { + toyBot.setDirection(directionCalculator.calculateNewDirection(toyBot, command)); + } + } +} diff --git a/src/test/java/de/dj_steam/bot/RobotEngineTest.java b/src/test/java/de/dj_steam/bot/RobotEngineTest.java new file mode 100644 index 0000000..b60a91d --- /dev/null +++ b/src/test/java/de/dj_steam/bot/RobotEngineTest.java @@ -0,0 +1,63 @@ +package de.dj_steam.bot; + +import static org.junit.Assert.assertEquals; + +import org.junit.Before; +import org.junit.Test; + +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 steam + */ +public class RobotEngineTest { + + private RobotEngine robotEngine; + private ToyBot toyBot; + + private ToyBotField toyBotField = new ToyBotField(); + + @Before + public void setup() { + toyBot = new ToyBot(Direction.NORTH, new Position()); + robotEngine = new RobotEngine(toyBotField, toyBot); + } + + @Test + public void testTurnLeftCommand() { + assertEquals(Direction.NORTH, toyBot.getDirection()); + + robotEngine.commandBot(RobotEngine.TURN_LEFT); + assertEquals(Direction.WEST, toyBot.getDirection()); + + robotEngine.commandBot(RobotEngine.TURN_LEFT); + assertEquals(Direction.SOUTH, toyBot.getDirection()); + + robotEngine.commandBot(RobotEngine.TURN_LEFT); + assertEquals(Direction.EAST, toyBot.getDirection()); + + robotEngine.commandBot(RobotEngine.TURN_LEFT); + assertEquals(Direction.NORTH, toyBot.getDirection()); + } + + @Test + public void testTurnRightCommand() { + assertEquals(Direction.NORTH, toyBot.getDirection()); + + robotEngine.commandBot(RobotEngine.TURN_RIGHT); + assertEquals(Direction.EAST, toyBot.getDirection()); + + robotEngine.commandBot(RobotEngine.TURN_RIGHT); + assertEquals(Direction.SOUTH, toyBot.getDirection()); + + robotEngine.commandBot(RobotEngine.TURN_RIGHT); + assertEquals(Direction.WEST, toyBot.getDirection()); + + robotEngine.commandBot(RobotEngine.TURN_RIGHT); + 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 new file mode 100644 index 0000000..9a33baa --- /dev/null +++ b/src/test/java/de/dj_steam/bot/moving/DirectionCalculatorTest.java @@ -0,0 +1,37 @@ +package de.dj_steam.bot.moving; + +import static org.junit.Assert.assertEquals; + +import org.junit.Before; +import org.junit.Test; + +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 + */ +public class DirectionCalculatorTest { + + private DirectionCalculator directionCalculator; + + @Before + public void setup() { + directionCalculator = new DirectionCalculator(); + } + + @Test + public void testCalculateOnTurnLeft() { + ToyBot toyBot = new ToyBot(Direction.NORTH, new Position()); + assertEquals(Direction.WEST, directionCalculator.calculateNewDirection(toyBot, RobotEngine.TURN_LEFT)); + } + + @Test + public void testCalculateOnTurnRight() { + ToyBot toyBot = new ToyBot(Direction.NORTH, new Position()); + assertEquals(Direction.EAST, directionCalculator.calculateNewDirection(toyBot, RobotEngine.TURN_RIGHT)); + } + +} \ No newline at end of file diff --git a/src/test/java/de/dj_steam/bot/moving/LoopedDirectionsArrayListTest.java b/src/test/java/de/dj_steam/bot/moving/LoopedDirectionsArrayListTest.java new file mode 100644 index 0000000..09951be --- /dev/null +++ b/src/test/java/de/dj_steam/bot/moving/LoopedDirectionsArrayListTest.java @@ -0,0 +1,45 @@ +package de.dj_steam.bot.moving; + +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; + +import org.junit.Before; +import org.junit.Test; + +import de.dj_steam.bot.domain.Direction; + +/** + * @author steam + */ +public class LoopedDirectionsArrayListTest { + private LoopedDirectionsArrayList directions; + + @Before + public void setup() { + directions = new LoopedDirectionsArrayList(); + directions.addAll(Arrays.asList(Direction.values())); + } + + @Test + public void testLoopedArrayInitialisation() { + assertEquals(Direction.NORTH, directions.get(0)); + assertEquals(Direction.EAST, directions.get(1)); + assertEquals(Direction.SOUTH, directions.get(2)); + assertEquals(Direction.WEST, directions.get(3)); + } + + @Test + public void testBorderOverlapping() { + assertEquals(Direction.NORTH, directions.get(4)); + assertEquals(Direction.EAST, directions.get(5)); + assertEquals(Direction.SOUTH, directions.get(6)); + assertEquals(Direction.WEST, directions.get(7)); + + assertEquals(Direction.WEST, directions.get(-1)); + assertEquals(Direction.SOUTH, directions.get(-2)); + assertEquals(Direction.EAST, directions.get(-3)); + assertEquals(Direction.NORTH, directions.get(-4)); + } + +} \ No newline at end of file From 516eb6a4eb57a5d81e6292bc936b3d93c475bf62 Mon Sep 17 00:00:00 2001 From: poweronoff Date: Fri, 21 Apr 2017 23:01:58 +0200 Subject: [PATCH 03/23] [bugfix] - avoid create new instance of RobotEngine on every command --- src/main/java/de/dj_steam/bot/cli/LoopingConsole.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 a0be10b..21a3e91 100644 --- a/src/main/java/de/dj_steam/bot/cli/LoopingConsole.java +++ b/src/main/java/de/dj_steam/bot/cli/LoopingConsole.java @@ -19,8 +19,9 @@ public class LoopingConsole { printUsageBanner(); + RobotEngine robotEngine = new RobotEngine(); + while (true) { - RobotEngine robotEngine = new RobotEngine(); System.out.print("> "); String input = br.readLine(); robotEngine.commandBot(input); From c36b562fb09e95682650c88660bcecf1ff78a55c Mon Sep 17 00:00:00 2001 From: poweronoff Date: Fri, 21 Apr 2017 23:02:21 +0200 Subject: [PATCH 04/23] ReportStrategy is added --- .../de/dj_steam/bot/engine/RobotEngine.java | 2 ++ .../bot/moving/strategy/ReportStrategy.java | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 src/main/java/de/dj_steam/bot/moving/strategy/ReportStrategy.java 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 3519b27..b198c66 100644 --- a/src/main/java/de/dj_steam/bot/engine/RobotEngine.java +++ b/src/main/java/de/dj_steam/bot/engine/RobotEngine.java @@ -8,6 +8,7 @@ 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.moving.strategy.ChangingStrategy; +import de.dj_steam.bot.moving.strategy.ReportStrategy; import de.dj_steam.bot.moving.strategy.TurnStrategy; /** @@ -46,5 +47,6 @@ public class RobotEngine { private void initChangingStrategies() { changingStrategies = new ArrayList<>(); changingStrategies.add(new TurnStrategy()); + changingStrategies.add(new ReportStrategy()); } } 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 new file mode 100644 index 0000000..e4fc064 --- /dev/null +++ b/src/main/java/de/dj_steam/bot/moving/strategy/ReportStrategy.java @@ -0,0 +1,17 @@ +package de.dj_steam.bot.moving.strategy; + +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)) { + System.out.println(toyBot); + } + } +} From 105ee886ad29d5fbf0932228612103ef014b0972 Mon Sep 17 00:00:00 2001 From: poweronoff Date: Fri, 21 Apr 2017 23:11:24 +0200 Subject: [PATCH 05/23] small code enhancement --- .../de/dj_steam/bot/moving/strategy/ReportStrategy.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 e4fc064..b7baab6 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 @@ -11,7 +11,11 @@ public class ReportStrategy implements ChangingStrategy { @Override public void change(ToyBot toyBot, ToyBotField toyBotField, String command) { if (command.equals(RobotEngine.REPORT)) { - System.out.println(toyBot); + printReport(toyBot); } } + + private void printReport(final ToyBot toyBot) { + System.out.println(toyBot); + } } From da8d281b45670adf0ab107a5325053babbee8c6a Mon Sep 17 00:00:00 2001 From: poweronoff Date: Sat, 22 Apr 2017 13:14:05 +0200 Subject: [PATCH 06/23] move RobotEngineTest to the right place --- .../java/de/dj_steam/bot/{ => engine}/RobotEngineTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) rename src/test/java/de/dj_steam/bot/{ => engine}/RobotEngineTest.java (96%) diff --git a/src/test/java/de/dj_steam/bot/RobotEngineTest.java b/src/test/java/de/dj_steam/bot/engine/RobotEngineTest.java similarity index 96% rename from src/test/java/de/dj_steam/bot/RobotEngineTest.java rename to src/test/java/de/dj_steam/bot/engine/RobotEngineTest.java index b60a91d..a69e880 100644 --- a/src/test/java/de/dj_steam/bot/RobotEngineTest.java +++ b/src/test/java/de/dj_steam/bot/engine/RobotEngineTest.java @@ -1,4 +1,4 @@ -package de.dj_steam.bot; +package de.dj_steam.bot.engine; import static org.junit.Assert.assertEquals; @@ -9,7 +9,6 @@ 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 steam From 2a1566b45468bafddc080bc665c1db17ef1a8459 Mon Sep 17 00:00:00 2001 From: poweronoff Date: Sat, 22 Apr 2017 13:14:24 +0200 Subject: [PATCH 07/23] added unit test for the TurnStrategy --- .../bot/moving/strategy/TurnStrategyTest.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/test/java/de/dj_steam/bot/moving/strategy/TurnStrategyTest.java 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 new file mode 100644 index 0000000..6b8d855 --- /dev/null +++ b/src/test/java/de/dj_steam/bot/moving/strategy/TurnStrategyTest.java @@ -0,0 +1,42 @@ +package de.dj_steam.bot.moving.strategy; + +import static org.junit.Assert.assertEquals; + +import org.junit.Before; +import org.junit.Test; + +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 + */ +public class TurnStrategyTest { + + private TurnStrategy turnStrategy; + private ToyBot toyBot; + + @Before + public void setup() { + turnStrategy = new TurnStrategy(); + toyBot = new ToyBot(Direction.NORTH, new Position()); + } + + @Test + public void testTurnLeft() { + assertEquals(Direction.NORTH, toyBot.getDirection()); + turnStrategy.change(toyBot, new ToyBotField(), RobotEngine.TURN_LEFT); + assertEquals(Direction.WEST, toyBot.getDirection()); + } + + @Test + public void testTurnRight() { + assertEquals(Direction.NORTH, toyBot.getDirection()); + turnStrategy.change(toyBot, new ToyBotField(), RobotEngine.TURN_RIGHT); + assertEquals(Direction.EAST, toyBot.getDirection()); + } + +} \ No newline at end of file From 737d4a61caa772ca4ec2d55fbdb466ea7197c216 Mon Sep 17 00:00:00 2001 From: poweronoff Date: Sat, 22 Apr 2017 16:07:23 +0200 Subject: [PATCH 08/23] added new Command abstraction to transport commands with parameters (f.e. PLACE X,Y,F) --- pom.xml | 6 +++ .../bot/cli/InvalidUserInputException.java | 8 ++++ .../de/dj_steam/bot/cli/LoopingConsole.java | 23 +++++++++- .../java/de/dj_steam/bot/domain/Command.java | 29 +++++++++++++ .../de/dj_steam/bot/engine/RobotEngine.java | 9 +--- .../bot/moving/DirectionCalculator.java | 8 ++-- .../bot/moving/strategy/ChangingStrategy.java | 3 +- .../bot/moving/strategy/ReportStrategy.java | 6 +-- .../bot/moving/strategy/TurnStrategy.java | 6 +-- .../dj_steam/bot/cli/LoopingConsoleTest.java | 42 +++++++++++++++++++ .../dj_steam/bot/engine/RobotEngineTest.java | 23 ++++++---- .../bot/moving/DirectionCalculatorTest.java | 8 ++-- .../bot/moving/strategy/TurnStrategyTest.java | 10 +++-- 13 files changed, 147 insertions(+), 34 deletions(-) create mode 100644 src/main/java/de/dj_steam/bot/cli/InvalidUserInputException.java create mode 100644 src/main/java/de/dj_steam/bot/domain/Command.java create mode 100644 src/test/java/de/dj_steam/bot/cli/LoopingConsoleTest.java 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()); } From de00d0cff39c09927f6c5e15d03687fe71cb97bd Mon Sep 17 00:00:00 2001 From: poweronoff Date: Sat, 22 Apr 2017 16:15:32 +0200 Subject: [PATCH 09/23] rudimentary user input error handling --- src/main/java/de/dj_steam/bot/cli/LoopingConsole.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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 b97a520..ac6d53f 100644 --- a/src/main/java/de/dj_steam/bot/cli/LoopingConsole.java +++ b/src/main/java/de/dj_steam/bot/cli/LoopingConsole.java @@ -29,7 +29,12 @@ public class LoopingConsole { while (true) { System.out.print("> "); String input = br.readLine(); - robotEngine.commandBot(createCommand(input)); + try { + robotEngine.commandBot(createCommand(input)); + }catch (InvalidUserInputException e) { + System.out.println("\nInput error occurred! Message: " + e.getMessage() +"\n"); + printUsageBanner(); + } if (input.trim().toLowerCase().equals(EXIT_COMMAND)) { System.out.println("exiting"); From 5ce81892841450f68e99d96e90cd8e3ddc02c19a Mon Sep 17 00:00:00 2001 From: poweronoff Date: Sat, 22 Apr 2017 17:26:00 +0200 Subject: [PATCH 10/23] implement place strategy, some improvements --- .../de/dj_steam/bot/cli/LoopingConsole.java | 2 +- .../java/de/dj_steam/bot/domain/Command.java | 9 ++ .../java/de/dj_steam/bot/domain/Position.java | 2 + .../de/dj_steam/bot/domain/ToyBotField.java | 4 +- .../de/dj_steam/bot/engine/RobotEngine.java | 4 +- .../bot/moving/strategy/ChangingStrategy.java | 6 ++ .../bot/moving/strategy/PlaceStrategy.java | 45 ++++++++++ .../bot/moving/strategy/ReportStrategy.java | 2 +- .../bot/moving/strategy/TurnStrategy.java | 2 +- .../dj_steam/bot/engine/RobotEngineTest.java | 22 +++++ .../moving/strategy/PlaceStrategyTest.java | 82 +++++++++++++++++++ 11 files changed, 174 insertions(+), 6 deletions(-) create mode 100644 src/main/java/de/dj_steam/bot/moving/strategy/PlaceStrategy.java create mode 100644 src/test/java/de/dj_steam/bot/moving/strategy/PlaceStrategyTest.java 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 ac6d53f..4474b27 100644 --- a/src/main/java/de/dj_steam/bot/cli/LoopingConsole.java +++ b/src/main/java/de/dj_steam/bot/cli/LoopingConsole.java @@ -17,7 +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 = " "; + private static final String COMMAND_DELIMITER = " "; public static void main(final String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); diff --git a/src/main/java/de/dj_steam/bot/domain/Command.java b/src/main/java/de/dj_steam/bot/domain/Command.java index d52104a..1da4b86 100644 --- a/src/main/java/de/dj_steam/bot/domain/Command.java +++ b/src/main/java/de/dj_steam/bot/domain/Command.java @@ -1,5 +1,6 @@ package de.dj_steam.bot.domain; +import java.util.List; import java.util.Optional; import lombok.EqualsAndHashCode; @@ -7,6 +8,13 @@ import lombok.Getter; /** * @author steam + * + * this is a general command implementation. + * + * The arguments as {@link String} is intentionally, to be flexible + * define some different argument formats. + * + * Use some kind of {@link List} for arguments in futher implementations. */ @Getter @@ -20,6 +28,7 @@ public class Command { public static final String REPORT = "REPORT"; private String command; + private Optional arguments; public Command(final String command, Optional arguments) { diff --git a/src/main/java/de/dj_steam/bot/domain/Position.java b/src/main/java/de/dj_steam/bot/domain/Position.java index 4331245..f8d5aee 100644 --- a/src/main/java/de/dj_steam/bot/domain/Position.java +++ b/src/main/java/de/dj_steam/bot/domain/Position.java @@ -1,5 +1,6 @@ package de.dj_steam.bot.domain; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.ToString; @@ -9,6 +10,7 @@ import lombok.ToString; @Getter @ToString +@EqualsAndHashCode public class Position { private int x; private int y; diff --git a/src/main/java/de/dj_steam/bot/domain/ToyBotField.java b/src/main/java/de/dj_steam/bot/domain/ToyBotField.java index 5cfa608..88190d3 100644 --- a/src/main/java/de/dj_steam/bot/domain/ToyBotField.java +++ b/src/main/java/de/dj_steam/bot/domain/ToyBotField.java @@ -7,6 +7,6 @@ import lombok.Getter; */ @Getter public class ToyBotField { - private int width = 5; - private int height = 5; + private int width = 4; + private int height = 4; } 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 2c707f9..f0342b9 100644 --- a/src/main/java/de/dj_steam/bot/engine/RobotEngine.java +++ b/src/main/java/de/dj_steam/bot/engine/RobotEngine.java @@ -9,6 +9,7 @@ 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.moving.strategy.ChangingStrategy; +import de.dj_steam.bot.moving.strategy.PlaceStrategy; import de.dj_steam.bot.moving.strategy.ReportStrategy; import de.dj_steam.bot.moving.strategy.TurnStrategy; @@ -27,7 +28,7 @@ public class RobotEngine { initChangingStrategies(); } - public RobotEngine(final ToyBotField toyBotField, final ToyBot toyBot) { + RobotEngine(final ToyBotField toyBotField, final ToyBot toyBot) { this.toyBotField = toyBotField; this.toyBot = toyBot; initChangingStrategies(); @@ -43,5 +44,6 @@ public class RobotEngine { changingStrategies = new ArrayList<>(); changingStrategies.add(new TurnStrategy()); changingStrategies.add(new ReportStrategy()); + changingStrategies.add(new PlaceStrategy()); } } 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 4bee235..2dad9bb 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 @@ -6,7 +6,13 @@ import de.dj_steam.bot.domain.ToyBotField; /** * @author steam + * + * this strategy defines how the robot will be manipulated + * implement this, if new change variant is wanted. + * + * use {@link Command} to define new commans to implement */ + public interface ChangingStrategy { void change(ToyBot toyBot, ToyBotField toyBotField, Command command); } diff --git a/src/main/java/de/dj_steam/bot/moving/strategy/PlaceStrategy.java b/src/main/java/de/dj_steam/bot/moving/strategy/PlaceStrategy.java new file mode 100644 index 0000000..f12b7b7 --- /dev/null +++ b/src/main/java/de/dj_steam/bot/moving/strategy/PlaceStrategy.java @@ -0,0 +1,45 @@ +package de.dj_steam.bot.moving.strategy; + +import org.apache.commons.lang3.EnumUtils; +import org.apache.commons.lang3.StringUtils; + +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; + +/** + * @author steam + */ +public class PlaceStrategy implements ChangingStrategy { + + @Override + public void change(ToyBot toyBot, ToyBotField toyBotField, Command command) { + if (command.getCommand().equals(Command.PLACE) && + isPlaceCommandValid(command) && + canBePlaced(toyBotField, command)) { + String[] arguments = command.getArguments().get().split(","); + + toyBot.setPosition(new Position(Integer.parseInt(arguments[0].trim()), Integer.parseInt(arguments[1].trim()))); + toyBot.setDirection(Direction.valueOf(arguments[2].trim())); + } + } + + boolean isPlaceCommandValid(Command command) { + if (command.getArguments().isPresent()) { + String[] arguments = command.getArguments().get().split(","); + return arguments.length == 3 && + StringUtils.isNumeric(arguments[0].trim()) && + StringUtils.isNumeric(arguments[1].trim()) && + EnumUtils.isValidEnum(Direction.class, arguments[2].trim()); + } + return false; + } + + boolean canBePlaced(final ToyBotField toyBotField, final Command command) { + String[] arguments = command.getArguments().get().split(","); + return (toyBotField.getWidth() >= Integer.parseInt(arguments[0].trim()) && + toyBotField.getHeight() >= Integer.parseInt(arguments[1].trim())); + } +} 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 22e5825..2e2199c 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 @@ -9,7 +9,7 @@ import de.dj_steam.bot.domain.ToyBotField; */ public class ReportStrategy implements ChangingStrategy { @Override - public void change(ToyBot toyBot, ToyBotField toyBotField, Command command) { + public void change(final ToyBot toyBot, final ToyBotField toyBotField, final 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 8155461..a076af6 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 @@ -17,7 +17,7 @@ public class TurnStrategy implements ChangingStrategy { } @Override - public void change(ToyBot toyBot, ToyBotField toyBotField, Command command) { + public void change(final ToyBot toyBot, final ToyBotField toyBotField, final 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/engine/RobotEngineTest.java b/src/test/java/de/dj_steam/bot/engine/RobotEngineTest.java index 65579d6..8d62bd1 100644 --- a/src/test/java/de/dj_steam/bot/engine/RobotEngineTest.java +++ b/src/test/java/de/dj_steam/bot/engine/RobotEngineTest.java @@ -66,4 +66,26 @@ public class RobotEngineTest { robotEngine.commandBot(turnRightCommand); assertEquals(Direction.NORTH, toyBot.getDirection()); } + + @Test + public void testPlaceCommand() { + Command placeCommand = new Command(Command.PLACE, Optional.empty()); + assertEquals(new Position(0, 0), toyBot.getPosition()); + + robotEngine.commandBot(placeCommand); + assertEquals(new Position(0, 0), toyBot.getPosition()); + + placeCommand = new Command(Command.PLACE, Optional.of("0,2,NORTH")); + robotEngine.commandBot(placeCommand); + assertEquals(new Position(0, 2), toyBot.getPosition()); + + placeCommand = new Command(Command.PLACE, Optional.of("5,1,NORTH")); + robotEngine.commandBot(placeCommand); + assertEquals(new Position(0, 2), toyBot.getPosition()); + + placeCommand = new Command(Command.PLACE, Optional.of("0,3,WEST")); + robotEngine.commandBot(placeCommand); + assertEquals(new Position(0,3), toyBot.getPosition()); + assertEquals(Direction.WEST, toyBot.getDirection()); + } } \ No newline at end of file diff --git a/src/test/java/de/dj_steam/bot/moving/strategy/PlaceStrategyTest.java b/src/test/java/de/dj_steam/bot/moving/strategy/PlaceStrategyTest.java new file mode 100644 index 0000000..3bfa661 --- /dev/null +++ b/src/test/java/de/dj_steam/bot/moving/strategy/PlaceStrategyTest.java @@ -0,0 +1,82 @@ +package de.dj_steam.bot.moving.strategy; + +import static junit.framework.TestCase.assertFalse; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +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; + +/** + * @author steam + */ +public class PlaceStrategyTest { + + private PlaceStrategy placeStrategy; + private ToyBot toyBot; + + @Before + public void setup() { + placeStrategy = new PlaceStrategy(); + toyBot = new ToyBot(Direction.NORTH, new Position(0, 0)); + } + + @Test + public void testPlaceCommandValid() { + assertTrue(placeStrategy.isPlaceCommandValid(new Command(Command.PLACE, Optional.of("1,2,EAST")))); + assertTrue(placeStrategy.isPlaceCommandValid(new Command(Command.PLACE, Optional.of("1 ,2 ,EAST")))); + assertTrue(placeStrategy.isPlaceCommandValid(new Command(Command.PLACE, Optional.of("1 ,2,EAST")))); + assertTrue(placeStrategy.isPlaceCommandValid(new Command(Command.PLACE, Optional.of("1 ,2, EAST ")))); + } + + @Test + public void testPlaceCommandInvalid() { + assertFalse(placeStrategy.isPlaceCommandValid(new Command(Command.PLACE, Optional.empty()))); + assertFalse(placeStrategy.isPlaceCommandValid(new Command(Command.PLACE, Optional.of("a,2,EAST")))); + assertFalse(placeStrategy.isPlaceCommandValid(new Command(Command.PLACE, Optional.of("1,2,NOTHING")))); + assertFalse(placeStrategy.isPlaceCommandValid(new Command(Command.PLACE, Optional.of("1,2")))); + assertFalse(placeStrategy.isPlaceCommandValid(new Command(Command.PLACE, Optional.of("a")))); + assertFalse(placeStrategy.isPlaceCommandValid(new Command(Command.PLACE, Optional.of("a,")))); + + } + + @Test + public void testNotCanBePlaced() { + assertFalse(placeStrategy.canBePlaced(new ToyBotField(), new Command(Command.PLACE, Optional.of("5,5,EAST")))); + assertFalse(placeStrategy.canBePlaced(new ToyBotField(), new Command(Command.PLACE, Optional.of("4,5,EAST")))); + assertFalse(placeStrategy.canBePlaced(new ToyBotField(), new Command(Command.PLACE, Optional.of("5,4,EAST")))); + } + + @Test + public void testCanBePlaced() { + assertTrue(placeStrategy.canBePlaced(new ToyBotField(), new Command(Command.PLACE, Optional.of("0,0,EAST")))); + assertTrue(placeStrategy.canBePlaced(new ToyBotField(), new Command(Command.PLACE, Optional.of("4,4,EAST")))); + assertTrue(placeStrategy.canBePlaced(new ToyBotField(), new Command(Command.PLACE, Optional.of("4 , 4 ,EAST")))); + } + + @Test + public void testPlaceStrategyPositiveTest() { + placeStrategy.change(toyBot, new ToyBotField(), new Command(Command.PLACE, Optional.of("0,2,NORTH"))); + assertEquals(new Position(0, 2), toyBot.getPosition()); + } + + @Test + public void testPlaceStrategyNegativeTest() { + placeStrategy.change(toyBot, new ToyBotField(), new Command(Command.PLACE, Optional.of("5,2,NORTH"))); + assertEquals(new Position(0, 0), toyBot.getPosition()); + } + + @Test + public void testPlaceStrategyDirection() { + placeStrategy.change(toyBot, new ToyBotField(), new Command(Command.PLACE, Optional.of("0,2,WEST"))); + assertEquals(Direction.WEST, toyBot.getDirection()); + } +} \ No newline at end of file From 1b7e21c8ee98ede2dee7085f32c1ff1f85b9150d Mon Sep 17 00:00:00 2001 From: poweronoff Date: Sat, 22 Apr 2017 21:45:45 +0200 Subject: [PATCH 11/23] maven builds now executable jar --- pom.xml | 49 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 45 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 5be2fdb..272f23e 100644 --- a/pom.xml +++ b/pom.xml @@ -7,6 +7,11 @@ toy-bot de.dj_steam.toybot 1.0-SNAPSHOT + jar + + + UTF-8 + @@ -39,18 +44,54 @@ - - org.springframework.boot - spring-boot-maven-plugin - org.apache.maven.plugins maven-compiler-plugin + 3.6.1 1.8 1.8 + + maven-clean-plugin + 3.0.0 + + + auto-clean + initialize + + clean + + + + + + maven-assembly-plugin + + + package + + single + + + + + + + de.dj_steam.bot.cli.LoopingConsole + + + + jar-with-dependencies + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + \ No newline at end of file From 6c9740bf4ec0315d03bb331221f6f65301709878 Mon Sep 17 00:00:00 2001 From: poweronoff Date: Sat, 22 Apr 2017 21:46:05 +0200 Subject: [PATCH 12/23] move strategy implemented --- .../de/dj_steam/bot/domain/ToyBotField.java | 8 ++ .../de/dj_steam/bot/engine/RobotEngine.java | 2 + .../bot/moving/strategy/MoveStrategy.java | 37 ++++++ .../bot/moving/strategy/PlaceStrategy.java | 3 +- .../dj_steam/bot/domain/ToyBotFieldTest.java | 26 +++++ .../dj_steam/bot/engine/RobotEngineTest.java | 60 +++++++++- .../bot/moving/strategy/MoveStrategyTest.java | 106 ++++++++++++++++++ 7 files changed, 234 insertions(+), 8 deletions(-) create mode 100644 src/main/java/de/dj_steam/bot/moving/strategy/MoveStrategy.java create mode 100644 src/test/java/de/dj_steam/bot/domain/ToyBotFieldTest.java create mode 100644 src/test/java/de/dj_steam/bot/moving/strategy/MoveStrategyTest.java diff --git a/src/main/java/de/dj_steam/bot/domain/ToyBotField.java b/src/main/java/de/dj_steam/bot/domain/ToyBotField.java index 88190d3..860b569 100644 --- a/src/main/java/de/dj_steam/bot/domain/ToyBotField.java +++ b/src/main/java/de/dj_steam/bot/domain/ToyBotField.java @@ -9,4 +9,12 @@ import lombok.Getter; public class ToyBotField { private int width = 4; private int height = 4; + + public boolean isInsideTheField(final Position position) { + return (position.getX() >= 0 && + position.getY() >= 0 && + position.getX() <= width && + position.getY() <= height); + } + } 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 f0342b9..cab6515 100644 --- a/src/main/java/de/dj_steam/bot/engine/RobotEngine.java +++ b/src/main/java/de/dj_steam/bot/engine/RobotEngine.java @@ -9,6 +9,7 @@ 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.moving.strategy.ChangingStrategy; +import de.dj_steam.bot.moving.strategy.MoveStrategy; import de.dj_steam.bot.moving.strategy.PlaceStrategy; import de.dj_steam.bot.moving.strategy.ReportStrategy; import de.dj_steam.bot.moving.strategy.TurnStrategy; @@ -45,5 +46,6 @@ public class RobotEngine { changingStrategies.add(new TurnStrategy()); changingStrategies.add(new ReportStrategy()); changingStrategies.add(new PlaceStrategy()); + changingStrategies.add(new MoveStrategy()); } } diff --git a/src/main/java/de/dj_steam/bot/moving/strategy/MoveStrategy.java b/src/main/java/de/dj_steam/bot/moving/strategy/MoveStrategy.java new file mode 100644 index 0000000..13f7e4d --- /dev/null +++ b/src/main/java/de/dj_steam/bot/moving/strategy/MoveStrategy.java @@ -0,0 +1,37 @@ +package de.dj_steam.bot.moving.strategy; + +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; + +/** + * @author steam + */ +public class MoveStrategy implements ChangingStrategy { + @Override + public void change(final ToyBot toyBot, final ToyBotField toyBotField, final Command command) { + if (command.getCommand().equals(Command.MOVE)) { + Position newPosition = toyBot.getPosition(); + + // TODO - refactor this ugly code + if (toyBot.getDirection().equals(Direction.NORTH)) { + newPosition = new Position(toyBot.getPosition().getX(), toyBot.getPosition().getY() + 1); + } else if (toyBot.getDirection().equals(Direction.EAST)) { + newPosition = new Position(toyBot.getPosition().getX() + 1, toyBot.getPosition().getY()); + } else if (toyBot.getDirection().equals(Direction.SOUTH)) { + newPosition = new Position(toyBot.getPosition().getX(), toyBot.getPosition().getY() - 1); + } else if (toyBot.getDirection().equals(Direction.WEST)) { + newPosition = new Position(toyBot.getPosition().getX() - 1, toyBot.getPosition().getY()); + } + setNewPosition(toyBot, toyBotField, newPosition); + } + } + + private void setNewPosition(ToyBot toyBot, final ToyBotField toyBotField, Position position) { + if (toyBotField.isInsideTheField(position)) { + toyBot.setPosition(position); + } + } +} diff --git a/src/main/java/de/dj_steam/bot/moving/strategy/PlaceStrategy.java b/src/main/java/de/dj_steam/bot/moving/strategy/PlaceStrategy.java index f12b7b7..9835963 100644 --- a/src/main/java/de/dj_steam/bot/moving/strategy/PlaceStrategy.java +++ b/src/main/java/de/dj_steam/bot/moving/strategy/PlaceStrategy.java @@ -39,7 +39,6 @@ public class PlaceStrategy implements ChangingStrategy { boolean canBePlaced(final ToyBotField toyBotField, final Command command) { String[] arguments = command.getArguments().get().split(","); - return (toyBotField.getWidth() >= Integer.parseInt(arguments[0].trim()) && - toyBotField.getHeight() >= Integer.parseInt(arguments[1].trim())); + return toyBotField.isInsideTheField(new Position(Integer.parseInt(arguments[0].trim()),Integer.parseInt(arguments[1].trim()))); } } diff --git a/src/test/java/de/dj_steam/bot/domain/ToyBotFieldTest.java b/src/test/java/de/dj_steam/bot/domain/ToyBotFieldTest.java new file mode 100644 index 0000000..e2c9b41 --- /dev/null +++ b/src/test/java/de/dj_steam/bot/domain/ToyBotFieldTest.java @@ -0,0 +1,26 @@ +package de.dj_steam.bot.domain; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * @author steam + */ +public class ToyBotFieldTest { + @Test + public void isInsideTheField() throws Exception { + ToyBotField toyBotField = new ToyBotField(); + assertTrue(toyBotField.isInsideTheField(new Position(0,0))); + assertTrue(toyBotField.isInsideTheField(new Position(4,4))); + + assertFalse(toyBotField.isInsideTheField(new Position( -1,-1))); + assertFalse(toyBotField.isInsideTheField(new Position(5,5))); + + assertFalse(toyBotField.isInsideTheField( new Position(-1,4))); + assertFalse(toyBotField.isInsideTheField( new Position(1,5))); + + } + +} \ 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 8d62bd1..c91c411 100644 --- a/src/test/java/de/dj_steam/bot/engine/RobotEngineTest.java +++ b/src/test/java/de/dj_steam/bot/engine/RobotEngineTest.java @@ -21,18 +21,26 @@ public class RobotEngineTest { private RobotEngine robotEngine; private ToyBot toyBot; + private Command turnLeftCommand; + private Command turnRightCommand; + private Command moveCommand; + private Command placeCommand; + private ToyBotField toyBotField = new ToyBotField(); @Before public void setup() { toyBot = new ToyBot(Direction.NORTH, new Position()); robotEngine = new RobotEngine(toyBotField, toyBot); + turnLeftCommand = new Command(Command.TURN_LEFT, Optional.empty()); + turnRightCommand = new Command(Command.TURN_RIGHT, Optional.empty()); + moveCommand = new Command(Command.MOVE, Optional.empty()); + placeCommand = new Command(Command.PLACE, Optional.empty()); + } @Test public void testTurnLeftCommand() { - Command turnLeftCommand = new Command(Command.TURN_LEFT, Optional.empty()); - assertEquals(Direction.NORTH, toyBot.getDirection()); robotEngine.commandBot(turnLeftCommand); @@ -50,8 +58,6 @@ public class RobotEngineTest { @Test public void testTurnRightCommand() { - - Command turnRightCommand = new Command(Command.TURN_RIGHT, Optional.empty()); assertEquals(Direction.NORTH, toyBot.getDirection()); robotEngine.commandBot(turnRightCommand); @@ -69,7 +75,6 @@ public class RobotEngineTest { @Test public void testPlaceCommand() { - Command placeCommand = new Command(Command.PLACE, Optional.empty()); assertEquals(new Position(0, 0), toyBot.getPosition()); robotEngine.commandBot(placeCommand); @@ -85,7 +90,50 @@ public class RobotEngineTest { placeCommand = new Command(Command.PLACE, Optional.of("0,3,WEST")); robotEngine.commandBot(placeCommand); - assertEquals(new Position(0,3), toyBot.getPosition()); + assertEquals(new Position(0, 3), toyBot.getPosition()); assertEquals(Direction.WEST, toyBot.getDirection()); } + + @Test + public void testMoveCommand() { + assertEquals(new Position(0, 0), toyBot.getPosition()); + assertEquals(Direction.NORTH, toyBot.getDirection()); + + for (int i = 1; i <= 4; i++) { + robotEngine.commandBot(moveCommand); + assertEquals(new Position(0, i), toyBot.getPosition()); + } + + robotEngine.commandBot(moveCommand); + assertEquals(new Position(0, 4), toyBot.getPosition()); + } + + @Test + public void testRunningRobotUiiiiii() { + assertEquals(new Position(0, 0), toyBot.getPosition()); + assertEquals(Direction.NORTH, toyBot.getDirection()); + + robotEngine.commandBot(moveCommand); + assertEquals(new Position(0, 1), toyBot.getPosition()); + assertEquals(Direction.NORTH, toyBot.getDirection()); + + robotEngine.commandBot(turnRightCommand); + assertEquals(Direction.EAST, toyBot.getDirection()); + + for (int i = 0; i <= 3; i++) { + robotEngine.commandBot(moveCommand); + } + + assertEquals(new Position(4, 1), toyBot.getPosition()); + + robotEngine.commandBot(moveCommand); // border + assertEquals(new Position(4, 1), toyBot.getPosition()); + + robotEngine.commandBot(turnLeftCommand); + for (int i = 0; i <= 3; i++) { + robotEngine.commandBot(moveCommand); + } + + assertEquals(new Position(4, 4), toyBot.getPosition()); + } } \ No newline at end of file diff --git a/src/test/java/de/dj_steam/bot/moving/strategy/MoveStrategyTest.java b/src/test/java/de/dj_steam/bot/moving/strategy/MoveStrategyTest.java new file mode 100644 index 0000000..3e8467e --- /dev/null +++ b/src/test/java/de/dj_steam/bot/moving/strategy/MoveStrategyTest.java @@ -0,0 +1,106 @@ +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; + +/** + * @author steam + */ +public class MoveStrategyTest { + + private ToyBotField toyBotField; + private MoveStrategy moveStrategy; + private Command moveCommand; + + + + @Before + public void setup() { + toyBotField = new ToyBotField(); + moveStrategy = new MoveStrategy(); + moveCommand = new Command(Command.MOVE, Optional.empty()); + } + + @Test + public void testMoveToNorthAllowed() { + Position startPosition = new Position(0,0); + ToyBot toyBot = new ToyBot(Direction.NORTH, startPosition); + assertEquals(startPosition, toyBot.getPosition()); + moveStrategy.change(toyBot, toyBotField, moveCommand); + assertEquals(new Position(0,1), toyBot.getPosition()); + } + + @Test + public void testMoveToWestAllowed() { + Position startPosition = new Position(1,0); + ToyBot toyBot = new ToyBot(Direction.WEST, startPosition); + assertEquals(startPosition, toyBot.getPosition()); + moveStrategy.change(toyBot, toyBotField, moveCommand); + assertEquals(new Position(0,0), toyBot.getPosition()); + } + + @Test + public void testMoveToEastAllowed() { + Position startPosition = new Position(0,0); + ToyBot toyBot = new ToyBot(Direction.EAST, startPosition); + assertEquals(startPosition, toyBot.getPosition()); + moveStrategy.change(toyBot, toyBotField, moveCommand); + assertEquals(new Position(1,0), toyBot.getPosition()); + } + + @Test + public void testMoveToSouthAllowed() { + Position startPosition = new Position(0,1); + ToyBot toyBot = new ToyBot(Direction.EAST, startPosition); + assertEquals(startPosition, toyBot.getPosition()); + moveStrategy.change(toyBot, toyBotField, moveCommand); + assertEquals(new Position(1,1), toyBot.getPosition()); + } + + @Test + public void testMoveToEastDisallowed() { + Position startPosition = new Position(4,1); + ToyBot toyBot = new ToyBot(Direction.EAST, startPosition); + assertEquals(startPosition, toyBot.getPosition()); + moveStrategy.change(toyBot, toyBotField, moveCommand); + assertEquals(startPosition, toyBot.getPosition()); + } + + @Test + public void testMoveToSouthDisallowed() { + Position startPosition = new Position(3,0); + ToyBot toyBot = new ToyBot(Direction.SOUTH, startPosition); + assertEquals(startPosition, toyBot.getPosition()); + moveStrategy.change(toyBot, toyBotField, moveCommand); + assertEquals(startPosition, toyBot.getPosition()); + } + + @Test + public void testMoveToWestDisallowed() { + Position startPosition = new Position(0,1); + ToyBot toyBot = new ToyBot(Direction.WEST, startPosition); + assertEquals(startPosition, toyBot.getPosition()); + moveStrategy.change(toyBot, toyBotField, moveCommand); + assertEquals(startPosition, toyBot.getPosition()); + } + + @Test + public void testMoveToNorthDisallowed() { + Position startPosition = new Position(0,4); + ToyBot toyBot = new ToyBot(Direction.WEST, startPosition); + assertEquals(startPosition, toyBot.getPosition()); + moveStrategy.change(toyBot, toyBotField, moveCommand); + assertEquals(startPosition, toyBot.getPosition()); + } + +} \ No newline at end of file From 8336a263a476df2e3a0620d4557d0e740a565cce Mon Sep 17 00:00:00 2001 From: poweronoff Date: Sat, 22 Apr 2017 22:03:21 +0200 Subject: [PATCH 13/23] README.md fix typo --- README.md | 43 ++++++++++++++++++- .../de/dj_steam/bot/cli/LoopingConsole.java | 2 +- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d6a8a74..8eaf1d3 100644 --- a/README.md +++ b/README.md @@ -1 +1,42 @@ -# toy-bot \ No newline at end of file +# toy-bot + +Many thanks to [Lorenzo Sisini](https://github.com/lorenzosisini) for this beautiful experience. + + +#### Requirements +- maven 3 +- oracle JDK 8 + +#### Quick start +- clone the repository +```bash +git clone https://github.com/poweronoff/toy-bot.git +``` +- build the project +````bash +mvn clean package +```` +- run it +```bash +java -jar target/de.dj_steam.toybot--jar-with-dependencies.jar +``` + +#### Toy-Bot Reference +```bash +Commands: +PLACE X,Y,F - place robot on position X,Y - coordinates, and direction (NORTH|SOUTH|WEST|EAST) +MOVE - move the robot to the next field in facing direction +LEFT - turn the robot to the left +RIGHT - turn the robot to the right +REPORT - show robots position and facing direction +exit - exit the application +``` + +#### Further plans and implementation road +- refactoring and rework MoveStrategy +- implement JUMP command +- implement TURN_AROUND command +- user interface +- add random pitfalls or barriers to the field + + 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 4474b27..ed982bc 100644 --- a/src/main/java/de/dj_steam/bot/cli/LoopingConsole.java +++ b/src/main/java/de/dj_steam/bot/cli/LoopingConsole.java @@ -63,7 +63,7 @@ public class LoopingConsole { System.out.println("####################################################"); System.out.println("Commands:"); System.out.println("PLACE X,Y,F - place robot on position X,Y - coordinates, and direction (NORTH|SOUTH|WEST|EAST)"); - System.out.println("MOVE - change the robot to the next field in facing direction"); + System.out.println("MOVE - move the robot to the next field in facing direction"); System.out.println("LEFT - turn the robot to the left"); System.out.println("RIGHT - turn the robot to the right"); System.out.println("REPORT - show robots position and facing direction"); From d582ad6bb0bccc151a52741cfea99db1d58033e7 Mon Sep 17 00:00:00 2001 From: poweronoff Date: Sun, 23 Apr 2017 21:55:19 +0200 Subject: [PATCH 14/23] some small renaming, small class documentation --- .../bot/cli/InvalidUserInputException.java | 2 + .../de/dj_steam/bot/cli/LoopingConsole.java | 21 ++++++--- .../de/dj_steam/bot/domain/Direction.java | 2 + .../java/de/dj_steam/bot/domain/Position.java | 3 +- .../java/de/dj_steam/bot/domain/ToyBot.java | 5 ++ .../de/dj_steam/bot/domain/ToyBotField.java | 4 ++ .../{RobotEngine.java => ToyBotEngine.java} | 8 ++-- .../bot/moving/DirectionCalculator.java | 2 + .../bot/moving/LoopedDirectionsArrayList.java | 9 ++++ .../bot/moving/strategy/MoveStrategy.java | 2 + .../bot/moving/strategy/PlaceStrategy.java | 2 + .../bot/moving/strategy/ReportStrategy.java | 2 + .../bot/moving/strategy/TurnStrategy.java | 2 + ...tEngineTest.java => ToyBotEngineTest.java} | 46 +++++++++---------- 14 files changed, 77 insertions(+), 33 deletions(-) rename src/main/java/de/dj_steam/bot/engine/{RobotEngine.java => ToyBotEngine.java} (86%) rename src/test/java/de/dj_steam/bot/engine/{RobotEngineTest.java => ToyBotEngineTest.java} (75%) diff --git a/src/main/java/de/dj_steam/bot/cli/InvalidUserInputException.java b/src/main/java/de/dj_steam/bot/cli/InvalidUserInputException.java index 51be78a..7ebf4a5 100644 --- a/src/main/java/de/dj_steam/bot/cli/InvalidUserInputException.java +++ b/src/main/java/de/dj_steam/bot/cli/InvalidUserInputException.java @@ -2,6 +2,8 @@ package de.dj_steam.bot.cli; /** * @author steam + * + * throw this exception if user input was invalid */ 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 ed982bc..9d366ce 100644 --- a/src/main/java/de/dj_steam/bot/cli/LoopingConsole.java +++ b/src/main/java/de/dj_steam/bot/cli/LoopingConsole.java @@ -8,15 +8,24 @@ import java.util.Optional; import org.apache.commons.lang3.StringUtils; import de.dj_steam.bot.domain.Command; -import de.dj_steam.bot.engine.RobotEngine; +import de.dj_steam.bot.engine.ToyBotEngine; /** * @author steam + * + * this is a main class. + * + * it realises the user interation over the standart input + * + * This class have following concern: + * - The {@link ToyBotEngine} will be create here. + * - Main setup of the application + * - Create command depending on user interaction */ public class LoopingConsole { - private static final String EXIT_COMMAND = "exit"; + private static final String EXIT_COMMAND = "EXIT"; private static final String COMMAND_DELIMITER = " "; public static void main(final String[] args) throws IOException { @@ -24,13 +33,13 @@ public class LoopingConsole { printUsageBanner(); - RobotEngine robotEngine = new RobotEngine(); + ToyBotEngine toyBotEngine = new ToyBotEngine(); while (true) { System.out.print("> "); String input = br.readLine(); try { - robotEngine.commandBot(createCommand(input)); + toyBotEngine.commandBot(createCommand(input)); }catch (InvalidUserInputException e) { System.out.println("\nInput error occurred! Message: " + e.getMessage() +"\n"); printUsageBanner(); @@ -62,12 +71,12 @@ public class LoopingConsole { private static void printUsageBanner() { System.out.println("####################################################"); System.out.println("Commands:"); - System.out.println("PLACE X,Y,F - place robot on position X,Y - coordinates, and direction (NORTH|SOUTH|WEST|EAST)"); + System.out.println("PLACE X,Y,F - place robot on position X,Y - coordinates and direction (NORTH|SOUTH|WEST|EAST)"); System.out.println("MOVE - move the robot to the next field in facing direction"); System.out.println("LEFT - turn the robot to the left"); System.out.println("RIGHT - turn the robot to the right"); System.out.println("REPORT - show robots position and facing direction"); - System.out.println("exit - exit the application"); + System.out.println("EXIT - exit the application"); System.out.println("####################################################"); System.out.println("Enter a command or '" + EXIT_COMMAND + "' to quit"); } diff --git a/src/main/java/de/dj_steam/bot/domain/Direction.java b/src/main/java/de/dj_steam/bot/domain/Direction.java index 1105363..6d5a61e 100644 --- a/src/main/java/de/dj_steam/bot/domain/Direction.java +++ b/src/main/java/de/dj_steam/bot/domain/Direction.java @@ -2,6 +2,8 @@ package de.dj_steam.bot.domain; /** * @author steam + * + * supported directions to move the robot over the field */ public enum Direction { NORTH, diff --git a/src/main/java/de/dj_steam/bot/domain/Position.java b/src/main/java/de/dj_steam/bot/domain/Position.java index f8d5aee..7567023 100644 --- a/src/main/java/de/dj_steam/bot/domain/Position.java +++ b/src/main/java/de/dj_steam/bot/domain/Position.java @@ -6,6 +6,8 @@ import lombok.ToString; /** * @author steam + * + * pojo class for transport robot postion */ @Getter @@ -24,5 +26,4 @@ public class Position { this.x = x; this.y = y; } - } diff --git a/src/main/java/de/dj_steam/bot/domain/ToyBot.java b/src/main/java/de/dj_steam/bot/domain/ToyBot.java index d02e197..53048c0 100644 --- a/src/main/java/de/dj_steam/bot/domain/ToyBot.java +++ b/src/main/java/de/dj_steam/bot/domain/ToyBot.java @@ -6,6 +6,11 @@ import lombok.ToString; /** * @author steam + * + * pojo representing the robot, it have following properties + * + * {@link Direction} - current facing of the robot + * {@link Position} - current posiotion of the robot */ @Getter diff --git a/src/main/java/de/dj_steam/bot/domain/ToyBotField.java b/src/main/java/de/dj_steam/bot/domain/ToyBotField.java index 860b569..b6b6125 100644 --- a/src/main/java/de/dj_steam/bot/domain/ToyBotField.java +++ b/src/main/java/de/dj_steam/bot/domain/ToyBotField.java @@ -4,7 +4,11 @@ import lombok.Getter; /** * @author steam + * + * the field to move robot over. It incapsulate the logic for calculate that the robot will + * move over the border on the next step or on place it on the field */ + @Getter public class ToyBotField { private int width = 4; diff --git a/src/main/java/de/dj_steam/bot/engine/RobotEngine.java b/src/main/java/de/dj_steam/bot/engine/ToyBotEngine.java similarity index 86% rename from src/main/java/de/dj_steam/bot/engine/RobotEngine.java rename to src/main/java/de/dj_steam/bot/engine/ToyBotEngine.java index cab6515..e570fe4 100644 --- a/src/main/java/de/dj_steam/bot/engine/RobotEngine.java +++ b/src/main/java/de/dj_steam/bot/engine/ToyBotEngine.java @@ -16,20 +16,22 @@ import de.dj_steam.bot.moving.strategy.TurnStrategy; /** * @author steam + * + * toyBotEngine implements setup of moving strategies and initial setup of ToyBot and ToyBotField */ -public class RobotEngine { +public class ToyBotEngine { private final ToyBotField toyBotField; private final ToyBot toyBot; private List changingStrategies; - public RobotEngine() { + public ToyBotEngine() { this.toyBot = new ToyBot(Direction.NORTH, new Position()); this.toyBotField = new ToyBotField(); initChangingStrategies(); } - RobotEngine(final ToyBotField toyBotField, final ToyBot toyBot) { + ToyBotEngine(final ToyBotField toyBotField, final ToyBot toyBot) { this.toyBotField = toyBotField; this.toyBot = toyBot; initChangingStrategies(); 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 56fcdcf..5128f08 100644 --- a/src/main/java/de/dj_steam/bot/moving/DirectionCalculator.java +++ b/src/main/java/de/dj_steam/bot/moving/DirectionCalculator.java @@ -8,6 +8,8 @@ import de.dj_steam.bot.domain.ToyBot; /** * @author steam + * + * this is a helper class to calculate direction */ public class DirectionCalculator { diff --git a/src/main/java/de/dj_steam/bot/moving/LoopedDirectionsArrayList.java b/src/main/java/de/dj_steam/bot/moving/LoopedDirectionsArrayList.java index dbf4759..22d76ee 100644 --- a/src/main/java/de/dj_steam/bot/moving/LoopedDirectionsArrayList.java +++ b/src/main/java/de/dj_steam/bot/moving/LoopedDirectionsArrayList.java @@ -4,6 +4,15 @@ import java.util.ArrayList; /** * @author steam + * + * this class is a simple looped ArrayList. + * + * it is possible to get indexed elements ot this list, which are over the size of the Array. + * + * the get(x) method will return the right element of list from the loop. It works with negative + * values to. + * + * This class does NOT support looped iterator. */ public class LoopedDirectionsArrayList extends ArrayList { diff --git a/src/main/java/de/dj_steam/bot/moving/strategy/MoveStrategy.java b/src/main/java/de/dj_steam/bot/moving/strategy/MoveStrategy.java index 13f7e4d..b60478b 100644 --- a/src/main/java/de/dj_steam/bot/moving/strategy/MoveStrategy.java +++ b/src/main/java/de/dj_steam/bot/moving/strategy/MoveStrategy.java @@ -8,6 +8,8 @@ import de.dj_steam.bot.domain.ToyBotField; /** * @author steam + * + * strategy implementing how the ToyBot is moving */ public class MoveStrategy implements ChangingStrategy { @Override diff --git a/src/main/java/de/dj_steam/bot/moving/strategy/PlaceStrategy.java b/src/main/java/de/dj_steam/bot/moving/strategy/PlaceStrategy.java index 9835963..919c5d6 100644 --- a/src/main/java/de/dj_steam/bot/moving/strategy/PlaceStrategy.java +++ b/src/main/java/de/dj_steam/bot/moving/strategy/PlaceStrategy.java @@ -11,6 +11,8 @@ import de.dj_steam.bot.domain.ToyBotField; /** * @author steam + * + * strategy implementing the place logic of the ToyBot on the ToyBotField */ public class PlaceStrategy implements ChangingStrategy { 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 2e2199c..dfb7db2 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 @@ -6,6 +6,8 @@ import de.dj_steam.bot.domain.ToyBotField; /** * @author steam + * + * strategy implementing how the ToyBot reporting his position and facing direction */ public class ReportStrategy implements ChangingStrategy { @Override 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 a076af6..c795429 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 @@ -7,6 +7,8 @@ import de.dj_steam.bot.moving.DirectionCalculator; /** * @author steam + * + * strategy implementing how the ToyBot do the turn */ public class TurnStrategy implements ChangingStrategy { diff --git a/src/test/java/de/dj_steam/bot/engine/RobotEngineTest.java b/src/test/java/de/dj_steam/bot/engine/ToyBotEngineTest.java similarity index 75% rename from src/test/java/de/dj_steam/bot/engine/RobotEngineTest.java rename to src/test/java/de/dj_steam/bot/engine/ToyBotEngineTest.java index c91c411..803e5c7 100644 --- a/src/test/java/de/dj_steam/bot/engine/RobotEngineTest.java +++ b/src/test/java/de/dj_steam/bot/engine/ToyBotEngineTest.java @@ -16,9 +16,9 @@ import de.dj_steam.bot.domain.ToyBotField; /** * @author steam */ -public class RobotEngineTest { +public class ToyBotEngineTest { - private RobotEngine robotEngine; + private ToyBotEngine toyBotEngine; private ToyBot toyBot; private Command turnLeftCommand; @@ -31,7 +31,7 @@ public class RobotEngineTest { @Before public void setup() { toyBot = new ToyBot(Direction.NORTH, new Position()); - robotEngine = new RobotEngine(toyBotField, toyBot); + toyBotEngine = new ToyBotEngine(toyBotField, toyBot); turnLeftCommand = new Command(Command.TURN_LEFT, Optional.empty()); turnRightCommand = new Command(Command.TURN_RIGHT, Optional.empty()); moveCommand = new Command(Command.MOVE, Optional.empty()); @@ -43,16 +43,16 @@ public class RobotEngineTest { public void testTurnLeftCommand() { assertEquals(Direction.NORTH, toyBot.getDirection()); - robotEngine.commandBot(turnLeftCommand); + toyBotEngine.commandBot(turnLeftCommand); assertEquals(Direction.WEST, toyBot.getDirection()); - robotEngine.commandBot(turnLeftCommand); + toyBotEngine.commandBot(turnLeftCommand); assertEquals(Direction.SOUTH, toyBot.getDirection()); - robotEngine.commandBot(turnLeftCommand); + toyBotEngine.commandBot(turnLeftCommand); assertEquals(Direction.EAST, toyBot.getDirection()); - robotEngine.commandBot(turnLeftCommand); + toyBotEngine.commandBot(turnLeftCommand); assertEquals(Direction.NORTH, toyBot.getDirection()); } @@ -60,16 +60,16 @@ public class RobotEngineTest { public void testTurnRightCommand() { assertEquals(Direction.NORTH, toyBot.getDirection()); - robotEngine.commandBot(turnRightCommand); + toyBotEngine.commandBot(turnRightCommand); assertEquals(Direction.EAST, toyBot.getDirection()); - robotEngine.commandBot(turnRightCommand); + toyBotEngine.commandBot(turnRightCommand); assertEquals(Direction.SOUTH, toyBot.getDirection()); - robotEngine.commandBot(turnRightCommand); + toyBotEngine.commandBot(turnRightCommand); assertEquals(Direction.WEST, toyBot.getDirection()); - robotEngine.commandBot(turnRightCommand); + toyBotEngine.commandBot(turnRightCommand); assertEquals(Direction.NORTH, toyBot.getDirection()); } @@ -77,19 +77,19 @@ public class RobotEngineTest { public void testPlaceCommand() { assertEquals(new Position(0, 0), toyBot.getPosition()); - robotEngine.commandBot(placeCommand); + toyBotEngine.commandBot(placeCommand); assertEquals(new Position(0, 0), toyBot.getPosition()); placeCommand = new Command(Command.PLACE, Optional.of("0,2,NORTH")); - robotEngine.commandBot(placeCommand); + toyBotEngine.commandBot(placeCommand); assertEquals(new Position(0, 2), toyBot.getPosition()); placeCommand = new Command(Command.PLACE, Optional.of("5,1,NORTH")); - robotEngine.commandBot(placeCommand); + toyBotEngine.commandBot(placeCommand); assertEquals(new Position(0, 2), toyBot.getPosition()); placeCommand = new Command(Command.PLACE, Optional.of("0,3,WEST")); - robotEngine.commandBot(placeCommand); + toyBotEngine.commandBot(placeCommand); assertEquals(new Position(0, 3), toyBot.getPosition()); assertEquals(Direction.WEST, toyBot.getDirection()); } @@ -100,11 +100,11 @@ public class RobotEngineTest { assertEquals(Direction.NORTH, toyBot.getDirection()); for (int i = 1; i <= 4; i++) { - robotEngine.commandBot(moveCommand); + toyBotEngine.commandBot(moveCommand); assertEquals(new Position(0, i), toyBot.getPosition()); } - robotEngine.commandBot(moveCommand); + toyBotEngine.commandBot(moveCommand); assertEquals(new Position(0, 4), toyBot.getPosition()); } @@ -113,25 +113,25 @@ public class RobotEngineTest { assertEquals(new Position(0, 0), toyBot.getPosition()); assertEquals(Direction.NORTH, toyBot.getDirection()); - robotEngine.commandBot(moveCommand); + toyBotEngine.commandBot(moveCommand); assertEquals(new Position(0, 1), toyBot.getPosition()); assertEquals(Direction.NORTH, toyBot.getDirection()); - robotEngine.commandBot(turnRightCommand); + toyBotEngine.commandBot(turnRightCommand); assertEquals(Direction.EAST, toyBot.getDirection()); for (int i = 0; i <= 3; i++) { - robotEngine.commandBot(moveCommand); + toyBotEngine.commandBot(moveCommand); } assertEquals(new Position(4, 1), toyBot.getPosition()); - robotEngine.commandBot(moveCommand); // border + toyBotEngine.commandBot(moveCommand); // border assertEquals(new Position(4, 1), toyBot.getPosition()); - robotEngine.commandBot(turnLeftCommand); + toyBotEngine.commandBot(turnLeftCommand); for (int i = 0; i <= 3; i++) { - robotEngine.commandBot(moveCommand); + toyBotEngine.commandBot(moveCommand); } assertEquals(new Position(4, 4), toyBot.getPosition()); From bf6ad53b5eb4a7573a18964363d57401a7f9b21b Mon Sep 17 00:00:00 2001 From: poweronoff Date: Wed, 3 May 2017 16:55:14 +0200 Subject: [PATCH 15/23] correct the Lorenzo's name :) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8eaf1d3..2c982a9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # toy-bot -Many thanks to [Lorenzo Sisini](https://github.com/lorenzosisini) for this beautiful experience. +Many thanks to [Lorenzo Sinisi](https://github.com/lorenzosisini) for this beautiful experience. #### Requirements From 97637c4fcf7ade404538a2619d78998e3b86af8a Mon Sep 17 00:00:00 2001 From: steam Date: Fri, 28 Feb 2020 22:17:46 +0100 Subject: [PATCH 16/23] update README.md - set a new repository localion --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2c982a9..2ac9d79 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Many thanks to [Lorenzo Sinisi](https://github.com/lorenzosisini) for this beaut #### Quick start - clone the repository ```bash -git clone https://github.com/poweronoff/toy-bot.git +git clone https://poweronoff.click/steam/toy-bot.git ``` - build the project ````bash From df03d7d186258313ea72e81b74e4d8bb31c62ca4 Mon Sep 17 00:00:00 2001 From: steam Date: Wed, 9 Sep 2020 19:49:36 +0200 Subject: [PATCH 17/23] update the documentation because of CSV domain change --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2ac9d79..9d81c14 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Many thanks to [Lorenzo Sinisi](https://github.com/lorenzosisini) for this beaut #### Quick start - clone the repository ```bash -git clone https://poweronoff.click/steam/toy-bot.git +git clone https://code.poweronoff.click/steam/toy-bot.git ``` - build the project ````bash From 897864fdf81e1dabaa21c040cd1283db91dbc59e Mon Sep 17 00:00:00 2001 From: steam Date: Sun, 7 Feb 2021 18:43:47 +0100 Subject: [PATCH 18/23] add drone config, update dependencies --- README.md | 1 + pom.xml | 25 ++++++++++++++++--------- scm/.drone.yml | 15 +++++++++++++++ 3 files changed, 32 insertions(+), 9 deletions(-) create mode 100644 scm/.drone.yml diff --git a/README.md b/README.md index 9d81c14..14607a2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # toy-bot +[![Build Status](https://ci.poweronoff.click/api/badges/steam/toy-bot/status.svg)](https://ci.poweronoff.click/steam/toy-bot) Many thanks to [Lorenzo Sinisi](https://github.com/lorenzosisini) for this beautiful experience. diff --git a/pom.xml b/pom.xml index 272f23e..e21c95c 100644 --- a/pom.xml +++ b/pom.xml @@ -18,25 +18,32 @@ org.slf4j slf4j-simple - 1.7.25 + 1.7.30 org.projectlombok lombok - 1.16.14 + 1.18.18 org.apache.commons commons-lang3 - 3.4 + 3.11 + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + maven-plugin junit junit - 4.12 + 4.13.1 test @@ -47,15 +54,15 @@ org.apache.maven.plugins maven-compiler-plugin - 3.6.1 + 3.8.1 - 1.8 - 1.8 + 11 + 11 maven-clean-plugin - 3.0.0 + 3.1.0 auto-clean @@ -90,7 +97,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.0.2 + 3.2.0 diff --git a/scm/.drone.yml b/scm/.drone.yml new file mode 100644 index 0000000..59eb1ca --- /dev/null +++ b/scm/.drone.yml @@ -0,0 +1,15 @@ +--- +kind: pipeline +name: "toy-bot coding challenge pipeline" +steps: + - + commands: + - "mvn clean test" + image: "maven:3-jdk-11" + name: test + - + image: appleboy/drone-telegram + name: "send telegram notification" + settings: + to: 733452136 + token: "986857118:AAFN9uAhYl_0WMYUE6hWGPoLArjjBBPxDnM" \ No newline at end of file From 0374e435a1791cb2e37f5103380e7bc63eedac15 Mon Sep 17 00:00:00 2001 From: steam Date: Sun, 7 Feb 2021 18:44:46 +0100 Subject: [PATCH 19/23] trigger the ci --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index e21c95c..5f0a7d1 100644 --- a/pom.xml +++ b/pom.xml @@ -46,7 +46,6 @@ 4.13.1 test - From 7c7a144fe6485373d289353f336b040e0b0a9451 Mon Sep 17 00:00:00 2001 From: steam Date: Tue, 14 Sep 2021 23:58:15 +0200 Subject: [PATCH 20/23] using maven 3.8.1-jdk-11 docker image to fix the CI/CD build issue --- scm/.drone.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scm/.drone.yml b/scm/.drone.yml index 59eb1ca..f939bed 100644 --- a/scm/.drone.yml +++ b/scm/.drone.yml @@ -5,11 +5,11 @@ steps: - commands: - "mvn clean test" - image: "maven:3-jdk-11" + image: "maven:3.8.1-jdk-11" name: test - image: appleboy/drone-telegram name: "send telegram notification" settings: to: 733452136 - token: "986857118:AAFN9uAhYl_0WMYUE6hWGPoLArjjBBPxDnM" \ No newline at end of file + token: "986857118:AAFN9uAhYl_0WMYUE6hWGPoLArjjBBPxDnM" From f72416b49ac1e022cfa46e83118b4b279b63a094 Mon Sep 17 00:00:00 2001 From: steam Date: Wed, 5 Oct 2022 15:52:38 +0200 Subject: [PATCH 21/23] update junit dependency in order to fix security problems --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5f0a7d1..99b88d4 100644 --- a/pom.xml +++ b/pom.xml @@ -43,7 +43,7 @@ junit junit - 4.13.1 + [4.13.1,) test From ed24bc0df1bf331020bd8d369f13e418539809ed Mon Sep 17 00:00:00 2001 From: steam Date: Wed, 5 Oct 2022 16:31:59 +0200 Subject: [PATCH 22/23] code cleanup, lombok update to 1.88.22 due some compile issues with a new JDK --- pom.xml | 2 +- src/main/java/de/dj_steam/bot/domain/Command.java | 8 ++++---- src/main/java/de/dj_steam/bot/domain/Position.java | 4 ++-- src/main/java/de/dj_steam/bot/domain/ToyBotField.java | 4 ++-- .../java/de/dj_steam/bot/moving/DirectionCalculator.java | 2 +- .../de/dj_steam/bot/moving/strategy/TurnStrategy.java | 2 +- src/test/java/de/dj_steam/bot/cli/LoopingConsoleTest.java | 4 ++-- src/test/java/de/dj_steam/bot/domain/ToyBotFieldTest.java | 2 +- .../java/de/dj_steam/bot/engine/ToyBotEngineTest.java | 2 +- 9 files changed, 15 insertions(+), 15 deletions(-) diff --git a/pom.xml b/pom.xml index 99b88d4..f57ad38 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ org.projectlombok lombok - 1.18.18 + 1.18.22 diff --git a/src/main/java/de/dj_steam/bot/domain/Command.java b/src/main/java/de/dj_steam/bot/domain/Command.java index 1da4b86..6f7e439 100644 --- a/src/main/java/de/dj_steam/bot/domain/Command.java +++ b/src/main/java/de/dj_steam/bot/domain/Command.java @@ -10,10 +10,10 @@ import lombok.Getter; * @author steam * * this is a general command implementation. - * + *

* The arguments as {@link String} is intentionally, to be flexible * define some different argument formats. - * + *

* Use some kind of {@link List} for arguments in futher implementations. */ @@ -27,9 +27,9 @@ public class Command { public static final String PLACE = "PLACE"; public static final String REPORT = "REPORT"; - private String command; + private final String command; - private Optional arguments; + private final Optional arguments; public Command(final String command, Optional arguments) { this.command = command; diff --git a/src/main/java/de/dj_steam/bot/domain/Position.java b/src/main/java/de/dj_steam/bot/domain/Position.java index 7567023..e80e326 100644 --- a/src/main/java/de/dj_steam/bot/domain/Position.java +++ b/src/main/java/de/dj_steam/bot/domain/Position.java @@ -14,8 +14,8 @@ import lombok.ToString; @ToString @EqualsAndHashCode public class Position { - private int x; - private int y; + private final int x; + private final int y; public Position() { this.x = 0; diff --git a/src/main/java/de/dj_steam/bot/domain/ToyBotField.java b/src/main/java/de/dj_steam/bot/domain/ToyBotField.java index b6b6125..2fb5980 100644 --- a/src/main/java/de/dj_steam/bot/domain/ToyBotField.java +++ b/src/main/java/de/dj_steam/bot/domain/ToyBotField.java @@ -11,8 +11,8 @@ import lombok.Getter; @Getter public class ToyBotField { - private int width = 4; - private int height = 4; + private final int width = 4; + private final int height = 4; public boolean isInsideTheField(final Position position) { return (position.getX() >= 0 && 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 5128f08..0b1fd24 100644 --- a/src/main/java/de/dj_steam/bot/moving/DirectionCalculator.java +++ b/src/main/java/de/dj_steam/bot/moving/DirectionCalculator.java @@ -13,7 +13,7 @@ import de.dj_steam.bot.domain.ToyBot; */ public class DirectionCalculator { - private LoopedDirectionsArrayList directions; + private final LoopedDirectionsArrayList directions; public DirectionCalculator() { directions = new LoopedDirectionsArrayList(); 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 c795429..38f6925 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 @@ -12,7 +12,7 @@ import de.dj_steam.bot.moving.DirectionCalculator; */ public class TurnStrategy implements ChangingStrategy { - private DirectionCalculator directionCalculator; + private final DirectionCalculator directionCalculator; public TurnStrategy() { directionCalculator = new DirectionCalculator(); diff --git a/src/test/java/de/dj_steam/bot/cli/LoopingConsoleTest.java b/src/test/java/de/dj_steam/bot/cli/LoopingConsoleTest.java index dcb3914..f45618e 100644 --- a/src/test/java/de/dj_steam/bot/cli/LoopingConsoleTest.java +++ b/src/test/java/de/dj_steam/bot/cli/LoopingConsoleTest.java @@ -15,12 +15,12 @@ public class LoopingConsoleTest { @Test(expected = InvalidUserInputException.class) - public void createCommandExpectedUserInputExceptionOnEmptyInput() throws Exception { + public void createCommandExpectedUserInputExceptionOnEmptyInput() { LoopingConsole.createCommand(""); } @Test(expected = InvalidUserInputException.class) - public void createCommandExpectedUserInputExceptionOnMoreThenTwoParams() throws Exception { + public void createCommandExpectedUserInputExceptionOnMoreThenTwoParams() { LoopingConsole.createCommand("INPUT X,Y,F WRONG_PARAM"); } diff --git a/src/test/java/de/dj_steam/bot/domain/ToyBotFieldTest.java b/src/test/java/de/dj_steam/bot/domain/ToyBotFieldTest.java index e2c9b41..2764099 100644 --- a/src/test/java/de/dj_steam/bot/domain/ToyBotFieldTest.java +++ b/src/test/java/de/dj_steam/bot/domain/ToyBotFieldTest.java @@ -10,7 +10,7 @@ import org.junit.Test; */ public class ToyBotFieldTest { @Test - public void isInsideTheField() throws Exception { + public void isInsideTheField() { ToyBotField toyBotField = new ToyBotField(); assertTrue(toyBotField.isInsideTheField(new Position(0,0))); assertTrue(toyBotField.isInsideTheField(new Position(4,4))); diff --git a/src/test/java/de/dj_steam/bot/engine/ToyBotEngineTest.java b/src/test/java/de/dj_steam/bot/engine/ToyBotEngineTest.java index 803e5c7..90a2ce7 100644 --- a/src/test/java/de/dj_steam/bot/engine/ToyBotEngineTest.java +++ b/src/test/java/de/dj_steam/bot/engine/ToyBotEngineTest.java @@ -26,7 +26,7 @@ public class ToyBotEngineTest { private Command moveCommand; private Command placeCommand; - private ToyBotField toyBotField = new ToyBotField(); + private final ToyBotField toyBotField = new ToyBotField(); @Before public void setup() { From 33e9fe12de324d8638970e49292a988050787ba6 Mon Sep 17 00:00:00 2001 From: Stanislav Nowogrudski Date: Wed, 5 Oct 2022 17:29:00 +0200 Subject: [PATCH 23/23] removed the invalid telegram token --- scm/.drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scm/.drone.yml b/scm/.drone.yml index f939bed..b88cb5a 100644 --- a/scm/.drone.yml +++ b/scm/.drone.yml @@ -12,4 +12,4 @@ steps: name: "send telegram notification" settings: to: 733452136 - token: "986857118:AAFN9uAhYl_0WMYUE6hWGPoLArjjBBPxDnM" + token: ""