public void TestSwitchState_FromStateToNull_ThrowsException()
    {
        TestSwitchableStateEngine engine = new TestSwitchableStateEngine();
        ITestSwitchableState      state  = Substitute.For <ITestSwitchableState>();

        engine.TrySwitchState(state);

        engine.TrySwitchState(null);
    }
    public void TestSwitchState_FromAStateToSameState_CurStateRemainsState()
    {
        TestSwitchableStateEngine engine = new TestSwitchableStateEngine();
        ITestSwitchableState      state  = Substitute.For <ITestSwitchableState>();

        engine.TrySwitchState(state);

        Assert.That(engine.GetCurState(), Is.SameAs(state));
    }
    public void TrySwitchState_FromNullToState_StateCalledOnEnter()
    {
        TestSwitchableStateEngine engine = new TestSwitchableStateEngine();
        ITestSwitchableState      state  = Substitute.For <ITestSwitchableState>();

        engine.TrySwitchState(state);

        state.Received(1).OnEnter();
    }
    public void TestSwitchState_FromAStateToSameState_StateCalledOnEnterOnce()
    {
        TestSwitchableStateEngine engine = new TestSwitchableStateEngine();
        ITestSwitchableState      state  = Substitute.For <ITestSwitchableState>();

        engine.TrySwitchState(state);

        state.Received(1).OnEnter();
        state.DidNotReceive().OnExit();
    }
    public void TestSwitchState_FromStateToDiffStateOfDiffType_TransitionSuccessful()
    {
        TestSwitchableStateEngine engine = new TestSwitchableStateEngine();
        ITestSwitchableState      stateA = Substitute.For <ITestSwitchableStateA>();
        ITestSwitchableState      stateB = Substitute.For <ITestSwitchableStateB>();

        engine.TrySwitchState(stateA);

        engine.TrySwitchState(stateB);

        Assert.That(engine.GetCurState(), Is.SameAs(stateB));
        stateA.Received(1).OnEnter();
        stateA.Received(1).OnExit();
        stateB.Received(1).OnEnter();
    }