anchor.diff:  
   uses
     TestUtils,
  +  System.Hash,
     FIToolkit.Base.FiniteStateMachine.Exceptions;
   
   procedure TestTFiniteStateMachine.OnEnterState(const PreviousState, CurrentState : TStateType;
  
positive.code:   );
  end;
  
  initialization
    // Register any test cases with the test runner
    RegisterTest(TestTFiniteStateMachine.Suite);
  
negative.code: procedure TestTFiniteStateMachine.TestCreate;
  var
    FSM : IFiniteStateMachine;
    CustomFSM : IFiniteStateMachine<TStateRec, TCommandRec, ETestException>;
    StateComparer : IEqualityComparer<TStateRec>;
    CommandComparer : IEqualityComparer<TCommandRec>;
  begin
    { Default test FSM }
  
    FSM := TFiniteStateMachine.Create;
    CheckEquals<TStateType>(START_STATE, FSM.CurrentState, 'CurrentState = START_STATE');
    CheckEquals<TStateType>(FSM.PreviousState, FSM.CurrentState, 'CurrentState = PreviousState');
    FSM := nil;
  
    FSM := TFiniteStateMachine.Create(FINISH_STATE);
    CheckEquals<TStateType>(FINISH_STATE, FSM.CurrentState, 'CurrentState = FINISH_STATE');
    CheckEquals<TStateType>(FSM.PreviousState, FSM.CurrentState, 'CurrentState = PreviousState');
    FSM := nil;
  
    { FSM with complex state/command types & custom comparers }
  
    StateComparer := TStateRecComparer.Create;
    CommandComparer := TCommandRecComparer.Create;
    CustomFSM := TFiniteStateMachine<TStateRec, TCommandRec, ETestException>.Create(
      STATE_RECS[0], StateComparer, CommandComparer);
    CustomFSM
      .AddTransition(STATE_RECS[0], STATE_RECS[1], COMMAND_RECS[0])
      .AddTransition(STATE_RECS[1], STATE_RECS[2], COMMAND_RECS[1]);
  
    CheckTrue(CustomFSM.HasTransition(STATE_RECS[0], COMMAND_RECS[0]), 'CheckTrue::HasTransition');
    CheckTrue(StateComparer.Equals(STATE_RECS[2], CustomFSM.GetReachableState(STATE_RECS[1], COMMAND_RECS[1])),
      'CheckTrue::(GetReachableState = STATE_RECS[2])');
  end;
  
  procedure TestTFiniteStateMachine.TestExecute;
  