using IvfTl.Control.Entity;
using ivf_tl_SerialHelper.Util;
using Xunit;
namespace ivf_tl_SerialHelper.Tests
{
///
/// M-01/M-02/M-03 合并遗留:control 端 Commander 缺 3 个 E方读写 builder。
/// 期望字节 = 合并前 operate 端 ivf_tl_Entity/ComEntitys/Commander.cs 同名方法的黄金真值
/// (临时文件/ivf_tl_operate_2.0,该实现真机已用),末位为 CreateORC 累加和校验(对前 n-1 字节求和取低字节)。
/// 字节编码是纯逻辑,这里 red→green;ComBin/SerialChannelImpl 接线 + EEPROM 读写往返走真机验证。
///
public class CommanderEepromTests
{
/// M-02 读E方→舱室排气阀打开时间。地址 00 03 08,固定 9 字节读命令。
[Fact]
public void CreateReadEEPROMVentNum_产出与operate一致的读排气阀时间命令字节()
{
var custom = new CustomProtocol();
custom.CreateReadEEPROMVentNum();
// 5E 11(READ_EEPROM) 00 09(LTH) 00 03 08(地址) 04 00 → ORC=前8字节和=0x87
var expected = new byte[] { 0x5E, 0x11, 0x00, 0x09, 0x00, 0x03, 0x08, 0x04, 0x87 };
Assert.Equal(expected, custom.sendBuffer);
}
/// M-01 写E方→舱室排气阀打开时间。地址 00 03 08 + 小端 4 字节值 + 校验。
[Fact]
public void CreateWriteEEPROOpenVentTimeCommand_产出与operate一致的写排气阀时间命令字节()
{
var custom = new CustomProtocol();
custom.CreateWriteEEPROOpenVentTimeCommand(5);
// 5E 12(WRITE_EEPROM) 00 0C(LTH) 00 03 08(地址) 05 00 00 00(小端5) 00→ORC=前11字节和=0x8C
var expected = new byte[] { 0x5E, 0x12, 0x00, 0x0C, 0x00, 0x03, 0x08, 0x05, 0x00, 0x00, 0x00, 0x8C };
Assert.Equal(expected, custom.sendBuffer);
}
/// M-03 写E方→灯光亮度。地址 00 05 34 + 小端 4 字节值 + 校验。
[Fact]
public void CreateWriteEEPROMLightNum_产出与operate一致的写灯光亮度命令字节()
{
var custom = new CustomProtocol();
custom.CreateWriteEEPROMLightNum(80);
// 5E 12(WRITE_EEPROM) 00 0C(LTH) 00 05 34(地址) 50 00 00 00(小端80=0x50) 00→ORC=前11字节和=0x105&0xFF=0x05
var expected = new byte[] { 0x5E, 0x12, 0x00, 0x0C, 0x00, 0x05, 0x34, 0x50, 0x00, 0x00, 0x00, 0x05 };
Assert.Equal(expected, custom.sendBuffer);
}
///
/// 交叉校验:写排气阀时间 与 control 已通过的写进气阀时间(地址 00 03 0c)仅"地址低字节"不同(0x08 vs 0x0c)。
/// 锚定到既有已验证 builder,防止地址表整体写错。
///
[Fact]
public void 写排气阀与写进气阀命令仅地址低字节不同()
{
var vent = new CustomProtocol();
vent.CreateWriteEEPROOpenVentTimeCommand(5);
var intake = new CustomProtocol();
intake.CreateWriteEEPROOpenIntakeTimeCommand(5);
Assert.Equal(intake.sendBuffer.Length, vent.sendBuffer.Length);
Assert.Equal((byte)0x0c, intake.sendBuffer[6]); // 进气阀地址低字节
Assert.Equal((byte)0x08, vent.sendBuffer[6]); // 排气阀地址低字节
// 除地址低字节(idx6)与末位校验外,其余字节应完全相同
for (int i = 0; i < vent.sendBuffer.Length - 1; i++)
{
if (i == 6) continue;
Assert.Equal(intake.sendBuffer[i], vent.sendBuffer[i]);
}
}
}
}