//package nl.fontys.sofa.limo.simulation.task;
//
//import java.util.Arrays;
//import nl.fontys.sofa.limo.domain.component.event.Event;
//import nl.fontys.sofa.limo.domain.component.hub.Hub;
//import nl.fontys.sofa.limo.domain.component.leg.Leg;
//import nl.fontys.sofa.limo.domain.component.leg.MultiModeLeg;
//import nl.fontys.sofa.limo.domain.component.leg.ScheduledLeg;
//import nl.fontys.sofa.limo.domain.component.procedure.Procedure;
//import nl.fontys.sofa.limo.domain.component.procedure.TimeType;
//import nl.fontys.sofa.limo.domain.component.procedure.value.RangeValue;
//import nl.fontys.sofa.limo.domain.component.procedure.value.SingleValue;
//import nl.fontys.sofa.limo.simulation.result.TestCaseResult;
//import static org.junit.Assert.assertNotNull;
//import static org.junit.Assert.assertNull;
//import static org.junit.Assert.assertTrue;
//import org.junit.Before;
//import org.junit.Test;
//
///**
// * Test a single test case for the simulation. This includes normal legs,
// * scheduled legs and multi mode legs.
// *
// * @author Sven Mäurer
// */
//public class TestCaseTest extends SupplyChainTester {
//
// private TestCase testCase;
// private MultiModeLeg multiModeLeg;
//
// public TestCaseTest() {
// super();
// }
//
// @Before
// public void setUp() {
// testCase = new TestCase(supplyChain);
// }
//
// @Test
// public void testGetResult() {
// TestCaseResult result = testCase.getResult();
// assertNull(result);
// }
//
// @Test
// public void testRunSimpleLeg() {
// buildComplexSupplyChain();
//
// leg.setNext(end);
// start.setNext(leg);
// supplyChain.setStartHub(start);
//
// testCase.run();
// TestCaseResult result = testCase.getResult();
// assertNotNull(result);
//
// assertTrue(result.getSupplyChain().equals(supplyChain));
// assertComplexSupplyChain(result);
// }
//
// @Test
// public void testRunMultiModeLegAlwaysHappen() {
// buildComplexSupplyChain();
//
// supplyChain.setStartHub(start);
// multiModeLeg = new MultiModeLeg();
// start.setNext(multiModeLeg);
// multiModeLeg.setNext(end);
// multiModeLeg.addLeg(leg, 1);
//
// testCase.run();
// TestCaseResult result = testCase.getResult();
// assertNotNull(result);
//
// assertTrue(result.getSupplyChain().equals(supplyChain));
// assertComplexSupplyChain(result);
// }
//
// @Test
// public void testRunRealMultiModeLeg() {
// buildComplexSupplyChain();
//
// Leg leg2 = new Leg();
// leg2.setName("Leg 2");
// leg2.setNext(end);
// start.setNext(leg2);
//
// supplyChain.setStartHub(start);
// multiModeLeg = new MultiModeLeg();
// multiModeLeg.setName("Multimode Leg");
// start.setNext(multiModeLeg);
// multiModeLeg.setNext(end);
// multiModeLeg.addLeg(leg, 0.4);
// multiModeLeg.addLeg(leg, 0.6);
//
// testCase = new TestCase(supplyChain);
// testCase.run();
//
// TestCaseResult result = testCase.getResult();
// assertNotNull(result);
//
// assertTrue("At least 4 events can happen.", result.getExecutedEvents().size() <= 4);
//
// assertTrue("Min 5000 based on procedures.", 5000 <= result.getTotalCosts());
// assertTrue("Max 7000 based on procedures.", 7000 >= result.getTotalCosts());
//
// assertTrue("Min 0 based on events.", 0 <= result.getTotalExtraCosts());
// assertTrue("Max 4000 based on events.", 4000 >= result.getTotalExtraCosts());
//
// assertTrue("No delay can happen.", 0 <= result.getTotalDelays());
// assertTrue("Up to 4 hours can happen.", 4 * 60 >= result.getTotalDelays());
//
// assertTrue("Min 5 hours lead time.", 5 * 60 <= result.getTotalLeadTimes());
// assertTrue("Max 7 hours lead time.", 7 * 60 >= result.getTotalLeadTimes());
// }
//
// @Test
// public void testScheduledLegTakeAlternative() {
// buildComplexSupplyChain();
//
// Leg leg2 = new Leg();
// leg2.setName("Leg 2");
// leg2.getProcedures().add(new Procedure("loading", MANDATORY, new RangeValue(3000, 4000), new RangeValue(3, 4), TimeType.HOURS, new SingleValue(0)));
// leg2.setNext(end);
// start.setNext(leg2);
//
// supplyChain.setStartHub(start);
// ScheduledLeg scheduledLeg = new ScheduledLeg();
// scheduledLeg.setName("Scheduleg Leg");
// start.setNext(scheduledLeg);
// scheduledLeg.setNext(end);
// scheduledLeg.setAlternative(leg2);
// scheduledLeg.setWaitingTimeLimit(20);
// scheduledLeg.setAcceptanceTimes(Arrays.asList(new Long[]{30L}));
//
// testCase.run();
// TestCaseResult result = testCase.getResult();
// assertNotNull(result);
//
// assertTrue("Min 5000 based on procedures.", 5000 <= result.getTotalCosts());
//
// assertTrue("Min 3000 based on events.", 3000 <= result.getTotalExtraCosts());
// assertTrue("Max 4000 based on events.", 4000 >= result.getTotalExtraCosts());
//
// assertTrue("No delay can happen.", 0 <= result.getTotalDelays());
// assertTrue("Up to 4 hours can happen.", 4 * 60 >= result.getTotalDelays());
//
// assertTrue("Min 5 hours lead time.", 5 * 60 <= result.getTotalLeadTimes());
//
// //Alternative
// boolean tooLate = false;
// for (Event executedEvent : result.getExecutedEvents()) {
// if (executedEvent.getName().equals("Waiting")) {
// tooLate = true;
// }
// }
// if (tooLate) {
// assertTrue("Max 11000 based on procedures.", 11000 >= result.getTotalCosts());
// assertTrue("Max 11 hours lead time.", 11 * 60 >= result.getTotalLeadTimes());
// } else {
// assertTrue("Max 7000 based on procedures.", 7000 >= result.getTotalCosts());
// assertTrue("Max 7 hours lead time.", 7 * 60 >= result.getTotalLeadTimes());
// }
// }
//
// @Test
// public void testScheduledLegNotAlternative() {
// buildComplexSupplyChain();
//
// Hub middleHub = new Hub();
// middleHub.setName("Amsterdam");
// middleHub.getProcedures().add(new Procedure("customs control", MANDATORY, new SingleValue(100), new RangeValue(3, 4), TimeType.HOURS, new SingleValue(0)));
//
// Leg leg2 = new Leg();
// leg2.setName("Rotterdam--Amsterdam");
// leg2.getProcedures().add(new Procedure("loading", MANDATORY, new RangeValue(3000, 4000), new RangeValue(3, 4), TimeType.HOURS, new SingleValue(0)));
// leg2.setNext(middleHub);
//
// supplyChain.setStartHub(start);
// ScheduledLeg scheduledLeg = new ScheduledLeg();
// scheduledLeg.setName("Scheduleg Leg");
// start.setNext(scheduledLeg);
// scheduledLeg.setNext(middleHub);
// scheduledLeg.setAlternative(leg2);
// scheduledLeg.setWaitingTimeLimit(4 * 60);
// scheduledLeg.setAcceptanceTimes(Arrays.asList(new Long[]{30L, 120L, 180L}));
//
// Leg leg3 = new Leg();
// leg3.setName("Leg 3");
// leg3.getProcedures().add(new Procedure("loading", MANDATORY, new RangeValue(3000, 4000), new RangeValue(3, 4), TimeType.HOURS, new SingleValue(0)));
// leg3.setNext(middleHub);
//
// ScheduledLeg scheduledLeg2 = new ScheduledLeg();
// scheduledLeg2.setName("Scheduled Leg 2");
// middleHub.setNext(scheduledLeg2);
// scheduledLeg2.setNext(end);
// scheduledLeg2.setAlternative(leg3);
// scheduledLeg2.setWaitingTimeLimit(4 * 60);
// scheduledLeg2.setAcceptanceTimes(Arrays.asList(new Long[]{30L, 120L, 180L}));
//
// testCase.run();
// TestCaseResult result = testCase.getResult();
// assertNotNull(result);
//
// assertTrue("Min 5000 based on procedures.", 5000 <= result.getTotalCosts());
// assertTrue("Max 7000 based on procedures.", 7000 >= result.getTotalCosts());
//
// assertTrue("Min 3000 based on events.", 3000 <= result.getTotalExtraCosts());
// assertTrue("Max 4000 based on events.", 4000 >= result.getTotalExtraCosts());
//
// assertTrue("No delay can happen.", 0 <= result.getTotalDelays());
// assertTrue("Up to 4 hours can happen.", 4 * 60 >= result.getTotalDelays());
//
// // Add the waiting time here
// assertTrue(result.getLeadTimesByCategory().containsKey(ScheduledLeg.WAIT_CATEGORY));
// assertTrue("Min 5.5 hours lead time.", 5 * 60 + 30 <= result.getTotalLeadTimes());
// assertTrue("Max 11.5 hours lead time.", 7 * 60 + 180 * 2 >= result.getTotalLeadTimes());
// }
//
//}