private SpStateMachineEngine GetEngine(out ISpEventListner listner, MyDataClass dataClass, ISpState <MyMsgId> 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();

            // To avoid log errors if no subscribers
            listner.ResponseReceived += new EventHandler((o, e) => { });

            // Simulates DI
            return(new SpStateMachineEngine(listner, store, behavior, sm, timer));
        }
        //[Test, Explicit]
        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.ToNextOnEvent(MyMsgId.Stop, s2);

                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 EventHandler((o, e) => { });



                // 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, MyMsgId.Stop));

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

                Thread.Sleep(3000);

                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);
            });
        }