/* * JaamSim Discrete Event Simulation * Copyright (C) 2014 Ausenco Engineering Canada Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.jaamsim.events; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.ArrayList; import org.junit.Test; public class TestEventManager { /** * Test the static EventManager methods that can only be called from a Process * thread throw a ProcessError when called from a non-Process thread. */ @Test public void testExpectedStaticFailures() { try { EventManager.current(); fail("Did not throw an error."); } catch (ProcessError e) {} catch (Throwable e) { fail("Unknown error thrown."); } try { EventManager.simTicks(); fail("Did not throw an error."); } catch (ProcessError e) {} catch (Throwable e) { fail("Unknown error thrown."); } try { EventManager.simSeconds(); fail("Did not throw an error."); } catch (ProcessError e) {} catch (Throwable e) { fail("Unknown error thrown."); } try { EventManager.scheduleTicks(0, 0, false, null, null); fail("Did not throw an error."); } catch (ProcessError e) {} catch (Throwable e) { fail("Unknown error thrown."); } try { EventManager.waitTicks(0, 0, false, null); fail("Did not throw an error."); } catch (ProcessError e) {} catch (Throwable e) { fail("Unknown error thrown."); } try { EventManager.scheduleSeconds(0.0d, 0, false, null, null); fail("Did not throw an error."); } catch (ProcessError e) {} catch (Throwable e) { fail("Unknown error thrown."); } try { EventManager.waitSeconds(0.0d, 0, false, null); fail("Did not throw an error."); } catch (ProcessError e) {} catch (Throwable e) { fail("Unknown error thrown."); } try { EventManager.interruptEvent(null); fail("Did not throw an error."); } catch (ProcessError e) {} catch (Throwable e) { fail("Unknown error thrown."); } try { EventManager.killEvent(null); fail("Did not throw an error."); } catch (ProcessError e) {} catch (Throwable e) { fail("Unknown error thrown."); } } @Test public void testScheduleTime() { EventManager evt = new EventManager("TestScheduleTimeEVT"); evt.clear(); ArrayList<String> log = new ArrayList<>(); evt.scheduleProcessExternal(0, 0, false, new LogTarget(0, log), null); evt.scheduleProcessExternal(1, 0, false, new LogTarget(1, log), null); evt.scheduleProcessExternal(2, 0, false, new LogTarget(2, log), null); evt.scheduleProcessExternal(3, 0, false, new LogTarget(3, log), null); evt.scheduleProcessExternal(4, 0, false, new LogTarget(4, log), null); TestFrameworkHelpers.runEventsToTick(evt, 100, 1000); ArrayList<String> expected = new ArrayList<>(); expected.add("Target:0"); expected.add("Target:1"); expected.add("Target:2"); expected.add("Target:3"); expected.add("Target:4"); assertTrue(expected.size() == log.size()); for (int i = 0; i < expected.size(); i++) { assertTrue(expected.get(i).equals(log.get(i))); } } @Test public void testSchedulePriority() { EventManager evt = new EventManager("testSchedulePriorityEVT"); evt.clear(); ArrayList<String> log = new ArrayList<>(); evt.scheduleProcessExternal(0, 0, false, new LogTarget(0, log), null); evt.scheduleProcessExternal(0, 1, false, new LogTarget(1, log), null); evt.scheduleProcessExternal(0, 2, false, new LogTarget(2, log), null); evt.scheduleProcessExternal(0, 3, false, new LogTarget(3, log), null); evt.scheduleProcessExternal(0, 4, false, new LogTarget(4, log), null); TestFrameworkHelpers.runEventsToTick(evt, 100, 1000); ArrayList<String> expected = new ArrayList<>(); expected.add("Target:0"); expected.add("Target:1"); expected.add("Target:2"); expected.add("Target:3"); expected.add("Target:4"); assertTrue(expected.size() == log.size()); for (int i = 0; i < expected.size(); i++) { assertTrue(expected.get(i).equals(log.get(i))); } } /** * Schedule events at the same time and test LIFO for the tiebreaker. */ @Test public void testScheduleLIFO() { EventManager evt = new EventManager("testScheduleLIFOEVT"); evt.clear(); ArrayList<String> log = new ArrayList<>(); evt.scheduleProcessExternal(0, 0, false, new LogTarget(0, log), null); evt.scheduleProcessExternal(0, 0, false, new LogTarget(1, log), null); evt.scheduleProcessExternal(0, 0, false, new LogTarget(2, log), null); evt.scheduleProcessExternal(0, 0, false, new LogTarget(3, log), null); evt.scheduleProcessExternal(0, 0, false, new LogTarget(4, log), null); TestFrameworkHelpers.runEventsToTick(evt, 100, 1000); ArrayList<String> expected = new ArrayList<>(); expected.add("Target:4"); expected.add("Target:3"); expected.add("Target:2"); expected.add("Target:1"); expected.add("Target:0"); assertTrue(expected.size() == log.size()); for (int i = 0; i < expected.size(); i++) { assertTrue(expected.get(i).equals(log.get(i))); } } /** * Schedule events at the same time and test LIFO for the tiebreaker. */ @Test public void testScheduleFIFO() { EventManager evt = new EventManager("testScheduleFIFOEVT"); evt.clear(); ArrayList<String> log = new ArrayList<>(); evt.scheduleProcessExternal(0, 0, true, new LogTarget(0, log), null); evt.scheduleProcessExternal(0, 0, true, new LogTarget(1, log), null); evt.scheduleProcessExternal(0, 0, true, new LogTarget(2, log), null); evt.scheduleProcessExternal(0, 0, true, new LogTarget(3, log), null); evt.scheduleProcessExternal(0, 0, true, new LogTarget(4, log), null); TestFrameworkHelpers.runEventsToTick(evt, 100, 1000); ArrayList<String> expected = new ArrayList<>(); expected.add("Target:0"); expected.add("Target:1"); expected.add("Target:2"); expected.add("Target:3"); expected.add("Target:4"); assertTrue(expected.size() == log.size()); for (int i = 0; i < expected.size(); i++) { assertTrue(expected.get(i).equals(log.get(i))); } } /** * Schedule events at the same time and test LIFO for the tiebreaker. */ @Test public void testScheduleMixed() { EventManager evt = new EventManager("testScheduleMixedEVT"); evt.clear(); ArrayList<String> log = new ArrayList<>(); evt.scheduleProcessExternal(0, 0, false, new LogTarget(0, log), null); evt.scheduleProcessExternal(1, 0, false, new LogTarget(1, log), null); evt.scheduleProcessExternal(2, 0, false, new LogTarget(2, log), null); evt.scheduleProcessExternal(3, 0, false, new LogTarget(3, log), null); evt.scheduleProcessExternal(4, 0, false, new LogTarget(4, log), null); evt.scheduleProcessExternal(0, 0, true, new LogTarget(10, log), null); evt.scheduleProcessExternal(1, 0, true, new LogTarget(11, log), null); evt.scheduleProcessExternal(2, 0, true, new LogTarget(12, log), null); evt.scheduleProcessExternal(3, 0, true, new LogTarget(13, log), null); evt.scheduleProcessExternal(4, 0, true, new LogTarget(14, log), null); evt.scheduleProcessExternal(0, 0, false, new LogTarget(20, log), null); evt.scheduleProcessExternal(1, 0, false, new LogTarget(21, log), null); evt.scheduleProcessExternal(2, 0, false, new LogTarget(22, log), null); evt.scheduleProcessExternal(3, 0, false, new LogTarget(23, log), null); evt.scheduleProcessExternal(4, 0, false, new LogTarget(24, log), null); TestFrameworkHelpers.runEventsToTick(evt, 100, 1000); ArrayList<String> expected = new ArrayList<>(); expected.add("Target:20"); expected.add("Target:0"); expected.add("Target:10"); expected.add("Target:21"); expected.add("Target:1"); expected.add("Target:11"); expected.add("Target:22"); expected.add("Target:2"); expected.add("Target:12"); expected.add("Target:23"); expected.add("Target:3"); expected.add("Target:13"); expected.add("Target:24"); expected.add("Target:4"); expected.add("Target:14"); assertTrue(expected.size() == log.size()); for (int i = 0; i < expected.size(); i++) { assertTrue(expected.get(i).equals(log.get(i))); } } /** * Schedule events at the same time and test LIFO for the tiebreaker. */ @Test public void testScheduleWait() { EventManager evt = new EventManager("testScheduleWaitEVT"); evt.clear(); final ArrayList<String> log = new ArrayList<>(); evt.scheduleProcessExternal(0, 0, false, new ProcessTarget() { @Override public String getDescription() { return ""; } @Override public void process() { log.add("Wait1:" + EventManager.simTicks()); EventManager.waitTicks(1, 0, true, null); log.add("Wait1:" + EventManager.simTicks()); EventManager.waitTicks(1, 0, true, null); log.add("Wait1:" + EventManager.simTicks()); EventManager.waitTicks(1, 0, false, null); log.add("Wait1:" + EventManager.simTicks()); } }, null); evt.scheduleProcessExternal(0, 0, false, new ProcessTarget() { @Override public String getDescription() { return ""; } @Override public void process() { log.add("Wait2:" + EventManager.simTicks()); EventManager.waitTicks(1, 0, true, null); log.add("Wait2:" + EventManager.simTicks()); EventManager.waitTicks(1, 0, true, null); log.add("Wait2:" + EventManager.simTicks()); EventManager.waitTicks(1, 0, true, null); log.add("Wait2:" + EventManager.simTicks()); } }, null); TestFrameworkHelpers.runEventsToTick(evt, 100, 1000); ArrayList<String> expected = new ArrayList<>(); expected.add("Wait2:0"); expected.add("Wait1:0"); expected.add("Wait2:1"); expected.add("Wait1:1"); expected.add("Wait2:2"); expected.add("Wait1:2"); expected.add("Wait1:3"); expected.add("Wait2:3"); assertTrue(expected.size() == log.size()); for (int i = 0; i < expected.size(); i++) { assertTrue(expected.get(i).equals(log.get(i))); } } private static class LogTarget extends ProcessTarget { final ArrayList<String> log; final int num; LogTarget(int i, ArrayList<String> l) { log = l; num = i; } @Override public String getDescription() { return "Target:" + num; } @Override public void process() { log.add("Target:" + num); } } }