using System;
using IvfTl.ControlHost.Debug;
using IvfTl.ControlHost.Tests.Fakes;
using Newtonsoft.Json.Linq;
using Xunit;
namespace IvfTl.ControlHost.Tests
{
/// 缓冲瓶(舱11)专属 op 路由测试:验证 Execute 把 5 个 op 分发到正确底层方法。
public class DebugBufferOpTests
{
private static readonly DateTime Now = new DateTime(2026, 6, 24, 0, 0, 0, DateTimeKind.Utc);
// 返回 (manager, sid, fakeSerial) 三件套,照 DebugStreamSessionTests 的装配方式
private (DebugSessionManager mgr, string sid, FakeSerial ser) NewSession()
{
var ser = new FakeSerial();
var gate = new FakeGate(11, ser);
var mgr = new DebugSessionManager(_ => gate, () => Now, ttlMs: 10000, log: null);
string sid = (string)mgr.Acquire(11).Result;
return (mgr, sid, ser);
}
[Fact]
public void BufferState_RoutesTo_BufferBottleStateWait_AndReturnsTuple()
{
var (mgr, sid, ser) = NewSession();
ser.BufferStateReturn = (2.5m, 36.1m, 37.2m);
var r = mgr.Execute(sid, "BufferState", null);
Assert.True(r.Ok);
Assert.Contains("BufferState", ser.Calls);
var jo = JObject.FromObject(r.Result);
Assert.Equal(2.5m, jo["pressure"].Value());
Assert.Equal(36.1m, jo["t1"].Value());
Assert.Equal(37.2m, jo["t2"].Value());
}
[Fact]
public void BufferAeration_RoutesTo_BufferBottleAerationWait()
{
var (mgr, sid, ser) = NewSession();
var r = mgr.Execute(sid, "BufferAeration", null);
Assert.True(r.Ok);
Assert.Equal(true, r.Result);
Assert.Contains("BufferAeration", ser.Calls);
}
[Fact]
public void ReadLight_RoutesTo_ReadLightBrightnessWait_AndReturnsInt()
{
var (mgr, sid, ser) = NewSession();
var r = mgr.Execute(sid, "ReadLight", null);
Assert.True(r.Ok);
Assert.Equal(500, r.Result); // FakeSerial.ReadLightBrightnessWait 固定返回 500
Assert.Contains("ReadLight", ser.Calls);
}
[Fact]
public void WriteLight_RoutesTo_WriteLightBrightnessWait_WithValue()
{
var (mgr, sid, ser) = NewSession();
var args = new JObject { ["value"] = 320 };
var r = mgr.Execute(sid, "WriteLight", args);
Assert.True(r.Ok);
Assert.Contains("WriteLight(320)", ser.Calls);
Assert.Equal(320, ser.LastWriteLight);
}
[Fact]
public void WriteOpenIntakeTimeBuffer_RoutesTo_WriteOpenIntakeTimeWait_WithIsBufferTrue()
{
var (mgr, sid, ser) = NewSession();
var args = new JObject { ["value"] = 150 };
var r = mgr.Execute(sid, "WriteOpenIntakeTimeBuffer", args);
Assert.True(r.Ok);
Assert.Equal(150, ser.LastWriteIntake);
Assert.True(ser.LastWriteIntakeIsBuffer);
}
}
}