159 lines
3.6 KiB
Java
159 lines
3.6 KiB
Java
// PART OF THE MACHINE SIMULATION. DO NOT CHANGE.
|
|
|
|
package nachos.machine;
|
|
|
|
import nachos.security.*;
|
|
import nachos.threads.KThread;
|
|
import nachos.threads.Semaphore;
|
|
|
|
/**
|
|
* Tests the <tt>ElevatorBank</tt> module, using a single elevator and a single
|
|
* rider.
|
|
*/
|
|
public final class ElevatorTest {
|
|
/**
|
|
* Allocate a new <tt>ElevatorTest</tt> object.
|
|
*/
|
|
public ElevatorTest() {
|
|
}
|
|
|
|
/**
|
|
* Run a test on <tt>Machine.bank()</tt>.
|
|
*/
|
|
public void run() {
|
|
Machine.bank().init(1, 2, new ElevatorController());
|
|
|
|
int[] stops = { 1 };
|
|
|
|
Machine.bank().addRider(new Rider(), 0, stops);
|
|
|
|
Machine.bank().run();
|
|
}
|
|
|
|
private class ElevatorController implements ElevatorControllerInterface {
|
|
public void initialize(ElevatorControls controls) {
|
|
this.controls = controls;
|
|
|
|
eventWait = new Semaphore(0);
|
|
|
|
controls.setInterruptHandler(new Runnable() {
|
|
public void run() { interrupt(); }
|
|
});
|
|
}
|
|
|
|
public void run() {
|
|
ElevatorEvent e;
|
|
|
|
Lib.assertTrue(controls.getFloor(0) == 0);
|
|
|
|
e = getNextEvent();
|
|
Lib.assertTrue(e.event == ElevatorEvent.eventUpButtonPressed &&
|
|
e.floor == 0);
|
|
|
|
controls.setDirectionDisplay(0, dirUp);
|
|
controls.openDoors(0);
|
|
|
|
e = getNextEvent();
|
|
Lib.assertTrue(e.event == ElevatorEvent.eventFloorButtonPressed &&
|
|
e.floor == 1);
|
|
|
|
controls.closeDoors(0);
|
|
controls.moveTo(1, 0);
|
|
|
|
e = getNextEvent();
|
|
Lib.assertTrue(e.event == ElevatorEvent.eventElevatorArrived &&
|
|
e.floor == 1 &&
|
|
e.elevator == 0);
|
|
|
|
controls.openDoors(0);
|
|
|
|
e = getNextEvent();
|
|
Lib.assertTrue(e.event == ElevatorEvent.eventRidersDone);
|
|
|
|
controls.finish();
|
|
Lib.assertNotReached();
|
|
}
|
|
|
|
private void interrupt() {
|
|
eventWait.V();
|
|
}
|
|
|
|
private ElevatorEvent getNextEvent() {
|
|
ElevatorEvent event;
|
|
while (true) {
|
|
if ((event = controls.getNextEvent()) != null)
|
|
break;
|
|
|
|
eventWait.P();
|
|
}
|
|
return event;
|
|
}
|
|
|
|
private ElevatorControls controls;
|
|
private Semaphore eventWait;
|
|
}
|
|
|
|
private class Rider implements RiderInterface {
|
|
public void initialize(RiderControls controls, int[] stops) {
|
|
this.controls = controls;
|
|
Lib.assertTrue(stops.length == 1 && stops[0] == 1);
|
|
|
|
eventWait = new Semaphore(0);
|
|
|
|
controls.setInterruptHandler(new Runnable() {
|
|
public void run() { interrupt(); }
|
|
});
|
|
}
|
|
|
|
public void run() {
|
|
RiderEvent e;
|
|
|
|
Lib.assertTrue(controls.getFloor() == 0);
|
|
|
|
controls.pressUpButton();
|
|
|
|
e = getNextEvent();
|
|
Lib.assertTrue(e.event == RiderEvent.eventDoorsOpened &&
|
|
e.floor == 0 &&
|
|
e.elevator == 0);
|
|
Lib.assertTrue(controls.getDirectionDisplay(0) == dirUp);
|
|
|
|
Lib.assertTrue(controls.enterElevator(0));
|
|
controls.pressFloorButton(1);
|
|
|
|
e = getNextEvent();
|
|
Lib.assertTrue(e.event == RiderEvent.eventDoorsClosed &&
|
|
e.floor == 0 &&
|
|
e.elevator == 0);
|
|
|
|
e = getNextEvent();
|
|
Lib.assertTrue(e.event == RiderEvent.eventDoorsOpened &&
|
|
e.floor == 1 &&
|
|
e.elevator == 0);
|
|
|
|
Lib.assertTrue(controls.exitElevator(1));
|
|
|
|
controls.finish();
|
|
Lib.assertNotReached();
|
|
}
|
|
|
|
private void interrupt() {
|
|
eventWait.V();
|
|
}
|
|
|
|
private RiderEvent getNextEvent() {
|
|
RiderEvent event;
|
|
while (true) {
|
|
if ((event = controls.getNextEvent()) != null)
|
|
break;
|
|
|
|
eventWait.P();
|
|
}
|
|
return event;
|
|
}
|
|
|
|
private RiderControls controls;
|
|
private Semaphore eventWait;
|
|
}
|
|
}
|