using Core.Utility; using NUnit.Framework; namespace Tests.Utility; [TestFixture] public class TextUtil_Tests { [Test] public void ParseDate_ValidInput_ReturnsCorrectDate() { // Arrange & Act var result = TextUtil.ParseDate("January", "15", 2025); // Assert Assert.That(result, Is.EqualTo(new DateOnly(2025, 1, 15))); } [Test] public void ParseDate_AllMonths_AreSupported() { // Arrange var months = new[] { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; var expectedDates = new[] { new DateOnly(2025, 1, 15), new DateOnly(2025, 2, 15), new DateOnly(2025, 3, 15), new DateOnly(2025, 4, 15), new DateOnly(2025, 5, 15), new DateOnly(2025, 6, 15), new DateOnly(2025, 7, 15), new DateOnly(2025, 8, 15), new DateOnly(2025, 9, 15), new DateOnly(2025, 10, 15), new DateOnly(2025, 11, 15), new DateOnly(2025, 12, 15), }; // Act & Assert for (int i = 0; i < months.Length; i++) { var result = TextUtil.ParseDate(months[i], "15", 2025); Assert.That(result, Is.EqualTo(expectedDates[i]), $"Month {months[i]} should parse correctly"); } } [Test] public void ParseDate_CaseInsensitive_Works() { // Arrange & Act var result1 = TextUtil.ParseDate("JANUARY", "15", 2025); var result2 = TextUtil.ParseDate("january", "15", 2025); var result3 = TextUtil.ParseDate("JaNuArY", "15", 2025); // Assert Assert.That(result1, Is.EqualTo(new DateOnly(2025, 1, 15))); Assert.That(result2, Is.EqualTo(new DateOnly(2025, 1, 15))); Assert.That(result3, Is.EqualTo(new DateOnly(2025, 1, 15))); } [Test] public void ParseDate_InvalidMonth_ThrowsArgumentException() { // Arrange, Act & Assert Assert.Throws(() => TextUtil.ParseDate("InvalidMonth", "15", 2025)); } [Test] public void ParseDate_InvalidDay_ThrowsFormatException() { // Arrange, Act & Assert Assert.Throws(() => TextUtil.ParseDate("January", "abc", 2025)); } [Test] public void ParseDate_InvalidDate_ThrowsArgumentOutOfRangeException() { // Arrange, Act & Assert - February 30 doesn't exist Assert.Throws(() => TextUtil.ParseDate("February", "30", 2025)); } [Test] public void ParseDate_LeapYear_February29_Works() { // Arrange & Act var result = TextUtil.ParseDate("February", "29", 2024); // 2024 is a leap year // Assert Assert.That(result, Is.EqualTo(new DateOnly(2024, 2, 29))); } [Test] public void ParseDate_NonLeapYear_February29_Throws() { // Arrange, Act & Assert - 2025 is not a leap year Assert.Throws(() => TextUtil.ParseDate("February", "29", 2025)); } [Test] public void ParseDate_SingleDigitDay_Works() { // Arrange & Act var result = TextUtil.ParseDate("March", "3", 2025); // Assert Assert.That(result, Is.EqualTo(new DateOnly(2025, 3, 3))); } [Test] public void ParseDate_DifferentYears_Works() { // Arrange & Act var result2024 = TextUtil.ParseDate("January", "1", 2024); var result2025 = TextUtil.ParseDate("January", "1", 2025); var result2026 = TextUtil.ParseDate("January", "1", 2026); // Assert Assert.That(result2024, Is.EqualTo(new DateOnly(2024, 1, 1))); Assert.That(result2025, Is.EqualTo(new DateOnly(2025, 1, 1))); Assert.That(result2026, Is.EqualTo(new DateOnly(2026, 1, 1))); } [Test] public void ParseDate_FirstDayOfMonth_Works() { // Arrange & Act var result = TextUtil.ParseDate("December", "1", 2025); // Assert Assert.That(result, Is.EqualTo(new DateOnly(2025, 12, 1))); } [Test] public void ParseDate_LastDayOfMonth_Works() { // Arrange & Act var result = TextUtil.ParseDate("January", "31", 2025); // Assert Assert.That(result, Is.EqualTo(new DateOnly(2025, 1, 31))); } }