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;
import cat.hack3.codingtests.marsrover.api.RotableRiderRover;
import cat.hack3.codingtests.marsrover.cartography.Coordinates;
import cat.hack3.codingtests.marsrover.cartography.Direction;
import cat.hack3.codingtests.marsrover.cartography.PlanetMap;
import cat.hack3.codingtests.marsrover.api.cartography.Coordinates;
import cat.hack3.codingtests.marsrover.api.cartography.Direction;
import cat.hack3.codingtests.marsrover.api.cartography.PlanetMap;
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.RoverDeployer;
import cat.hack3.codingtests.marsrover.cartography.Direction;
import cat.hack3.codingtests.marsrover.cartography.PlanetMap;
import cat.hack3.codingtests.marsrover.api.cartography.Direction;
import cat.hack3.codingtests.marsrover.api.cartography.PlanetMap;
public class MarsRoverDeployer implements RoverDeployer {
@Override

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,7 +1,7 @@
package cat.hack3.codingtests.marsrover.api;
import cat.hack3.codingtests.marsrover.cartography.Direction;
import cat.hack3.codingtests.marsrover.cartography.PlanetMap;
import cat.hack3.codingtests.marsrover.api.cartography.Direction;
import cat.hack3.codingtests.marsrover.api.cartography.PlanetMap;
public interface RoverDeployer {
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) {

View File

@ -1,4 +1,4 @@
package cat.hack3.codingtests.marsrover.cartography;
package cat.hack3.codingtests.marsrover.api.cartography;
public enum Direction {
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 {
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;

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 {
enum Type {MOVE_FORWARD, MOVE_BACKWARDS, TURN_LEFT, TURN_RIGHT}

View File

@ -1,4 +1,5 @@
module rover.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.commands.api.RoverCommand;
import cat.hack3.codingtests.marsrover.api.commands.RoverCommand;
public class MoveBackwardsCommand implements RoverCommand {
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.commands.api.RoverCommand;
import cat.hack3.codingtests.marsrover.api.commands.RoverCommand;
public class MoveForwardCommand implements RoverCommand {
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.commands.MoveBackwardsCommand;
import cat.hack3.codingtests.marsrover.commands.MoveForwardCommand;
import cat.hack3.codingtests.marsrover.commands.TurnLeftCommand;
import cat.hack3.codingtests.marsrover.commands.TurnRightCommand;
import cat.hack3.codingtests.marsrover.api.commands.CommandFactory;
import cat.hack3.codingtests.marsrover.api.commands.RoverCommand;
public class CommandFactory {
public class RoverCommandFactory implements CommandFactory {
private final RotableRiderRover rover;
public CommandFactory(RotableRiderRover rover) {
public RoverCommandFactory(RotableRiderRover rover) {
this.rover = rover;
}
@Override
public RoverCommand createCommand(RoverCommand.Type type) {
return switch (type) {
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.commands.api.RoverCommand;
import cat.hack3.codingtests.marsrover.api.commands.RoverCommand;
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.commands.api.RoverCommand;
import cat.hack3.codingtests.marsrover.api.commands.RoverCommand;
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 {
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;
import cat.hack3.codingtests.marsrover.cartography.PlanetMapInitializer;
import cat.hack3.codingtests.marsrover.api.cartography.PlanetMapInitializer;
import java.util.ServiceLoader;

View File

@ -1,8 +1,9 @@
module station.plugin {
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.commands.CommandFactoryInitializer;
exports cat.hack3.codingtests.marsrover.plugin.station;
}

View File

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

View File

@ -1,11 +1,11 @@
package cat.hack3.codingtests.marsrover.test;
import cat.hack3.codingtests.marsrover.cartography.Coordinates;
import cat.hack3.codingtests.marsrover.cartography.Direction;
import cat.hack3.codingtests.marsrover.api.cartography.Coordinates;
import cat.hack3.codingtests.marsrover.api.cartography.Direction;
import org.testng.annotations.BeforeMethod;
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;
public class MarsRoverTest extends CommonTests {

View File

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

View File

@ -1,7 +1,7 @@
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;

View File

@ -1,19 +1,19 @@
package cat.hack3.codingtests.marsrover.ui.console;
import cat.hack3.codingtests.marsrover.RotableRiderRover;
import cat.hack3.codingtests.marsrover.commands.api.CommandFactory;
import cat.hack3.codingtests.marsrover.commands.api.RoverCommand;
import cat.hack3.codingtests.marsrover.api.commands.RoverCommand;
import cat.hack3.codingtests.marsrover.commands.api.RoverCommandFactory;
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.output;
public class RoverCommandsPerformer {
private final Scanner reader;
CommandFactory commandFactory;
RoverCommandFactory roverCommandFactory;
private final RoverCommand moveForwardCommand;
private final RoverCommand moveBackwardsCommand;
private final RoverCommand turnLeftCommand;
@ -21,11 +21,11 @@ public class RoverCommandsPerformer {
public RoverCommandsPerformer(Scanner reader, RotableRiderRover rover) {
this.reader = reader;
commandFactory = new CommandFactory(rover);
moveForwardCommand = commandFactory.createCommand(MOVE_FORWARD);
moveBackwardsCommand = commandFactory.createCommand(MOVE_BACKWARDS);
turnLeftCommand = commandFactory.createCommand(TURN_LEFT);
turnRightCommand = commandFactory.createCommand(TURN_RIGHT);
roverCommandFactory = new RoverCommandFactory(rover);
moveForwardCommand = roverCommandFactory.createCommand(MOVE_FORWARD);
moveBackwardsCommand = roverCommandFactory.createCommand(MOVE_BACKWARDS);
turnLeftCommand = roverCommandFactory.createCommand(TURN_LEFT);
turnRightCommand = roverCommandFactory.createCommand(TURN_RIGHT);
}
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.RotableRiderRover;
import cat.hack3.codingtests.marsrover.cartography.Coordinates;
import cat.hack3.codingtests.marsrover.cartography.Direction;
import cat.hack3.codingtests.marsrover.api.cartography.Coordinates;
import cat.hack3.codingtests.marsrover.api.cartography.Direction;
import cat.hack3.codingtests.marsrover.gps.MarsMap;
import java.util.InputMismatchException;