1
0
Fork 0

another interface that goes to api module (command factory)

This commit is contained in:
Xavier Fontanet 2024-06-24 01:44:14 +02:00
parent d40ff90c6e
commit fd7306f1a1
33 changed files with 121 additions and 67 deletions

View File

@ -1,9 +1,9 @@
package cat.hack3.codingtests.marsrover; package cat.hack3.codingtests.marsrover;
import cat.hack3.codingtests.marsrover.api.RotableRiderRover; import cat.hack3.codingtests.marsrover.api.RotableRiderRover;
import cat.hack3.codingtests.marsrover.cartography.Coordinates; import cat.hack3.codingtests.marsrover.api.cartography.Coordinates;
import cat.hack3.codingtests.marsrover.cartography.Direction; import cat.hack3.codingtests.marsrover.api.cartography.Direction;
import cat.hack3.codingtests.marsrover.cartography.PlanetMap; import cat.hack3.codingtests.marsrover.api.cartography.PlanetMap;
public class MarsRover implements RotableRiderRover { public class MarsRover implements RotableRiderRover {

View File

@ -2,8 +2,8 @@ package cat.hack3.codingtests.marsrover;
import cat.hack3.codingtests.marsrover.api.RotableRiderRover; import cat.hack3.codingtests.marsrover.api.RotableRiderRover;
import cat.hack3.codingtests.marsrover.api.RoverDeployer; import cat.hack3.codingtests.marsrover.api.RoverDeployer;
import cat.hack3.codingtests.marsrover.cartography.Direction; import cat.hack3.codingtests.marsrover.api.cartography.Direction;
import cat.hack3.codingtests.marsrover.cartography.PlanetMap; import cat.hack3.codingtests.marsrover.api.cartography.PlanetMap;
public class MarsRoverDeployer implements RoverDeployer { public class MarsRoverDeployer implements RoverDeployer {
@Override @Override

View File

@ -1,8 +1,8 @@
package cat.hack3.codingtests.marsrover; package cat.hack3.codingtests.marsrover;
import cat.hack3.codingtests.marsrover.api.RotableRiderRover.Rotation; import cat.hack3.codingtests.marsrover.api.RotableRiderRover.Rotation;
import cat.hack3.codingtests.marsrover.cartography.Coordinates; import cat.hack3.codingtests.marsrover.api.cartography.Coordinates;
import cat.hack3.codingtests.marsrover.cartography.Direction; import cat.hack3.codingtests.marsrover.api.cartography.Direction;
import java.util.logging.Logger; import java.util.logging.Logger;

View File

@ -1,7 +1,7 @@
package cat.hack3.codingtests.marsrover.gps; package cat.hack3.codingtests.marsrover.gps;
import cat.hack3.codingtests.marsrover.cartography.Coordinates.Latitude; import cat.hack3.codingtests.marsrover.api.cartography.Coordinates.Latitude;
import cat.hack3.codingtests.marsrover.cartography.Coordinates.Longitude; import cat.hack3.codingtests.marsrover.api.cartography.Coordinates.Longitude;
public class MapIncrementalPositionResolver { public class MapIncrementalPositionResolver {

View File

@ -1,10 +1,10 @@
package cat.hack3.codingtests.marsrover.gps; package cat.hack3.codingtests.marsrover.gps;
import cat.hack3.codingtests.marsrover.cartography.Coordinates; import cat.hack3.codingtests.marsrover.api.cartography.Coordinates;
import cat.hack3.codingtests.marsrover.cartography.Coordinates.Latitude; import cat.hack3.codingtests.marsrover.api.cartography.Coordinates.Latitude;
import cat.hack3.codingtests.marsrover.cartography.Coordinates.Longitude; import cat.hack3.codingtests.marsrover.api.cartography.Coordinates.Longitude;
import cat.hack3.codingtests.marsrover.cartography.Direction; import cat.hack3.codingtests.marsrover.api.cartography.Direction;
import cat.hack3.codingtests.marsrover.cartography.PlanetMap; import cat.hack3.codingtests.marsrover.api.cartography.PlanetMap;
import java.util.List; import java.util.List;

View File

@ -1,8 +1,8 @@
package cat.hack3.codingtests.marsrover.gps; package cat.hack3.codingtests.marsrover.gps;
import cat.hack3.codingtests.marsrover.cartography.Coordinates; import cat.hack3.codingtests.marsrover.api.cartography.Coordinates;
import cat.hack3.codingtests.marsrover.cartography.PlanetMap; import cat.hack3.codingtests.marsrover.api.cartography.PlanetMap;
import cat.hack3.codingtests.marsrover.cartography.PlanetMapInitializer; import cat.hack3.codingtests.marsrover.api.cartography.PlanetMapInitializer;
import java.util.List; import java.util.List;

View File

@ -1,8 +1,10 @@
import cat.hack3.codingtests.marsrover.api.cartography.PlanetMapInitializer;
module mars.station { module mars.station {
requires rover.api; requires rover.api;
requires java.logging; requires java.logging;
provides cat.hack3.codingtests.marsrover.cartography.PlanetMapInitializer provides PlanetMapInitializer
with cat.hack3.codingtests.marsrover.gps.MarsMapInitializer; with cat.hack3.codingtests.marsrover.gps.MarsMapInitializer;
provides cat.hack3.codingtests.marsrover.api.RoverDeployer provides cat.hack3.codingtests.marsrover.api.RoverDeployer

View File

@ -1,7 +1,7 @@
package cat.hack3.codingtests.marsrover.api; package cat.hack3.codingtests.marsrover.api;
import cat.hack3.codingtests.marsrover.cartography.Coordinates; import cat.hack3.codingtests.marsrover.api.cartography.Coordinates;
import cat.hack3.codingtests.marsrover.cartography.Direction; import cat.hack3.codingtests.marsrover.api.cartography.Direction;
public interface RotableRiderRover { public interface RotableRiderRover {
enum Rotation {LEFT, RIGHT} enum Rotation {LEFT, RIGHT}

View File

@ -1,7 +1,7 @@
package cat.hack3.codingtests.marsrover.api; package cat.hack3.codingtests.marsrover.api;
import cat.hack3.codingtests.marsrover.cartography.Direction; import cat.hack3.codingtests.marsrover.api.cartography.Direction;
import cat.hack3.codingtests.marsrover.cartography.PlanetMap; import cat.hack3.codingtests.marsrover.api.cartography.PlanetMap;
public interface RoverDeployer { public interface RoverDeployer {
RotableRiderRover deploy(PlanetMap map, Direction startingDirection); RotableRiderRover deploy(PlanetMap map, Direction startingDirection);

View File

@ -1,4 +1,4 @@
package cat.hack3.codingtests.marsrover.cartography; package cat.hack3.codingtests.marsrover.api.cartography;
public record Coordinates(Latitude latitude, Longitude longitude) { public record Coordinates(Latitude latitude, Longitude longitude) {

View File

@ -1,4 +1,4 @@
package cat.hack3.codingtests.marsrover.cartography; package cat.hack3.codingtests.marsrover.api.cartography;
public enum Direction { public enum Direction {
NORTH, SOUTH, EAST, WEST; NORTH, SOUTH, EAST, WEST;

View File

@ -1,4 +1,4 @@
package cat.hack3.codingtests.marsrover.cartography; package cat.hack3.codingtests.marsrover.api.cartography;
public interface PlanetMap { public interface PlanetMap {
Coordinates getNextPositionTowards(Direction direction); Coordinates getNextPositionTowards(Direction direction);

View File

@ -1,4 +1,4 @@
package cat.hack3.codingtests.marsrover.cartography; package cat.hack3.codingtests.marsrover.api.cartography;
import java.util.List; import java.util.List;

View File

@ -0,0 +1,5 @@
package cat.hack3.codingtests.marsrover.api.commands;
public interface CommandFactory {
RoverCommand createCommand(RoverCommand.Type type);
}

View File

@ -0,0 +1,7 @@
package cat.hack3.codingtests.marsrover.api.commands;
import cat.hack3.codingtests.marsrover.api.RotableRiderRover;
public interface CommandFactoryInitializer {
CommandFactory initFor(RotableRiderRover rover);
}

View File

@ -1,4 +1,4 @@
package cat.hack3.codingtests.marsrover.commands.api; package cat.hack3.codingtests.marsrover.api.commands;
public interface RoverCommand { public interface RoverCommand {
enum Type {MOVE_FORWARD, MOVE_BACKWARDS, TURN_LEFT, TURN_RIGHT} enum Type {MOVE_FORWARD, MOVE_BACKWARDS, TURN_LEFT, TURN_RIGHT}

View File

@ -1,4 +1,5 @@
module rover.api { module rover.api {
exports cat.hack3.codingtests.marsrover.api; exports cat.hack3.codingtests.marsrover.api;
exports cat.hack3.codingtests.marsrover.cartography; exports cat.hack3.codingtests.marsrover.api.cartography;
exports cat.hack3.codingtests.marsrover.api.commands;
} }

View File

@ -2,7 +2,7 @@ package cat.hack3.codingtests.marsrover.commands;
import cat.hack3.codingtests.marsrover.api.RotableRiderRover; import cat.hack3.codingtests.marsrover.api.RotableRiderRover;
import cat.hack3.codingtests.marsrover.commands.api.RoverCommand; import cat.hack3.codingtests.marsrover.api.commands.RoverCommand;
public class MoveBackwardsCommand implements RoverCommand { public class MoveBackwardsCommand implements RoverCommand {
private final RotableRiderRover rover; private final RotableRiderRover rover;

View File

@ -2,7 +2,7 @@ package cat.hack3.codingtests.marsrover.commands;
import cat.hack3.codingtests.marsrover.api.RotableRiderRover; import cat.hack3.codingtests.marsrover.api.RotableRiderRover;
import cat.hack3.codingtests.marsrover.commands.api.RoverCommand; import cat.hack3.codingtests.marsrover.api.commands.RoverCommand;
public class MoveForwardCommand implements RoverCommand { public class MoveForwardCommand implements RoverCommand {
private final RotableRiderRover rover; private final RotableRiderRover rover;

View File

@ -1,19 +1,18 @@
package cat.hack3.codingtests.marsrover.commands.api; package cat.hack3.codingtests.marsrover.commands;
import cat.hack3.codingtests.marsrover.api.RotableRiderRover; import cat.hack3.codingtests.marsrover.api.RotableRiderRover;
import cat.hack3.codingtests.marsrover.commands.MoveBackwardsCommand; import cat.hack3.codingtests.marsrover.api.commands.CommandFactory;
import cat.hack3.codingtests.marsrover.commands.MoveForwardCommand; import cat.hack3.codingtests.marsrover.api.commands.RoverCommand;
import cat.hack3.codingtests.marsrover.commands.TurnLeftCommand;
import cat.hack3.codingtests.marsrover.commands.TurnRightCommand;
public class CommandFactory { public class RoverCommandFactory implements CommandFactory {
private final RotableRiderRover rover; private final RotableRiderRover rover;
public CommandFactory(RotableRiderRover rover) { public RoverCommandFactory(RotableRiderRover rover) {
this.rover = rover; this.rover = rover;
} }
@Override
public RoverCommand createCommand(RoverCommand.Type type) { public RoverCommand createCommand(RoverCommand.Type type) {
return switch (type) { return switch (type) {
case MOVE_FORWARD -> new MoveForwardCommand(rover); case MOVE_FORWARD -> new MoveForwardCommand(rover);

View File

@ -0,0 +1,12 @@
package cat.hack3.codingtests.marsrover.commands;
import cat.hack3.codingtests.marsrover.api.RotableRiderRover;
import cat.hack3.codingtests.marsrover.api.commands.CommandFactory;
import cat.hack3.codingtests.marsrover.api.commands.CommandFactoryInitializer;
public class RoverCommandFactoryInitializer implements CommandFactoryInitializer {
@Override
public CommandFactory initFor(RotableRiderRover rover) {
return new RoverCommandFactory(rover);
}
}

View File

@ -2,7 +2,7 @@ package cat.hack3.codingtests.marsrover.commands;
import cat.hack3.codingtests.marsrover.api.RotableRiderRover; import cat.hack3.codingtests.marsrover.api.RotableRiderRover;
import cat.hack3.codingtests.marsrover.commands.api.RoverCommand; import cat.hack3.codingtests.marsrover.api.commands.RoverCommand;
import static cat.hack3.codingtests.marsrover.api.RotableRiderRover.Rotation.LEFT; import static cat.hack3.codingtests.marsrover.api.RotableRiderRover.Rotation.LEFT;

View File

@ -2,7 +2,7 @@ package cat.hack3.codingtests.marsrover.commands;
import cat.hack3.codingtests.marsrover.api.RotableRiderRover; import cat.hack3.codingtests.marsrover.api.RotableRiderRover;
import cat.hack3.codingtests.marsrover.commands.api.RoverCommand; import cat.hack3.codingtests.marsrover.api.commands.RoverCommand;
import static cat.hack3.codingtests.marsrover.api.RotableRiderRover.Rotation.RIGHT; import static cat.hack3.codingtests.marsrover.api.RotableRiderRover.Rotation.RIGHT;

View File

@ -1,5 +1,9 @@
import cat.hack3.codingtests.marsrover.api.commands.CommandFactoryInitializer;
import cat.hack3.codingtests.marsrover.commands.RoverCommandFactoryInitializer;
module rover.commands { module rover.commands {
requires rover.api; requires rover.api;
exports cat.hack3.codingtests.marsrover.commands.api; provides CommandFactoryInitializer
with RoverCommandFactoryInitializer;
} }

View File

@ -0,0 +1,14 @@
package cat.hack3.codingtests.marsrover.plugin.station;
import cat.hack3.codingtests.marsrover.api.commands.CommandFactoryInitializer;
import java.util.ServiceLoader;
public class CommandFactoryInitializerProvider {
public CommandFactoryInitializer getNextAvailable() {
return ServiceLoader
.load(CommandFactoryInitializer.class)
.findFirst()
.orElseThrow();
}
}

View File

@ -1,6 +1,6 @@
package cat.hack3.codingtests.marsrover.plugin.station; package cat.hack3.codingtests.marsrover.plugin.station;
import cat.hack3.codingtests.marsrover.cartography.PlanetMapInitializer; import cat.hack3.codingtests.marsrover.api.cartography.PlanetMapInitializer;
import java.util.ServiceLoader; import java.util.ServiceLoader;

View File

@ -1,8 +1,9 @@
module station.plugin { module station.plugin {
requires rover.api; requires rover.api;
uses cat.hack3.codingtests.marsrover.cartography.PlanetMapInitializer; uses cat.hack3.codingtests.marsrover.api.cartography.PlanetMapInitializer;
uses cat.hack3.codingtests.marsrover.api.RoverDeployer; uses cat.hack3.codingtests.marsrover.api.RoverDeployer;
uses cat.hack3.codingtests.marsrover.api.commands.CommandFactoryInitializer;
exports cat.hack3.codingtests.marsrover.plugin.station; exports cat.hack3.codingtests.marsrover.plugin.station;
} }

View File

@ -1,19 +1,20 @@
package cat.hack3.codingtests.marsrover.test; package cat.hack3.codingtests.marsrover.test;
import cat.hack3.codingtests.marsrover.api.RotableRiderRover; import cat.hack3.codingtests.marsrover.api.RotableRiderRover;
import cat.hack3.codingtests.marsrover.cartography.Coordinates; import cat.hack3.codingtests.marsrover.api.cartography.Coordinates;
import cat.hack3.codingtests.marsrover.cartography.Direction; import cat.hack3.codingtests.marsrover.api.cartography.Direction;
import cat.hack3.codingtests.marsrover.cartography.PlanetMap; import cat.hack3.codingtests.marsrover.api.cartography.PlanetMap;
import cat.hack3.codingtests.marsrover.commands.api.CommandFactory; import cat.hack3.codingtests.marsrover.api.commands.CommandFactory;
import cat.hack3.codingtests.marsrover.commands.api.RoverCommand; import cat.hack3.codingtests.marsrover.api.commands.RoverCommand;
import cat.hack3.codingtests.marsrover.plugin.station.CommandFactoryInitializerProvider;
import cat.hack3.codingtests.marsrover.plugin.station.PlanetMapInitializerProvider; import cat.hack3.codingtests.marsrover.plugin.station.PlanetMapInitializerProvider;
import cat.hack3.codingtests.marsrover.plugin.station.RoverDeployerProvider; import cat.hack3.codingtests.marsrover.plugin.station.RoverDeployerProvider;
import java.util.List; import java.util.List;
import java.util.stream.IntStream; import java.util.stream.IntStream;
import static cat.hack3.codingtests.marsrover.cartography.Direction.SOUTH; import static cat.hack3.codingtests.marsrover.api.cartography.Direction.SOUTH;
import static cat.hack3.codingtests.marsrover.commands.api.RoverCommand.Type.*; import static cat.hack3.codingtests.marsrover.api.commands.RoverCommand.Type.*;
public class CommonTests { public class CommonTests {
@ -27,10 +28,12 @@ public class CommonTests {
private PlanetMapInitializerProvider gpsProvider; private PlanetMapInitializerProvider gpsProvider;
private RoverDeployerProvider roverProvider; private RoverDeployerProvider roverProvider;
private CommandFactoryInitializerProvider commandFactoryProvider;
protected void setup() { protected void setup() {
gpsProvider = new PlanetMapInitializerProvider(); gpsProvider = new PlanetMapInitializerProvider();
roverProvider = new RoverDeployerProvider(); roverProvider = new RoverDeployerProvider();
commandFactoryProvider = new CommandFactoryInitializerProvider();
int mapWidth = 10; int mapWidth = 10;
int mapHeight = 10; int mapHeight = 10;
@ -41,13 +44,19 @@ public class CommonTests {
var marsMap = getMap(mapHeight, mapWidth, startingCoordinates); var marsMap = getMap(mapHeight, mapWidth, startingCoordinates);
rover = getRover(marsMap); rover = getRover(marsMap);
var commandFactory = new CommandFactory(this.rover); var commandFactory = getCommandFactory(rover);
moveForwardCommand = commandFactory.createCommand(MOVE_FORWARD); moveForwardCommand = commandFactory.createCommand(MOVE_FORWARD);
moveBackwardsCommand = commandFactory.createCommand(MOVE_BACKWARDS); moveBackwardsCommand = commandFactory.createCommand(MOVE_BACKWARDS);
turnLeftCommand = commandFactory.createCommand(TURN_LEFT); turnLeftCommand = commandFactory.createCommand(TURN_LEFT);
turnRightCommand = commandFactory.createCommand(TURN_RIGHT); turnRightCommand = commandFactory.createCommand(TURN_RIGHT);
} }
private CommandFactory getCommandFactory(RotableRiderRover rover) {
var commandFactoryInitializer = commandFactoryProvider.getNextAvailable();
return commandFactoryInitializer.initFor(rover);
}
private PlanetMap getMap(int mapHeight, int mapWidth, Coordinates startingCoordinates) { private PlanetMap getMap(int mapHeight, int mapWidth, Coordinates startingCoordinates) {
var planetInitializer = gpsProvider.getNextAvailable(); var planetInitializer = gpsProvider.getNextAvailable();
return planetInitializer.setupNewMap(mapHeight, mapWidth, startingCoordinates, getObstacles()); return planetInitializer.setupNewMap(mapHeight, mapWidth, startingCoordinates, getObstacles());

View File

@ -1,11 +1,11 @@
package cat.hack3.codingtests.marsrover.test; package cat.hack3.codingtests.marsrover.test;
import cat.hack3.codingtests.marsrover.cartography.Coordinates; import cat.hack3.codingtests.marsrover.api.cartography.Coordinates;
import cat.hack3.codingtests.marsrover.cartography.Direction; import cat.hack3.codingtests.marsrover.api.cartography.Direction;
import org.testng.annotations.BeforeMethod; import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import static cat.hack3.codingtests.marsrover.cartography.Direction.*; import static cat.hack3.codingtests.marsrover.api.cartography.Direction.*;
import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertEquals;
public class MarsRoverTest extends CommonTests { public class MarsRoverTest extends CommonTests {

View File

@ -1,7 +1,7 @@
package cat.hack3.codingtests.marsrover.test; package cat.hack3.codingtests.marsrover.test;
import cat.hack3.codingtests.marsrover.cartography.Coordinates; import cat.hack3.codingtests.marsrover.api.cartography.Coordinates;
import cat.hack3.codingtests.marsrover.cartography.Direction; import cat.hack3.codingtests.marsrover.api.cartography.Direction;
import org.testng.annotations.BeforeMethod; import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test; import org.testng.annotations.Test;

View File

@ -1,7 +1,7 @@
package cat.hack3.codingtests.marsrover.ui.console; package cat.hack3.codingtests.marsrover.ui.console;
import cat.hack3.codingtests.marsrover.cartography.Direction; import cat.hack3.codingtests.marsrover.api.cartography.Direction;
import java.util.Scanner; import java.util.Scanner;

View File

@ -1,19 +1,19 @@
package cat.hack3.codingtests.marsrover.ui.console; package cat.hack3.codingtests.marsrover.ui.console;
import cat.hack3.codingtests.marsrover.RotableRiderRover; import cat.hack3.codingtests.marsrover.RotableRiderRover;
import cat.hack3.codingtests.marsrover.commands.api.CommandFactory; import cat.hack3.codingtests.marsrover.api.commands.RoverCommand;
import cat.hack3.codingtests.marsrover.commands.api.RoverCommand; import cat.hack3.codingtests.marsrover.commands.api.RoverCommandFactory;
import java.util.Scanner; import java.util.Scanner;
import static cat.hack3.codingtests.marsrover.commands.api.RoverCommand.Type.*; import static cat.hack3.codingtests.marsrover.api.commands.RoverCommand.Type.*;
import static cat.hack3.codingtests.marsrover.ui.console.UICommons.isNotExitSignal; import static cat.hack3.codingtests.marsrover.ui.console.UICommons.isNotExitSignal;
import static cat.hack3.codingtests.marsrover.ui.console.UICommons.output; import static cat.hack3.codingtests.marsrover.ui.console.UICommons.output;
public class RoverCommandsPerformer { public class RoverCommandsPerformer {
private final Scanner reader; private final Scanner reader;
CommandFactory commandFactory; RoverCommandFactory roverCommandFactory;
private final RoverCommand moveForwardCommand; private final RoverCommand moveForwardCommand;
private final RoverCommand moveBackwardsCommand; private final RoverCommand moveBackwardsCommand;
private final RoverCommand turnLeftCommand; private final RoverCommand turnLeftCommand;
@ -21,11 +21,11 @@ public class RoverCommandsPerformer {
public RoverCommandsPerformer(Scanner reader, RotableRiderRover rover) { public RoverCommandsPerformer(Scanner reader, RotableRiderRover rover) {
this.reader = reader; this.reader = reader;
commandFactory = new CommandFactory(rover); roverCommandFactory = new RoverCommandFactory(rover);
moveForwardCommand = commandFactory.createCommand(MOVE_FORWARD); moveForwardCommand = roverCommandFactory.createCommand(MOVE_FORWARD);
moveBackwardsCommand = commandFactory.createCommand(MOVE_BACKWARDS); moveBackwardsCommand = roverCommandFactory.createCommand(MOVE_BACKWARDS);
turnLeftCommand = commandFactory.createCommand(TURN_LEFT); turnLeftCommand = roverCommandFactory.createCommand(TURN_LEFT);
turnRightCommand = commandFactory.createCommand(TURN_RIGHT); turnRightCommand = roverCommandFactory.createCommand(TURN_RIGHT);
} }
public void acceptCommandsUntilExitSignal() { public void acceptCommandsUntilExitSignal() {

View File

@ -2,8 +2,8 @@ package cat.hack3.codingtests.marsrover.ui.console;
import cat.hack3.codingtests.marsrover.MarsRover; import cat.hack3.codingtests.marsrover.MarsRover;
import cat.hack3.codingtests.marsrover.RotableRiderRover; import cat.hack3.codingtests.marsrover.RotableRiderRover;
import cat.hack3.codingtests.marsrover.cartography.Coordinates; import cat.hack3.codingtests.marsrover.api.cartography.Coordinates;
import cat.hack3.codingtests.marsrover.cartography.Direction; import cat.hack3.codingtests.marsrover.api.cartography.Direction;
import cat.hack3.codingtests.marsrover.gps.MarsMap; import cat.hack3.codingtests.marsrover.gps.MarsMap;
import java.util.InputMismatchException; import java.util.InputMismatchException;