Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- namespace Tests
- {
- public class State
- {
- public State(int id, string name)
- {
- Id = id;
- Name = name;
- }
- public int Id { get; set; }
- public string Name { get; set; }
- }
- public class Trigger
- {
- public Trigger(string name)
- {
- Name = name;
- }
- public string Name { get; set; }
- }
- public class TriggerParameters
- {
- public TriggerParameters(TriggerType triggerType, bool condition)
- {
- TriggerType = triggerType;
- Condition = condition;
- }
- public TriggerType TriggerType { get; set; }
- public bool Condition { get; }
- }
- public enum TriggerType
- {
- Event,
- Option
- }
- [TestFixture]
- public class TestStateless
- {
- [Test]
- public void CreateSimpleStateMachine()
- {
- var startedState = new State(1, "Started");
- var stoppedState = new State(2, "Stopped");
- var startTrigger = new Trigger("Start");
- var stopTrigger = new Trigger("Stop");
- var sm = new StateMachine<State, Trigger>(stoppedState);
- var startTriggerWithParameters = sm.SetTriggerParameters<TriggerParameters>(startTrigger);
- var stopTriggerWithParameters =sm.SetTriggerParameters<TriggerParameters>(stopTrigger);
- sm.OnTransitioned(PrintTransition);
- sm.OnUnhandledTrigger(PrintProhibitedTransition);
- sm.Configure(stoppedState)
- .OnEntry(() => {Console.WriteLine("Entry stopped state");})
- .OnExit(() => { Console.WriteLine("Exit stopped state"); })
- .PermitIf(startTriggerWithParameters, startedState, parameters => parameters.Condition, "Evaluate condition");
- sm.Configure(startedState)
- .OnEntry(() => { Console.WriteLine("Entry started state"); })
- .OnExit(() => { Console.WriteLine("Exit started state"); })
- .PermitIf(stopTrigger, stoppedState, () => true, "Condition name");
- sm.Fire(stopTriggerWithParameters, new TriggerParameters(TriggerType.Event, true));
- sm.Fire(startTriggerWithParameters, new TriggerParameters(TriggerType.Event, false));
- sm.Fire(startTriggerWithParameters, new TriggerParameters(TriggerType.Event, true));
- sm.Fire(stopTriggerWithParameters, new TriggerParameters(TriggerType.Option, false));
- }
- private void PrintTransition(StateMachine<State, Trigger>.Transition transition)
- {
- Console.WriteLine($"Event {transition.Trigger.Name} triggered transition from {transition.Source.Name} to {transition.Destination.Name}");
- }
- private void PrintProhibitedTransition(State state, Trigger trigger, ICollection<string> unmetConditions)
- {
- Console.WriteLine($"Event {trigger.Name} was ignored in state {state.Name}, the following conditions were not met: {string.Join(", ", unmetConditions ?? new List<string>())}");
- }
- }
- }
Add Comment
Please, Sign In to add comment