From 381ea44a9a9d9e28218446c585be18f368d4ce03 Mon Sep 17 00:00:00 2001 From: romanschenk37 <84532681+romanschenk37@users.noreply.github.com> Date: Sat, 5 Mar 2022 16:39:08 +0100 Subject: [PATCH 01/21] Created CarTest.java added Tests setPosition, nextPosition --- .../java/ch/zhaw/pm2/racetrack/CarTest.java | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/test/java/ch/zhaw/pm2/racetrack/CarTest.java diff --git a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java new file mode 100644 index 0000000..eb013c6 --- /dev/null +++ b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java @@ -0,0 +1,60 @@ + +package ch.zhaw.pm2.racetrack; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class CarTest { + Car car; + + @BeforeEach + void setUp() { + car = new Car('a', new PositionVector(10, 10)); + } + + @AfterEach + void tearDown() { + } + + @Test + void setPosition() { + car.setPosition(new PositionVector(20, 20)); + checkPosition(20, 20); + } + + @Test + void nextPosition() { + checkPosition(10, 10); + } + + @Test + void accelerate() { + } + + @Test + void move() { + } + + @Test + void crash() { + } + + @Test + void isCrashed() { + } + + @Test + void setMoveStrategy() { + } + + @Test + void getMoveStrategy() { + } + + void checkPosition(int x, int y) { + assertTrue(car.nextPosition().equals(new PositionVector(x, y))); + } +} -- 2.40.1 From 8ff70ab3ac552f6a5494e6b2959a33c94fafa182 Mon Sep 17 00:00:00 2001 From: Andrin Fassbind Date: Sun, 6 Mar 2022 15:15:39 +0100 Subject: [PATCH 02/21] -Method readFile done and tested -Method getSpaceType done and once tested --- .../java/ch/zhaw/pm2/racetrack/Track.java | 45 ++++++++++++++- .../java/ch/zhaw/pm2/racetrack/TrackTest.java | 55 +++++++++++++++++++ 2 files changed, 97 insertions(+), 3 deletions(-) create mode 100644 src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Track.java b/src/main/java/ch/zhaw/pm2/racetrack/Track.java index 61deadf..68e5625 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Track.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Track.java @@ -1,9 +1,13 @@ package ch.zhaw.pm2.racetrack; +import ch.zhaw.pm2.racetrack.given.ConfigSpecification; import ch.zhaw.pm2.racetrack.given.TrackSpecification; import java.io.File; import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; /** * This class represents the racetrack board. @@ -56,7 +60,7 @@ public class Track implements TrackSpecification { public static final char CRASH_INDICATOR = 'X'; // TODO: Add necessary variables - + private List track; /** * Initialize a Track from the given track file. * @@ -66,7 +70,32 @@ public class Track implements TrackSpecification { */ public Track(File trackFile) throws FileNotFoundException, InvalidTrackFormatException { // TODO: implementation - throw new UnsupportedOperationException(); + readFile(trackFile); + + //TODO: throw error again... + //throw new UnsupportedOperationException(); // was allready in !! + } + + /** + * This method reads the File and saves it to the track ArrayList Line by Line + * @param trackFile the File where the track has been documented + * @throws FileNotFoundException if the FilePath is invalid. + */ + private void readFile(File trackFile) throws FileNotFoundException { + track = new ArrayList<>(); + Scanner scanner = new Scanner(trackFile); + while (scanner.hasNextLine()) { + track.add(scanner.nextLine()); + } + } + + + /** + * + * @return the track + */ + public List getTrack() { + return track; } /** @@ -78,7 +107,17 @@ public class Track implements TrackSpecification { */ @Override public Config.SpaceType getSpaceType(PositionVector position) { - // TODO: implementation + // TODO: implementation // Done first tests passed but what to do with error + char charAtPosition = track.get(position.getY()).charAt(position.getX()); + + ConfigSpecification.SpaceType[] spaceTypes = ConfigSpecification.SpaceType.values(); + + for (ConfigSpecification.SpaceType spaceType : spaceTypes) { + if(spaceType.getValue() == charAtPosition) { + return spaceType; + } + } + throw new UnsupportedOperationException(); } diff --git a/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java b/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java new file mode 100644 index 0000000..7034a97 --- /dev/null +++ b/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java @@ -0,0 +1,55 @@ +package ch.zhaw.pm2.racetrack; + +import ch.zhaw.pm2.racetrack.given.ConfigSpecification; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.io.FileNotFoundException; +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class TrackTest { + Track trackObj; + + @BeforeEach + void setup() { + File file = new File("C:\\Studium\\Semester2\\PM2\\Projekt1\\racetrack\\tracks\\challenge.txt"); + try { + trackObj = new Track(file); + + } catch (Exception e) { + System.err.println("Error in Test compareTrack" + e.getMessage()); + } + } + + @Test + void canReadFile() { + File file = new File("C:\\Studium\\Semester2\\PM2\\Projekt1\\racetrack\\tracks\\challenge.txt"); + Assertions.assertThrows(FileNotFoundException.class,() -> new Track(file)); + } + + /** + * Dirty test... + */ + @Test + void compareTrack() { + try { + List track = trackObj.getTrack(); + for (String s: track + ) { + System.out.println(s); + } + } catch (Exception e) { + System.err.println("Error in Test compareTrack" + e.getMessage()); + } + } + + @Test + void getSpaceTyp() { + Assertions.assertEquals(ConfigSpecification.SpaceType.FINISH_RIGHT,trackObj.getSpaceType(new PositionVector(22,24))); + } +} -- 2.40.1 From 571728b6fda3fa13e4ceb4b26c95ea27198e1be6 Mon Sep 17 00:00:00 2001 From: Andrin Fassbind Date: Sun, 6 Mar 2022 16:10:18 +0100 Subject: [PATCH 03/21] - Method toString done --- .../java/ch/zhaw/pm2/racetrack/Track.java | 44 ++++++++++++++++--- .../java/ch/zhaw/pm2/racetrack/TrackTest.java | 22 ++++------ 2 files changed, 47 insertions(+), 19 deletions(-) diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Track.java b/src/main/java/ch/zhaw/pm2/racetrack/Track.java index 68e5625..8e74c93 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Track.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Track.java @@ -6,6 +6,7 @@ import ch.zhaw.pm2.racetrack.given.TrackSpecification; import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Scanner; @@ -61,6 +62,8 @@ public class Track implements TrackSpecification { // TODO: Add necessary variables private List track; + private List cars; + /** * Initialize a Track from the given track file. * @@ -69,7 +72,9 @@ public class Track implements TrackSpecification { * @throws InvalidTrackFormatException if the track file contains invalid data (no tracklines, ...) */ public Track(File trackFile) throws FileNotFoundException, InvalidTrackFormatException { - // TODO: implementation + // TODO: + track = new ArrayList<>(); + cars = new ArrayList<>(); readFile(trackFile); //TODO: throw error again... @@ -78,20 +83,43 @@ public class Track implements TrackSpecification { /** * This method reads the File and saves it to the track ArrayList Line by Line + * * @param trackFile the File where the track has been documented * @throws FileNotFoundException if the FilePath is invalid. */ private void readFile(File trackFile) throws FileNotFoundException { - track = new ArrayList<>(); Scanner scanner = new Scanner(trackFile); while (scanner.hasNextLine()) { track.add(scanner.nextLine()); } } + public void findCar() { + ConfigSpecification.SpaceType[] spaceTypes = ConfigSpecification.SpaceType.values(); + ArrayList allSpaceTypesAsChar = new ArrayList<>(); + + for (ConfigSpecification.SpaceType spaceType : spaceTypes) { + allSpaceTypesAsChar.add(spaceType.getValue()); + } + + + for (String line : track) { + for (int i = 0; i < line.length(); i++) { + if (!allSpaceTypesAsChar.contains(line.charAt(i))) { + //TODO: CREATE CAR - ADD IT TO CARS - BUT CHECK THAT Symbol is not allready used for another car? + } + } + } + + } + + private void findFinish() { + //TODO: + + } + /** - * * @return the track */ public List getTrack() { @@ -111,9 +139,8 @@ public class Track implements TrackSpecification { char charAtPosition = track.get(position.getY()).charAt(position.getX()); ConfigSpecification.SpaceType[] spaceTypes = ConfigSpecification.SpaceType.values(); - for (ConfigSpecification.SpaceType spaceType : spaceTypes) { - if(spaceType.getValue() == charAtPosition) { + if (spaceType.getValue() == charAtPosition) { return spaceType; } } @@ -203,6 +230,11 @@ public class Track implements TrackSpecification { @Override public String toString() { // TODO: implementation - throw new UnsupportedOperationException(); + String str = ""; + for (String line : track) { + str += line+"\n"; + } + return str; + //throw new UnsupportedOperationException(); } } diff --git a/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java b/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java index 7034a97..c040580 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java @@ -7,9 +7,6 @@ import org.junit.jupiter.api.Test; import java.io.File; import java.io.FileNotFoundException; -import java.lang.reflect.Array; -import java.util.ArrayList; -import java.util.Arrays; import java.util.List; public class TrackTest { @@ -36,20 +33,19 @@ public class TrackTest { * Dirty test... */ @Test - void compareTrack() { - try { - List track = trackObj.getTrack(); - for (String s: track - ) { - System.out.println(s); - } - } catch (Exception e) { - System.err.println("Error in Test compareTrack" + e.getMessage()); - } + void printOutTrack() { + System.out.println(trackObj); } @Test void getSpaceTyp() { Assertions.assertEquals(ConfigSpecification.SpaceType.FINISH_RIGHT,trackObj.getSpaceType(new PositionVector(22,24))); } + + //TODO: + @Test + void findCarAtInit() { + trackObj.findCar(); + + } } -- 2.40.1 From 972f011a080c488eaabc6345a71570ed72e14c4a Mon Sep 17 00:00:00 2001 From: romanschenk37 <84532681+romanschenk37@users.noreply.github.com> Date: Sun, 6 Mar 2022 17:06:42 +0100 Subject: [PATCH 04/21] changes in Tests car.CarTest setPosition, movement, crash, moveStrategy --- .../java/ch/zhaw/pm2/racetrack/CarTest.java | 124 ++++++++++++++---- 1 file changed, 100 insertions(+), 24 deletions(-) diff --git a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java index eb013c6..a6d91ba 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java @@ -1,60 +1,136 @@ package ch.zhaw.pm2.racetrack; -import org.junit.jupiter.api.AfterEach; +import ch.zhaw.pm2.racetrack.strategy.*; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + import static org.junit.jupiter.api.Assertions.*; class CarTest { Car car; + int DEFAULT_X = 10; + int DEFAULT_Y = 10; @BeforeEach void setUp() { - car = new Car('a', new PositionVector(10, 10)); + car = new Car('a', new PositionVector(DEFAULT_X, DEFAULT_Y)); } - @AfterEach - void tearDown() { - } @Test void setPosition() { - car.setPosition(new PositionVector(20, 20)); - checkPosition(20, 20); + CheckNextPosition(DEFAULT_X, DEFAULT_Y); + + List validPositions = new ArrayList<>(); + validPositions.add(new PositionVector(20, 20)); + validPositions.add(new PositionVector(0, 0)); + validPositions.add(new PositionVector(20, 0)); + validPositions.add(new PositionVector(0, 20)); + + for(PositionVector positionVector : validPositions) { + car.setPosition(positionVector); + assertEquals(positionVector, car.nextPosition()); + } + + List invalidPositions = new ArrayList<>(); + invalidPositions.add(new PositionVector(0, -20)); + invalidPositions.add(new PositionVector(-20, 0)); + invalidPositions.add(new PositionVector(-20, -20)); + + for(PositionVector positionVector : invalidPositions) { + boolean exception = false; + try { + car.setPosition(positionVector); + } catch (IllegalArgumentException e) { + exception = true; + } + assertTrue(exception); + + CheckNextPosition(0, 0); + } } - @Test - void nextPosition() { - checkPosition(10, 10); - } + @Test - void accelerate() { + void movement() { + car.move(); + CheckNextPosition(DEFAULT_X, DEFAULT_Y); + + List directions = Arrays.asList(PositionVector.Direction.values()); + + for (PositionVector.Direction direction1 : directions){ + + setUp(); + int nextPosX = DEFAULT_X; + int nextPosY = DEFAULT_Y; + + car.accelerate(direction1); + nextPosX += direction1.vector.getX(); + nextPosY += direction1.vector.getY(); + CheckNextPosition(nextPosX, nextPosY); + + car.move(); + nextPosX += direction1.vector.getX(); + nextPosY += direction1.vector.getY(); + CheckNextPosition(nextPosX, nextPosY); + + for (PositionVector.Direction direction2 : directions) { + car.accelerate(direction2); + nextPosX += direction2.vector.getX(); + nextPosY += direction2.vector.getY(); + CheckNextPosition(nextPosX, nextPosY); + + car.move(); + nextPosX += direction1.vector.getX(); + nextPosY += direction1.vector.getY(); + nextPosX += direction2.vector.getX(); + nextPosY += direction2.vector.getY(); + CheckNextPosition(nextPosX, nextPosY); + + } + + } } - @Test - void move() { - } @Test void crash() { + assertFalse(car.isCrashed()); + car.crash(); + assertTrue(car.isCrashed()); + } @Test - void isCrashed() { + void MoveStrategy() { + MoveStrategy moveStrategy; + + moveStrategy = new DoNotMoveStrategy(); + car.setMoveStrategy(moveStrategy); + assertEquals(moveStrategy, car.getMoveStrategy()); + + moveStrategy = new MoveListStrategy(); + car.setMoveStrategy(moveStrategy); + assertEquals(moveStrategy, car.getMoveStrategy()); + + moveStrategy = new PathFollowerMoveStrategy(); + car.setMoveStrategy(moveStrategy); + assertEquals(moveStrategy, car.getMoveStrategy()); + + moveStrategy = new UserMoveStrategy(); + car.setMoveStrategy(moveStrategy); + assertEquals(moveStrategy, car.getMoveStrategy()); } - @Test - void setMoveStrategy() { - } - @Test - void getMoveStrategy() { - } - void checkPosition(int x, int y) { - assertTrue(car.nextPosition().equals(new PositionVector(x, y))); + void CheckNextPosition(int x, int y) { + assertEquals(new PositionVector(x, y), car.nextPosition()); } } -- 2.40.1 From 8086111772e34c4079d87805ee1a8eff94111306 Mon Sep 17 00:00:00 2001 From: romanschenk37 <84532681+romanschenk37@users.noreply.github.com> Date: Sun, 6 Mar 2022 18:13:27 +0100 Subject: [PATCH 05/21] Fix in CarTest.java @Test setPosition --- src/test/java/ch/zhaw/pm2/racetrack/CarTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java index a6d91ba..5f0c462 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java @@ -51,7 +51,7 @@ class CarTest { } assertTrue(exception); - CheckNextPosition(0, 0); + CheckNextPosition(DEFAULT_X, DEFAULT_Y); } } -- 2.40.1 From 40cd4f7b72e59e83fbcf60f9d7ad2759d6015fab Mon Sep 17 00:00:00 2001 From: romanschenk37 <84532681+romanschenk37@users.noreply.github.com> Date: Sun, 6 Mar 2022 18:57:01 +0100 Subject: [PATCH 06/21] Added Javadoc and comments in CarTest.java --- .../java/ch/zhaw/pm2/racetrack/CarTest.java | 91 ++++++++++++------- 1 file changed, 60 insertions(+), 31 deletions(-) diff --git a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java index 5f0c462..3468cbf 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java @@ -11,38 +11,62 @@ import java.util.List; import static org.junit.jupiter.api.Assertions.*; +/** + * Tests for Class Car + */ class CarTest { + Car car; + + // Default coordinates for tests int DEFAULT_X = 10; int DEFAULT_Y = 10; + /** + * Create a new Car Object and set Position to a defined Default Position + */ @BeforeEach void setUp() { car = new Car('a', new PositionVector(DEFAULT_X, DEFAULT_Y)); } + /** + * Method to check nextPosition with coordinates as int + * + * @param x the expected value for x coordinate + * @param y the expected value for y coordinate + */ + void CheckNextPosition(int x, int y) { + assertEquals(new PositionVector(x, y), car.nextPosition()); + } + /** + * - checks if the position of the car can be set and saved correctly with valid positions. + * - checks if an exception is throwed and position keeps unchanged if invalid coordinates are entered. + */ @Test void setPosition() { CheckNextPosition(DEFAULT_X, DEFAULT_Y); + // List of valid Positions List validPositions = new ArrayList<>(); validPositions.add(new PositionVector(20, 20)); validPositions.add(new PositionVector(0, 0)); validPositions.add(new PositionVector(20, 0)); validPositions.add(new PositionVector(0, 20)); - for(PositionVector positionVector : validPositions) { + for (PositionVector positionVector : validPositions) { car.setPosition(positionVector); assertEquals(positionVector, car.nextPosition()); } + // List of invalid positions. List invalidPositions = new ArrayList<>(); invalidPositions.add(new PositionVector(0, -20)); invalidPositions.add(new PositionVector(-20, 0)); invalidPositions.add(new PositionVector(-20, -20)); - for(PositionVector positionVector : invalidPositions) { + for (PositionVector positionVector : invalidPositions) { boolean exception = false; try { car.setPosition(positionVector); @@ -51,62 +75,73 @@ class CarTest { } assertTrue(exception); + // position should keep unchanged CheckNextPosition(DEFAULT_X, DEFAULT_Y); } } - + /** + * Checks if the methods accelerate and move are working correctly with acceleration in all directions. + * Checks also if velocity is calculated correctly if method accelerate is called a second time. + */ @Test void movement() { + // add all possible directions in a List + List directions = Arrays.asList(PositionVector.Direction.values()); + + //position shouldn't be changed because velocity should be 0. car.move(); CheckNextPosition(DEFAULT_X, DEFAULT_Y); - List directions = Arrays.asList(PositionVector.Direction.values()); - - for (PositionVector.Direction direction1 : directions){ + for (PositionVector.Direction direction1 : directions) { + //create a new instance of Car with default coordinates and velocity 0. setUp(); - int nextPosX = DEFAULT_X; - int nextPosY = DEFAULT_Y; + + //variables to save the actual expected result of method nextPosition + int ExpectedNextPosX = DEFAULT_X; + int ExpectedNextPosY = DEFAULT_Y; car.accelerate(direction1); - nextPosX += direction1.vector.getX(); - nextPosY += direction1.vector.getY(); - CheckNextPosition(nextPosX, nextPosY); + ExpectedNextPosX += direction1.vector.getX(); + ExpectedNextPosY += direction1.vector.getY(); + CheckNextPosition(ExpectedNextPosX, ExpectedNextPosY); car.move(); - nextPosX += direction1.vector.getX(); - nextPosY += direction1.vector.getY(); - CheckNextPosition(nextPosX, nextPosY); + ExpectedNextPosX += direction1.vector.getX(); + ExpectedNextPosY += direction1.vector.getY(); + CheckNextPosition(ExpectedNextPosX, ExpectedNextPosY); for (PositionVector.Direction direction2 : directions) { car.accelerate(direction2); - nextPosX += direction2.vector.getX(); - nextPosY += direction2.vector.getY(); - CheckNextPosition(nextPosX, nextPosY); + ExpectedNextPosX += direction2.vector.getX(); + ExpectedNextPosY += direction2.vector.getY(); + CheckNextPosition(ExpectedNextPosX, ExpectedNextPosY); car.move(); - nextPosX += direction1.vector.getX(); - nextPosY += direction1.vector.getY(); - nextPosX += direction2.vector.getX(); - nextPosY += direction2.vector.getY(); - CheckNextPosition(nextPosX, nextPosY); - + ExpectedNextPosX += (direction1.vector.getX() + direction2.vector.getX()); + ExpectedNextPosY += (direction1.vector.getY() + direction2.vector.getY()); + CheckNextPosition(ExpectedNextPosX, ExpectedNextPosY); } - } } + /** + * test for methods crash and isCrashed. checks if state crashed is set and returned correctly. + */ @Test void crash() { assertFalse(car.isCrashed()); car.crash(); assertTrue(car.isCrashed()); - } + /** + * test for methods setMoveStrategy. Checks if the MoveStrategy Object is saved and returned correctly + * with all Types of MoveStrategy. + */ @Test void MoveStrategy() { MoveStrategy moveStrategy; @@ -127,10 +162,4 @@ class CarTest { car.setMoveStrategy(moveStrategy); assertEquals(moveStrategy, car.getMoveStrategy()); } - - - - void CheckNextPosition(int x, int y) { - assertEquals(new PositionVector(x, y), car.nextPosition()); - } } -- 2.40.1 From dea430e418c1bf1aacec97bc766cfc0f996c5637 Mon Sep 17 00:00:00 2001 From: romanschenk37 <84532681+romanschenk37@users.noreply.github.com> Date: Mon, 7 Mar 2022 17:43:32 +0100 Subject: [PATCH 07/21] Added Test for Method getID in CarTest.java --- src/test/java/ch/zhaw/pm2/racetrack/CarTest.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java index 3468cbf..e8db6aa 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java @@ -21,13 +21,19 @@ class CarTest { // Default coordinates for tests int DEFAULT_X = 10; int DEFAULT_Y = 10; + char DEFAULT_ID = 'f'; /** * Create a new Car Object and set Position to a defined Default Position */ @BeforeEach void setUp() { - car = new Car('a', new PositionVector(DEFAULT_X, DEFAULT_Y)); + car = new Car(DEFAULT_ID, new PositionVector(DEFAULT_X, DEFAULT_Y)); + } + + @Test + void getID() { + assertEquals(DEFAULT_ID, car.getID()); } /** -- 2.40.1 From 007d8ee3937d6268cfb9a706056ce577b6cac252 Mon Sep 17 00:00:00 2001 From: Andrin Fassbind Date: Mon, 7 Mar 2022 17:49:55 +0100 Subject: [PATCH 08/21] =?UTF-8?q?-=20Methoden=20=C3=BCberarbeitet=20Teils?= =?UTF-8?q?=20provisorisch=20da=20genaue=20Umsetzung=20noch=20unklar=20Sie?= =?UTF-8?q?he=20TODO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ch/zhaw/pm2/racetrack/Track.java | 47 ++++++++++++++----- .../java/ch/zhaw/pm2/racetrack/TrackTest.java | 4 +- 2 files changed, 37 insertions(+), 14 deletions(-) diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Track.java b/src/main/java/ch/zhaw/pm2/racetrack/Track.java index 8e74c93..688ee61 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Track.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Track.java @@ -94,7 +94,7 @@ public class Track implements TrackSpecification { } } - public void findCar() { + public void addCar() { ConfigSpecification.SpaceType[] spaceTypes = ConfigSpecification.SpaceType.values(); ArrayList allSpaceTypesAsChar = new ArrayList<>(); @@ -113,6 +113,19 @@ public class Track implements TrackSpecification { } + private PositionVector findChar(char symbol) { + PositionVector vector = null; + for (int i = 0; i < track.size(); i++) { + String line = track.get(i); + for (int j = 0; j < line.length(); j++) { + if (line.charAt(j) == symbol) { + vector = new PositionVector(j,i); + } + } + } + return vector; + } + private void findFinish() { //TODO: @@ -155,8 +168,9 @@ public class Track implements TrackSpecification { */ @Override public int getCarCount() { - // TODO: implementation - throw new UnsupportedOperationException(); + // TODO: error??? + return cars.size(); + //throw new UnsupportedOperationException(); } /** @@ -167,8 +181,9 @@ public class Track implements TrackSpecification { */ @Override public Car getCar(int carIndex) { - // TODO: implementation - throw new UnsupportedOperationException(); + // TODO: error??? + return cars.get(carIndex); + //throw new UnsupportedOperationException(); } /** @@ -179,8 +194,9 @@ public class Track implements TrackSpecification { */ @Override public char getCarId(int carIndex) { - // TODO: implementation - throw new UnsupportedOperationException(); + // TODO: error??? + return cars.get(carIndex).getID(); + //throw new UnsupportedOperationException(); } /** @@ -191,8 +207,14 @@ public class Track implements TrackSpecification { */ @Override public PositionVector getCarPos(int carIndex) { - // TODO: implementation - throw new UnsupportedOperationException(); + // TODO: nextPosition or Position of Trackfile? + //Alternative 1 + return cars.get(carIndex).nextPosition(); + + //Alternative 2 //NULL aussschliessen falls umgesetzt. + return findChar(cars.get(carIndex).getID()); + + //throw new UnsupportedOperationException(); } /** @@ -203,8 +225,9 @@ public class Track implements TrackSpecification { */ @Override public PositionVector getCarVelocity(int carIndex) { - // TODO: implementation - throw new UnsupportedOperationException(); + // TODO: error??? + return cars.get(carIndex).getVelocity(); + //throw new UnsupportedOperationException(); } /** @@ -229,7 +252,7 @@ public class Track implements TrackSpecification { */ @Override public String toString() { - // TODO: implementation + // TODO: error??? String str = ""; for (String line : track) { str += line+"\n"; diff --git a/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java b/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java index c040580..6821ea9 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java @@ -44,8 +44,8 @@ public class TrackTest { //TODO: @Test - void findCarAtInit() { - trackObj.findCar(); + void addCarAtInit() { + trackObj.addCar(); } } -- 2.40.1 From 31a24120eb29b2a4c9d1ffdb355f1fd1a72a17d5 Mon Sep 17 00:00:00 2001 From: romanschenk37 <84532681+romanschenk37@users.noreply.github.com> Date: Mon, 7 Mar 2022 20:44:05 +0100 Subject: [PATCH 09/21] added checks for method getVelocity in Test Movement in CarTest.java --- .../java/ch/zhaw/pm2/racetrack/CarTest.java | 54 ++++++++++++------- 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java index e8db6aa..472b356 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java @@ -42,7 +42,7 @@ class CarTest { * @param x the expected value for x coordinate * @param y the expected value for y coordinate */ - void CheckNextPosition(int x, int y) { + void checkNextPosition(int x, int y) { assertEquals(new PositionVector(x, y), car.nextPosition()); } @@ -52,7 +52,7 @@ class CarTest { */ @Test void setPosition() { - CheckNextPosition(DEFAULT_X, DEFAULT_Y); + checkNextPosition(DEFAULT_X, DEFAULT_Y); // List of valid Positions List validPositions = new ArrayList<>(); @@ -82,13 +82,17 @@ class CarTest { assertTrue(exception); // position should keep unchanged - CheckNextPosition(DEFAULT_X, DEFAULT_Y); + checkNextPosition(DEFAULT_X, DEFAULT_Y); } } + void checkVelocity(int x, int y) { + assertEquals(new PositionVector(x, y), car.getVelocity()); + } + /** - * Checks if the methods accelerate and move are working correctly with acceleration in all directions. + * Checks if the methods accelerate, move and getVelocity are working correctly with acceleration in all directions. * Checks also if velocity is calculated correctly if method accelerate is called a second time. */ @Test @@ -98,7 +102,7 @@ class CarTest { //position shouldn't be changed because velocity should be 0. car.move(); - CheckNextPosition(DEFAULT_X, DEFAULT_Y); + checkNextPosition(DEFAULT_X, DEFAULT_Y); for (PositionVector.Direction direction1 : directions) { @@ -106,29 +110,41 @@ class CarTest { setUp(); //variables to save the actual expected result of method nextPosition - int ExpectedNextPosX = DEFAULT_X; - int ExpectedNextPosY = DEFAULT_Y; + int expectedNextPosX = DEFAULT_X; + int expectedNextPosY = DEFAULT_Y; + + //variables to save the acutal expected result of method getVelocity + int expectedVelocityX = 0; + int expectedVelocityY = 0; car.accelerate(direction1); - ExpectedNextPosX += direction1.vector.getX(); - ExpectedNextPosY += direction1.vector.getY(); - CheckNextPosition(ExpectedNextPosX, ExpectedNextPosY); + expectedVelocityX += direction1.vector.getX(); + expectedVelocityY += direction1.vector.getY(); + expectedNextPosX += direction1.vector.getX(); + expectedNextPosY += direction1.vector.getY(); + checkVelocity(expectedVelocityX, expectedVelocityY); + checkNextPosition(expectedNextPosX, expectedNextPosY); car.move(); - ExpectedNextPosX += direction1.vector.getX(); - ExpectedNextPosY += direction1.vector.getY(); - CheckNextPosition(ExpectedNextPosX, ExpectedNextPosY); + expectedNextPosX += direction1.vector.getX(); + expectedNextPosY += direction1.vector.getY(); + checkVelocity(expectedVelocityX, expectedVelocityY); + checkNextPosition(expectedNextPosX, expectedNextPosY); for (PositionVector.Direction direction2 : directions) { car.accelerate(direction2); - ExpectedNextPosX += direction2.vector.getX(); - ExpectedNextPosY += direction2.vector.getY(); - CheckNextPosition(ExpectedNextPosX, ExpectedNextPosY); + expectedVelocityX += direction2.vector.getX(); + expectedVelocityY += direction2.vector.getY(); + expectedNextPosX += direction2.vector.getX(); + expectedNextPosY += direction2.vector.getY(); + checkVelocity(expectedVelocityX, expectedVelocityY); + checkNextPosition(expectedNextPosX, expectedNextPosY); car.move(); - ExpectedNextPosX += (direction1.vector.getX() + direction2.vector.getX()); - ExpectedNextPosY += (direction1.vector.getY() + direction2.vector.getY()); - CheckNextPosition(ExpectedNextPosX, ExpectedNextPosY); + checkVelocity(expectedVelocityX, expectedVelocityY); + expectedNextPosX += (direction1.vector.getX() + direction2.vector.getX()); + expectedNextPosY += (direction1.vector.getY() + direction2.vector.getY()); + checkNextPosition(expectedNextPosX, expectedNextPosY); } } } -- 2.40.1 From 77b5f4cbfb28dfa1484e95032ff89a51098f3fef Mon Sep 17 00:00:00 2001 From: romanschenk37 <84532681+romanschenk37@users.noreply.github.com> Date: Mon, 7 Mar 2022 22:03:43 +0100 Subject: [PATCH 10/21] created Class_UserInterface --- .../ch/zhaw/pm2/racetrack/UserInterface.java | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 src/main/java/ch/zhaw/pm2/racetrack/UserInterface.java diff --git a/src/main/java/ch/zhaw/pm2/racetrack/UserInterface.java b/src/main/java/ch/zhaw/pm2/racetrack/UserInterface.java new file mode 100644 index 0000000..d800a95 --- /dev/null +++ b/src/main/java/ch/zhaw/pm2/racetrack/UserInterface.java @@ -0,0 +1,94 @@ +package ch.zhaw.pm2.racetrack; + +import org.beryx.textio.TextIO; +import org.beryx.textio.TextIoFactory; +import org.beryx.textio.TextTerminal; + +import java.util.List; + +public class UserInterface { + + private final TextIO textIO; + private final TextTerminal textTerminal; + + /** + * Opens a new Terminal Window and prints the welcome Text + * @param welcomeText The Text which will be printed after the windows is opened. + */ + public UserInterface(String welcomeText) { + textIO = TextIoFactory.getTextIO(); + textTerminal = textIO.getTextTerminal(); + + textTerminal.println(welcomeText + "\n"); + } + + /** + * asks the user to choose one of the options given. + * @param text Text which is printed befor the options are printed. Example: "Select Track file:" + * @param options List with the options which can be selected. + * @return the list index of the selected option + */ + public int selectOption(String text, List options) { + textTerminal.println(text + ":\n"); + for(int option = 0; option < options.size(); option ++) { + textTerminal.println(" " + (option + 1) + ": " + options.get(option)); + } + return textIO.newIntInputReader().withMinVal(1).withMaxVal(options.size()).read("Enter your choice: ") - 1; + } + + /** + * gives information which player's turn it is and asks for the direction to accelerate + * @param playingCarIndex the index of the player + * @param playingCarID the ID of the player + * @return the direction which is selected by the player. If null -> quit game + */ + public PositionVector.Direction selectDirection(int playingCarIndex, char playingCarID) { + PositionVector.Direction direction = null; + textTerminal.println("Playing Car " + playingCarIndex + ": " + playingCarIndex); + textTerminal.println("Directions are based on the number pad:"); + textTerminal.println("7 8 9 7=up-left, 8=up, 9=up-right"); + textTerminal.println("4 5 6 4=left, 5=no acceleration, 6=right"); + textTerminal.println("1 2 3 1=down-left, 2=down, 3=down-right"); + textTerminal.println("\n10 = quit \n"); + + while (direction == null) { //asks until a valid input in entered + int number = textIO.newIntInputReader().withMinVal(1).withMaxVal(10).read("choose your Acceleration direction: "); + if (number == 10) { //quit game + return null; + } + direction = getDirection(number); + } + return direction; + } + + /** + * returns the the associated direction Object + * @param number the number which was typed by the user + * @return the associated direction. If null -> unknown number + */ + private PositionVector.Direction getDirection(int number) { + return switch (number) { + case 1 -> PositionVector.Direction.DOWN_LEFT; + case 2 -> PositionVector.Direction.DOWN; + case 3 -> PositionVector.Direction.DOWN_RIGHT; + case 4 -> PositionVector.Direction.LEFT; + case 5 -> PositionVector.Direction.NONE; + case 6 -> PositionVector.Direction.RIGHT; + case 7 -> PositionVector.Direction.UP_LEFT; + case 8 -> PositionVector.Direction.UP; + case 9 -> PositionVector.Direction.UP_RIGHT; + default -> null; + }; + } + + /** + * prints the given Track in the terminal + * @param track the track which should be printed + */ + public void printTrack(Track track) { + textTerminal.println(track.toString()); + } + + + +} -- 2.40.1 From 15123b05bb5ae19a02c186a0a1bc470af3ce9054 Mon Sep 17 00:00:00 2001 From: Andrin Fassbind Date: Tue, 8 Mar 2022 11:27:05 +0100 Subject: [PATCH 11/21] =?UTF-8?q?-=20Methoden=20=C3=BCberarbeitet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + .../java/ch/zhaw/pm2/racetrack/Track.java | 96 ++++++++++++------- .../java/ch/zhaw/pm2/racetrack/TrackTest.java | 29 +++++- 3 files changed, 91 insertions(+), 35 deletions(-) diff --git a/build.gradle b/build.gradle index 37dcb87..669126f 100644 --- a/build.gradle +++ b/build.gradle @@ -29,6 +29,7 @@ dependencies { // beryx uses SLF4J. To remove warning, we add the implementation "no operation" implementation 'org.slf4j:slf4j-nop:2.+' + implementation 'junit:junit:4.13.1' // Use JUnit Jupiter API for testing. testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2' diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Track.java b/src/main/java/ch/zhaw/pm2/racetrack/Track.java index 688ee61..1c7dffc 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Track.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Track.java @@ -63,6 +63,7 @@ public class Track implements TrackSpecification { // TODO: Add necessary variables private List track; private List cars; + private List finishLine; /** * Initialize a Track from the given track file. @@ -75,10 +76,10 @@ public class Track implements TrackSpecification { // TODO: track = new ArrayList<>(); cars = new ArrayList<>(); + finishLine = new ArrayList<>(); readFile(trackFile); - - //TODO: throw error again... - //throw new UnsupportedOperationException(); // was allready in !! + findFinish(); + addCar(); } /** @@ -94,43 +95,84 @@ public class Track implements TrackSpecification { } } - public void addCar() { + //TODO: MAKE PRIVATE + public void addCar() throws InvalidTrackFormatException { ConfigSpecification.SpaceType[] spaceTypes = ConfigSpecification.SpaceType.values(); - ArrayList allSpaceTypesAsChar = new ArrayList<>(); + List allSpaceTypesAsChar = new ArrayList<>(); + List usedSymbolForCar = new ArrayList<>(); for (ConfigSpecification.SpaceType spaceType : spaceTypes) { allSpaceTypesAsChar.add(spaceType.getValue()); } - for (String line : track) { + for (int j = 0; j < track.size(); j++) { + String line = track.get(j); for (int i = 0; i < line.length(); i++) { - if (!allSpaceTypesAsChar.contains(line.charAt(i))) { - //TODO: CREATE CAR - ADD IT TO CARS - BUT CHECK THAT Symbol is not allready used for another car? + char possibleCarChar = line.charAt(i); + if (!allSpaceTypesAsChar.contains(possibleCarChar)) { + if (usedSymbolForCar.contains(possibleCarChar)) { + throw new InvalidTrackFormatException(); + } + usedSymbolForCar.add(possibleCarChar); + cars.add(new Car(possibleCarChar, new PositionVector(i, j))); } } } } + private void findFinish() throws InvalidTrackFormatException { + for (int i = 0; i < track.size(); i++) { + String line = track.get(i); + for (int j = 0; j < line.length(); j++) { + if (line.charAt(j) == ConfigSpecification.SpaceType.FINISH_LEFT.getValue() || + line.charAt(j) == ConfigSpecification.SpaceType.FINISH_RIGHT.getValue() || + line.charAt(j) == ConfigSpecification.SpaceType.FINISH_DOWN.getValue() || + line.charAt(j) == ConfigSpecification.SpaceType.FINISH_UP.getValue()) { + finishLine.add(new PositionVector(j, i)); + } + } + } + if (finishLine.size() == 0) { + throw new InvalidTrackFormatException(); + } + ConfigSpecification.SpaceType finishTyp = getSpaceType(finishLine.get(0)); + for (PositionVector positionVector : finishLine) { + if (getSpaceType(positionVector) != finishTyp) { + throw new InvalidTrackFormatException(); + } + } + } + private PositionVector findChar(char symbol) { PositionVector vector = null; for (int i = 0; i < track.size(); i++) { String line = track.get(i); for (int j = 0; j < line.length(); j++) { if (line.charAt(j) == symbol) { - vector = new PositionVector(j,i); + vector = new PositionVector(j, i); } } } return vector; } - private void findFinish() { - //TODO: - + /** + * + * @return all Cars + */ + public List getCars() { + return cars; } + /** + * + * @return finishLine + */ + public List getFinishLine() { + return finishLine; + } /** * @return the track @@ -148,7 +190,8 @@ public class Track implements TrackSpecification { */ @Override public Config.SpaceType getSpaceType(PositionVector position) { - // TODO: implementation // Done first tests passed but what to do with error + + //TODO: RETURN NULL OR CUSTOM ERROR? char charAtPosition = track.get(position.getY()).charAt(position.getX()); ConfigSpecification.SpaceType[] spaceTypes = ConfigSpecification.SpaceType.values(); @@ -158,7 +201,7 @@ public class Track implements TrackSpecification { } } - throw new UnsupportedOperationException(); + return null; } /** @@ -168,9 +211,7 @@ public class Track implements TrackSpecification { */ @Override public int getCarCount() { - // TODO: error??? return cars.size(); - //throw new UnsupportedOperationException(); } /** @@ -181,9 +222,7 @@ public class Track implements TrackSpecification { */ @Override public Car getCar(int carIndex) { - // TODO: error??? return cars.get(carIndex); - //throw new UnsupportedOperationException(); } /** @@ -194,27 +233,20 @@ public class Track implements TrackSpecification { */ @Override public char getCarId(int carIndex) { - // TODO: error??? - return cars.get(carIndex).getID(); - //throw new UnsupportedOperationException(); + return cars.get(carIndex).getId(); } /** * Get the position of the specified car. + * Returns Null if carIndex not valid * * @param carIndex The zero-based carIndex number * @return A PositionVector containing the car's current position */ @Override public PositionVector getCarPos(int carIndex) { - // TODO: nextPosition or Position of Trackfile? - //Alternative 1 - return cars.get(carIndex).nextPosition(); - - //Alternative 2 //NULL aussschliessen falls umgesetzt. - return findChar(cars.get(carIndex).getID()); - - //throw new UnsupportedOperationException(); + return findChar(cars.get(carIndex).getId()); + //TODO: SHOULD WE GET CAR POSITION FROM TRACK STRING OR CAR OBJ } /** @@ -225,9 +257,7 @@ public class Track implements TrackSpecification { */ @Override public PositionVector getCarVelocity(int carIndex) { - // TODO: error??? return cars.get(carIndex).getVelocity(); - //throw new UnsupportedOperationException(); } /** @@ -252,12 +282,10 @@ public class Track implements TrackSpecification { */ @Override public String toString() { - // TODO: error??? String str = ""; for (String line : track) { - str += line+"\n"; + str += line + "\n"; } return str; - //throw new UnsupportedOperationException(); } } diff --git a/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java b/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java index 6821ea9..a4decfb 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java @@ -1,14 +1,17 @@ package ch.zhaw.pm2.racetrack; import ch.zhaw.pm2.racetrack.given.ConfigSpecification; +import org.junit.Before; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.io.File; import java.io.FileNotFoundException; +import java.util.ArrayList; import java.util.List; + public class TrackTest { Track trackObj; @@ -45,7 +48,31 @@ public class TrackTest { //TODO: @Test void addCarAtInit() { - trackObj.addCar(); + try { + trackObj.addCar(); + } catch (InvalidTrackFormatException e) { + e.printStackTrace(); + } } + + @Test + void findFinish() { + List expected = new ArrayList<>(); + expected.add(new PositionVector(22,22)); + expected.add(new PositionVector(22,23)); + expected.add(new PositionVector(22,24)); + Assertions.assertEquals(expected,trackObj.getFinishLine()); + } + + @Test + void makeTrackObj() { + try { + Track t1 = new Track(new File("C:\\Studium\\Semester2\\PM2\\Projekt1\\racetrack\\tracks\\challenge.txt")); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (InvalidTrackFormatException e) { + e.printStackTrace(); + } + } } -- 2.40.1 From b6f69d3c1c83bc065711b8fd513ab7d199192723 Mon Sep 17 00:00:00 2001 From: Leonardo Brandenberger Date: Thu, 10 Mar 2022 13:31:51 +0100 Subject: [PATCH 12/21] created Branch car finished all TODOS in car and created needed method getID and getVelocity. --- src/main/java/ch/zhaw/pm2/racetrack/Car.java | 53 +++++++++++++++----- 1 file changed, 40 insertions(+), 13 deletions(-) diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Car.java b/src/main/java/ch/zhaw/pm2/racetrack/Car.java index 9b97c3d..c8739f1 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Car.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Car.java @@ -3,6 +3,8 @@ package ch.zhaw.pm2.racetrack; import ch.zhaw.pm2.racetrack.given.CarSpecification; import ch.zhaw.pm2.racetrack.strategy.MoveStrategy; +import java.util.Vector; + /** * Class representing a car on the racetrack. * Uses {@link PositionVector} to store current position on the track grid and current velocity vector. @@ -48,17 +50,39 @@ public class Car implements CarSpecification { setPosition(position); } + /** + * Returns the id of the car. + * + * @return id of the car. + */ + public char getID(){ + return id; + } + + /** + * Returns the current velocity of the car as a PositionVector. + * + * @return velocity current velocity of the car. + */ + public PositionVector getVelocity(){ + return velocity; + } /** * Set this Car position directly, regardless of current position and velocity. * This should only be used by the game controller in rare cases to set the crash or winning position. * The next position is normaly automatically calculated and set in the {@link #move()} method. * * @param position The new position to set the car directly to. + * @throws IllegalArgumentException if invalid PositionVector is given. */ @Override public void setPosition(final PositionVector position) { - // TODO: implementation - throw new UnsupportedOperationException(); + if (position.getX() < 0 || position.getY() < 0) { + throw new IllegalArgumentException(); + } + else { + this.position = position; + } } /** @@ -69,8 +93,7 @@ public class Car implements CarSpecification { */ @Override public PositionVector nextPosition() { - // TODO: implementation - throw new UnsupportedOperationException(); + return new PositionVector(position.getX() + velocity.getX(),position.getY() + velocity.getY()); } /** @@ -80,11 +103,18 @@ public class Car implements CarSpecification { * Changes only velocity, not position. * * @param acceleration A Direction vector containing the amounts to add to the velocity in x and y dimension + * @throws IllegalArgumentException if PositionVector is not in allowed area. */ @Override public void accelerate(PositionVector.Direction acceleration) { - // TODO: implementation - throw new UnsupportedOperationException(); + if(acceleration.vector.getX() < -1 || acceleration.vector.getX() > 1|| + acceleration.vector.getY() < -1 || acceleration.vector.getY() > 1) { + throw new IllegalArgumentException(); + } + else { + velocity = new PositionVector(velocity.getX() + acceleration.vector.getX(), + velocity.getY() + acceleration.vector.getY()); + } } /** @@ -92,8 +122,7 @@ public class Car implements CarSpecification { */ @Override public void move() { - // TODO: implementation - throw new UnsupportedOperationException(); + position = new PositionVector(position.getX() + velocity.getX(), position.getY() + velocity.getY()); } /** @@ -101,8 +130,7 @@ public class Car implements CarSpecification { */ @Override public void crash() { - // TODO: implementation - throw new UnsupportedOperationException(); + crashed = true; } /** @@ -112,13 +140,12 @@ public class Car implements CarSpecification { */ @Override public boolean isCrashed() { - // TODO: implementation - throw new UnsupportedOperationException(); + return crashed; } /** * Set move strategy - * @param moveStrategy + * @param moveStrategy Strategy to be implemented */ public void setMoveStrategy(MoveStrategy moveStrategy) { this.moveStrategy = moveStrategy; -- 2.40.1 From 19b227c59fccb2b65816a3eebfbeda0c82d0b0d4 Mon Sep 17 00:00:00 2001 From: Leonardo Brandenberger Date: Thu, 10 Mar 2022 14:18:33 +0100 Subject: [PATCH 13/21] merged cartest branch into car branch --- src/test/java/ch/zhaw/pm2/racetrack/CarTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java index 472b356..87154a6 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java @@ -74,6 +74,7 @@ class CarTest { for (PositionVector positionVector : invalidPositions) { boolean exception = false; + setUp(); try { car.setPosition(positionVector); } catch (IllegalArgumentException e) { -- 2.40.1 From befc67f4f02363ef3e260d02a46188717f49c9f9 Mon Sep 17 00:00:00 2001 From: Andrin Fassbind Date: Thu, 10 Mar 2022 14:35:33 +0100 Subject: [PATCH 14/21] =?UTF-8?q?-=20Methoden=20=C3=BCberarbeitet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/ch/zhaw/pm2/racetrack/Car.java | 10 +++- src/main/java/ch/zhaw/pm2/racetrack/Game.java | 7 ++- .../java/ch/zhaw/pm2/racetrack/Track.java | 49 +++++++++++++++---- 3 files changed, 53 insertions(+), 13 deletions(-) diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Car.java b/src/main/java/ch/zhaw/pm2/racetrack/Car.java index 9b97c3d..dfcce64 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Car.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Car.java @@ -48,6 +48,14 @@ public class Car implements CarSpecification { setPosition(position); } + public char getId() { + return id; + } + + public PositionVector getVelocity() { + return velocity; + } + /** * Set this Car position directly, regardless of current position and velocity. * This should only be used by the game controller in rare cases to set the crash or winning position. @@ -58,7 +66,7 @@ public class Car implements CarSpecification { @Override public void setPosition(final PositionVector position) { // TODO: implementation - throw new UnsupportedOperationException(); + this.position = position; } /** diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Game.java b/src/main/java/ch/zhaw/pm2/racetrack/Game.java index 27609ca..b0204e9 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Game.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Game.java @@ -127,6 +127,8 @@ public class Game implements GameSpecification { throw new UnsupportedOperationException(); } + + /** * Does indicate if a car would have a crash with a WALL space or another car at the given position. * @param carIndex The zero-based carIndex number @@ -135,7 +137,8 @@ public class Game implements GameSpecification { */ @Override public boolean willCarCrash(int carIndex, PositionVector position) { - // TODO: implementation - throw new UnsupportedOperationException(); + + + return true; } } diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Track.java b/src/main/java/ch/zhaw/pm2/racetrack/Track.java index 1c7dffc..5cc9993 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Track.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Track.java @@ -73,13 +73,12 @@ public class Track implements TrackSpecification { * @throws InvalidTrackFormatException if the track file contains invalid data (no tracklines, ...) */ public Track(File trackFile) throws FileNotFoundException, InvalidTrackFormatException { - // TODO: track = new ArrayList<>(); cars = new ArrayList<>(); finishLine = new ArrayList<>(); readFile(trackFile); findFinish(); - addCar(); + addCars(); } /** @@ -95,8 +94,8 @@ public class Track implements TrackSpecification { } } - //TODO: MAKE PRIVATE - public void addCar() throws InvalidTrackFormatException { + + private void addCars() throws InvalidTrackFormatException { ConfigSpecification.SpaceType[] spaceTypes = ConfigSpecification.SpaceType.values(); List allSpaceTypesAsChar = new ArrayList<>(); List usedSymbolForCar = new ArrayList<>(); @@ -159,7 +158,6 @@ public class Track implements TrackSpecification { } /** - * * @return all Cars */ public List getCars() { @@ -167,7 +165,6 @@ public class Track implements TrackSpecification { } /** - * * @return finishLine */ public List getFinishLine() { @@ -181,6 +178,32 @@ public class Track implements TrackSpecification { return track; } + /** + * This Method will update the Car on the track + * and will make the Car move to the next position + * @param carIndex representing the current Car + */ + public void moveCar(int carIndex) { + PositionVector positionVector = findChar(getCarId(carIndex)); + //Removes the Car at Current Pos + String line = track.get(positionVector.getY()); + line = line.substring(0,positionVector.getX()) + ConfigSpecification.SpaceType.TRACK.getValue() + line.substring(positionVector.getX()+1); + track.add(positionVector.getY(),line); + + //Adds Car at new Position + positionVector = cars.get(carIndex).nextPosition(); + line = track.get(positionVector.getY()); + line = line.substring(0,positionVector.getX()) + cars.get(carIndex).getId() + line.substring(positionVector.getX()+1); + track.add(positionVector.getY(),line); + + //Change position of car + getCar(carIndex).move(); + } + + public char getRealCharAtPosition(PositionVector positionVector) { + return track.get(positionVector.getY()).charAt(positionVector.getX()); + } + /** * Return the type of space at the given position. * If the location is outside the track bounds, it is considered a wall. @@ -191,7 +214,6 @@ public class Track implements TrackSpecification { @Override public Config.SpaceType getSpaceType(PositionVector position) { - //TODO: RETURN NULL OR CUSTOM ERROR? char charAtPosition = track.get(position.getY()).charAt(position.getX()); ConfigSpecification.SpaceType[] spaceTypes = ConfigSpecification.SpaceType.values(); @@ -246,7 +268,6 @@ public class Track implements TrackSpecification { @Override public PositionVector getCarPos(int carIndex) { return findChar(cars.get(carIndex).getId()); - //TODO: SHOULD WE GET CAR POSITION FROM TRACK STRING OR CAR OBJ } /** @@ -271,8 +292,16 @@ public class Track implements TrackSpecification { */ @Override public char getCharAtPosition(int y, int x, Config.SpaceType currentSpace) { - // TODO: implementation - throw new UnsupportedOperationException(); + char charAtPos = track.get(y).charAt(x); + for (Car car : cars) { + if(charAtPos == car.getId()) { + if(car.isCrashed()) { + return CRASH_INDICATOR; + } + return charAtPos; + } + } + return currentSpace.getValue(); } /** -- 2.40.1 From 46e6b838c216f110e04fbbf0a96a70d9aa913fda Mon Sep 17 00:00:00 2001 From: Andrin Fassbind Date: Thu, 10 Mar 2022 14:43:34 +0100 Subject: [PATCH 15/21] =?UTF-8?q?-=20Methoden=20=C3=BCberarbeitet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/ch/zhaw/pm2/racetrack/Track.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Track.java b/src/main/java/ch/zhaw/pm2/racetrack/Track.java index 5cc9993..2596103 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Track.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Track.java @@ -193,15 +193,21 @@ public class Track implements TrackSpecification { //Adds Car at new Position positionVector = cars.get(carIndex).nextPosition(); line = track.get(positionVector.getY()); - line = line.substring(0,positionVector.getX()) + cars.get(carIndex).getId() + line.substring(positionVector.getX()+1); + line = line.substring(0,positionVector.getX()) + cars.get(carIndex).getID() + line.substring(positionVector.getX()+1); track.add(positionVector.getY(),line); //Change position of car getCar(carIndex).move(); } - public char getRealCharAtPosition(PositionVector positionVector) { - return track.get(positionVector.getY()).charAt(positionVector.getX()); + /** + * This Method will check if the Car could crash at the specific position + * @param positionVector the position to check if the car could crash + * @return true if car would crash. Else false. + */ + public boolean willCrashAtPosition(PositionVector positionVector) { + char charAtPosition = track.get(positionVector.getY()).charAt(positionVector.getX()); + return charAtPosition != ConfigSpecification.SpaceType.TRACK.value; } /** @@ -255,7 +261,7 @@ public class Track implements TrackSpecification { */ @Override public char getCarId(int carIndex) { - return cars.get(carIndex).getId(); + return cars.get(carIndex).getID(); } /** @@ -267,7 +273,7 @@ public class Track implements TrackSpecification { */ @Override public PositionVector getCarPos(int carIndex) { - return findChar(cars.get(carIndex).getId()); + return findChar(cars.get(carIndex).getID()); } /** @@ -294,7 +300,7 @@ public class Track implements TrackSpecification { public char getCharAtPosition(int y, int x, Config.SpaceType currentSpace) { char charAtPos = track.get(y).charAt(x); for (Car car : cars) { - if(charAtPos == car.getId()) { + if(charAtPos == car.getID()) { if(car.isCrashed()) { return CRASH_INDICATOR; } -- 2.40.1 From a67a96d19de2cb4bf71227229d115ca32bc8a437 Mon Sep 17 00:00:00 2001 From: romanschenk37 <84532681+romanschenk37@users.noreply.github.com> Date: Thu, 10 Mar 2022 14:46:51 +0100 Subject: [PATCH 16/21] fix in CarTest.java --- .../java/ch/zhaw/pm2/racetrack/CarTest.java | 55 ++++++++++--------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java index 87154a6..89b1965 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java @@ -105,34 +105,37 @@ class CarTest { car.move(); checkNextPosition(DEFAULT_X, DEFAULT_Y); + + for (PositionVector.Direction direction1 : directions) { - - //create a new instance of Car with default coordinates and velocity 0. - setUp(); - - //variables to save the actual expected result of method nextPosition - int expectedNextPosX = DEFAULT_X; - int expectedNextPosY = DEFAULT_Y; - - //variables to save the acutal expected result of method getVelocity - int expectedVelocityX = 0; - int expectedVelocityY = 0; - - car.accelerate(direction1); - expectedVelocityX += direction1.vector.getX(); - expectedVelocityY += direction1.vector.getY(); - expectedNextPosX += direction1.vector.getX(); - expectedNextPosY += direction1.vector.getY(); - checkVelocity(expectedVelocityX, expectedVelocityY); - checkNextPosition(expectedNextPosX, expectedNextPosY); - - car.move(); - expectedNextPosX += direction1.vector.getX(); - expectedNextPosY += direction1.vector.getY(); - checkVelocity(expectedVelocityX, expectedVelocityY); - checkNextPosition(expectedNextPosX, expectedNextPosY); - for (PositionVector.Direction direction2 : directions) { + + //create a new instance of Car with default coordinates and velocity 0. + setUp(); + + //variables to save the actual expected result of method nextPosition + int expectedNextPosX = DEFAULT_X; + int expectedNextPosY = DEFAULT_Y; + + //variables to save the acutal expected result of method getVelocity + int expectedVelocityX = 0; + int expectedVelocityY = 0; + + car.accelerate(direction1); + expectedVelocityX += direction1.vector.getX(); + expectedVelocityY += direction1.vector.getY(); + expectedNextPosX += direction1.vector.getX(); + expectedNextPosY += direction1.vector.getY(); + checkVelocity(expectedVelocityX, expectedVelocityY); + checkNextPosition(expectedNextPosX, expectedNextPosY); + + car.move(); + expectedNextPosX += direction1.vector.getX(); + expectedNextPosY += direction1.vector.getY(); + checkVelocity(expectedVelocityX, expectedVelocityY); + checkNextPosition(expectedNextPosX, expectedNextPosY); + + car.accelerate(direction2); expectedVelocityX += direction2.vector.getX(); expectedVelocityY += direction2.vector.getY(); -- 2.40.1 From c4ea4d1920e59a2c06f2e56b8386dabc42ba930b Mon Sep 17 00:00:00 2001 From: Andrin Fassbind Date: Thu, 10 Mar 2022 14:58:54 +0100 Subject: [PATCH 17/21] =?UTF-8?q?-=20Crash=20Methoden=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ch/zhaw/pm2/racetrack/Track.java | 45 ++++++++++++++----- 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Track.java b/src/main/java/ch/zhaw/pm2/racetrack/Track.java index 2596103..e89b960 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Track.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Track.java @@ -157,6 +157,12 @@ public class Track implements TrackSpecification { return vector; } + private void drawCharOnTrackIndicator(PositionVector positionVector, char symbol) { + String line = track.get(positionVector.getY()); + line = line.substring(0,positionVector.getX()) + symbol + line.substring(positionVector.getX()+1); + track.add(positionVector.getY(),line); + } + /** * @return all Cars */ @@ -184,22 +190,24 @@ public class Track implements TrackSpecification { * @param carIndex representing the current Car */ public void moveCar(int carIndex) { - PositionVector positionVector = findChar(getCarId(carIndex)); - //Removes the Car at Current Pos - String line = track.get(positionVector.getY()); - line = line.substring(0,positionVector.getX()) + ConfigSpecification.SpaceType.TRACK.getValue() + line.substring(positionVector.getX()+1); - track.add(positionVector.getY(),line); - - //Adds Car at new Position - positionVector = cars.get(carIndex).nextPosition(); - line = track.get(positionVector.getY()); - line = line.substring(0,positionVector.getX()) + cars.get(carIndex).getID() + line.substring(positionVector.getX()+1); - track.add(positionVector.getY(),line); - + makeCarMoveInTrack(carIndex); //Change position of car getCar(carIndex).move(); } + /** + * This class does change the Position of the car only in the track. + * @param carIndex + */ + private void makeCarMoveInTrack(int carIndex) { + PositionVector positionVector = findChar(getCarId(carIndex)); + //Removes the Car at Current Pos + drawCharOnTrackIndicator(positionVector,ConfigSpecification.SpaceType.TRACK.getValue()); + //Adds Car at new Position + positionVector = cars.get(carIndex).nextPosition(); + drawCharOnTrackIndicator(positionVector,cars.get(carIndex).getID()); + } + /** * This Method will check if the Car could crash at the specific position * @param positionVector the position to check if the car could crash @@ -210,6 +218,19 @@ public class Track implements TrackSpecification { return charAtPosition != ConfigSpecification.SpaceType.TRACK.value; } + /** + * This Method will make the Car Crash. In Track and in the Car Object + * @param carIndex representing current Car + * @param positionVector where the Crash did happen + */ + public void carDoesCrash(int carIndex,PositionVector positionVector) { + Car car = cars.get(carIndex); + car.crash(); + makeCarMoveInTrack(carIndex); + drawCharOnTrackIndicator(new PositionVector(positionVector.getX()+1,positionVector.getY()),CRASH_INDICATOR); + + } + /** * Return the type of space at the given position. * If the location is outside the track bounds, it is considered a wall. -- 2.40.1 From 0fafa3e0e70027501ba1e7acf2c4d3de96a26d3f Mon Sep 17 00:00:00 2001 From: Leonardo Brandenberger Date: Thu, 10 Mar 2022 15:17:04 +0100 Subject: [PATCH 18/21] finished both exceptions. --- .../ch/zhaw/pm2/racetrack/InvalidFileFormatException.java | 5 ++++- .../ch/zhaw/pm2/racetrack/InvalidTrackFormatException.java | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java b/src/main/java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java index e7d0c07..c60ea91 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java @@ -1,5 +1,8 @@ package ch.zhaw.pm2.racetrack; public class InvalidFileFormatException extends Exception { - // TODO: implementation + + public InvalidFileFormatException(String errorMessage) { + super(errorMessage); + } } diff --git a/src/main/java/ch/zhaw/pm2/racetrack/InvalidTrackFormatException.java b/src/main/java/ch/zhaw/pm2/racetrack/InvalidTrackFormatException.java index 25de664..97b0310 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/InvalidTrackFormatException.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/InvalidTrackFormatException.java @@ -1,5 +1,7 @@ package ch.zhaw.pm2.racetrack; public class InvalidTrackFormatException extends Exception { - // TODO: implementation + public InvalidTrackFormatException(String errorMessage) { + super(errorMessage); + } } -- 2.40.1 From 6080b48b828748ba31112fb313d3286b470a8bff Mon Sep 17 00:00:00 2001 From: Leonardo Brandenberger Date: Thu, 10 Mar 2022 15:18:16 +0100 Subject: [PATCH 19/21] finished both exceptions. --- .../java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java b/src/main/java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java index c60ea91..91c59fa 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java @@ -1,7 +1,6 @@ package ch.zhaw.pm2.racetrack; public class InvalidFileFormatException extends Exception { - public InvalidFileFormatException(String errorMessage) { super(errorMessage); } -- 2.40.1 From dca575999e4efe3335bff6aa91cb6b657f99b62a Mon Sep 17 00:00:00 2001 From: Leonardo Brandenberger Date: Thu, 10 Mar 2022 15:20:53 +0100 Subject: [PATCH 20/21] Added javadocs to exceptions. --- .../java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java | 3 +++ .../ch/zhaw/pm2/racetrack/InvalidTrackFormatException.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/main/java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java b/src/main/java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java index 91c59fa..6655e69 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/InvalidFileFormatException.java @@ -1,5 +1,8 @@ package ch.zhaw.pm2.racetrack; +/** + * Class for Exception when invalid Fileformat is used. + */ public class InvalidFileFormatException extends Exception { public InvalidFileFormatException(String errorMessage) { super(errorMessage); diff --git a/src/main/java/ch/zhaw/pm2/racetrack/InvalidTrackFormatException.java b/src/main/java/ch/zhaw/pm2/racetrack/InvalidTrackFormatException.java index 97b0310..3cdd04c 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/InvalidTrackFormatException.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/InvalidTrackFormatException.java @@ -1,5 +1,8 @@ package ch.zhaw.pm2.racetrack; +/** + * Class for Exception when invalid track format is used. + */ public class InvalidTrackFormatException extends Exception { public InvalidTrackFormatException(String errorMessage) { super(errorMessage); -- 2.40.1 From 884b3490770849e8a8136306fef785b3b959b956 Mon Sep 17 00:00:00 2001 From: Andrin Fassbind Date: Fri, 11 Mar 2022 16:01:49 +0100 Subject: [PATCH 21/21] - TrackTest done Track done --- .../pm2/racetrack/PositionVectorNotValid.java | 9 + .../java/ch/zhaw/pm2/racetrack/Track.java | 64 +++--- src/test/InvalidTracks/sameCar.txt | 26 +++ .../java/ch/zhaw/pm2/racetrack/TrackTest.java | 205 +++++++++++++----- 4 files changed, 223 insertions(+), 81 deletions(-) create mode 100644 src/main/java/ch/zhaw/pm2/racetrack/PositionVectorNotValid.java create mode 100644 src/test/InvalidTracks/sameCar.txt diff --git a/src/main/java/ch/zhaw/pm2/racetrack/PositionVectorNotValid.java b/src/main/java/ch/zhaw/pm2/racetrack/PositionVectorNotValid.java new file mode 100644 index 0000000..2b70333 --- /dev/null +++ b/src/main/java/ch/zhaw/pm2/racetrack/PositionVectorNotValid.java @@ -0,0 +1,9 @@ +package ch.zhaw.pm2.racetrack; + +public class PositionVectorNotValid extends Throwable { + public PositionVectorNotValid(String message) { + super(message); + } + + public PositionVectorNotValid() {} +} diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Track.java b/src/main/java/ch/zhaw/pm2/racetrack/Track.java index e89b960..f3e51f0 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Track.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Track.java @@ -6,7 +6,6 @@ import ch.zhaw.pm2.racetrack.given.TrackSpecification; import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Scanner; @@ -59,11 +58,9 @@ import java.util.Scanner; public class Track implements TrackSpecification { public static final char CRASH_INDICATOR = 'X'; - - // TODO: Add necessary variables private List track; private List cars; - private List finishLine; + private final List finishLine; /** * Initialize a Track from the given track file. @@ -72,7 +69,7 @@ public class Track implements TrackSpecification { * @throws FileNotFoundException if the given track file could not be found * @throws InvalidTrackFormatException if the track file contains invalid data (no tracklines, ...) */ - public Track(File trackFile) throws FileNotFoundException, InvalidTrackFormatException { + public Track(File trackFile) throws FileNotFoundException, InvalidTrackFormatException, PositionVectorNotValid { track = new ArrayList<>(); cars = new ArrayList<>(); finishLine = new ArrayList<>(); @@ -159,8 +156,17 @@ public class Track implements TrackSpecification { private void drawCharOnTrackIndicator(PositionVector positionVector, char symbol) { String line = track.get(positionVector.getY()); - line = line.substring(0,positionVector.getX()) + symbol + line.substring(positionVector.getX()+1); - track.add(positionVector.getY(),line); + line = line.substring(0, positionVector.getX()) + symbol + line.substring(positionVector.getX() + 1); + track.remove(positionVector.getY()); + track.add(positionVector.getY(), line); + } + + private void isPositionVectorOnTrack(PositionVector positionVector) throws PositionVectorNotValid { + try{ + track.get(positionVector.getY()).charAt(positionVector.getX()); + }catch (IndexOutOfBoundsException e) { + throw new PositionVectorNotValid(); + } } /** @@ -187,6 +193,7 @@ public class Track implements TrackSpecification { /** * This Method will update the Car on the track * and will make the Car move to the next position + * * @param carIndex representing the current Car */ public void moveCar(int carIndex) { @@ -197,38 +204,43 @@ public class Track implements TrackSpecification { /** * This class does change the Position of the car only in the track. - * @param carIndex + * + * @param carIndex of the current car */ private void makeCarMoveInTrack(int carIndex) { PositionVector positionVector = findChar(getCarId(carIndex)); //Removes the Car at Current Pos - drawCharOnTrackIndicator(positionVector,ConfigSpecification.SpaceType.TRACK.getValue()); + drawCharOnTrackIndicator(positionVector, ConfigSpecification.SpaceType.TRACK.getValue()); //Adds Car at new Position positionVector = cars.get(carIndex).nextPosition(); - drawCharOnTrackIndicator(positionVector,cars.get(carIndex).getID()); + drawCharOnTrackIndicator(positionVector, cars.get(carIndex).getID()); } /** * This Method will check if the Car could crash at the specific position + * * @param positionVector the position to check if the car could crash * @return true if car would crash. Else false. */ - public boolean willCrashAtPosition(PositionVector positionVector) { + public boolean willCrashAtPosition(int carIndex, PositionVector positionVector) throws PositionVectorNotValid { + isPositionVectorOnTrack(positionVector); char charAtPosition = track.get(positionVector.getY()).charAt(positionVector.getX()); - return charAtPosition != ConfigSpecification.SpaceType.TRACK.value; + if (getCarId(carIndex) == charAtPosition) return false; + return (charAtPosition == ConfigSpecification.SpaceType.WALL.value); } /** * This Method will make the Car Crash. In Track and in the Car Object - * @param carIndex representing current Car + * + * @param carIndex representing current Car * @param positionVector where the Crash did happen */ - public void carDoesCrash(int carIndex,PositionVector positionVector) { + public void carDoesCrash(int carIndex, PositionVector positionVector) throws PositionVectorNotValid{ + isPositionVectorOnTrack(positionVector); Car car = cars.get(carIndex); car.crash(); - makeCarMoveInTrack(carIndex); - drawCharOnTrackIndicator(new PositionVector(positionVector.getX()+1,positionVector.getY()),CRASH_INDICATOR); - + car.setPosition(positionVector); + drawCharOnTrackIndicator(new PositionVector(positionVector.getX(), positionVector.getY()), CRASH_INDICATOR); } /** @@ -240,9 +252,8 @@ public class Track implements TrackSpecification { */ @Override public Config.SpaceType getSpaceType(PositionVector position) { - + //isPositionVectorOnTrack(position); Should be used but we are not allowed to change method head. We don't use function anyway char charAtPosition = track.get(position.getY()).charAt(position.getX()); - ConfigSpecification.SpaceType[] spaceTypes = ConfigSpecification.SpaceType.values(); for (ConfigSpecification.SpaceType spaceType : spaceTypes) { if (spaceType.getValue() == charAtPosition) { @@ -320,14 +331,13 @@ public class Track implements TrackSpecification { @Override public char getCharAtPosition(int y, int x, Config.SpaceType currentSpace) { char charAtPos = track.get(y).charAt(x); + PositionVector positionVector = new PositionVector(x, y); for (Car car : cars) { - if(charAtPos == car.getID()) { - if(car.isCrashed()) { - return CRASH_INDICATOR; - } + if (charAtPos == car.getID()) { return charAtPos; } } + if (positionVector.equals(findChar(CRASH_INDICATOR))) return CRASH_INDICATOR; return currentSpace.getValue(); } @@ -338,10 +348,8 @@ public class Track implements TrackSpecification { */ @Override public String toString() { - String str = ""; - for (String line : track) { - str += line + "\n"; - } - return str; + StringBuilder str = new StringBuilder(); + for (String line : track) str.append(line).append("\n"); + return str.toString(); } } diff --git a/src/test/InvalidTracks/sameCar.txt b/src/test/InvalidTracks/sameCar.txt new file mode 100644 index 0000000..26dc7cc --- /dev/null +++ b/src/test/InvalidTracks/sameCar.txt @@ -0,0 +1,26 @@ +############################################################### +################# ############# +############### ########### +############### ######### +############### ################## ######### +############### #################### ######### +############## ##################### ######### +############ ###################### ########## +######### ###################### ############ +######### ###################### ############## +######### ##################### ################ +######### ################# ################## +######### ################ ################## +########## ################## ############### +########### #################### ############# +########### ####################### ########## +########## ########################## ######### +######### ############################ ######## +######## ############################# ######## +####### ############################## ######## +###### ############################# ######## +###### ############################ ######### +###### > a ########### +###### > a ############## +######## > b ################# +############################################################### diff --git a/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java b/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java index a4decfb..d5cff22 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java @@ -1,10 +1,7 @@ package ch.zhaw.pm2.racetrack; import ch.zhaw.pm2.racetrack.given.ConfigSpecification; -import org.junit.Before; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.*; import java.io.File; import java.io.FileNotFoundException; @@ -15,64 +12,166 @@ import java.util.List; public class TrackTest { Track trackObj; - @BeforeEach - void setup() { - File file = new File("C:\\Studium\\Semester2\\PM2\\Projekt1\\racetrack\\tracks\\challenge.txt"); - try { - trackObj = new Track(file); + @Nested + @DisplayName("Positiv Test Cases") + class positivClass { - } catch (Exception e) { - System.err.println("Error in Test compareTrack" + e.getMessage()); + @BeforeEach + void setup() { + File file = new File(".\\tracks\\challenge.txt"); + try { + trackObj = new Track(file); + + } catch (Exception | PositionVectorNotValid e) { + System.err.println("Error in Test compareTrack" + e.getMessage()); + } + } + + @Test + @DisplayName("Create correct amount of Car instance") + void checkCars() { + Assertions.assertEquals(2, trackObj.getCarCount()); + } + + @Test + @DisplayName("Create Car instance with correct Symbols / Id") + void checkCarId() { + Assertions.assertEquals('a', trackObj.getCarId(0)); + Assertions.assertEquals('b', trackObj.getCarId(1)); + } + + + @Test + @DisplayName("Check getSpaceTyp") + void getSpaceTyp() { + Assertions.assertEquals(ConfigSpecification.SpaceType.FINISH_RIGHT, trackObj.getSpaceType(new PositionVector(22, 24))); + } + + @Test + @DisplayName("Find FinishLine") + void findFinish() { + List expected = new ArrayList<>(); + expected.add(new PositionVector(22, 22)); + expected.add(new PositionVector(22, 23)); + expected.add(new PositionVector(22, 24)); + Assertions.assertEquals(expected, trackObj.getFinishLine()); + } + + @Test + @DisplayName("Converts Trackfile correctly to List") + void checkTrack() { + Track trackObj; + try { + trackObj = new Track(new File(".\\tracks\\oval-anticlock-right.txt")); + List track = new ArrayList<>(); + track.add("##################################################"); + track.add("##################################################"); + track.add("############## #############"); + track.add("########## ##########"); + track.add("####### #######"); + track.add("###### ################# ######"); + track.add("##### ################### #####"); + track.add("##### ################### #####"); + track.add("###### ################# ######"); + track.add("####### > a #######"); + track.add("########## > ##########"); + track.add("############## > b ##############"); + track.add("##################################################"); + track.add("##################################################"); + Assertions.assertLinesMatch(track, trackObj.getTrack()); + } catch (FileNotFoundException | InvalidTrackFormatException | PositionVectorNotValid e) { + e.printStackTrace(); + } + } + + @Test + @DisplayName("Make Car move down on track") + void makeCarMoveDown() { + PositionVector beforeMove = trackObj.getCarPos(0); + trackObj.getCar(0).accelerate(PositionVector.Direction.DOWN); + trackObj.moveCar(0); + PositionVector afterMove = trackObj.getCarPos(0); + Assertions.assertEquals(beforeMove.getY() + 1, afterMove.getY()); + Assertions.assertEquals(beforeMove.getX(), afterMove.getX()); + } + + @Test + @DisplayName("Make Car move with (0,0) acceleration on track") + void makeCarStay() { + PositionVector beforeMove = trackObj.getCarPos(0); + trackObj.moveCar(0); + PositionVector afterMove = trackObj.getCarPos(0); + Assertions.assertEquals(beforeMove.getY(), afterMove.getY()); + Assertions.assertEquals(beforeMove.getX(), afterMove.getX()); + } + + @Test + @DisplayName("Will Car Crash") + void willCarCrash() { + try { + //Car will Crash + Assertions.assertTrue(trackObj.willCrashAtPosition(0, new PositionVector(25, 21))); + //Car will not Crash and is on track + Assertions.assertFalse(trackObj.willCrashAtPosition(0, new PositionVector(7, 22))); + //Car will not Crash and is on finishLine + Assertions.assertFalse(trackObj.willCrashAtPosition(0, trackObj.getFinishLine().get(0))); + } catch (PositionVectorNotValid positionVectorNotValid) { + positionVectorNotValid.printStackTrace(); + Assertions.fail("Test should not throw error"); + } + } + + @Test + @DisplayName("Make Car Crash") + void makeCarCrash() { + try { + trackObj.carDoesCrash(0, new PositionVector(6, 22)); + } catch (PositionVectorNotValid positionVectorNotValid) { + positionVectorNotValid.printStackTrace(); + Assertions.fail("Test should not throw exception"); + } + Assertions.assertEquals(Track.CRASH_INDICATOR, trackObj.getTrack().get(22).charAt(6)); + Assertions.assertTrue(trackObj.getCar(0).isCrashed()); } } - @Test - void canReadFile() { - File file = new File("C:\\Studium\\Semester2\\PM2\\Projekt1\\racetrack\\tracks\\challenge.txt"); - Assertions.assertThrows(FileNotFoundException.class,() -> new Track(file)); - } + @Nested + @DisplayName("Negative TestCase") + class negativeClass { + File file; - /** - * Dirty test... - */ - @Test - void printOutTrack() { - System.out.println(trackObj); - } + @BeforeEach + void setup() { + file = new File(".\\tracks\\challenge.txt"); + try { + trackObj = new Track(file); - @Test - void getSpaceTyp() { - Assertions.assertEquals(ConfigSpecification.SpaceType.FINISH_RIGHT,trackObj.getSpaceType(new PositionVector(22,24))); - } + } catch (Exception | PositionVectorNotValid e) { + System.err.println("Error in Test compareTrack" + e.getMessage()); + } + } - //TODO: - @Test - void addCarAtInit() { - try { - trackObj.addCar(); - } catch (InvalidTrackFormatException e) { - e.printStackTrace(); + @Test + @DisplayName("Throw error if File not found") + void canReadFile() { + file = new File(".\\tracks\\NotExisting.txt"); + Assertions.assertThrows(FileNotFoundException.class, () -> new Track(file)); + } + + @Test + @DisplayName("Throw error if File is invalid") + void invalidTrackFile() { + File testfile = new File(".\\src\\test\\InvalidTracks\\sameCar.txt"); + Assertions.assertThrows(InvalidTrackFormatException.class, () -> new Track(testfile)); + } + + @Test + @DisplayName("Invalid Position Vector used") + void invalidPositionVector() { + Assertions.assertThrows(PositionVectorNotValid.class, () -> trackObj.willCrashAtPosition(0, new PositionVector(100, 200))); + Assertions.assertThrows(PositionVectorNotValid.class, () -> trackObj.carDoesCrash(1,new PositionVector(200,100))); } } - @Test - void findFinish() { - List expected = new ArrayList<>(); - expected.add(new PositionVector(22,22)); - expected.add(new PositionVector(22,23)); - expected.add(new PositionVector(22,24)); - Assertions.assertEquals(expected,trackObj.getFinishLine()); - } - - @Test - void makeTrackObj() { - try { - Track t1 = new Track(new File("C:\\Studium\\Semester2\\PM2\\Projekt1\\racetrack\\tracks\\challenge.txt")); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (InvalidTrackFormatException e) { - e.printStackTrace(); - } - } } -- 2.40.1