using System; using IvfTl.ControlHost.Debug; using IvfTl.ControlHost.Tests.Fakes; using Xunit; namespace IvfTl.ControlHost.Tests { /// /// Task7-t3:借用(Acquire)成功时回带培养态(cultivating + embryoCount)。 /// 纯逻辑、注入式——cultivationOf 委托提供假培养态,不接真实数据源(下个任务才装配)。 /// public class DebugAcquireCultivationTests { private static readonly DateTime Now = new DateTime(2026, 6, 24, 0, 0, 0, DateTimeKind.Utc); private DebugSessionManager NewMgr(FakeGate gate, Func cultivationOf) => new DebugSessionManager(_ => gate, () => Now, ttlMs: 10000, log: null, cultivationOf: cultivationOf); [Fact] public void Acquire_CultivatingHouse_ReturnsCultivationState() { var gate = new FakeGate(6, new FakeSerial()); var mgr = NewMgr(gate, sn => (true, 3)); var r = mgr.Acquire(6); Assert.True(r.Ok); Assert.True(r.Cultivating); Assert.Equal(3, r.EmbryoCount); // Result 仍是 sid 字符串(operate 端靠 r.Result 取 sessionId,不能破坏) Assert.IsType(r.Result); Assert.False(string.IsNullOrEmpty((string)r.Result)); } [Fact] public void Acquire_EmptyHouse_ReturnsNotCultivating() { var gate = new FakeGate(6, new FakeSerial()); var mgr = NewMgr(gate, sn => (false, 0)); var r = mgr.Acquire(6); Assert.True(r.Ok); Assert.False(r.Cultivating); Assert.Equal(0, r.EmbryoCount); Assert.IsType(r.Result); Assert.False(string.IsNullOrEmpty((string)r.Result)); } [Fact] public void Acquire_NoCultivationProvider_DefaultsFalse() { var gate = new FakeGate(6, new FakeSerial()); // cultivationOf 传 null(不提供)——Acquire 不应崩,默认 false/0 var mgr = NewMgr(gate, null); var r = mgr.Acquire(6); Assert.True(r.Ok); Assert.False(r.Cultivating); Assert.Equal(0, r.EmbryoCount); Assert.IsType(r.Result); Assert.False(string.IsNullOrEmpty((string)r.Result)); } [Fact] public void Acquire_CultivationProviderThrows_DoesNotBlockAcquire() { var gate = new FakeGate(6, new FakeSerial()); // 业务红线:取培养态炸了也绝不能阻断借用本身(锁死 Acquire 里的 try-catch 兜底语义) var mgr = NewMgr(gate, sn => throw new Exception("模拟取培养态失败")); var r = mgr.Acquire(6); Assert.True(r.Ok); // 借用仍成功 Assert.False(r.Cultivating); // 兜底为默认 false Assert.Equal(0, r.EmbryoCount); // 兜底为默认 0 Assert.IsType(r.Result); Assert.False(string.IsNullOrEmpty((string)r.Result)); } } }