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