public void Simulate_ActivitySpecified_ActivityFiredAtTheAppropriateTime()
        {
            using(var context = new SimulationContext(isDefaultContextForProcess: true)){

                var notification = new TestNotification();
                var activity = new TestActivity(new List<InstructionBase>() { new RaiseNotificationInstruction<TestNotification>(notification) });
                long waitTime = 10;

                var process = new ActivityHostProcess(activity, waitTime);

                Assert.IsNotNull(process.SimulationState);
                Assert.IsTrue(process.SimulationState.IsActive);

                var registeredProcesses = context.GetByType<Process>();
                Assert.IsTrue(registeredProcesses.Contains(process));

                var enumerator = process.Simulate();

                bool couldMove = enumerator.MoveNext();
                Assert.IsTrue(couldMove);

                // first instruction should be the wait instruction
                Assert.IsTrue(enumerator.Current is WaitInstruction);
                Assert.AreEqual(waitTime, ((WaitInstruction)enumerator.Current).NumberOfPeriodsToWait);

                couldMove = enumerator.MoveNext();
                Assert.IsTrue(couldMove);

                Assert.IsTrue(enumerator.Current is RaiseNotificationInstruction<TestNotification>);
                Assert.AreEqual(notification, ((RaiseNotificationInstruction<TestNotification>)enumerator.Current).Notification);

                couldMove = enumerator.MoveNext();
                Assert.IsFalse(couldMove);
            }
        }
        /// <summary>
        /// Complete the instruction.  For this instruction type, this involves interrupting a process.
        /// </summary>
        /// <param name='context'>
        /// Context providing state information for the current simulation.
        /// </param>
        public override void Complete(SimulationContext context)
        {
            base.Complete(context);

            var process = new ActivityHostProcess(Activity, WaitTime);
            context.Register(process);

            if (context.ActiveProcesses != null){
                // add it to te active process list
                context.ActiveProcesses.Add(process);
                context.ProcessesRemainingThisTimePeriod.Enqueue(process);
            }
        }