Files
upo-valpre/src/test/java/net/berack/upo/valpre/sim/TestSimulation.java

614 lines
25 KiB
Java

package net.berack.upo.valpre.sim;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.HashSet;
import org.junit.jupiter.api.Test;
import net.berack.upo.valpre.rand.Distribution;
import net.berack.upo.valpre.rand.Rng;
public class TestSimulation {
private static final double DELTA = 0.0000001;
private static final Distribution const0 = _ -> 0.0;
private static final Distribution const1 = _ -> 1.0;
private static final Rng rigged;
private static final Net simpleNet;
private static final ServerNode node0;
private static final ServerNode node1;
static {
node0 = ServerNode.Builder.sourceLimited("First", 0, const1);
node1 = ServerNode.Builder.queue("Second", 1, const1);
simpleNet = new Net();
simpleNet.addNode(node0);
simpleNet.addNode(node1);
simpleNet.addConnection(0, 1, 1.0);
rigged = new Rng() {
@Override
public double random() {
return 0.1;
}
};
}
@Test
public void serverNode() {
var node = ServerNode.Builder.queue("Nodo", 0, const1);
assertEquals("Nodo", node.name);
assertEquals(1, node.maxServers);
assertEquals(0, node.spawnArrivals);
assertEquals(1.0, node.getServiceTime(null), DELTA);
node = ServerNode.Builder.queue("Queue", 50, const1);
assertEquals("Queue", node.name);
assertEquals(50, node.maxServers);
assertEquals(0, node.spawnArrivals);
assertEquals(1.0, node.getServiceTime(null), DELTA);
node = ServerNode.Builder.source("Source", const1);
assertEquals("Source", node.name);
assertEquals(1, node.maxServers);
assertEquals(Integer.MAX_VALUE, node.spawnArrivals);
assertEquals(1.0, node.getServiceTime(null), DELTA);
node = ServerNode.Builder.sourceLimited("Source", 50, const1);
assertEquals("Source", node.name);
assertEquals(1, node.maxServers);
assertEquals(50, node.spawnArrivals);
assertEquals(1.0, node.getServiceTime(null), DELTA);
}
@Test
public void event() {
var event = Event.newAvailable(0, 1.0);
assertEquals(0, event.nodeIndex);
assertEquals(1.0, event.time, 0.000000000001);
assertEquals(Event.Type.AVAILABLE, event.type);
var event2 = Event.newArrival(0, 5.0);
assertEquals(0, event2.nodeIndex);
assertEquals(5.0, event2.time, 0.000000000001);
assertEquals(Event.Type.ARRIVAL, event2.type);
var event3 = Event.newDeparture(1, 8.0);
assertEquals(1, event3.nodeIndex);
assertEquals(8.0, event3.time, 0.000000000001);
assertEquals(Event.Type.DEPARTURE, event3.type);
assertEquals(0, event2.compareTo(event2));
assertEquals(1, event2.compareTo(event));
assertEquals(-1, event2.compareTo(event3));
}
@Test
public void net() {
var net = new Net();
assertEquals(0, net.size());
var node = ServerNode.Builder.source("First", const0);
var index = net.addNode(node);
assertEquals(1, net.size());
assertEquals(0, index);
assertEquals(node, net.getNode(0));
assertEquals(node, net.getNode("First"));
assertEquals(index, net.getNodeIndex("First"));
var node1 = ServerNode.Builder.queue("Second", 1, const0);
var index1 = net.addNode(node1);
assertEquals(2, net.size());
assertEquals(0, index);
assertEquals(node, net.getNode(0));
assertEquals(node, net.getNode("First"));
assertEquals(index, net.getNodeIndex("First"));
assertEquals(1, index1);
assertEquals(node1, net.getNode(1));
assertEquals(node1, net.getNode("Second"));
assertEquals(index1, net.getNodeIndex("Second"));
var nodes = new HashSet<ServerNode>();
nodes.add(node);
nodes.add(node1);
net.forEach(n -> assertTrue(nodes.contains(n)));
net.addConnection(0, 1, 1.0);
var conn = net.getChildren(0);
assertEquals(1, conn.size());
assertEquals(1, conn.get(0).index);
assertEquals(1.0, conn.get(0).weight, DELTA);
conn = net.getChildren(1);
assertEquals(0, conn.size());
var node2 = ServerNode.Builder.queue("Third", 1, const0);
net.addNode(node2);
net.addConnection(0, 2, 1.0);
conn = net.getChildren(0);
assertEquals(2, conn.size());
assertEquals(1, conn.get(0).index);
assertEquals(2, conn.get(1).index);
assertEquals(1.0, conn.get(0).weight, DELTA);
assertEquals(1.0, conn.get(1).weight, DELTA);
conn = net.getChildren(1);
assertEquals(0, conn.size());
conn = net.getChildren(2);
assertEquals(0, conn.size());
net.normalizeWeights();
conn = net.getChildren(0);
assertEquals(2, conn.size());
assertEquals(1, conn.get(0).index);
assertEquals(2, conn.get(1).index);
assertEquals(0.5, conn.get(0).weight, DELTA);
assertEquals(0.5, conn.get(1).weight, DELTA);
conn = net.getChildren(1);
assertEquals(0, conn.size());
conn = net.getChildren(2);
assertEquals(0, conn.size());
}
@Test
public void nodeState() {
var state = new ServerNodeState(1, simpleNet);
assertEquals(1, state.index);
assertEquals(node1, state.node);
assertEquals(0, state.numServerBusy);
assertEquals(0, state.numServerUnavailable);
assertEquals(0, state.queue.size());
assertFalse(state.isQueueFull());
assertTrue(state.canServe());
assertFalse(state.hasRequests());
assertFalse(state.shouldSpawnArrival());
state.numServerBusy = 1;
assertEquals(1, state.numServerBusy);
assertFalse(state.canServe());
assertFalse(state.hasRequests());
state.numServerBusy = 0;
state.numServerUnavailable = 1;
assertEquals(1, state.numServerUnavailable);
assertFalse(state.canServe());
assertFalse(state.hasRequests());
state.queue.add(1.0);
assertEquals(1, state.queue.size());
assertTrue(state.hasRequests());
assertFalse(state.isQueueFull());
state.numServerUnavailable = 0;
state.numServerBusy = 0;
assertTrue(state.canServe());
assertTrue(state.hasRequests());
state.numServerBusy = 1;
state.queue.poll();
assertEquals(0, state.queue.size());
assertFalse(state.hasRequests());
}
@Test
public void nodeStatsUpdates() {
var net = new Net();
net.addNode(ServerNode.Builder.sourceLimited("Source", 50, const1));
net.addNode(node1);
net.addConnection(0, 1, 1.0);
var state = new ServerNodeState(0, net);
var event = state.spawnArrivalIfPossilbe(0);
assertNotNull(event);
assertEquals(0, state.stats.numArrivals, DELTA);
assertEquals(0, state.stats.numDepartures, DELTA);
assertEquals(0, state.numServerBusy);
assertEquals(0, state.numServerUnavailable);
assertEquals(Event.Type.ARRIVAL, event.type);
assertEquals(0, event.nodeIndex);
state.updateArrival(event.time);
assertEquals(1, state.stats.numArrivals, DELTA);
assertEquals(0, state.numServerBusy);
event = state.spawnDepartureIfPossible(event.time, rigged);
assertNotNull(event);
assertEquals(1, state.stats.numArrivals, DELTA);
assertEquals(0, state.stats.numDepartures, DELTA);
assertEquals(1, state.numServerBusy);
assertEquals(0, state.numServerUnavailable);
assertEquals(Event.Type.DEPARTURE, event.type);
assertEquals(0, event.nodeIndex);
state.updateDeparture(event.time);
assertEquals(1, state.stats.numArrivals, DELTA);
assertEquals(1, state.stats.numDepartures, DELTA);
assertEquals(0, state.numServerBusy);
assertEquals(0, state.numServerUnavailable);
state = new ServerNodeState(1, net);
event = state.spawnArrivalIfPossilbe(0);
assertNull(event);
assertEquals(0, state.stats.numArrivals, DELTA);
assertEquals(0, state.stats.numDepartures, DELTA);
assertEquals(0, state.numServerBusy);
assertEquals(0, state.numServerUnavailable);
state.updateArrival(0);
assertEquals(1, state.stats.numArrivals, DELTA);
assertEquals(0, state.numServerBusy);
event = state.spawnDepartureIfPossible(0, rigged);
assertNotNull(event);
assertEquals(1, state.stats.numArrivals, DELTA);
assertEquals(0, state.stats.numDepartures, DELTA);
assertEquals(1, state.numServerBusy);
assertEquals(0, state.numServerUnavailable);
assertEquals(Event.Type.DEPARTURE, event.type);
assertEquals(1, event.nodeIndex);
state.updateDeparture(event.time);
assertEquals(1, state.stats.numArrivals, DELTA);
assertEquals(1, state.stats.numDepartures, DELTA);
assertEquals(0, state.numServerBusy);
assertEquals(0, state.numServerUnavailable);
event = state.spawnUnavailableIfPossible(0, rigged);
assertNull(event);
state = new ServerNodeState(0, net);
event = state.spawnArrivalToChild(0, rigged);
assertNotNull(event);
assertEquals(0, state.stats.numArrivals, DELTA);
assertEquals(0, state.stats.numDepartures, DELTA);
assertEquals(0, state.numServerBusy);
assertEquals(0, state.numServerUnavailable);
assertEquals(Event.Type.ARRIVAL, event.type);
assertEquals(1, event.nodeIndex);
}
@Test
public void criteriaTime() {
var criteria = new EndCriteria.MaxTime(3.0);
var sim = new Simulation(simpleNet, rigged);
assertTrue(sim.hasEnded());
assertFalse(criteria.shouldEnd(sim));
sim.addToFel(Event.newArrival(0, sim.getTime()));
assertFalse(sim.hasEnded());
assertFalse(criteria.shouldEnd(sim));
sim.processNextEvent(); // Arrival
assertEquals(0.0, sim.getTime(), DELTA);
assertFalse(sim.hasEnded());
assertFalse(criteria.shouldEnd(sim));
sim.processNextEvent(); // Departure Source
assertEquals(1.0, sim.getTime(), DELTA);
assertFalse(sim.hasEnded());
assertFalse(criteria.shouldEnd(sim));
sim.processNextEvent(); // Arrival Queue
assertEquals(1.0, sim.getTime(), DELTA);
assertFalse(sim.hasEnded());
assertFalse(criteria.shouldEnd(sim));
sim.processNextEvent(); // Departure Queue
assertEquals(2.0, sim.getTime(), DELTA);
assertTrue(sim.hasEnded()); // No more events
assertFalse(criteria.shouldEnd(sim));
sim.addToFel(Event.newArrival(0, sim.getTime()));
assertFalse(sim.hasEnded());
assertFalse(criteria.shouldEnd(sim));
sim.processNextEvent(); // Arrival
assertEquals(2.0, sim.getTime(), DELTA);
assertFalse(sim.hasEnded());
assertFalse(criteria.shouldEnd(sim));
sim.processNextEvent(); // Departure Source
assertEquals(3.0, sim.getTime(), DELTA);
assertFalse(sim.hasEnded());
assertTrue(criteria.shouldEnd(sim));
}
@Test
public void criteriaArrivals() {
var criteria = new EndCriteria.MaxArrivals(node0.name, 2);
var sim = new Simulation(simpleNet, rigged);
assertTrue(sim.hasEnded());
assertFalse(criteria.shouldEnd(sim));
sim.addToFel(Event.newArrival(0, sim.getTime()));
assertFalse(sim.hasEnded());
assertFalse(criteria.shouldEnd(sim));
sim.processNextEvent(); // Arrival
assertEquals(0.0, sim.getTime(), DELTA);
assertFalse(sim.hasEnded());
assertFalse(criteria.shouldEnd(sim));
sim.processNextEvent(); // Departure Source
assertEquals(1.0, sim.getTime(), DELTA);
assertFalse(sim.hasEnded());
assertFalse(criteria.shouldEnd(sim));
sim.processNextEvent(); // Arrival Queue
assertEquals(1.0, sim.getTime(), DELTA);
assertFalse(sim.hasEnded());
assertFalse(criteria.shouldEnd(sim));
sim.processNextEvent(); // Departure Queue
assertEquals(2.0, sim.getTime(), DELTA);
assertTrue(sim.hasEnded());
assertFalse(criteria.shouldEnd(sim));
sim.addToFel(Event.newArrival(0, sim.getTime()));
assertFalse(sim.hasEnded());
assertFalse(criteria.shouldEnd(sim));
sim.processNextEvent(); // Arrival
assertEquals(2.0, sim.getTime(), DELTA);
assertFalse(sim.hasEnded());
assertTrue(criteria.shouldEnd(sim));
}
@Test
public void criteriaDeparture() {
var criteria = new EndCriteria.MaxDepartures(node0.name, 2);
var sim = new Simulation(simpleNet, rigged);
assertTrue(sim.hasEnded());
assertFalse(criteria.shouldEnd(sim));
sim.addToFel(Event.newArrival(0, sim.getTime()));
assertFalse(sim.hasEnded());
assertFalse(criteria.shouldEnd(sim));
sim.processNextEvent(); // Arrival
assertEquals(0.0, sim.getTime(), DELTA);
assertFalse(sim.hasEnded());
assertFalse(criteria.shouldEnd(sim));
sim.processNextEvent(); // Departure Source
assertEquals(1.0, sim.getTime(), DELTA);
assertFalse(sim.hasEnded());
assertFalse(criteria.shouldEnd(sim));
sim.processNextEvent(); // Arrival Queue
assertEquals(1.0, sim.getTime(), DELTA);
assertFalse(sim.hasEnded());
assertFalse(criteria.shouldEnd(sim));
sim.processNextEvent(); // Departure Queue
assertEquals(2.0, sim.getTime(), DELTA);
assertTrue(sim.hasEnded());
assertFalse(criteria.shouldEnd(sim));
sim.addToFel(Event.newArrival(0, sim.getTime()));
assertFalse(sim.hasEnded());
assertFalse(criteria.shouldEnd(sim));
sim.processNextEvent(); // Arrival
assertEquals(2.0, sim.getTime(), DELTA);
assertFalse(sim.hasEnded());
assertFalse(criteria.shouldEnd(sim));
sim.processNextEvent(); // Departure Source
assertEquals(3.0, sim.getTime(), DELTA);
assertFalse(sim.hasEnded());
assertTrue(criteria.shouldEnd(sim));
}
@Test
public void simulation() {
var start = System.nanoTime();
var sim = new Simulation(simpleNet, rigged);
// knowing that it takes time to allocate the object
// we can use the average time
var endAllocation = System.nanoTime();
var time = (endAllocation + start) / 2;
var diff = 0.5e-6 * (endAllocation - start); // getting the error margin in ms
assertTrue(sim.hasEnded());
assertEquals(0, sim.getEventsProcessed());
assertEquals(0.0, sim.getTime(), DELTA);
assertEquals(node0, sim.getNode(node0.name));
assertEquals(node1, sim.getNode(node1.name));
assertEquals(0, sim.getNodeState(node0.name).numServerBusy);
assertEquals(0, sim.getNodeState(node0.name).numServerUnavailable);
assertEquals(0, sim.getNodeState(node1.name).numServerBusy);
assertEquals(0, sim.getNodeState(node1.name).numServerUnavailable);
var fel = sim.getFutureEventList();
assertEquals(0, fel.size());
sim.addToFel(Event.newArrival(0, sim.getTime()));
assertFalse(sim.hasEnded());
assertEquals(0, sim.getEventsProcessed());
assertEquals(0.0, sim.getTime(), DELTA);
assertEquals(node0, sim.getNode(node0.name));
assertEquals(node1, sim.getNode(node1.name));
assertEquals(0, sim.getNodeState(node0.name).numServerBusy);
assertEquals(0, sim.getNodeState(node0.name).numServerUnavailable);
assertEquals(0, sim.getNodeState(node1.name).numServerBusy);
assertEquals(0, sim.getNodeState(node1.name).numServerUnavailable);
fel = sim.getFutureEventList();
assertEquals(1, fel.size());
assertEquals(Event.Type.ARRIVAL, fel.get(0).type);
assertEquals(0, fel.get(0).nodeIndex);
assertEquals(0.0, fel.get(0).time, DELTA);
sim.processNextEvent(); // Arrival
assertEquals(0.0, sim.getTime(), DELTA);
assertFalse(sim.hasEnded());
assertEquals(1, sim.getEventsProcessed());
assertEquals(node0, sim.getNode(node0.name));
assertEquals(node1, sim.getNode(node1.name));
assertEquals(1, sim.getNodeState(node0.name).numServerBusy);
assertEquals(0, sim.getNodeState(node0.name).numServerUnavailable);
assertEquals(0, sim.getNodeState(node1.name).numServerBusy);
assertEquals(0, sim.getNodeState(node1.name).numServerUnavailable);
fel = sim.getFutureEventList();
assertEquals(1, fel.size());
assertEquals(Event.Type.DEPARTURE, fel.get(0).type);
assertEquals(0, fel.get(0).nodeIndex);
assertEquals(1.0, fel.get(0).time, DELTA);
sim.processNextEvent(); // Departure Source
assertEquals(1.0, sim.getTime(), DELTA);
assertFalse(sim.hasEnded());
assertEquals(2, sim.getEventsProcessed());
assertEquals(node0, sim.getNode(node0.name));
assertEquals(node1, sim.getNode(node1.name));
assertEquals(0, sim.getNodeState(node0.name).numServerBusy);
assertEquals(0, sim.getNodeState(node0.name).numServerUnavailable);
assertEquals(0, sim.getNodeState(node1.name).numServerBusy);
assertEquals(0, sim.getNodeState(node1.name).numServerUnavailable);
fel = sim.getFutureEventList();
assertEquals(1, fel.size());
assertEquals(Event.Type.ARRIVAL, fel.get(0).type);
assertEquals(1, fel.get(0).nodeIndex);
assertEquals(1.0, fel.get(0).time, DELTA);
sim.processNextEvent(); // Arrival Queue
assertEquals(1.0, sim.getTime(), DELTA);
assertFalse(sim.hasEnded());
assertEquals(3, sim.getEventsProcessed());
assertEquals(node0, sim.getNode(node0.name));
assertEquals(node1, sim.getNode(node1.name));
assertEquals(0, sim.getNodeState(node0.name).numServerBusy);
assertEquals(0, sim.getNodeState(node0.name).numServerUnavailable);
assertEquals(1, sim.getNodeState(node1.name).numServerBusy);
assertEquals(0, sim.getNodeState(node1.name).numServerUnavailable);
fel = sim.getFutureEventList();
assertEquals(1, fel.size());
assertEquals(Event.Type.DEPARTURE, fel.get(0).type);
assertEquals(1, fel.get(0).nodeIndex);
assertEquals(2.0, fel.get(0).time, DELTA);
sim.processNextEvent(); // Departure Queue
assertEquals(2.0, sim.getTime(), DELTA);
assertTrue(sim.hasEnded());
assertEquals(4, sim.getEventsProcessed());
assertEquals(node0, sim.getNode(node0.name));
assertEquals(node1, sim.getNode(node1.name));
assertEquals(0, sim.getNodeState(node0.name).numServerBusy);
assertEquals(0, sim.getNodeState(node0.name).numServerUnavailable);
assertEquals(0, sim.getNodeState(node1.name).numServerBusy);
assertEquals(0, sim.getNodeState(node1.name).numServerUnavailable);
fel = sim.getFutureEventList();
assertEquals(0, fel.size());
var elapsed = (double) (System.nanoTime() - time);
var result = sim.endSimulation();
assertEquals(2.0, result.simulationTime, DELTA);
assertEquals(sim.seed, result.seed);
assertEquals(elapsed * 1e-6, result.timeElapsedMS, diff);
assertEquals(2, result.nodes.size());
assertEquals(1, result.nodes.get(node0.name).numArrivals, DELTA);
assertEquals(1, result.nodes.get(node0.name).numDepartures, DELTA);
assertEquals(1, result.nodes.get(node1.name).numArrivals, DELTA);
assertEquals(1, result.nodes.get(node1.name).numDepartures, DELTA);
}
@Test
public void endSim() {
var criteria = new EndCriteria.MaxDepartures(node0.name, 5);
var sim = new Simulation(simpleNet, rigged, criteria);
sim.addToFel(Event.newArrival(0, sim.getTime()));
sim.addToFel(Event.newArrival(0, sim.getTime()));
sim.addToFel(Event.newArrival(0, sim.getTime()));
sim.addToFel(Event.newArrival(0, sim.getTime()));
sim.addToFel(Event.newArrival(0, sim.getTime()));
sim.addToFel(Event.newArrival(0, sim.getTime()));
while (!criteria.shouldEnd(sim)) {
sim.processNextEvent();
}
assertTrue(sim.hasEnded());
var res = sim.endSimulation();
assertEquals(6, res.nodes.get(node0.name).numArrivals, DELTA);
assertEquals(5, res.nodes.get(node0.name).numDepartures, DELTA);
assertEquals(4, res.nodes.get(node1.name).numArrivals, DELTA);
assertEquals(3, res.nodes.get(node1.name).numDepartures, DELTA);
}
@Test
public void simulationStats() {
var net = new Net();
net.addNode(ServerNode.Builder.sourceLimited("Source", 50, const1));
var sim = new Simulation(net, rigged);
var result = sim.run();
var nodeStat = result.nodes.get("Source");
assertEquals(50, nodeStat.numArrivals, DELTA);
assertEquals(50, nodeStat.numDepartures, DELTA);
assertEquals(1.0, nodeStat.avgQueueLength, DELTA);
assertEquals(1.0, nodeStat.avgResponse, DELTA);
assertEquals(0.0, nodeStat.avgWaitTime, DELTA);
assertEquals(1.0, nodeStat.maxQueueLength, DELTA);
assertEquals(50.0, nodeStat.busyTime, DELTA);
assertEquals(result.simulationTime, nodeStat.lastEventTime, DELTA);
assertEquals(1.0, nodeStat.throughput, DELTA);
assertEquals(1.0, nodeStat.utilization, DELTA);
assertEquals(0.0, nodeStat.unavailable, DELTA);
net.addNode(ServerNode.Builder.queue("Queue", 1, const1));
net.addConnection(0, 1, 1.0);
sim = new Simulation(net, rigged);
result = sim.run();
nodeStat = result.nodes.get("Source");
assertEquals(50, nodeStat.numArrivals, DELTA);
assertEquals(50, nodeStat.numDepartures, DELTA);
assertEquals(1.0, nodeStat.avgQueueLength, DELTA);
assertEquals(1.0, nodeStat.avgResponse, DELTA);
assertEquals(0.0, nodeStat.avgWaitTime, DELTA);
assertEquals(1.0, nodeStat.maxQueueLength, DELTA);
assertEquals(50.0, nodeStat.busyTime, DELTA);
assertEquals(result.simulationTime - 1, nodeStat.lastEventTime, DELTA);
assertEquals(1.0, nodeStat.throughput, DELTA);
assertEquals(1.0, nodeStat.utilization, DELTA);
assertEquals(0.0, nodeStat.unavailable, DELTA);
nodeStat = result.nodes.get("Queue");
assertEquals(50, nodeStat.numArrivals, DELTA);
assertEquals(50, nodeStat.numDepartures, DELTA);
assertEquals(1.0, nodeStat.avgQueueLength, DELTA);
assertEquals(1.0, nodeStat.avgResponse, DELTA);
assertEquals(0.0, nodeStat.avgWaitTime, DELTA);
assertEquals(1.0, nodeStat.maxQueueLength, DELTA);
assertEquals(50.0, nodeStat.busyTime, DELTA);
assertEquals(result.simulationTime, nodeStat.lastEventTime, DELTA);
assertEquals(nodeStat.busyTime / nodeStat.lastEventTime, nodeStat.utilization, DELTA);
assertEquals(nodeStat.numDepartures / nodeStat.lastEventTime, nodeStat.throughput, DELTA);
assertEquals(0.0, nodeStat.unavailable, DELTA);
}
@Test
public void simulationDrop() {
var net = new Net();
net.addNode(ServerNode.Builder.sourceLimited("Source", 50, const1));
net.addNode(new ServerNode.Builder("Queue", _ -> 2.0).queue(20).build());
net.addConnection(0, 1, 1.0);
var sim = new Simulation(net, rigged);
var result = sim.run();
var nodeStat = result.nodes.get("Source");
assertEquals(50, nodeStat.numArrivals, DELTA);
assertEquals(50, nodeStat.numDepartures, DELTA);
assertEquals(1.0, nodeStat.avgQueueLength, DELTA);
assertEquals(1.0, nodeStat.avgResponse, DELTA);
assertEquals(0.0, nodeStat.avgWaitTime, DELTA);
assertEquals(1.0, nodeStat.maxQueueLength, DELTA);
assertEquals(50.0, nodeStat.busyTime, DELTA);
assertEquals(50.0, nodeStat.lastEventTime, DELTA);
assertEquals(1.0, nodeStat.throughput, DELTA);
assertEquals(1.0, nodeStat.utilization, DELTA);
assertEquals(0.0, nodeStat.unavailable, DELTA);
nodeStat = result.nodes.get("Queue");
assertEquals(44, nodeStat.numArrivals, DELTA);
assertEquals(44, nodeStat.numDepartures, DELTA);
assertEquals(20.0, nodeStat.maxQueueLength, DELTA);
assertEquals(23.0227272, nodeStat.avgResponse, DELTA);
assertEquals(21.0227272, nodeStat.avgWaitTime, DELTA);
assertEquals(0.0, nodeStat.unavailable, DELTA);
assertEquals(result.simulationTime, nodeStat.lastEventTime, DELTA);
}
}