Refactor event occurrence parsing by introducing modular components for improved maintainability

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.
This commit is contained in:
2026-01-08 20:23:57 -05:00
parent 7ddc55f672
commit f916cfad6b
16 changed files with 1631 additions and 342 deletions
@@ -0,0 +1,107 @@
using Core.Entities;
using Core.Parsers.EventOccurrence;
using NUnit.Framework;
namespace Tests.Parsers.EventOccurrence;
[TestFixture]
public class EventDefinitionResolver_Tests
{
[Test]
public void Resolve_SpecialEventPattern_MeetTheCandidates_ReturnsCorrectDefinition()
{
// Act
var result = EventDefinitionResolver.Resolve("Meet the Candidates Session 1", null);
// Assert
Assert.That(result, Is.EqualTo(EventDefinition.MeetTheCandidates));
}
[Test]
public void Resolve_SpecialEventPattern_ChapterOfficerMeeting_ReturnsCorrectDefinition()
{
// Act
var result = EventDefinitionResolver.Resolve("Chapter Officer Meeting - MS", null);
// Assert
Assert.That(result, Is.EqualTo(EventDefinition.ChapterOfficerMeeting));
}
[Test]
public void Resolve_SpecialEventPattern_VotingDelegateMeeting_ReturnsCorrectDefinition()
{
// Act
var result = EventDefinitionResolver.Resolve("Voting Delegate Meeting", null);
// Assert
Assert.That(result, Is.EqualTo(EventDefinition.VotingDelegateMeeting));
}
[Test]
public void Resolve_SpecialEventPattern_CaseInsensitive_Works()
{
// Act
var result = EventDefinitionResolver.Resolve("MEET THE CANDIDATES", null);
// Assert
Assert.That(result, Is.EqualTo(EventDefinition.MeetTheCandidates));
}
[Test]
public void Resolve_GeneralSchedule_CurrentEventGeneralSchedule_ReturnsGeneralSchedule()
{
// Act
var result = EventDefinitionResolver.Resolve("Some Event Name", EventDefinition.GeneralSchedule);
// Assert
Assert.That(result, Is.EqualTo(EventDefinition.GeneralSchedule));
}
[Test]
public void Resolve_CurrentEventDefinition_ReturnsCurrentEvent()
{
// Arrange
var currentEvent = new EventDefinition { Name = "Test Event" };
// Act
var result = EventDefinitionResolver.Resolve("Some Occurrence", currentEvent);
// Assert
Assert.That(result, Is.EqualTo(currentEvent));
}
[Test]
public void Resolve_SpecialEventPattern_TakesPrecedenceOverCurrentEvent()
{
// Arrange
var currentEvent = new EventDefinition { Name = "Test Event" };
// Act
var result = EventDefinitionResolver.Resolve("Meet the Candidates Session 1", currentEvent);
// Assert
Assert.That(result, Is.EqualTo(EventDefinition.MeetTheCandidates));
Assert.That(result, Is.Not.EqualTo(currentEvent));
}
[Test]
public void Resolve_NoMatch_ReturnsNull()
{
// Act
var result = EventDefinitionResolver.Resolve("Unknown Event Name", null);
// Assert
Assert.That(result, Is.Null);
}
[Test]
public void Resolve_NoMatch_CurrentEventNull_ReturnsNull()
{
// Act
var result = EventDefinitionResolver.Resolve("Unknown Event Name", null);
// Assert
Assert.That(result, Is.Null);
}
}