Skip to content
Snippets Groups Projects
Commit 35df265d authored by ddnguyen's avatar ddnguyen
Browse files

add elevator's test scenarios, add scheduler, add scheduler's test

parent 575810c3
Branches
No related tags found
No related merge requests found
Pipeline #17637 passed
package elevator;
import java.util.ArrayList;
import java.util.List;
import elevatorSimulator.State;
public class Scheduler {
private List<FloorRequest> floorRequests;
private List<CabinRequest> cabinRequests;
public Scheduler() {
floorRequests = new ArrayList<>();
cabinRequests = new ArrayList<>();
}
public List<CabinRequest> getCabinRequests(){
return this.cabinRequests;
}
public List<FloorRequest> getFloorRequests(){
return this.floorRequests;
}
public void registerFloorRequest(FloorRequest floorRequest) {
floorRequests.add(floorRequest);
}
public void registerCabinRequest(CabinRequest cabinRequest) {
cabinRequests.add(cabinRequest);
}
public void cancelFloorRequest(int floor, State direction) {
floorRequests.removeIf(fr -> fr.floor == floor && fr.direction == direction);
}
public int calculateNextFloor(int currentFloor, State direction) {
// Sort floor requests based on direction and proximity to current floor
floorRequests.sort((fr1, fr2) -> {
if (direction == State.UP) {
return Integer.compare(fr1.floor, fr2.floor);
} else {
return Integer.compare(fr2.floor, fr1.floor);
}
});
// Find the next floor to stop at
for (FloorRequest request : floorRequests) {
if (direction == State.UP && request.floor > currentFloor) {
return request.floor;
} else if (direction == State.DOWN && request.floor < currentFloor) {
return request.floor;
}
}
// If no pending requests in the current direction, continue in the same direction
return currentFloor + (direction == State.UP ? 1 : -1);
}
// Helper class to represent floor requests with direction
public static class FloorRequest {
private final int floor;
private final State direction;
public FloorRequest(int floor, State direction) {
this.floor = floor;
this.direction = direction;
}
public int getFloor() {
return floor;
}
public State getDirection() {
return direction;
}
}
// Helper class to represent cabin requests
public static class CabinRequest{
private final int floor;
public CabinRequest(final int floor) {
this.floor = floor;
}
public int getFloor() {
return floor;
}
}
}
......@@ -3,9 +3,8 @@ package elevator;
import static elevatorSimulator.State.ERROR;
import static elevatorSimulator.State.OPEN;
import static elevatorSimulator.State.RESET;
import static elevatorSimulator.State.UP;
import static elevatorSimulator.State.STOP;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Disabled;
......@@ -38,7 +37,6 @@ public class TestAutomaticElevator {
assertEquals(3.0, e.getLevel());
// l'ascenseur est en erreur
assertEquals(ERROR, e.getState());
// les étapes
assertEquals("-S0-U0-U1-U2-U3-E3", e.getEvents());
}
......@@ -49,7 +47,6 @@ public class TestAutomaticElevator {
@DisplayName("Elevator simulator - step by step mode")
public void testElevatorByStep() throws Exception {
System.out.printf("\nElevator simulator - step by step mode\n");
//3 étages en mode automatique
var e = new ElevatorSimulator(3, true);
......@@ -57,58 +54,173 @@ public class TestAutomaticElevator {
e.up();
//l'évolution de l'ascenseur
while (e.getState() == UP) {
// demander à s'arrêter au 3e
if(e.getLevel() == 2) {
e.stopNext();
}
for(int i = 0; i < 15; i++) {
System.out.printf("level = %3.2f\n", e.getLevel());
e.oneStep();
}
if(e.getLevel() == 2) {
e.stopNext();
}
}
// l'ascenseur est au 3ème
assertEquals(3.0, e.getLevel());
// l'ascenseur a a entraîné l'ouverture des portes
assertEquals(OPEN, e.getState());
// les étapes
assertEquals("-S0-U0-U1-U2-O3", e.getEvents());
}
@Test
@Order(10)
@Order(20)
@Disabled
@DisplayName("Elevator simulator - position by step")
public void testElevatorPositionByStep() throws Exception {
System.out.printf("\nElevator simulator - step by step mode\n");
System.out.printf("\nElevator simulator - position by step\n");
//3 étages en mode automatique
var e = new ElevatorSimulator(3, true);
double compte = 0;
int etage = 0;
int count = 0;
double currentFloor = 0;
// activer la montée
System.out.printf("level = %3.2f\n", (double)count/15);
e.up();
//l'évolution de l'ascenseur
while (e.getState() == UP) {
for(int i = 0; i < 15; i++) {
//demander à s'arrêter au 2e
if(currentFloor + 1 == 2)
e.stopNext();
for(int i = 0; i < 15; i++) {
e.oneStep();
compte ++;
System.out.printf("level = %3.2f\n", compte/15);
count ++;
System.out.printf("level = %3.2f\n", (double)count/15);
}
if(compte%15 == 0) {
etage++;
if(count%15 == 0) {
currentFloor++;
System.out.println(e.getState());
}
if(etage + 1 == 2)
e.stopNext();
}
// l'ascenseur est au 3ème
// l'ascenseur est au 2ème
assertEquals(2.0, e.getLevel());
// l'ascenseur a a entraîné l'ouverture des portes
assertEquals(OPEN, e.getState());
// les étapes
assertEquals("-S0-U0-U1-O2", e.getEvents());
}
@Test
@Order(30)
@Disabled
@DisplayName("Elevator simulator - door and command")
public void testElevatorDoorsAndCommand() throws Exception {
//3 étages en mode automatique
var e = new ElevatorSimulator(3, true);
int count = 0;
double currentFloor = 0;
// ouvrir les portes et activer la montée
System.out.printf("level = %3.2f\n", (double)count/15);
// e.openDoor();
// assertEquals(OPEN, e.getState());
// e.halt();
// System.out.println(e.getState());
// e.reset();
// System.out.println(e.getState());
// System.out.println(e.getEvents());
e.up();
//l'évolution de l'ascenseur
while (e.getState() == UP) {
//demande à s'arrêter au 2e étage
if(currentFloor + 1 == 1)
e.stopNext();
for(int i = 0; i < 15; i++) {
e.oneStep();
count ++;
System.out.printf("level = %3.2f\n", (double)count/15);
}
if(count%15 == 0) {
currentFloor++;
System.out.println(e.getState());
}
}
// l'ascenseur est au 2ème
assertEquals(1.0, e.getLevel());
// l'ascenseur a a entraîné l'ouverture des portes
assertEquals(OPEN, e.getState());
// les étapes
assertEquals("-S0-U0-U1-O2", e.getEvents());
}
@Test
@Order(40)
@Disabled
@DisplayName("Elevator simulator - reset")
public void testElevatorReset() throws Exception {
//3 étages en mode automatique
var e = new ElevatorSimulator(3, true);
int count = 0;
double currentFloor = 0;
// ouvrir les portes et activer la montée
System.out.printf("level = %3.2f\n", (double)count/15);
e.up();
//l'évolution de l'ascenseur
while (e.getState() == UP) {
//provoquer une erreur vers 3e
if(currentFloor + 1 == 3)
e.halt();
for(int i = 0; i < 15; i++) {
e.oneStep();
count ++;
System.out.printf("level = %3.2f\n", (double)count/15);
}
if(count%15 == 0) {
currentFloor++;
System.out.println(e.getState());
}
}
// l'ascenseur est en pane
assertEquals(ERROR, e.getState());
// reinitialiser l'ascenseur
e.reset();
assertEquals(RESET, e.getState());
// les étapes
assertEquals("-S0-U0-U1-U2-E2-R2", e.getEvents());
}
@Test
@Order(50)
@DisplayName("Elevator simulator - emergency stop")
public void testElevatorEmergencyStop() throws Exception {
//3 étages en mode automatique
var e = new ElevatorSimulator(3, true);
int count = 0;
double currentFloor = 0;
// ouvrir les portes et activer la montée
System.out.printf("level = %3.2f\n", (double)count/15);
e.up();
//l'évolution de l'ascenseur
while (e.getState() == UP) {
if(currentFloor + 1 == 3)
e.halt();
for(int i = 0; i < 15; i++) {
e.oneStep();
count ++;
System.out.printf("level = %3.2f\n", (double)count/15);
}
if(count%15 == 0) {
currentFloor++;
System.out.println(e.getState());
}
}
// l'ascenseur est en pane
assertEquals(ERROR, e.getState());
// les étapes
assertEquals("-S0-U0-U1-U2-E2", e.getEvents());
}
}
package elevator;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import elevator.Scheduler.CabinRequest;
import elevator.Scheduler.FloorRequest;
import elevatorSimulator.State;
public class TestScheduler {
@Test
@Order(0)
@DisplayName("Scheduler - register cabin request")
public void testSchedulerRegisterCabinRequest(){
Scheduler s = new Scheduler();
assertThat(s.getCabinRequests()).hasSize(0);
//scheduler registre un ordre à monter/descendre vers 2e étage
s.registerCabinRequest(new CabinRequest(2));
//scheduler registre un ordre monter/descendre vers 3e étage
s.registerCabinRequest(new CabinRequest(3));
assertThat(s.getCabinRequests()).hasSize(2);
assertThat(s.getCabinRequests().get(0).getFloor()).isEqualTo(2);
assertThat(s.getCabinRequests().get(1).getFloor()).isEqualTo(3);
//scheduler registre un ordre monter/descendre vers le rez-de-chaussée
s.registerCabinRequest(new CabinRequest(0));
assertThat(s.getCabinRequests().get(2).getFloor()).isEqualTo(0);
}
@Test
@Order(10)
@DisplayName("Scheduler - floor request")
public void testSchedulerFloorRequest(){
Scheduler s = new Scheduler();
assertThat(s.getFloorRequests()).hasSize(0);
//scheduler registre un ordre monter au rez-de-chaussée
s.registerFloorRequest(new FloorRequest(0, State.UP));
//scheduler registre un ordre monter au 1e étage
s.registerFloorRequest(new FloorRequest(1, State.UP));
//scheduler registre un ordre descendre au 1e étage
s.registerFloorRequest(new FloorRequest(1, State.DOWN));
assertThat(s.getFloorRequests()).hasSize(3);
assertThat(s.getFloorRequests().get(0).getFloor()).isEqualTo(0);
assertThat(s.getFloorRequests().get(0).getDirection()).isEqualTo(State.UP);
assertThat(s.getFloorRequests().get(1).getFloor()).isEqualTo(1);
assertThat(s.getFloorRequests().get(1).getDirection()).isEqualTo(State.UP);
assertThat(s.getFloorRequests().get(2).getFloor()).isEqualTo(1);
assertThat(s.getFloorRequests().get(2).getDirection()).isEqualTo(State.DOWN);
s.cancelFloorRequest(1, State.UP);
assertThat(s.getFloorRequests()).hasSize(2);
assertThat(s.getFloorRequests().get(1).getFloor()).isEqualTo(1);
assertThat(s.getFloorRequests().get(1).getDirection()).isEqualTo(State.DOWN);
}
@Test
@Order(20)
@DisplayName("Scheduler - register and calculate Next Floor")
public void testRegisterAndCalculateNextFloor() {
Scheduler scheduler = new Scheduler();
// Register floor requests
scheduler.registerFloorRequest(new FloorRequest(3, State.UP));
scheduler.registerFloorRequest(new FloorRequest(1, State.DOWN));
scheduler.registerFloorRequest(new FloorRequest(2, State.UP));
// Calculate next floor when the elevator is at floor 2 going up
int nextFloor = scheduler.calculateNextFloor(2, State.UP);
assertEquals(3, nextFloor);
// Calculate next floor when the elevator is at floor 3 going down
nextFloor = scheduler.calculateNextFloor(3, State.DOWN);
assertEquals(2, nextFloor);
// Register a cabin request
scheduler.registerCabinRequest(new CabinRequest(4));
// Calculate next floor when the elevator is at floor 1 going up
nextFloor = scheduler.calculateNextFloor(1, State.UP);
assertEquals(2, nextFloor);
// Cancel a floor request
scheduler.cancelFloorRequest(1, State.DOWN);
// Calculate next floor when the elevator is at floor 1 going up (after canceling)
nextFloor = scheduler.calculateNextFloor(1, State.UP);
assertEquals(2, nextFloor);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment