using System.Collections.Generic; using System.Linq; using IvfTl.Control.Entity.InitEntitys; using ivf_tl_Control; using Xunit; namespace IvfTl.ControlHost.Tests { public class StartupFaultPolicyTests { private static HouseFault Fault(int sn, HouseFaultType t = HouseFaultType.CcdSnMissing) => new HouseFault { HouseSn = sn, Type = t, Reason = "x", Stage = "扫口握手" }; [Fact] public void BadHouseSns_Only_Counts_Known_Houses() { var faults = new List { Fault(6), Fault(-1, HouseFaultType.CameraDuplicateSn), // 舱号未知 → 不算坏舱 Fault(8), }; var bad = StartupFaultPolicy.BadHouseSns(faults); Assert.Equal(new[] { 6, 8 }, bad.OrderBy(x => x).ToArray()); } [Fact] public void RunnableHouses_Excludes_Bad_And_Sorts() { var discovered = new[] { 2, 4, 6, 7, 8, 9, 11 }; var faults = new List { Fault(6), Fault(8) }; var run = StartupFaultPolicy.RunnableHouses(discovered, faults); Assert.Equal(new[] { 2, 4, 7, 9, 11 }, run.ToArray()); } [Fact] public void RunnableHouses_With_No_Faults_Returns_All_Discovered() { var discovered = new[] { 2, 4, 6 }; var run = StartupFaultPolicy.RunnableHouses(discovered, new List()); Assert.Equal(new[] { 2, 4, 6 }, run.ToArray()); } [Fact] public void RunnableHouses_UnknownHouseFault_Does_Not_Exclude_Anyone() { var discovered = new[] { 2, 4 }; var faults = new List { Fault(-1, HouseFaultType.CameraReadFailed) }; var run = StartupFaultPolicy.RunnableHouses(discovered, faults); Assert.Equal(new[] { 2, 4 }, run.ToArray()); } [Fact] public void IsFatal_True_Only_When_No_Runnable_House() { Assert.True(StartupFaultPolicy.IsFatal(new List())); Assert.False(StartupFaultPolicy.IsFatal(new List { 11 })); Assert.False(StartupFaultPolicy.IsFatal(new List { 2, 4 })); } [Fact] public void Partial_Failure_Is_Never_Fatal() { // 7 个舱里坏 2 个 → 仍 5 个可跑 → 不致命(核心需求) var discovered = new[] { 2, 4, 6, 7, 8, 9, 11 }; var faults = new List { Fault(6), Fault(8) }; var run = StartupFaultPolicy.RunnableHouses(discovered, faults); Assert.False(StartupFaultPolicy.IsFatal(run)); } } }