2026-01-06 22:59:58 +08:00

195 lines
6.8 KiB
C#

using System;
using Xunit;
namespace YunDa.SOMS.MongoDB.Application.Tests.Inspection
{
/// <summary>
/// Unit tests for CalculateDisplayWindow helper method
/// Tests validate Requirements: 1.1, 1.2, 1.3, 1.4, 5.1, 6.1, 7.1, 8.1, 9.1, 10.1
/// </summary>
public class CalculateDisplayWindowTests
{
/// <summary>
/// Helper class to expose the internal CalculateDisplayWindow method for testing
/// </summary>
private class TestableService
{
public (int startYear, int startMonth, int endYear, int endMonth) CalculateDisplayWindow(
int currentYear,
int currentMonth)
{
// Calculate historical start (3 months before current)
int historicalStartMonth = currentMonth - 3;
int startYear;
int startMonth;
if (historicalStartMonth <= 0)
{
// Year boundary: go back to previous year
startYear = currentYear - 1;
startMonth = 12 + historicalStartMonth; // historicalStartMonth is negative or 0
}
else
{
startYear = currentYear;
startMonth = historicalStartMonth;
}
// Calculate end month (11 months after current)
int endMonthOffset = currentMonth + 11;
int endYear;
int endMonth;
if (endMonthOffset > 12)
{
// Year boundary: go to next year
endYear = currentYear + 1;
endMonth = endMonthOffset - 12;
}
else
{
endYear = currentYear;
endMonth = endMonthOffset;
}
return (startYear, startMonth, endYear, endMonth);
}
}
private readonly TestableService _service = new TestableService();
[Fact]
public void CalculateDisplayWindow_January_ReturnsCorrectWindow()
{
// Arrange
int currentYear = 2025;
int currentMonth = 1; // January
// Act
var (startYear, startMonth, endYear, endMonth) = _service.CalculateDisplayWindow(currentYear, currentMonth);
// Assert
// January: 3 months before = Oct, Nov, Dec of previous year
// 11 months after = December of current year
Assert.Equal(2024, startYear);
Assert.Equal(10, startMonth); // October
Assert.Equal(2025, endYear);
Assert.Equal(12, endMonth); // December
}
[Fact]
public void CalculateDisplayWindow_March_ReturnsCorrectWindow()
{
// Arrange
int currentYear = 2025;
int currentMonth = 3; // March
// Act
var (startYear, startMonth, endYear, endMonth) = _service.CalculateDisplayWindow(currentYear, currentMonth);
// Assert
// March: 3 months before = Dec of previous year, Jan, Feb of current year
// 11 months after = February of next year
Assert.Equal(2024, startYear);
Assert.Equal(12, startMonth); // December
Assert.Equal(2026, endYear);
Assert.Equal(2, endMonth); // February
}
[Fact]
public void CalculateDisplayWindow_September_ReturnsCorrectWindow()
{
// Arrange
int currentYear = 2025;
int currentMonth = 9; // September
// Act
var (startYear, startMonth, endYear, endMonth) = _service.CalculateDisplayWindow(currentYear, currentMonth);
// Assert
// September: 3 months before = June, July, August
// 11 months after = August of next year
Assert.Equal(2025, startYear);
Assert.Equal(6, startMonth); // June
Assert.Equal(2026, endYear);
Assert.Equal(8, endMonth); // August
}
[Fact]
public void CalculateDisplayWindow_October_ReturnsCorrectWindow()
{
// Arrange
int currentYear = 2025;
int currentMonth = 10; // October
// Act
var (startYear, startMonth, endYear, endMonth) = _service.CalculateDisplayWindow(currentYear, currentMonth);
// Assert
// October: 3 months before = July, August, September
// 11 months after = September of next year
Assert.Equal(2025, startYear);
Assert.Equal(7, startMonth); // July
Assert.Equal(2026, endYear);
Assert.Equal(9, endMonth); // September
}
[Fact]
public void CalculateDisplayWindow_December_ReturnsCorrectWindow()
{
// Arrange
int currentYear = 2025;
int currentMonth = 12; // December
// Act
var (startYear, startMonth, endYear, endMonth) = _service.CalculateDisplayWindow(currentYear, currentMonth);
// Assert
// December: 3 months before = September, October, November
// 11 months after = November of next year
Assert.Equal(2025, startYear);
Assert.Equal(9, startMonth); // September
Assert.Equal(2026, endYear);
Assert.Equal(11, endMonth); // November
}
[Fact]
public void CalculateDisplayWindow_February_HandlesYearBoundary()
{
// Arrange
int currentYear = 2025;
int currentMonth = 2; // February
// Act
var (startYear, startMonth, endYear, endMonth) = _service.CalculateDisplayWindow(currentYear, currentMonth);
// Assert
// February: 3 months before = Nov, Dec of previous year, Jan of current year
// 11 months after = January of next year
Assert.Equal(2024, startYear);
Assert.Equal(11, startMonth); // November
Assert.Equal(2026, endYear);
Assert.Equal(1, endMonth); // January
}
[Fact]
public void CalculateDisplayWindow_April_NoYearBoundary()
{
// Arrange
int currentYear = 2025;
int currentMonth = 4; // April
// Act
var (startYear, startMonth, endYear, endMonth) = _service.CalculateDisplayWindow(currentYear, currentMonth);
// Assert
// April: 3 months before = January, February, March (same year)
// 11 months after = March of next year
Assert.Equal(2025, startYear);
Assert.Equal(1, startMonth); // January
Assert.Equal(2026, endYear);
Assert.Equal(3, endMonth); // March
}
}
}