From 1c7f228d0b5b8d3c2f857b02164948ce49a4b2fa Mon Sep 17 00:00:00 2001 From: Tyler Carrol Date: Sat, 21 Jun 2025 12:20:31 -0400 Subject: [PATCH 1/5] Create OnStateChanged Method --- TJC.StateMachine.Tests/Mocks/RevolverMock.cs | 7 ++++ .../Tests/RevolverMockTests.cs | 37 +++++++++++++++++++ TJC.StateMachine/StateMachineBase.cs | 25 ++++++++++++- 3 files changed, 67 insertions(+), 2 deletions(-) diff --git a/TJC.StateMachine.Tests/Mocks/RevolverMock.cs b/TJC.StateMachine.Tests/Mocks/RevolverMock.cs index dcc6256..2b740a2 100644 --- a/TJC.StateMachine.Tests/Mocks/RevolverMock.cs +++ b/TJC.StateMachine.Tests/Mocks/RevolverMock.cs @@ -5,6 +5,8 @@ internal class RevolverMock() { public int BulletsLoaded { get; private set; } = 6; + internal uint StateChanges = 0; + public bool TryShoot() { switch (State) @@ -26,5 +28,10 @@ public void Reload() BulletsLoaded = 6; State = RevolverStates.Loaded; } + + protected override void OnStateChanged() + { + StateChanges++; + } } } \ No newline at end of file diff --git a/TJC.StateMachine.Tests/Tests/RevolverMockTests.cs b/TJC.StateMachine.Tests/Tests/RevolverMockTests.cs index 6156f15..9cb2213 100644 --- a/TJC.StateMachine.Tests/Tests/RevolverMockTests.cs +++ b/TJC.StateMachine.Tests/Tests/RevolverMockTests.cs @@ -57,5 +57,42 @@ public void EnsureReloadingResetsBulletsTo6() revolver.Reload(); Assert.AreEqual(6, revolver.BulletsLoaded); } + + [TestMethod] + public void EnsureEmptyingChangesStateAndReloadingChangesStateAgain() + { + var revolver = new RevolverMock(); + + Assert.AreEqual(0, revolver.StateChanges); + + revolver.TryShoot(); + revolver.TryShoot(); + revolver.TryShoot(); + revolver.TryShoot(); + revolver.TryShoot(); + revolver.TryShoot(); + + Assert.AreEqual(1, revolver.StateChanges); + + revolver.Reload(); + + Assert.AreEqual(2, revolver.StateChanges); + + } + + [TestMethod] + public void EnsureReloadingMultipleTimesDoesNotChangeState() + { + var revolver = new RevolverMock(); + + Assert.AreEqual(0, revolver.StateChanges); + + revolver.Reload(); + revolver.Reload(); + revolver.Reload(); + + Assert.AreEqual(0, revolver.StateChanges); + + } } } diff --git a/TJC.StateMachine/StateMachineBase.cs b/TJC.StateMachine/StateMachineBase.cs index 6e0fc99..205be61 100644 --- a/TJC.StateMachine/StateMachineBase.cs +++ b/TJC.StateMachine/StateMachineBase.cs @@ -5,11 +5,32 @@ /// /// State Type. /// Initial State of the State Machine. - public class StateMachineBase(T initialState) + public abstract class StateMachineBase(T initialState) { + private T _state = initialState; + /// /// State of the state machine. /// - protected T State { get; set; } = initialState; + protected T State + { + get => _state; + set + { + if (Equals(_state, value)) + return; + _state = value; + OnStateChanged(); + } + } + + /// + /// Called on state change. + /// Can be used to add tracing & debugging. + /// Should not be used to notify state. + /// + protected virtual void OnStateChanged() + { + } } } \ No newline at end of file From b376c6fe3582918fa086d62616963cdaa3da8dec Mon Sep 17 00:00:00 2001 From: Tyler Carrol Date: Sat, 21 Jun 2025 12:21:41 -0400 Subject: [PATCH 2/5] Update CHANGELOG.md --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c455722..612e496 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- OnStateChanged method + ## [0.1.0] - 2025-04-23 ### Added From bef987cb67a9bf63a4afb747857c6644dd64e85f Mon Sep 17 00:00:00 2001 From: Tyler Carrol Date: Sat, 21 Jun 2025 12:29:08 -0400 Subject: [PATCH 3/5] Changed to abstract --- TJC.StateMachine.Tests/Mocks/RevolverMock.cs | 1 + TJC.StateMachine/StateMachineBase.cs | 6 ++---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/TJC.StateMachine.Tests/Mocks/RevolverMock.cs b/TJC.StateMachine.Tests/Mocks/RevolverMock.cs index 2b740a2..51513a5 100644 --- a/TJC.StateMachine.Tests/Mocks/RevolverMock.cs +++ b/TJC.StateMachine.Tests/Mocks/RevolverMock.cs @@ -31,6 +31,7 @@ public void Reload() protected override void OnStateChanged() { + base.OnStateChanged(); StateChanges++; } } diff --git a/TJC.StateMachine/StateMachineBase.cs b/TJC.StateMachine/StateMachineBase.cs index 205be61..978d354 100644 --- a/TJC.StateMachine/StateMachineBase.cs +++ b/TJC.StateMachine/StateMachineBase.cs @@ -27,10 +27,8 @@ protected T State /// /// Called on state change. /// Can be used to add tracing & debugging. - /// Should not be used to notify state. + /// Should not be used to notify of state changes externally. /// - protected virtual void OnStateChanged() - { - } + protected abstract void OnStateChanged(); } } \ No newline at end of file From fbbdfd4e6a5951fcebb6632b4fb38e0988e9e516 Mon Sep 17 00:00:00 2001 From: Tyler Carrol Date: Sat, 21 Jun 2025 12:33:40 -0400 Subject: [PATCH 4/5] =?UTF-8?q?=F0=9F=A7=B9=20chore:=20[MegaLinter]=20Appl?= =?UTF-8?q?y=20[1]=20automatic=20fixes=20(#8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: TylerCarrol <25536704+TylerCarrol@users.noreply.github.com> --- TJC.StateMachine.Tests/Mocks/RevolverMock.cs | 9 +++++---- TJC.StateMachine.Tests/Tests/RevolverMockTests.cs | 2 -- TJC.StateMachine/StateMachineBase.cs | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/TJC.StateMachine.Tests/Mocks/RevolverMock.cs b/TJC.StateMachine.Tests/Mocks/RevolverMock.cs index 51513a5..1fb1a7c 100644 --- a/TJC.StateMachine.Tests/Mocks/RevolverMock.cs +++ b/TJC.StateMachine.Tests/Mocks/RevolverMock.cs @@ -1,7 +1,6 @@ namespace TJC.StateMachine.Tests.Mocks { - internal class RevolverMock() - : StateMachineBase(RevolverStates.Loaded) + internal class RevolverMock() : StateMachineBase(RevolverStates.Loaded) { public int BulletsLoaded { get; private set; } = 6; @@ -19,7 +18,9 @@ public bool TryShoot() State = RevolverStates.Empty; return true; default: - throw new InvalidOperationException($"Unknown State [{State}] for method {nameof(TryShoot)}"); + throw new InvalidOperationException( + $"Unknown State [{State}] for method {nameof(TryShoot)}" + ); } } @@ -35,4 +36,4 @@ protected override void OnStateChanged() StateChanges++; } } -} \ No newline at end of file +} diff --git a/TJC.StateMachine.Tests/Tests/RevolverMockTests.cs b/TJC.StateMachine.Tests/Tests/RevolverMockTests.cs index 9cb2213..9289925 100644 --- a/TJC.StateMachine.Tests/Tests/RevolverMockTests.cs +++ b/TJC.StateMachine.Tests/Tests/RevolverMockTests.cs @@ -77,7 +77,6 @@ public void EnsureEmptyingChangesStateAndReloadingChangesStateAgain() revolver.Reload(); Assert.AreEqual(2, revolver.StateChanges); - } [TestMethod] @@ -92,7 +91,6 @@ public void EnsureReloadingMultipleTimesDoesNotChangeState() revolver.Reload(); Assert.AreEqual(0, revolver.StateChanges); - } } } diff --git a/TJC.StateMachine/StateMachineBase.cs b/TJC.StateMachine/StateMachineBase.cs index 978d354..8c33b4f 100644 --- a/TJC.StateMachine/StateMachineBase.cs +++ b/TJC.StateMachine/StateMachineBase.cs @@ -31,4 +31,4 @@ protected T State /// protected abstract void OnStateChanged(); } -} \ No newline at end of file +} From b6cb1d33f47d3a0894dd625be8b0e16054397a36 Mon Sep 17 00:00:00 2001 From: Tyler Carrol Date: Sat, 21 Jun 2025 12:36:28 -0400 Subject: [PATCH 5/5] Fixed typo --- TJC.StateMachine.Tests/Mocks/RevolverMock.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/TJC.StateMachine.Tests/Mocks/RevolverMock.cs b/TJC.StateMachine.Tests/Mocks/RevolverMock.cs index 51513a5..2b740a2 100644 --- a/TJC.StateMachine.Tests/Mocks/RevolverMock.cs +++ b/TJC.StateMachine.Tests/Mocks/RevolverMock.cs @@ -31,7 +31,6 @@ public void Reload() protected override void OnStateChanged() { - base.OnStateChanged(); StateChanges++; } }