anchor.diff:  procedure TestTFiniteStateMachine.TestCreate;
   var
     FSM : IFiniteStateMachine;
  -begin
  +  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;
  
positive.code:   );
  end;
  
  initialization
    // Register any test cases with the test runner
    RegisterTest(TestTFiniteStateMachine.Suite);
  
negative.code: 
  uses
    TestUtils,
    System.Hash,
    FIToolkit.Base.FiniteStateMachine.Exceptions;
  
  procedure TestTFiniteStateMachine.OnEnterState(const PreviousState, CurrentState : TStateType;
  