diff --git a/source/Lite.StateMachine.Tests/StateTests/CommandStateTests.cs b/source/Lite.StateMachine.Tests/StateTests/CommandStateTests.cs new file mode 100644 index 0000000..7a5e325 --- /dev/null +++ b/source/Lite.StateMachine.Tests/StateTests/CommandStateTests.cs @@ -0,0 +1,93 @@ +// Copyright Xeno Innovations, Inc. 2025 +// See the LICENSE file in the project root for more information. + +using System; +using System.Threading.Tasks; +using Lite.StateMachine.Tests.TestData; +using Lite.StateMachine.Tests.TestData.Models; +using Lite.StateMachine.Tests.TestData.Services; +using Lite.StateMachine.Tests.TestData.States.CommandL3DiStates; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; + +namespace Lite.StateMachine.Tests.StateTests; + +[TestClass] +public class CommandStateTests : TestBase +{ + [TestMethod] + public async Task BasicState_Override_Executes_SuccessAsync() + { + // Assemble with Dependency Injection + var services = new ServiceCollection() + .AddLogging(InlineTraceLogger(LogLevel.Trace)) + .AddSingleton() + .AddSingleton() + .BuildServiceProvider(); + + var msgService = services.GetRequiredService(); + var events = services.GetRequiredService(); + Func factory = t => ActivatorUtilities.CreateInstance(services, t); + + var ctxProperties = new PropertyBag() + { + { ParameterType.Counter, 0 }, + }; + + var machine = new StateMachine(factory, events) + { + // Make sure we don't get stuck. + // And send some message after leaving Command state + // to make sure we unsubscribed successfully. + DefaultStateTimeoutMs = 3000, + IsContextPersistent = true, + }; + + machine + .RegisterState(StateId.State1, StateId.State2) + .RegisterComposite(StateId.State2, initialChildStateId: StateId.State2_Sub1, onSuccess: StateId.State3) + .RegisterSubState(StateId.State2_Sub1, parentStateId: StateId.State2, onSuccess: StateId.State2_Sub2) + .RegisterSubComposite(StateId.State2_Sub2, parentStateId: StateId.State2, initialChildStateId: StateId.State2_Sub2_Sub1, onSuccess: StateId.State2_Sub3) + .RegisterSubState(StateId.State2_Sub2_Sub1, parentStateId: StateId.State2_Sub2, onSuccess: StateId.State2_Sub2_Sub2) + .RegisterSubState(StateId.State2_Sub2_Sub2, parentStateId: StateId.State2_Sub2, onSuccess: StateId.State2_Sub2_Sub3) + .RegisterSubState(StateId.State2_Sub2_Sub3, parentStateId: StateId.State2_Sub2, onSuccess: null) + .RegisterSubState(StateId.State2_Sub3, parentStateId: StateId.State2, onSuccess: null) + .RegisterState(StateId.State3, onSuccess: null); + + events.Subscribe(msg => + { + if (msg is ICustomCommand) + { + if (msg is UnlockCommand cmd) + { + // +100 check so we don't trigger this a 2nd time. + if (cmd.Counter > 100 && cmd.Counter < 200) + return; + + // NOTE: + // First we purposely publish 'OpenCommand' to prove that our OnMessage + // filters out the bad message, followed by publishing the REAL message. + if (cmd.Counter < 200) + events.Publish(new UnlockCommand { Counter = cmd.Counter + 100 }); + + events.Publish(new UnlockResponse { Counter = cmd.Counter + 100 }); + + // NOTE: This doesn't reach State2_Sub2_Sub2 because it already left (GOOD) + events.Publish(new CloseResponse { Counter = cmd.Counter + 100 }); + } + } + }); + + // Act - Start your engine! + await machine.RunAsync(StateId.State1, ctxProperties, null, TestContext.CancellationToken); + + // Assert Results + Assert.IsNotNull(machine); + Assert.IsNull(machine.Context); + + Assert.AreEqual(29, msgService.Counter1); + Assert.AreEqual(13, msgService.Counter2, "State2 Context.Param Count"); + Assert.AreEqual(12, msgService.Counter3); + Assert.AreEqual(2, msgService.Counter4); + } +} diff --git a/source/Lite.StateMachine.Tests/StateTests/CompositeStateTest.cs b/source/Lite.StateMachine.Tests/StateTests/CompositeStateTest.cs index 1c283d6..dc6e2e4 100644 --- a/source/Lite.StateMachine.Tests/StateTests/CompositeStateTest.cs +++ b/source/Lite.StateMachine.Tests/StateTests/CompositeStateTest.cs @@ -19,8 +19,6 @@ public class CompositeStateTest : TestBase public const string ParameterSubStateEntered = "SubEntered"; public const string SUCCESS = "success"; - public TestContext TestContext { get; set; } - [TestMethod] public async Task Level1_Basic_RegisterHelpers_SuccessTestAsync() { diff --git a/source/Lite.StateMachine.Tests/StateTests/CustomStateTests.cs b/source/Lite.StateMachine.Tests/StateTests/CustomStateTests.cs index 11ad0a6..0c7b9df 100644 --- a/source/Lite.StateMachine.Tests/StateTests/CustomStateTests.cs +++ b/source/Lite.StateMachine.Tests/StateTests/CustomStateTests.cs @@ -14,8 +14,6 @@ namespace Lite.StateMachine.Tests.StateTests; [TestClass] public class CustomStateTests : TestBase { - public TestContext TestContext { get; set; } - [TestMethod] [DataRow(false, DisplayName = "Don't skip State3")] [DataRow(true, DisplayName = "Skip State3")] diff --git a/source/Lite.StateMachine.Tests/StateTests/TestBase.cs b/source/Lite.StateMachine.Tests/StateTests/TestBase.cs index b003a61..241d697 100644 --- a/source/Lite.StateMachine.Tests/StateTests/TestBase.cs +++ b/source/Lite.StateMachine.Tests/StateTests/TestBase.cs @@ -9,6 +9,8 @@ namespace Lite.StateMachine.Tests.StateTests; public class TestBase { + public TestContext TestContext { get; set; } + /// ILogger Helper for generating clean in-line logs. /// Log level (Default: Trace). /// . diff --git a/source/Lite.StateMachine.Tests/TestData/Models/CustomCommands.cs b/source/Lite.StateMachine.Tests/TestData/Models/CustomCommands.cs new file mode 100644 index 0000000..b60b422 --- /dev/null +++ b/source/Lite.StateMachine.Tests/TestData/Models/CustomCommands.cs @@ -0,0 +1,31 @@ +// Copyright Xeno Innovations, Inc. 2025 +// See the LICENSE file in the project root for more information. + +namespace Lite.StateMachine.Tests.TestData.Models; + +#pragma warning disable SA1649 // File name should match first type name +#pragma warning disable SA1402 // File may only contain a single type + +/// Signifies it's one of our event packets. +public interface ICustomCommand; + +/// Sample command sent by state machine. +public class UnlockCommand : ICustomCommand +{ + public int Counter { get; set; } = 0; +} + +/// Sample command response received by state machine. +public class UnlockResponse : ICustomCommand +{ + public int Counter { get; set; } = 0; +} + +/// Sample command response received by state machine. +public class CloseResponse : ICustomCommand +{ + public int Counter { get; set; } = 0; +} + +#pragma warning restore SA1402 // File may only contain a single type +#pragma warning restore SA1649 // File name should match first type name diff --git a/source/Lite.StateMachine.Tests/TestData/Services/MessageService.cs b/source/Lite.StateMachine.Tests/TestData/Services/MessageService.cs index a1a93b0..d233e14 100644 --- a/source/Lite.StateMachine.Tests/TestData/Services/MessageService.cs +++ b/source/Lite.StateMachine.Tests/TestData/Services/MessageService.cs @@ -21,6 +21,9 @@ public interface IMessageService /// Gets or sets the user's custom counter. int Counter3 { get; set; } + /// Gets or sets the user's custom counter. + int Counter4 { get; set; } + /// Gets a list of user's custom messages. List Messages { get; } @@ -40,6 +43,9 @@ public class MessageService : IMessageService /// public int Counter3 { get; set; } + /// + public int Counter4 { get; set; } + /// public List Messages { get; } = []; diff --git a/source/Lite.StateMachine.Tests/TestData/States/CommandL3States.cs b/source/Lite.StateMachine.Tests/TestData/States/CommandL3States.cs index 2e6ab25..2e9ef33 100644 --- a/source/Lite.StateMachine.Tests/TestData/States/CommandL3States.cs +++ b/source/Lite.StateMachine.Tests/TestData/States/CommandL3States.cs @@ -2,7 +2,9 @@ // See the LICENSE file in the project root for more information. using System; +using System.Collections.Generic; using System.Threading.Tasks; +using Lite.StateMachine.Tests.TestData.Models; using Lite.StateMachine.Tests.TestData.Services; using Microsoft.Extensions.Logging; @@ -14,6 +16,21 @@ /// namespace Lite.StateMachine.Tests.TestData.States.CommandL3DiStates; +public enum StateId +{ + State1, + State2, + State2_Sub1, + State2_Sub2, + State2_Sub2_Sub1, + State2_Sub2_Sub2, + State2_Sub2_Sub3, + State2_Sub3, + State3, + Done, + Error, +} + public class CommonDiStateBase(IMessageService msg, ILogger logger) : DiStateBase(msg, logger) where TStateId : struct, Enum @@ -29,45 +46,77 @@ public override Task OnEnter(Context context) } public class State1(IMessageService msg, ILogger log) - : DiStateBase(msg, log) + : CommandStateBase(msg, log) { - public override Task OnEnter(Context context) + /// Gets message types for command state to subscribe to. + public override IReadOnlyCollection SubscribedMessageTypes => new[] { - if (context.ParameterAsBool(ParameterType.TestExecutionOrder)) - Assert.IsNull(context.PreviousStateId); + //// typeof(OpenCommand), // <---- NOTE: Not needed + typeof(UnlockResponse), + }; + public override Task OnEnter(Context context) + { context.Parameters.Add(context.CurrentStateId.ToString(), Guid.NewGuid()); MessageService.AddMessage($"[Keys-{context.CurrentStateId}]: {string.Join(",", context.Parameters.Keys)}"); + + context.EventAggregator?.Publish(new UnlockCommand { Counter = 1 }); + return base.OnEnter(context); } + + public override Task OnMessage(Context context, object message) + { + // NOTE: Cannot supply our own types yet. + ////public override Task OnMessage(Context context, OpenResponse message) + + if (message is not UnlockResponse) + { + // SHOUD NEVER BE HERE! As only 'OpenResponse' is in the filter list + context.NextState(Result.Error); + return Task.CompletedTask; + } + + MessageService.Counter4++; + + context.NextState(Result.Success); + return base.OnMessage(context, message); + } + + public override Task OnTimeout(Context context) + { + context.NextState(Result.Error); + + // Never gets thrown + ////throw new TimeoutException(); + + return base.OnTimeout(context); + } } /// Level-1: Composite. public class State2(IMessageService msg, ILogger log) - : CommonDiStateBase(msg, log) + : CommonDiStateBase(msg, log) { - #region CodeMaid - DoNotReorder + #region CodeMaid - Suppress method sorting - public override Task OnEntering(Context context) + public override Task OnEntering(Context context) { // Demonstrate NEW parameter that will carry forward context.Parameters.Add($"{context.CurrentStateId}!Anchor", Guid.NewGuid()); return base.OnEntering(context); } - #endregion CodeMaid - DoNotReorder + #endregion CodeMaid - Suppress method sorting - public override Task OnEnter(Context context) + public override Task OnEnter(Context context) { - if (context.ParameterAsBool(ParameterType.TestExecutionOrder)) - Assert.AreEqual(CompositeL3.State1, context.PreviousStateId); - // Demonstrate temporary parameter that will be discarded after State2's OnExit context.Parameters.Add($"{context.CurrentStateId}!TEMP", Guid.NewGuid()); return base.OnEnter(context); } - public override Task OnExit(Context context) + public override Task OnExit(Context context) { // Expected Count: 7 - State2_Sub2 is composite; therefore, discarded. // State1,State2!Anchor,State2!TEMP,State2,State2_Sub1,State2_Sub2!Anchor,State2_Sub3 @@ -78,24 +127,18 @@ public override Task OnExit(Context context) /// Sublevel-2: State. public class State2_Sub1(IMessageService msg, ILogger log) - : CommonDiStateBase(msg, log) + : CommonDiStateBase(msg, log) { - public override Task OnEnter(Context context) - { - if (context.ParameterAsBool(ParameterType.TestExecutionOrder)) - Assert.IsNull(context.PreviousStateId); - - return base.OnEnter(context); - } + public override Task OnEnter(Context context) => base.OnEnter(context); } /// Sublevel-2: Composite. public class State2_Sub2(IMessageService msg, ILogger log) - : CommonDiStateBase(msg, log) + : CommonDiStateBase(msg, log) { #region CodeMaid - DoNotReorder - public override Task OnEntering(Context context) + public override Task OnEntering(Context context) { // Demonstrate NEW parameter that will carry forward context.Parameters.Add($"{context.CurrentStateId}!Anchor", Guid.NewGuid()); @@ -104,17 +147,14 @@ public override Task OnEntering(Context context) #endregion CodeMaid - DoNotReorder - public override Task OnEnter(Context context) + public override Task OnEnter(Context context) { - if (context.ParameterAsBool(ParameterType.TestExecutionOrder)) - Assert.AreEqual(CompositeL3.State2_Sub1, context.PreviousStateId); - // Demonstrate temporary parameter that will be discarded after State2_Sub2's OnExit context.Parameters.Add($"{context.CurrentStateId}!TEMP", Guid.NewGuid()); return base.OnEnter(context); } - public override Task OnExit(Context context) + public override Task OnExit(Context context) { // Expected Count: 7 MessageService.Counter3 = context.Parameters.Count; @@ -124,43 +164,62 @@ public override Task OnExit(Context context) /// Sublevel-3: State. public class State2_Sub2_Sub1(IMessageService msg, ILogger log) - : CommonDiStateBase(msg, log) + : CommonDiStateBase(msg, log) { - public override Task OnEnter(Context context) - { - if (context.ParameterAsBool(ParameterType.TestExecutionOrder)) - Assert.IsNull(context.PreviousStateId); - - return base.OnEnter(context); - } + public override Task OnEnter(Context context) => base.OnEnter(context); } /// Sublevel-3: State. public class State2_Sub2_Sub2(IMessageService msg, ILogger log) - : CommonDiStateBase(msg, log); - -/// Sublevel-3: Last State. -public class State2_Sub2_Sub3(IMessageService msg, ILogger log) - : CommonDiStateBase(msg, log) + : CommandStateBase(msg, log) { - public override Task OnEnter(Context context) + /// Gets message types for command state to subscribe to. + public override IReadOnlyCollection SubscribedMessageTypes => + [ + typeof(UnlockResponse), + typeof(CloseResponse), + ]; + + public override Task OnEnter(Context context) { - if (context.ParameterAsBool(ParameterType.TestExecutionOrder)) - Assert.AreEqual(CompositeL3.State2_Sub2_Sub2, context.PreviousStateId); + context.Parameters.Add(context.CurrentStateId.ToString(), Guid.NewGuid()); + MessageService.AddMessage($"[Keys-{context.CurrentStateId}]: {string.Join(",", context.Parameters.Keys)}"); + // NOTE: + // 1) We're sending the same OpenCommand to prove that State1's OnMessage isn't called a 2nd time. + // 2) CloseResponse doesn't reached our OnMessage because we left already. + context.EventAggregator?.Publish(new UnlockCommand { Counter = 200 }); return base.OnEnter(context); } + + public override Task OnMessage(Context context, object message) + { + MessageService.Counter4++; + + context.NextState(Result.Success); + return base.OnMessage(context, message); + } + + public override Task OnTimeout(Context context) + { + context.NextState(Result.Error); + return base.OnTimeout(context); + } +} + +/// Sublevel-3: Last State. +public class State2_Sub2_Sub3(IMessageService msg, ILogger log) +: CommonDiStateBase(msg, log) +{ + public override Task OnEnter(Context context) => base.OnEnter(context); } /// Sublevel-2: Last State. public class State2_Sub3(IMessageService msg, ILogger log) - : DiStateBase(msg, log) + : DiStateBase(msg, log) { - public override Task OnEnter(Context context) + public override Task OnEnter(Context context) { - if (context.ParameterAsBool(ParameterType.TestExecutionOrder)) - Assert.AreEqual(CompositeL3.State2_Sub2, context.PreviousStateId); - context.Parameters.Add(context.CurrentStateId.ToString(), Guid.NewGuid()); MessageService.AddMessage($"[Keys-{context.CurrentStateId}]: {string.Join(",", context.Parameters.Keys)}"); return base.OnEnter(context); @@ -169,9 +228,9 @@ public override Task OnEnter(Context context) /// Make sure not child-created context is there. public class State3(IMessageService msg, ILogger log) - : DiStateBase(msg, log) + : DiStateBase(msg, log) { - public override Task OnEnter(Context context) + public override Task OnEnter(Context context) { context.Parameters.Add(context.CurrentStateId.ToString(), Guid.NewGuid()); MessageService.AddMessage($"[Keys-{context.CurrentStateId}]: {string.Join(",", context.Parameters.Keys)}"); diff --git a/source/Lite.StateMachine.Tests/TestData/States/CommandStateBase.cs b/source/Lite.StateMachine.Tests/TestData/States/CommandStateBase.cs index 2de8ad4..d0256f0 100644 --- a/source/Lite.StateMachine.Tests/TestData/States/CommandStateBase.cs +++ b/source/Lite.StateMachine.Tests/TestData/States/CommandStateBase.cs @@ -2,29 +2,62 @@ // See the LICENSE file in the project root for more information. using System; +using System.Collections.Generic; +using System.Diagnostics; using System.Threading.Tasks; using Lite.StateMachine.Tests.TestData.Services; using Microsoft.Extensions.Logging; namespace Lite.StateMachine.Tests.TestData.States; +/// Command Class (doesn't auto-success, you must implement `context.NextState(Result.xxx);`. +/// State class object. +/// State Id. public class CommandStateBase(IMessageService msg, ILogger logger) : DiStateBase(msg, logger), ICommandState where TStateId : struct, Enum { - public Task OnMessage(Context context, object message) + //// NEEDS TESTED: public virtual IReadOnlyCollection SubscribedMessageTypes => []; + ////public virtual IReadOnlyCollection SubscribedMessageTypes => Array.Empty(); + public virtual IReadOnlyCollection SubscribedMessageTypes => []; + + public override Task OnEnter(Context context) { + MessageService.Counter1++; Log.LogInformation("[OnEnter]"); + if (HasExtraLogging) + Debug.WriteLine($"[{GetType().Name}] [{context.CurrentStateId}] [OnEnter]"); + // DO NOT AUTO-SUCCESS! Placed here as a note ////context.NextState(Result.Success); return Task.CompletedTask; } - public Task OnTimeout(Context context) + public virtual Task OnMessage(Context context, object message) { + // Note: Cannot supply our own object type + //// public virtual Task OnMessage(Context context, OpenResponse message) + + MessageService.Counter1++; Log.LogInformation("[OnMessage]"); + if (HasExtraLogging) + Debug.WriteLine($"[{GetType().Name}] [{context.CurrentStateId}] [OnMessage]"); + + // DO NOT AUTO-SUCCESS! Placed here as a note + ////context.NextState(Result.Success); + return Task.CompletedTask; + } + + public virtual Task OnTimeout(Context context) + { + MessageService.Counter1++; + Log.LogInformation("[OnTimeout] => "); + + if (HasExtraLogging) + Debug.WriteLine($"[{GetType().Name}] [{context.CurrentStateId}] [OnTimeout]"); + // DO NOT AUTO-SUCCESS! Placed here as a note ////context.NextState(Result.Success); return Task.CompletedTask; diff --git a/source/Lite.StateMachine.Tests/TestData/States/CompositeL1DiStates.cs b/source/Lite.StateMachine.Tests/TestData/States/CompositeL1DiStates.cs index 85140e0..a886056 100644 --- a/source/Lite.StateMachine.Tests/TestData/States/CompositeL1DiStates.cs +++ b/source/Lite.StateMachine.Tests/TestData/States/CompositeL1DiStates.cs @@ -25,7 +25,7 @@ public class ParentState(IMessageService msg, ILogger log) public override Task OnExit(Context context) { MessageService.Counter1++; - MessageService.AddMessage(GetType().Name + " OnExit"); + MessageService.AddMessage(GetType().Name + " [OnExit]"); Log.LogInformation("[OnExit] => {result}", context.LastChildResult); context.NextState(context.LastChildResult switch @@ -51,7 +51,7 @@ public class ParentSub_WaitMessageState(IMessageService msg, ILogger context) { MessageService.Counter1++; - MessageService.AddMessage(GetType().Name + " OnEnter"); + MessageService.AddMessage(GetType().Name + " [OnEnter]"); Log.LogInformation("[OnEnter] (Counter2: {cnt})", MessageService.Counter2); switch (MessageService.Counter2) @@ -84,7 +84,7 @@ public override Task OnEnter(Context context) public Task OnMessage(Context context, object message) { MessageService.Counter1++; - MessageService.AddMessage(GetType().Name + " OnEnter"); + MessageService.AddMessage(GetType().Name + " [OnEnter]"); if (message is not string response) { @@ -122,7 +122,7 @@ public Task OnMessage(Context context, object message) public Task OnTimeout(Context context) { MessageService.Counter1++; - MessageService.AddMessage(GetType().Name + " OnEnter"); + MessageService.AddMessage(GetType().Name + " [OnEnter]"); context.NextState(Result.Failure); Log.LogInformation("[OnTimeout] => Failure; (Publishing: ReceivedTimeout)"); @@ -145,7 +145,7 @@ public override Task OnEnter(Context context) { MessageService.Counter1++; MessageService.Counter2++; - MessageService.AddMessage(GetType().Name + " OnEnter"); + MessageService.AddMessage(GetType().Name + " [OnEnter]"); Log.LogInformation("[{StateName}] [OnEnter] => OK; Counter2++", GetType().Name); Debug.WriteLine($"[{GetType().Name}] [OnEnter] => OK; Counter2++"); @@ -164,7 +164,7 @@ public override Task OnEnter(Context context) { MessageService.Counter1++; MessageService.Counter2++; - MessageService.AddMessage(GetType().Name + " OnEnter"); + MessageService.AddMessage(GetType().Name + " [OnEnter]"); Log.LogInformation("[{StateName}] [OnEnter] => OK; (Counter2++)", GetType().Name); Debug.WriteLine($"[{GetType().Name}] [OnEnter] => OK; (Counter2++)"); diff --git a/source/Lite.StateMachine.Tests/TestData/States/DiStateBase.cs b/source/Lite.StateMachine.Tests/TestData/States/DiStateBase.cs index 0c4ba74..0b06b65 100644 --- a/source/Lite.StateMachine.Tests/TestData/States/DiStateBase.cs +++ b/source/Lite.StateMachine.Tests/TestData/States/DiStateBase.cs @@ -9,6 +9,8 @@ namespace Lite.StateMachine.Tests.TestData.States; +#pragma warning disable SA1124 // Do not use regions + public class DiStateBase(IMessageService msg, ILogger logger) : IState where TStateId : struct, Enum { @@ -22,35 +24,36 @@ public class DiStateBase(IMessageService msg, ILogger _msgService; - public virtual Task OnEnter(Context context) + #region Suppress CodeMaid Method Sorting + + public virtual Task OnEntering(Context context) { _msgService.Counter1++; - ////_msgService.AddMessage(GetType().Name + " OnEnter"); - _logger.LogInformation("[OnEnter] => OK"); + _logger.LogInformation("[OnEntering]"); if (HasExtraLogging) - Debug.WriteLine($"[{GetType().Name}] [OnEnter] => OK"); + Debug.WriteLine($"[{GetType().Name}] [OnEntering]"); - context.NextState(Result.Success); return Task.CompletedTask; } - public virtual Task OnEntering(Context context) + #endregion Suppress CodeMaid Method Sorting + + public virtual Task OnEnter(Context context) { _msgService.Counter1++; - ////_msgService.AddMessage(GetType().Name + " OnEntering"); - _logger.LogInformation("[OnEntering]"); + _logger.LogInformation("[OnEnter] => OK"); if (HasExtraLogging) - Debug.WriteLine($"[{GetType().Name}] [OnEntering]"); + Debug.WriteLine($"[{GetType().Name}] [OnEnter] => OK"); + context.NextState(Result.Success); return Task.CompletedTask; } public virtual Task OnExit(Context context) { _msgService.Counter1++; - ////_msgService.AddMessage(GetType().Name + " OnExit"); _logger.LogInformation("[OnExit]"); if (HasExtraLogging) @@ -60,3 +63,5 @@ public virtual Task OnExit(Context context) return Task.CompletedTask; } } + +#pragma warning restore SA1124 // Do not use regions diff --git a/source/Sample.Basics/DiStates/DiStateBase.cs b/source/Sample.Basics/DiStates/DiStateBase.cs index 3d317f3..8c541c3 100644 --- a/source/Sample.Basics/DiStates/DiStateBase.cs +++ b/source/Sample.Basics/DiStates/DiStateBase.cs @@ -27,7 +27,7 @@ public class DiStateBase(IMessageService msg, ILogger context) { _msgService.Counter1++; - ////_msgService.AddMessage(GetType().Name + " OnEnter"); + ////_msgService.AddMessage(GetType().Name + " [OnEnter]"); _logger.LogInformation("[OnEnter] => OK"); if (HasExtraLogging) @@ -40,7 +40,7 @@ public virtual Task OnEnter(Context context) public virtual Task OnEntering(Context context) { _msgService.Counter1++; - ////_msgService.AddMessage(GetType().Name + " OnEntering"); + ////_msgService.AddMessage(GetType().Name + " [OnEntering]"); _logger.LogInformation("[OnEntering]"); if (HasExtraLogging) @@ -52,7 +52,7 @@ public virtual Task OnEntering(Context context) public virtual Task OnExit(Context context) { _msgService.Counter1++; - ////_msgService.AddMessage(GetType().Name + " OnExit"); + ////_msgService.AddMessage(GetType().Name + " [OnExit]"); _logger.LogInformation("[OnExit]"); if (HasExtraLogging)