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

222 lines
8.2 KiB
C#

using System;
using Xunit;
namespace YunDa.SOMS.MongoDB.Application.Tests.Inspection
{
/// <summary>
/// Unit tests for September special case in GetYearlyStatisticsByMonthAsync
/// Tests validate Requirements: 5.1, 5.2, 5.3, 5.4, 5.5
/// </summary>
public class SeptemberSpecialCaseTests
{
/// <summary>
/// Helper class to simulate the September special case logic
/// </summary>
private class SeptemberLogicSimulator
{
public (int startYear, int startMonth, int endYear, int endMonth) ApplySeptemberSpecialCase(
int currentYear,
int currentMonth,
int calculatedStartYear,
int calculatedStartMonth,
int calculatedEndYear,
int calculatedEndMonth)
{
// Apply September special case
if (currentMonth == 9)
{
// For September, adjust to show only Jan-Dec of current year
return (currentYear, 1, currentYear, 12);
}
// Return original calculated values for non-September months
return (calculatedStartYear, calculatedStartMonth, calculatedEndYear, calculatedEndMonth);
}
public int CalculateMonthCount(int startYear, int startMonth, int endYear, int endMonth)
{
int count = 0;
int iterYear = startYear;
int iterMonth = startMonth;
while (iterYear < endYear || (iterYear == endYear && iterMonth <= endMonth))
{
count++;
iterMonth++;
if (iterMonth > 12)
{
iterMonth = 1;
iterYear++;
}
}
return count;
}
}
private readonly SeptemberLogicSimulator _simulator = new SeptemberLogicSimulator();
[Fact]
public void SeptemberSpecialCase_AdjustsToJanuaryThroughDecember()
{
// Arrange
int currentYear = 2025;
int currentMonth = 9; // September
// Simulated calculated window (June 2025 to August 2026)
int calculatedStartYear = 2025;
int calculatedStartMonth = 6;
int calculatedEndYear = 2026;
int calculatedEndMonth = 8;
// Act
var (startYear, startMonth, endYear, endMonth) = _simulator.ApplySeptemberSpecialCase(
currentYear, currentMonth,
calculatedStartYear, calculatedStartMonth,
calculatedEndYear, calculatedEndMonth);
// Assert - Requirements 5.1: Display Jan-Dec of current year
Assert.Equal(2025, startYear);
Assert.Equal(1, startMonth); // January
Assert.Equal(2025, endYear);
Assert.Equal(12, endMonth); // December
}
[Fact]
public void SeptemberSpecialCase_Returns12Months()
{
// Arrange
int currentYear = 2025;
int currentMonth = 9; // September
int calculatedStartYear = 2025;
int calculatedStartMonth = 6;
int calculatedEndYear = 2026;
int calculatedEndMonth = 8;
// Act
var (startYear, startMonth, endYear, endMonth) = _simulator.ApplySeptemberSpecialCase(
currentYear, currentMonth,
calculatedStartYear, calculatedStartMonth,
calculatedEndYear, calculatedEndMonth);
int monthCount = _simulator.CalculateMonthCount(startYear, startMonth, endYear, endMonth);
// Assert - Requirements 5.5: Only 12 months for September
Assert.Equal(12, monthCount);
}
[Fact]
public void SeptemberSpecialCase_DoesNotAffectOtherMonths()
{
// Arrange
int currentYear = 2025;
int currentMonth = 10; // October (not September)
int calculatedStartYear = 2025;
int calculatedStartMonth = 7;
int calculatedEndYear = 2026;
int calculatedEndMonth = 9;
// Act
var (startYear, startMonth, endYear, endMonth) = _simulator.ApplySeptemberSpecialCase(
currentYear, currentMonth,
calculatedStartYear, calculatedStartMonth,
calculatedEndYear, calculatedEndMonth);
// Assert - Non-September months should keep original calculated values
Assert.Equal(calculatedStartYear, startYear);
Assert.Equal(calculatedStartMonth, startMonth);
Assert.Equal(calculatedEndYear, endYear);
Assert.Equal(calculatedEndMonth, endMonth);
}
[Fact]
public void SeptemberSpecialCase_IncludesHistoricalMonths()
{
// Arrange
int currentYear = 2025;
int currentMonth = 9; // September
int calculatedStartYear = 2025;
int calculatedStartMonth = 6;
int calculatedEndYear = 2026;
int calculatedEndMonth = 8;
// Act
var (startYear, startMonth, endYear, endMonth) = _simulator.ApplySeptemberSpecialCase(
currentYear, currentMonth,
calculatedStartYear, calculatedStartMonth,
calculatedEndYear, calculatedEndMonth);
// Assert - Requirements 5.2: Includes June, July, August as historical
// The window starts at January, so June (month 6) is included
Assert.True(startMonth <= 6); // June is month 6
Assert.True(endMonth >= 6);
}
[Fact]
public void SeptemberSpecialCase_IncludesCurrentMonth()
{
// Arrange
int currentYear = 2025;
int currentMonth = 9; // September
int calculatedStartYear = 2025;
int calculatedStartMonth = 6;
int calculatedEndYear = 2026;
int calculatedEndMonth = 8;
// Act
var (startYear, startMonth, endYear, endMonth) = _simulator.ApplySeptemberSpecialCase(
currentYear, currentMonth,
calculatedStartYear, calculatedStartMonth,
calculatedEndYear, calculatedEndMonth);
// Assert - Requirements 5.3: Includes September as current month
Assert.True(startMonth <= 9); // September is month 9
Assert.True(endMonth >= 9);
}
[Fact]
public void SeptemberSpecialCase_IncludesPredictedMonths()
{
// Arrange
int currentYear = 2025;
int currentMonth = 9; // September
int calculatedStartYear = 2025;
int calculatedStartMonth = 6;
int calculatedEndYear = 2026;
int calculatedEndMonth = 8;
// Act
var (startYear, startMonth, endYear, endMonth) = _simulator.ApplySeptemberSpecialCase(
currentYear, currentMonth,
calculatedStartYear, calculatedStartMonth,
calculatedEndYear, calculatedEndMonth);
// Assert - Requirements 5.4: Predicts October, November, December
Assert.True(endMonth >= 12); // December is month 12
Assert.Equal(currentYear, endYear); // Same year
}
[Fact]
public void SeptemberSpecialCase_DoesNotIncludeNextYear()
{
// Arrange
int currentYear = 2025;
int currentMonth = 9; // September
int calculatedStartYear = 2025;
int calculatedStartMonth = 6;
int calculatedEndYear = 2026;
int calculatedEndMonth = 8;
// Act
var (startYear, startMonth, endYear, endMonth) = _simulator.ApplySeptemberSpecialCase(
currentYear, currentMonth,
calculatedStartYear, calculatedStartMonth,
calculatedEndYear, calculatedEndMonth);
// Assert - Requirements 5.5: Does not include any months from next year
Assert.Equal(currentYear, endYear);
Assert.Equal(12, endMonth); // Ends at December of current year
}
}
}