public void _50082_WaitOnEvent_Disposed()
 {
     TestHelpers.CatchExpected(50082, "SpPeriodicWakeupOnly", "WaitOnEvent", "Attempting to use Disposed Object", () => {
         SpPeriodicWakeupOnly w = new SpPeriodicWakeupOnly();
         w.Dispose();
         Thread.Sleep(100);
         w.WaitOnEvent();
     });
 }
 public void _50080_EventReceived_Disposed()
 {
     TestHelpers.CatchExpected(50080, "SpPeriodicWakeupOnly", "EventReceived", "Attempting to use Disposed Object", () => {
         SpPeriodicWakeupOnly w = new SpPeriodicWakeupOnly();
         w.Dispose();
         Thread.Sleep(100);
         w.EventReceived(BehaviorResponseEventType.MsgArrived);
     });
 }
 public void _50081_EventReceived_UnhandledType()
 {
     TestHelpers.CatchUnexpected(() => {
         SpPeriodicWakeupOnly w = new SpPeriodicWakeupOnly();
         w.EventReceived(BehaviorResponseEventType.Undefined);
         w.Dispose();
         Thread.Sleep(100);
     });
     this.logReader.Validate(50081, "SpPeriodicWakeupOnly", "EventReceived", "The Behavior Response Event Type 'Undefined' is not Supported");
 }
        public void _50084_OnPeriodicTimer_Busy()
        {
            TestHelpers.CatchUnexpected(() => {
                SpPeriodicWakeupOnly w = new SpPeriodicWakeupOnly();

                // setting terminate allows it to drop through the waitOnEvent
                w.EventReceived(BehaviorResponseEventType.TerminateRequest);
                w.WaitOnEvent();
                Thread.Sleep(100);

                // we then hit it with another event. Normaly the user would loop back to the wait to set it not busy
                w.EventReceived(BehaviorResponseEventType.PeriodicWakeup);

                w.Dispose();
                Thread.Sleep(100);
            });
            this.logReader.Validate(50084, "SpPeriodicWakeupOnly", "OnPeriodicTimer", "Still Busy When the Periodic Timer Woke Up");
        }
        private SpStateMachineEngine GetEngine(out ISpEventListner listner, MyDataClass dataClass, ISpState firstState)
        {
            ISpStateMachine sm = new MyStateMachine(dataClass, firstState);
            ISpEventStore store = new SimpleDequeEventStore(new MyTickMsg());
            ISpBehaviorOnEvent behavior = new SpPeriodicWakeupOnly();
            ISpPeriodicTimer timer = new WinSimpleTimer(new TimeSpan(0, 0, 0, 0, 500));
            //ISpEventListner listner = new SimpleEventListner();
            listner = new SimpleEventListner();

            listner.ResponseReceived += new Action<ISpEventMessage>((msg) => { });

            // Simulates DI
            return new SpStateMachineEngine(listner, store, behavior, sm, timer);
        }
        public void TestInitialGenericSpState()
        {
            TestHelpers.CatchUnexpected(() => {

                MyDataClass dataClass = new MyDataClass();
                // This would normally be the main superstate which includes all other states cascading within it's and it's children's constructors

                MyState sParent = new MyState(MyStateID.NotStarted, dataClass);
                MyState s = new MyState(sParent, MyStateID.WaitingForUserInput, dataClass);
                MyState s2 = new MyState(sParent, MyStateID.Active, dataClass);

                Console.WriteLine("SuperState sParent name:{0}", sParent.FullName);
                Console.WriteLine("State s name:{0}", s.FullName);
                Console.WriteLine("State s2 name:{0}", s2.FullName);

                s.RegisterOnEventTransition(new SpEnumToInt(MyEventType.Stop), new SpStateTransition(SpStateTransitionType.NextState, s2, null));

                ISpStateMachine sm = new MyStateMachine(dataClass, s);
                ISpEventStore store = new SimpleDequeEventStore(new MyTickMsg());
                ISpBehaviorOnEvent behavior = new SpPeriodicWakeupOnly();
                ISpPeriodicTimer timer = new WinSimpleTimer(new TimeSpan(0, 0, 0, 0, 1000));
                ISpEventListner listner = new SimpleEventListner();

                listner.ResponseReceived += new Action<ISpEventMessage>((msg) => { });

                // TODO - Need a default response msg

                // Simulates DI
                SpStateMachineEngine engine =
                new SpStateMachineEngine(listner, store, behavior, sm, timer);

                engine.Start();

                Thread.Sleep(3000);

                //sm.Tick(new BaseMsg(99, 456));

                //listner.PostMessage(new SpBaseMsg(MyMessageType 777, 12345));

                listner.PostMessage(new MyBaseMsg(MyMsgType.SimpleMsg, MyEventType.Stop));

                Thread.Sleep(3000);
                engine.Stop();

                Console.WriteLine("Disposing Engine - thread should not output while I wait 3 seconds");
                engine.Dispose();

                Thread.Sleep(3000);
                Console.WriteLine("Done");

                // Multi call test
                engine.Dispose();
                engine.Dispose();
                engine.Dispose();
                Console.WriteLine("Engine Disposed");

                //SpState<DataClass> state = new SpState<DataClass>(dataClass);
                //SpStateMachine<DataClass> stateMachine = new SpStateMachine<DataClass>(dataClass, state);

            });
        }