using System; using Xunit; namespace YunDa.SOMS.MongoDB.Application.Tests.Inspection { /// /// Unit tests for September special case in GetYearlyStatisticsByMonthAsync /// Tests validate Requirements: 5.1, 5.2, 5.3, 5.4, 5.5 /// public class SeptemberSpecialCaseTests { /// /// Helper class to simulate the September special case logic /// 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 } } }