public void TestIncorrectRemove()
        {
            var evaluator = new SchedulingServiceImpl(-1, new TimeSourceServiceImpl());
            var callback  = new SupportScheduleCallback();

            evaluator.Remove(callback, 0);
        }
        public void TestTrigger()
        {
            long startTime = 0;

            service.Time = 0;

            // Add callbacks
            service.Add(20, callbacks[3], slots[1][1]);
            service.Add(20, callbacks[2], slots[1][0]);
            service.Add(20, callbacks[1], slots[0][1]);
            service.Add(21, callbacks[0], slots[0][0]);
            Assert.IsTrue(service.IsScheduled(callbacks[3]));
            Assert.IsTrue(service.IsScheduled(callbacks[0]));

            // Evaluate before the within time, expect not results
            startTime   += 19;
            service.Time = startTime;
            EvaluateSchedule();
            CheckCallbacks(callbacks, new[] { 0, 0, 0, 0, 0 });
            Assert.IsTrue(service.IsScheduled(callbacks[3]));

            // Evaluate exactly on the within time, expect a result
            startTime   += 1;
            service.Time = startTime;
            EvaluateSchedule();
            CheckCallbacks(callbacks, new[] { 0, 1, 2, 3, 0 });
            Assert.IsFalse(service.IsScheduled(callbacks[3]));

            // Evaluate after already evaluated once, no result
            startTime   += 1;
            service.Time = startTime;
            EvaluateSchedule();
            CheckCallbacks(callbacks, new[] { 4, 0, 0, 0, 0 });
            Assert.IsFalse(service.IsScheduled(callbacks[3]));

            startTime   += 1;
            service.Time = startTime;
            EvaluateSchedule();
            Assert.AreEqual(0, callbacks[3].ClearAndGetOrderTriggered());

            // Adding the same callback more than once should cause an exception
            service.Add(20, callbacks[0], slots[0][0]);
            service.Add(28, callbacks[0], slots[0][0]);
            service.Remove(callbacks[0], slots[0][0]);

            service.Add(20, callbacks[2], slots[1][0]);
            service.Add(25, callbacks[1], slots[0][1]);
            service.Remove(callbacks[1], slots[0][1]);
            service.Add(21, callbacks[0], slots[0][0]);
            service.Add(21, callbacks[3], slots[1][1]);
            service.Add(20, callbacks[1], slots[0][1]);
            SupportScheduleCallback.SetCallbackOrderNum(0);

            startTime   += 20;
            service.Time = startTime;
            EvaluateSchedule();
            CheckCallbacks(callbacks, new[] { 0, 1, 2, 0, 0 });

            startTime   += 1;
            service.Time = startTime;
            EvaluateSchedule();
            CheckCallbacks(callbacks, new[] { 3, 0, 0, 4, 0 });

            service.Time = startTime + int.MaxValue;
            EvaluateSchedule();
            CheckCallbacks(callbacks, new[] { 0, 0, 0, 0, 0 });
        }