Guest User

Untitled

a guest
Mar 24th, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.03 KB | None | 0 0
  1. namespace Tests
  2. {
  3. public class State
  4. {
  5. public State(int id, string name)
  6. {
  7. Id = id;
  8. Name = name;
  9. }
  10.  
  11. public int Id { get; set; }
  12.  
  13. public string Name { get; set; }
  14. }
  15.  
  16. public class Trigger
  17. {
  18. public Trigger(string name)
  19. {
  20. Name = name;
  21. }
  22.  
  23. public string Name { get; set; }
  24. }
  25.  
  26. public class TriggerParameters
  27. {
  28. public TriggerParameters(TriggerType triggerType, bool condition)
  29. {
  30. TriggerType = triggerType;
  31. Condition = condition;
  32. }
  33.  
  34. public TriggerType TriggerType { get; set; }
  35. public bool Condition { get; }
  36. }
  37.  
  38. public enum TriggerType
  39. {
  40. Event,
  41. Option
  42. }
  43.  
  44.  
  45. [TestFixture]
  46. public class TestStateless
  47. {
  48. [Test]
  49. public void CreateSimpleStateMachine()
  50. {
  51. var startedState = new State(1, "Started");
  52. var stoppedState = new State(2, "Stopped");
  53.  
  54. var startTrigger = new Trigger("Start");
  55. var stopTrigger = new Trigger("Stop");
  56.  
  57. var sm = new StateMachine<State, Trigger>(stoppedState);
  58.  
  59. var startTriggerWithParameters = sm.SetTriggerParameters<TriggerParameters>(startTrigger);
  60. var stopTriggerWithParameters =sm.SetTriggerParameters<TriggerParameters>(stopTrigger);
  61.  
  62. sm.OnTransitioned(PrintTransition);
  63. sm.OnUnhandledTrigger(PrintProhibitedTransition);
  64.  
  65. sm.Configure(stoppedState)
  66. .OnEntry(() => {Console.WriteLine("Entry stopped state");})
  67. .OnExit(() => { Console.WriteLine("Exit stopped state"); })
  68. .PermitIf(startTriggerWithParameters, startedState, parameters => parameters.Condition, "Evaluate condition");
  69.  
  70. sm.Configure(startedState)
  71. .OnEntry(() => { Console.WriteLine("Entry started state"); })
  72. .OnExit(() => { Console.WriteLine("Exit started state"); })
  73. .PermitIf(stopTrigger, stoppedState, () => true, "Condition name");
  74.  
  75. sm.Fire(stopTriggerWithParameters, new TriggerParameters(TriggerType.Event, true));
  76. sm.Fire(startTriggerWithParameters, new TriggerParameters(TriggerType.Event, false));
  77. sm.Fire(startTriggerWithParameters, new TriggerParameters(TriggerType.Event, true));
  78. sm.Fire(stopTriggerWithParameters, new TriggerParameters(TriggerType.Option, false));
  79. }
  80.  
  81. private void PrintTransition(StateMachine<State, Trigger>.Transition transition)
  82. {
  83. Console.WriteLine($"Event {transition.Trigger.Name} triggered transition from {transition.Source.Name} to {transition.Destination.Name}");
  84. }
  85.  
  86. private void PrintProhibitedTransition(State state, Trigger trigger, ICollection<string> unmetConditions)
  87. {
  88. Console.WriteLine($"Event {trigger.Name} was ignored in state {state.Name}, the following conditions were not met: {string.Join(", ", unmetConditions ?? new List<string>())}");
  89. }
  90. }
  91. }
Add Comment
Please, Sign In to add comment