Skip to content

Commit 5e0e5d8

Browse files
committed
fix and did start SM
1 parent 8786c59 commit 5e0e5d8

File tree

10 files changed

+154
-43
lines changed

10 files changed

+154
-43
lines changed

SimpleStateMachineLibrary/Data/Data.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ public Data OnChange(Action<Data, object, object> actionOnChange)
2727
protected internal Data(StateMachine stateMachine, string nameData, object valueData = null) : base(stateMachine, nameData)
2828
{
2929
Value = valueData;
30+
31+
stateMachine.AddData(this, true);
3032
}
3133

3234
public Data Delete()

SimpleStateMachineLibrary/StateMachines/StateMachine.cs

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,15 @@ public partial class StateMachine
1919

2020
public State StartState { get; protected set; }
2121

22+
private Action<State, State> _onChangeState;
23+
24+
public StateMachine OnChangeState(Action<State, State> actionOnChangeState)
25+
{
26+
_onChangeState += actionOnChangeState;
27+
28+
return this;
29+
}
30+
2231
public StateMachine()
2332
{
2433

@@ -41,6 +50,7 @@ public StateMachine(string xDocumentPath)
4150

4251
private Dictionary<string, object> _nextParameters { get; set; }
4352

53+
private State _beforeState { get; set; }
4454

4555

4656
private void CheckStartState()
@@ -61,7 +71,8 @@ private void CheckCurrentTransition()
6171

6272
public State SetStartState(State state)
6373
{
64-
return SetStartState(state);
74+
CheckStartState();
75+
return StartState = state;
6576
}
6677

6778
public State SetStartState(string stateName)
@@ -87,25 +98,29 @@ public void Start(Dictionary<string, object> startParameters = null)
8798
{
8899
CurrentState = StartState;
89100
CurrentState.Entry(startParameters);
101+
_onChangeState?.Invoke(null, CurrentState);
90102
CurrentState.Exit(startParameters);
91-
//while (CurrentState != EndState)
92-
//{
93-
// _currentParameters = _nextParameters;
94-
// _nextParameters = null;
95-
96-
// CurrentTransition = _nextTransition;
97-
// _nextTransition = null;
98-
99-
// CheckCurrentTransition();
100-
// CurrentState = null;
101-
// CurrentTransition.Invoke(_currentParameters);
102-
// CurrentState = CurrentTransition.StateTo;
103-
// CurrentTransition = null;
104-
105-
// CurrentState.Entry(_currentParameters);
106-
// CurrentState.Exit(_currentParameters);
107-
//}
108-
103+
104+
105+
while (_nextTransition != null)
106+
{
107+
_currentParameters = _nextParameters;
108+
_nextParameters = null;
109+
110+
CurrentTransition = _nextTransition;
111+
_nextTransition = null;
112+
113+
_beforeState = CurrentState;
114+
CurrentState = null;
115+
CurrentTransition.Invoke(_currentParameters);
116+
CurrentState = CurrentTransition.StateTo;
117+
CurrentTransition = null;
118+
119+
CurrentState.Entry(_currentParameters);
120+
_onChangeState?.Invoke(_beforeState, CurrentState);
121+
CurrentState.Exit(_currentParameters);
122+
}
123+
109124
}
110125

111126
}

SimpleStateMachineLibrary/StateMachines/StateMachineWorkWithData.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,15 @@ private Data _AddData(string nameData, object valueData, bool exeption)
4242
return new Data(this, nameData, valueData);
4343
}
4444

45+
internal Data AddData(Data data, bool exeption)
46+
{
47+
if (!Check.NotContains(_data, data, exeption))
48+
return null;
49+
50+
_data.Add(data.Name, data);
51+
return data;
52+
}
53+
4554
public Data AddData(string nameData, object valueData = default(object))
4655
{
4756
return _AddData(nameData, valueData, true);

SimpleStateMachineLibrary/StateMachines/StateMachineWorkWithStates.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,17 @@ private State _AddState(string nameState, bool exeption)
3535
{
3636
if (!Check.NotContains(_states, nameState, exeption))
3737
return null;
38-
3938
return new State(this, nameState);
4039
}
40+
internal State AddState(State state, bool exeption)
41+
{
42+
if (!Check.NotContains(_states, state, exeption))
43+
return null;
44+
45+
_states.Add(state.Name, state);
46+
47+
return state;
48+
}
4149

4250
public State AddState(string nameState)
4351
{

SimpleStateMachineLibrary/StateMachines/StateMachineWorkWithTransitions.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,16 @@ private Transition _AddTransition(string nameTrancition, State stateFrom, State
4141
return new Transition(this, nameTrancition, stateFrom, stateTo);
4242
}
4343

44+
internal Transition AddTransition(Transition trancition, bool exeption)
45+
{
46+
if (!Check.NotContains(_transitions, trancition, exeption))
47+
return null;
48+
49+
_transitions.Add(trancition.Name, trancition);
50+
51+
return trancition;
52+
}
53+
4454
public Transition AddTransition(string nameTrancition, State stateFrom, State stateTo)
4555
{
4656
return _AddTransition(nameTrancition, stateFrom, stateTo, true);

SimpleStateMachineLibrary/StateMachines/StateMachineWorkWithXML.cs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@ public static XDocument ToXDocument(StateMachine stateMachine, string nameFile)
2222
states.Add(state.Value.ToXElement());
2323
}
2424

25+
if (stateMachine?.StartState != null)
26+
{
27+
XElement startState = new XElement("StartState");
28+
stateMachineXElement.Add(startState);
29+
startState.Add(new XAttribute("Name", stateMachine.StartState.Name));
30+
}
31+
2532
XElement transitions = new XElement("Transitions");
2633
stateMachineXElement.Add(transitions);
2734

@@ -30,6 +37,8 @@ public static XDocument ToXDocument(StateMachine stateMachine, string nameFile)
3037
transitions.Add(transition.Value.ToXElement());
3138
}
3239

40+
41+
3342
xDocument.Save(nameFile);
3443
return xDocument;
3544
}
@@ -42,8 +51,17 @@ public XDocument ToXDocument(string nameFile)
4251
public static StateMachine FromXDocument(StateMachine stateMachine, XDocument xDocument)
4352
{
4453
XElement stateMachineXElement = Check.Object(xDocument).Element("StateMachine");
45-
stateMachineXElement?.Element("States")?.Elements()?.ToList().ForEach(x => stateMachine.AddState(x));
46-
stateMachineXElement?.Element("Transitions")?.Elements()?.ToList().ForEach(x => stateMachine.AddTransition(x));
54+
var States = stateMachineXElement.Element("States")?.Elements()?.ToList();
55+
States.ForEach(x => stateMachine.AddState(x));
56+
var startState = stateMachineXElement.Element("StartState");
57+
string nameStartState = startState?.Attribute("Name").Value;
58+
59+
if (!string.IsNullOrEmpty(nameStartState))
60+
stateMachine.SetStartState(nameStartState);
61+
62+
var Transitions = stateMachineXElement.Element("Transitions")?.Elements()?.ToList();
63+
Transitions.ForEach(x => stateMachine.AddTransition(x));
64+
4765
return stateMachine;
4866
}
4967

SimpleStateMachineLibrary/States/State.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public partial class State : NamedObject<State>
1212

1313
protected internal State(StateMachine stateMachine, string nameState) : base(stateMachine, nameState)
1414
{
15-
15+
StateMachine.AddState(this, true);
1616
}
1717

1818
public State Delete()

SimpleStateMachineLibrary/Transitions/Transition.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ protected internal Transition(StateMachine stateMachine, string nameTransition,
1616
{
1717
StateFrom = stateFrom;
1818
StateTo = stateTo;
19+
stateMachine.AddTransition(this, true);
1920
}
2021

2122
public Transition Delete()

Tests/StateMachineUnitTests.cs

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
using Microsoft.VisualStudio.TestTools.UnitTesting;
2+
using SimpleStateMachineLibrary;
3+
using System.Collections.Generic;
4+
5+
namespace Tests
6+
{
7+
[TestClass]
8+
public class StateMachineUnitTests
9+
{
10+
void Method1(State state, Dictionary<string, object> parameters)
11+
{
12+
//Assert.AreEqual(parameters["Data1"], "Test Data");
13+
14+
state.StateMachine.InvokeTransitionWithParameters("Transition1", new Dictionary<string, object>() { { "Test1", "Test1" } });
15+
}
16+
void Method2(State state, Dictionary<string, object> parameters)
17+
{
18+
state.StateMachine.InvokeTransitionWithParameters("Transition2", new Dictionary<string, object>() { { "Test2", "Test2" } });
19+
}
20+
void MethodOnChange(State stateFrom, State stateTo)
21+
{
22+
23+
}
24+
25+
[TestMethod]
26+
public void StateMachineFromCode()
27+
{
28+
StateMachine stateMachine = new StateMachine();
29+
30+
State state1 = stateMachine.AddState("State1");
31+
State state2 = stateMachine.AddState("State2");
32+
State state3 = stateMachine.AddState("State3");
33+
34+
stateMachine.OnChangeState(MethodOnChange);
35+
36+
Transition transition1 = state1.AddTransitionFromThis("Transition1", state2);
37+
Transition transition2 = stateMachine.AddTransition("Transition2", state2, state3);
38+
39+
state1.SetAsStartState();
40+
state1.OnExit(Method1);
41+
state2.OnExit(Method2);
42+
43+
var parametersForStart = new Dictionary<string, object>() { { "Data1", "Test Data" } };
44+
45+
stateMachine.Start(parametersForStart);
46+
47+
Assert.AreEqual(stateMachine.CurrentState.Name, "State3");
48+
49+
stateMachine.ToXDocument("text.xml");
50+
}
51+
52+
[TestMethod]
53+
public void StateMachineFromXML()
54+
{
55+
StateMachine stateMachine = StateMachine.FromXDocument("text.xml");
56+
57+
stateMachine.State("State1").OnExit(Method1);
58+
stateMachine.State("State2").OnExit(Method2);
59+
60+
stateMachine.OnChangeState(MethodOnChange);
61+
62+
stateMachine.Start();
63+
64+
Assert.AreEqual(stateMachine.CurrentState.Name, "State3");
65+
}
66+
67+
}
68+
}

Tests/UnitTest1.cs

Lines changed: 0 additions & 20 deletions
This file was deleted.

0 commit comments

Comments
 (0)