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); } /// /// 第一把扫码枪返回 noRead、第二把扫码枪返回有效条码时,应舍弃 noRead 并使用第二把扫码枪结果。 /// [Fact] public void Merge_ShouldUseSecondBarcode_WhenFirstScannerReturnsNoRead() { var first = new ScanOperationResult { IsSuccess = true, DeviceConnected = true, Barcode = "noRead", RawMessage = "noRead" }; var second = new ScanOperationResult { IsSuccess = true, DeviceConnected = true, Barcode = "PCB-SECOND", RawMessage = "PCB-SECOND" }; ScanOperationResult result = DualScannerResultMerger.Merge(first, second); Assert.True(result.IsSuccess); Assert.Equal("PCB-SECOND", result.Barcode); Assert.Contains("使用扫码枪2", result.RawMessage); Assert.DoesNotContain("使用扫码枪1", 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); } }