// Feature: cnc-run-execution, Property 11: 节点执行状态转换正确性 // Validates: Requirements 6.1, 6.2 using System; using FsCheck; using FsCheck.Fluent; using FsCheck.Xunit; using XplorePlane.Models; using XplorePlane.ViewModels.Cnc; using Xunit; namespace XplorePlane.Tests.ViewModels { public class CncNodeViewModelTests { [Fact] public void SavePosition_SaveImage_CanBeUpdated() { var node = new SavePositionNode(Guid.NewGuid(), 0, "Pos_0", MotionState.Default, SaveImage: false); var vm = new CncNodeViewModel(node, (_, __) => { }); vm.SaveImage = true; var updatedNode = Assert.IsType(vm.Model); Assert.True(vm.SaveImage); Assert.True(updatedNode.SaveImage); } [Property(MaxTest = 100)] public Property ExecutionState_TransitionsProduceCorrectBoolProperties() { var gen = from xm in ArbMap.Default.GeneratorFor() from ym in ArbMap.Default.GeneratorFor() select new ReferencePointNode( Guid.NewGuid(), 0, "TestNode", xm, ym, 0, 0, 0, 0, false, 0, 0); return Prop.ForAll( gen.ToArbitrary(), node => { var vm = new CncNodeViewModel(node, (_, __) => { }); vm.ExecutionState = NodeExecutionState.Running; bool runningOk = vm.IsRunningNode && !vm.IsSucceededNode && !vm.IsFailedNode; vm.ExecutionState = NodeExecutionState.Succeeded; bool succeededOk = !vm.IsRunningNode && vm.IsSucceededNode && !vm.IsFailedNode; vm.ExecutionState = NodeExecutionState.Failed; bool failedOk = !vm.IsRunningNode && !vm.IsSucceededNode && vm.IsFailedNode; vm.ExecutionState = NodeExecutionState.Idle; bool idleOk = !vm.IsRunningNode && !vm.IsSucceededNode && !vm.IsFailedNode; return runningOk && succeededOk && failedOk && idleOk; }); } } }