|
@@ -0,0 +1,90 @@
|
|
|
|
|
+using System;
|
|
|
|
|
+using IvfTl.ControlHost.Debug;
|
|
|
|
|
+using IvfTl.ControlHost.Tests.Fakes;
|
|
|
|
|
+using Newtonsoft.Json.Linq;
|
|
|
|
|
+using Xunit;
|
|
|
|
|
+
|
|
|
|
|
+namespace IvfTl.ControlHost.Tests
|
|
|
|
|
+{
|
|
|
|
|
+ /// <summary>缓冲瓶(舱11)专属 op 路由测试:验证 Execute 把 5 个 op 分发到正确底层方法。</summary>
|
|
|
|
|
+ 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<decimal>());
|
|
|
|
|
+ Assert.Equal(36.1m, jo["t1"].Value<decimal>());
|
|
|
|
|
+ Assert.Equal(37.2m, jo["t2"].Value<decimal>());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ [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);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|