Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a67a96d19d | ||
|
|
19b227c59f | ||
|
|
cbc915bf50 | ||
|
|
b6f69d3c1c | ||
|
|
31a24120eb | ||
|
|
dea430e418 | ||
|
|
40cd4f7b72 | ||
|
|
8086111772 | ||
|
|
972f011a08 | ||
|
|
381ea44a9a |
@@ -3,6 +3,8 @@ package ch.zhaw.pm2.racetrack;
|
|||||||
import ch.zhaw.pm2.racetrack.given.CarSpecification;
|
import ch.zhaw.pm2.racetrack.given.CarSpecification;
|
||||||
import ch.zhaw.pm2.racetrack.strategy.MoveStrategy;
|
import ch.zhaw.pm2.racetrack.strategy.MoveStrategy;
|
||||||
|
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class representing a car on the racetrack.
|
* Class representing a car on the racetrack.
|
||||||
* Uses {@link PositionVector} to store current position on the track grid and current velocity vector.
|
* 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);
|
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.
|
* 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.
|
* 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.
|
* 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.
|
* @param position The new position to set the car directly to.
|
||||||
|
* @throws IllegalArgumentException if invalid PositionVector is given.
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void setPosition(final PositionVector position) {
|
public void setPosition(final PositionVector position) {
|
||||||
// TODO: implementation
|
if (position.getX() < 0 || position.getY() < 0) {
|
||||||
throw new UnsupportedOperationException();
|
throw new IllegalArgumentException();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.position = position;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -69,8 +93,7 @@ public class Car implements CarSpecification {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public PositionVector nextPosition() {
|
public PositionVector nextPosition() {
|
||||||
// TODO: implementation
|
return new PositionVector(position.getX() + velocity.getX(),position.getY() + velocity.getY());
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -80,11 +103,18 @@ public class Car implements CarSpecification {
|
|||||||
* Changes only velocity, not position.
|
* Changes only velocity, not position.
|
||||||
*
|
*
|
||||||
* @param acceleration A Direction vector containing the amounts to add to the velocity in x and y dimension
|
* @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
|
@Override
|
||||||
public void accelerate(PositionVector.Direction acceleration) {
|
public void accelerate(PositionVector.Direction acceleration) {
|
||||||
// TODO: implementation
|
if(acceleration.vector.getX() < -1 || acceleration.vector.getX() > 1||
|
||||||
throw new UnsupportedOperationException();
|
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
|
@Override
|
||||||
public void move() {
|
public void move() {
|
||||||
// TODO: implementation
|
position = new PositionVector(position.getX() + velocity.getX(), position.getY() + velocity.getY());
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -101,8 +130,7 @@ public class Car implements CarSpecification {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void crash() {
|
public void crash() {
|
||||||
// TODO: implementation
|
crashed = true;
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -112,13 +140,12 @@ public class Car implements CarSpecification {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean isCrashed() {
|
public boolean isCrashed() {
|
||||||
// TODO: implementation
|
return crashed;
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set move strategy
|
* Set move strategy
|
||||||
* @param moveStrategy
|
* @param moveStrategy Strategy to be implemented
|
||||||
*/
|
*/
|
||||||
public void setMoveStrategy(MoveStrategy moveStrategy) {
|
public void setMoveStrategy(MoveStrategy moveStrategy) {
|
||||||
this.moveStrategy = moveStrategy;
|
this.moveStrategy = moveStrategy;
|
||||||
|
|||||||
@@ -1,10 +1,5 @@
|
|||||||
package ch.zhaw.pm2.racetrack;
|
package ch.zhaw.pm2.racetrack;
|
||||||
|
|
||||||
/**
|
|
||||||
* Class for Exception when invalid Fileformat is used.
|
|
||||||
*/
|
|
||||||
public class InvalidFileFormatException extends Exception {
|
public class InvalidFileFormatException extends Exception {
|
||||||
public InvalidFileFormatException(String errorMessage) {
|
// TODO: implementation
|
||||||
super(errorMessage);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,5 @@
|
|||||||
package ch.zhaw.pm2.racetrack;
|
package ch.zhaw.pm2.racetrack;
|
||||||
|
|
||||||
/**
|
|
||||||
* Class for Exception when invalid track format is used.
|
|
||||||
*/
|
|
||||||
public class InvalidTrackFormatException extends Exception {
|
public class InvalidTrackFormatException extends Exception {
|
||||||
public InvalidTrackFormatException(String errorMessage) {
|
// TODO: implementation
|
||||||
super(errorMessage);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,191 @@
|
|||||||
|
|
||||||
|
package ch.zhaw.pm2.racetrack;
|
||||||
|
|
||||||
|
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.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests for Class Car
|
||||||
|
*/
|
||||||
|
class CarTest {
|
||||||
|
|
||||||
|
Car car;
|
||||||
|
|
||||||
|
// 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(DEFAULT_ID, new PositionVector(DEFAULT_X, DEFAULT_Y));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void getID() {
|
||||||
|
assertEquals(DEFAULT_ID, car.getID());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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<PositionVector> 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 of invalid positions.
|
||||||
|
List<PositionVector> 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;
|
||||||
|
setUp();
|
||||||
|
try {
|
||||||
|
car.setPosition(positionVector);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
exception = true;
|
||||||
|
}
|
||||||
|
assertTrue(exception);
|
||||||
|
|
||||||
|
// position should keep unchanged
|
||||||
|
checkNextPosition(DEFAULT_X, DEFAULT_Y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void checkVelocity(int x, int y) {
|
||||||
|
assertEquals(new PositionVector(x, y), car.getVelocity());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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
|
||||||
|
void movement() {
|
||||||
|
// add all possible directions in a List
|
||||||
|
List<PositionVector.Direction> directions = Arrays.asList(PositionVector.Direction.values());
|
||||||
|
|
||||||
|
//position shouldn't be changed because velocity should be 0.
|
||||||
|
car.move();
|
||||||
|
checkNextPosition(DEFAULT_X, DEFAULT_Y);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
for (PositionVector.Direction direction1 : directions) {
|
||||||
|
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();
|
||||||
|
expectedNextPosX += direction2.vector.getX();
|
||||||
|
expectedNextPosY += direction2.vector.getY();
|
||||||
|
checkVelocity(expectedVelocityX, expectedVelocityY);
|
||||||
|
checkNextPosition(expectedNextPosX, expectedNextPosY);
|
||||||
|
|
||||||
|
car.move();
|
||||||
|
checkVelocity(expectedVelocityX, expectedVelocityY);
|
||||||
|
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;
|
||||||
|
|
||||||
|
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());
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user