using AxiOmron.PcbCheck.Models; using AxiOmron.PcbCheck.Services.Implementations; using Xunit; namespace AxiOmron.PcbCheck.Tests; /// /// 验证双扫码枪结果汇总规则。 /// public sealed class DualScannerResultMergerTests { /// /// 任一扫码枪成功时,应使用成功条码继续后续 SFTP 流程。 /// [Fact] public void Merge_ShouldUseSecondBarcode_WhenOnlySecondScannerSucceeds() { var first = new ScanOperationResult { IsSuccess = false, DeviceConnected = true, ErrorMessage = "扫码枪1超时" }; var second = new ScanOperationResult { IsSuccess = true, DeviceConnected = true, Barcode = "PCB-SECOND" }; ScanOperationResult result = DualScannerResultMerger.Merge(first, second); Assert.True(result.IsSuccess); Assert.Equal("PCB-SECOND", result.Barcode); Assert.Contains("扫码枪2", result.RawMessage); } /// /// 两把扫码枪都成功但内容不一致时,应优先使用扫码枪1条码并保留不一致说明。 /// [Fact] public void Merge_ShouldPreferFirstBarcode_WhenBothScannersReturnDifferentBarcodes() { var first = new ScanOperationResult { IsSuccess = true, DeviceConnected = true, Barcode = "PCB-FIRST" }; var second = new ScanOperationResult { IsSuccess = true, DeviceConnected = true, Barcode = "PCB-SECOND" }; ScanOperationResult result = DualScannerResultMerger.Merge(first, second); Assert.True(result.IsSuccess); Assert.Equal("PCB-FIRST", result.Barcode); Assert.Contains("不一致", result.ErrorMessage); Assert.Contains("PCB-SECOND", result.RawMessage); } }