f916cfad6b
This commit restructures the EventOccurrenceParser by breaking down its functionality into modular components, including EventDefinitionResolver, LineClassifier, LocationPatternMatcher, SectionHeaderMatcher, TimeLocationParser, and TimeParser. This refactoring enhances code readability and maintainability, allowing for easier updates and testing. Additionally, the TextUtil class has been updated to include input sanitization methods. Comprehensive unit tests have been added to ensure the correctness of the new parsing logic and to validate the handling of various event occurrence scenarios.
147 lines
4.3 KiB
C#
147 lines
4.3 KiB
C#
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<ArgumentException>(() => TextUtil.ParseDate("InvalidMonth", "15", 2025));
|
|
}
|
|
|
|
[Test]
|
|
public void ParseDate_InvalidDay_ThrowsFormatException()
|
|
{
|
|
// Arrange, Act & Assert
|
|
Assert.Throws<FormatException>(() => TextUtil.ParseDate("January", "abc", 2025));
|
|
}
|
|
|
|
[Test]
|
|
public void ParseDate_InvalidDate_ThrowsArgumentOutOfRangeException()
|
|
{
|
|
// Arrange, Act & Assert - February 30 doesn't exist
|
|
Assert.Throws<ArgumentOutOfRangeException>(() => 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<ArgumentOutOfRangeException>(() => 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)));
|
|
}
|
|
}
|
|
|