using System; using Xunit; namespace YunDa.SOMS.MongoDB.Application.Tests.Inspection { /// /// 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 /// public class CalculateDisplayWindowTests { /// /// Helper class to expose the internal CalculateDisplayWindow method for testing /// 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 } } }