using CliFx.Infrastructure; using Shouldly; using Xunit; using ZB.MOM.WW.OtOpcUa.Driver.Modbus.Cli.Commands; namespace ZB.MOM.WW.OtOpcUa.Driver.Modbus.Cli.Tests; /// /// Covers the branch validation inside : /// 1. Driver.Modbus.Cli-002 — write to must use /// --type Bool. /// 2. Read-only regions (DiscreteInputs / InputRegisters) reject any write. /// The actual driver call is never reached for these guard cases — they throw a /// before the driver is constructed, /// so we can exercise ExecuteAsync against an unreachable host. /// [Trait("Category", "Unit")] public sealed class WriteCommandRegionValidationTests { [Theory] [InlineData(ModbusRegion.DiscreteInputs, ModbusDataType.Bool, "0")] [InlineData(ModbusRegion.InputRegisters, ModbusDataType.UInt16, "1")] public async Task ExecuteAsync_rejects_read_only_regions( ModbusRegion region, ModbusDataType type, string value) { var sut = new WriteCommand { // Host is required, but the guard fires before any socket use. Host = "127.0.0.1", Region = region, Address = 0, DataType = type, Value = value, }; using var console = new FakeInMemoryConsole(); await Should.ThrowAsync( async () => await sut.ExecuteAsync(console)); } [Theory] [InlineData(ModbusDataType.UInt16)] [InlineData(ModbusDataType.Int16)] [InlineData(ModbusDataType.Float32)] [InlineData(ModbusDataType.Int32)] public async Task ExecuteAsync_rejects_non_Bool_type_for_Coils_region(ModbusDataType type) { var sut = new WriteCommand { Host = "127.0.0.1", Region = ModbusRegion.Coils, Address = 5, DataType = type, Value = "42", }; using var console = new FakeInMemoryConsole(); var ex = await Should.ThrowAsync( async () => await sut.ExecuteAsync(console)); ex.Message.ShouldContain("Coils"); ex.Message.ShouldContain("Bool"); } }