You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

202 lines
5.7 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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);
}
}
}