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));
}
}
}