using System; using System.Collections.Generic; using Xunit; using Haoliang.Models.Production; using Haoliang.Models.Device; namespace Haoliang.Tests { public class ProductionCalculatorTests { [Fact] public void CalculateProduction_WithSameProgramAndIncrementingCounts_ReturnsDifference() { // Arrange var lastStatus = new DeviceCurrentStatus { NCProgram = "O0001", CumulativeCount = 100 }; var currentStatus = new DeviceCurrentStatus { NCProgram = "O0001", CumulativeCount = 120 }; // Act var production = ProductionCalculator.CalculateProduction(currentStatus, lastStatus); // Assert Assert.Equal(20, production); } [Fact] public void CalculateProduction_WithSameProgramAndDecreasingCounts_ReturnsZero() { // Arrange var lastStatus = new DeviceCurrentStatus { NCProgram = "O0001", CumulativeCount = 120 }; var currentStatus = new DeviceCurrentStatus { NCProgram = "O0001", CumulativeCount = 100 }; // Act var production = ProductionCalculator.CalculateProduction(currentStatus, lastStatus); // Assert Assert.Equal(0, production); // 异常值保护,避免负数 } [Fact] public void CalculateProduction_WithProgramSwitch_ReturnsCurrentCount() { // Arrange var lastStatus = new DeviceCurrentStatus { NCProgram = "O0001", CumulativeCount = 100 }; var currentStatus = new DeviceCurrentStatus { NCProgram = "O0002", // 程序切换 CumulativeCount = 50 }; // Act var production = ProductionCalculator.CalculateProduction(currentStatus, lastStatus); // Assert Assert.Equal(50, production); // 新程序以当前累计数为起点 } [Fact] public void CalculateProduction_WithReturnToPreviousProgram_ReturnsZero() { // Arrange var lastStatus = new DeviceCurrentStatus { NCProgram = "O0001", CumulativeCount = 100 }; var currentStatus = new DeviceCurrentStatus { NCProgram = "O0002", // 先切换到新程序 CumulativeCount = 150 }; var secondStatus = new DeviceCurrentStatus { NCProgram = "O0001", // 切回历史程序 CumulativeCount = 200 }; // Act var production = ProductionCalculator.CalculateProduction(secondStatus, lastStatus); // Assert (从O0001直接跳到O0001,视为重新开始,所以应该返回0) Assert.Equal(0, production); // 切回历史程序,视为重新开始 } [Fact] public void IsNewProgram_WithDifferentPrograms_ReturnsTrue() { // Arrange var currentProgram = "O0002"; var lastProgram = "O0001"; // Act var isNew = ProductionCalculator.IsNewProgram(currentProgram, lastProgram); // Assert Assert.True(isNew); } [Fact] public void IsNewProgram_WithSameProgram_ReturnsFalse() { // Arrange var currentProgram = "O0001"; var lastProgram = "O0001"; // Act var isNew = ProductionCalculator.IsNewProgram(currentProgram, lastProgram); // Assert Assert.False(isNew); } [Fact] public void CrossDayReset_WithDifferentDates_ShouldHandleCrossDay() { // Arrange var lastStatus = new DeviceCurrentStatus { RecordTime = new DateTime(2024, 1, 1, 23, 59, 59) }; var currentStatus = new DeviceCurrentStatus { RecordTime = new DateTime(2024, 1, 2, 0, 0, 1) // 跨天 }; // Act ProductionCalculator.CrossDayReset(currentStatus, lastStatus); // Assert (这里只是验证不会抛出异常) Assert.True(true); } [Fact] public void CrossDayReset_WithSameDate_ShouldNotReset() { // Arrange var lastStatus = new DeviceCurrentStatus { RecordTime = new DateTime(2024, 1, 1, 10, 0, 0) }; var currentStatus = new DeviceCurrentStatus { RecordTime = new DateTime(2024, 1, 1, 10, 30, 0) // 同一天 }; // Act ProductionCalculator.CrossDayReset(currentStatus, lastStatus); // Assert (这里只是验证不会抛出异常) Assert.True(true); } [Fact] public void ProductionCalculator_WithLargeProductionNumber_HandlesCorrectly() { // Arrange var lastStatus = new DeviceCurrentStatus { NCProgram = "O0001", CumulativeCount = 1000000 }; var currentStatus = new DeviceCurrentStatus { NCProgram = "O0001", CumulativeCount = 1005000 }; // Act var production = ProductionCalculator.CalculateProduction(currentStatus, lastStatus); // Assert Assert.Equal(5000, production); } } }