| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- using Xunit;
- using YZWater.Core.Services;
- namespace YZWater.Core.Tests.Services;
- /// <summary>
- /// DeviceStateMachine 单元测试
- /// </summary>
- public class DeviceStateMachineTests
- {
- [Fact]
- public void InitialState_ShouldBeStopped()
- {
- var sm = new DeviceStateMachine("P001", "泵1");
- Assert.Equal(DeviceStateMachine.DeviceState.Stopped, sm.CurrentState);
- }
- [Fact]
- public void Start_ShouldTransitionToRunning()
- {
- var sm = new DeviceStateMachine("P001", "泵1");
- sm.Start();
- Assert.Equal(DeviceStateMachine.DeviceState.Running, sm.CurrentState);
- }
- [Fact]
- public void Stop_FromRunning_ShouldTransitionToStopped()
- {
- var sm = new DeviceStateMachine("P001", "泵1");
- sm.Start();
- sm.Stop();
- Assert.Equal(DeviceStateMachine.DeviceState.Stopped, sm.CurrentState);
- }
- [Fact]
- public void ReportFault_ShouldTransitionToFault()
- {
- var sm = new DeviceStateMachine("P001", "泵1");
- sm.Start();
- sm.ReportFault();
- Assert.Equal(DeviceStateMachine.DeviceState.Fault, sm.CurrentState);
- }
- [Fact]
- public void Recover_FromFault_ShouldTransitionToStopped()
- {
- var sm = new DeviceStateMachine("P001", "泵1");
- sm.Start();
- sm.ReportFault();
- sm.Recover();
- Assert.Equal(DeviceStateMachine.DeviceState.Stopped, sm.CurrentState);
- }
- [Fact]
- public void FaultCannotDirectlyTransitionToRunning()
- {
- var sm = new DeviceStateMachine("P001", "泵1");
- sm.ReportFault();
- var canStart = sm.CanFire(DeviceStateMachine.DeviceTrigger.Start);
- Assert.False(canStart);
- }
- [Fact]
- public void TryFire_InvalidTransition_ShouldReturnFalse()
- {
- var sm = new DeviceStateMachine("P001", "泵1");
- // 从 Stopped 不能直接 Stop
- var result = sm.TryFire(DeviceStateMachine.DeviceTrigger.Stop);
- Assert.False(result);
- Assert.Equal(DeviceStateMachine.DeviceState.Stopped, sm.CurrentState);
- }
- [Fact]
- public void StateChanged_EventShouldFire()
- {
- var sm = new DeviceStateMachine("P001", "泵1");
- var eventFired = false;
- DeviceStateMachine.DeviceState? fromState = null;
- DeviceStateMachine.DeviceState? toState = null;
- sm.StateChanged += (id, from, to) =>
- {
- eventFired = true;
- fromState = from;
- toState = to;
- };
- sm.Start();
- Assert.True(eventFired);
- Assert.Equal(DeviceStateMachine.DeviceState.Stopped, fromState);
- Assert.Equal(DeviceStateMachine.DeviceState.Running, toState);
- }
- [Fact]
- public void BeginMaintenance_ShouldTransitionToMaintenance()
- {
- var sm = new DeviceStateMachine("P001", "泵1");
- sm.BeginMaintenance();
- Assert.Equal(DeviceStateMachine.DeviceState.Maintenance, sm.CurrentState);
- }
- [Fact]
- public void CompleteMaintenance_ShouldTransitionToStopped()
- {
- var sm = new DeviceStateMachine("P001", "泵1");
- sm.BeginMaintenance();
- sm.CompleteMaintenance();
- Assert.Equal(DeviceStateMachine.DeviceState.Stopped, sm.CurrentState);
- }
- [Fact]
- public void ToDeviceStatus_ShouldConvertCorrectly()
- {
- var sm = new DeviceStateMachine("P001", "泵1");
- Assert.Equal(YZWater.Core.Models.DeviceStatus.Stopped, sm.ToDeviceStatus());
- sm.Start();
- Assert.Equal(YZWater.Core.Models.DeviceStatus.Running, sm.ToDeviceStatus());
- sm.ReportFault();
- Assert.Equal(YZWater.Core.Models.DeviceStatus.Fault, sm.ToDeviceStatus());
- }
- }
- /// <summary>
- /// DeviceStateMachineManager 单元测试
- /// </summary>
- public class DeviceStateMachineManagerTests
- {
- [Fact]
- public void GetOrCreate_ShouldCreateNewMachine()
- {
- var manager = new DeviceStateMachineManager();
- var sm = manager.GetOrCreate("P001", "泵1");
- Assert.NotNull(sm);
- Assert.Equal("P001", sm.DeviceId);
- Assert.Equal("泵1", sm.DeviceName);
- }
- [Fact]
- public void GetOrCreate_SameId_ShouldReturnSameInstance()
- {
- var manager = new DeviceStateMachineManager();
- var sm1 = manager.GetOrCreate("P001", "泵1");
- var sm2 = manager.GetOrCreate("P001", "泵1");
- Assert.Same(sm1, sm2);
- }
- [Fact]
- public void Get_ExistingMachine_ShouldReturnIt()
- {
- var manager = new DeviceStateMachineManager();
- manager.GetOrCreate("P001", "泵1");
- var sm = manager.Get("P001");
- Assert.NotNull(sm);
- }
- [Fact]
- public void Get_NonExistingMachine_ShouldReturnNull()
- {
- var manager = new DeviceStateMachineManager();
- var sm = manager.Get("P999");
- Assert.Null(sm);
- }
- [Fact]
- public void Clear_ShouldRemoveAllMachines()
- {
- var manager = new DeviceStateMachineManager();
- manager.GetOrCreate("P001", "泵1");
- manager.GetOrCreate("P002", "泵2");
- manager.Clear();
- Assert.Empty(manager.GetAll());
- }
- }
|