package nl.fontys.sofa.limo.simulation.task;
import nl.fontys.sofa.limo.simulation.result.SimulationResult;
import org.junit.Assert;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
/**
* Test the complete simulation.
*
* @author Sven Mäurer
*/
public class SimulationTest extends SupplyChainTester {
private static final int NUMBER_OF_SIMULATIONS = 1000;
private final Simulation simulation;
public SimulationTest() {
super();
buildComplexSupplyChain();
leg.setNext(end);
start.setNext(leg);
supplyChain.setStartHub(start);
simulation = new Simulation(supplyChain, NUMBER_OF_SIMULATIONS, "1");
}
@Test
public void testGetProgress() {
double progress = simulation.getProgress();
Assert.assertEquals(0, progress, 0.000001);
}
@Test
public void testGetResult() {
SimulationResult result = simulation.getResult();
Assert.assertEquals(null, result.getTotalCosts().getMax());
Assert.assertEquals(null, result.getTotalDelays().getMax());
Assert.assertEquals(null, result.getTotalExtraCosts().getMax());
Assert.assertEquals(null, result.getTotalLeadTimes().getMax());
}
@Test
public void testRunEmpty() {
Simulation s = new Simulation(supplyChain, 0, "1");
s.run();
while (s.getProgress() != 1.0d) {
}
SimulationResult result = s.getResult();
}
@Test
public void testRun() {
simulation.run();
while (simulation.getProgress() != 1.0d) {
}
SimulationResult result = simulation.getResult();
assertTrue(result.getSupplyChain().equals(supplyChain));
assertEquals(NUMBER_OF_SIMULATIONS, result.getTestCaseCount(), 4);
assertTrue("Two events always happen.", result.getExecutedEvents().size() >= 2);
assertTrue("At least 4 events can happen.", result.getExecutedEvents().size() <= 4);
assertTrue("Two events always happen.", result.getEventExecutionRate().size() >= 2);
assertTrue("At least 4 events can happen.", result.getEventExecutionRate().size() <= 4);
assertTrue(result.getCostsByCategory().containsKey(MANDATORY));
assertTrue("Min 5000 based on procedures.", 5000 <= result.getTotalCosts().getMin());
assertTrue("Max 7000 based on procedures.", 7000 >= result.getTotalCosts().getMax());
assertTrue(result.getExtraCostsByCategory().containsKey(MANDATORY));
assertTrue(result.getExtraCostsByCategory().containsKey("always"));
assertTrue(result.getExtraCostsByCategory().containsKey("if too late"));
assertTrue("Min 3000 based on events.", 3000 <= result.getTotalExtraCosts().getMin());
assertTrue("Max 4000 based on events.", 4000 >= result.getTotalExtraCosts().getMax());
assertTrue(result.getDelaysByCategory().containsKey(MANDATORY));
assertTrue(result.getDelaysByCategory().containsKey("always"));
assertTrue(result.getDelaysByCategory().containsKey("if too late"));
assertTrue("No delay can happen.", 0 <= result.getTotalDelays().getMin());
assertTrue("Up to 4 hours can happen.", 4 * 60 >= result.getTotalDelays().getMax());
assertTrue(result.getLeadTimesByCategory().containsKey(MANDATORY));
assertTrue("Min 5 hours lead time.", 5 * 60 <= result.getTotalLeadTimes().getMin());
assertTrue("Max 7 hours lead time.", 7 * 60 >= result.getTotalLeadTimes().getMax());
}
@Test
public void testTaskFinished() {
// simulation.taskFinished(Task.EMPTY);
}
}