Enhance event occurrence parsing to skip unmatched high school section headers

This commit introduces a new property to track skipped high school section headers in the EventOccurrenceParseResult and EventOccurrenceParserResult classes. The EventOccurrenceParser has been updated to gracefully skip HS section headers that do not match any event definitions, improving the parsing logic. Additionally, the LocationParsingConfiguration has been removed from the EventOccurrenceParser, simplifying its constructor. Unit tests have been updated to reflect these changes and ensure correct behavior during parsing.
This commit is contained in:
2026-01-09 00:14:19 -05:00
parent f916cfad6b
commit 19e5ef0675
10 changed files with 279 additions and 372 deletions
@@ -1,4 +1,3 @@
using Core.Models;
using Core.Parsers.EventOccurrence;
using NUnit.Framework;
@@ -10,110 +9,69 @@ public class TimeLocationParser_Tests
[Test]
public void Parse_TimeAndLocation_ExtractsBoth()
{
// Arrange
var locationConfig = new LocationParsingConfiguration
{
LocationPatterns = new List<string> { "Room *" }
};
// Act
TimeLocationParser.Parse("10:30 a.m. Room 101", locationConfig,
out string time, out string location, out bool locationParseSuccess);
TimeLocationParser.Parse("10:30 a.m. Room 101",
out string time, out string location);
// Assert
Assert.That(time, Is.EqualTo("10:30 a.m."));
Assert.That(location, Is.EqualTo("Room 101"));
Assert.That(locationParseSuccess, Is.True);
}
[Test]
public void Parse_TimeRangeAndLocation_ExtractsTimeRangeAndLocation()
{
// Arrange
var locationConfig = new LocationParsingConfiguration
{
LocationPatterns = new List<string> { "Room *" }
};
// Act
TimeLocationParser.Parse("10:00 a.m. - 12:00 p.m. Room 202", locationConfig,
out string time, out string location, out bool locationParseSuccess);
TimeLocationParser.Parse("10:00 a.m. - 12:00 p.m. Room 202",
out string time, out string location);
// Assert
Assert.That(time, Is.EqualTo("10:00 a.m. - 12:00 p.m."));
Assert.That(location, Is.EqualTo("Room 202"));
Assert.That(locationParseSuccess, Is.True);
}
[Test]
public void Parse_NOONAndLocation_ExtractsBoth()
{
// Arrange
var locationConfig = new LocationParsingConfiguration
{
LocationPatterns = new List<string> { "Hall *" }
};
// Act
TimeLocationParser.Parse("NOON Hall C", locationConfig,
out string time, out string location, out bool locationParseSuccess);
TimeLocationParser.Parse("NOON Hall C",
out string time, out string location);
// Assert
Assert.That(time, Is.EqualTo("NOON"));
Assert.That(location, Is.EqualTo("Hall C"));
Assert.That(locationParseSuccess, Is.True);
}
[Test]
public void Parse_TimeOnly_NoLocation()
{
// Arrange
var locationConfig = new LocationParsingConfiguration
{
LocationPatterns = new List<string> { "Room *" }
};
// Act
TimeLocationParser.Parse("3:00 p.m.", locationConfig,
out string time, out string location, out bool locationParseSuccess);
TimeLocationParser.Parse("3:00 p.m.",
out string time, out string location);
// Assert
Assert.That(time, Is.EqualTo("3:00 p.m."));
Assert.That(location, Is.Empty);
Assert.That(locationParseSuccess, Is.True); // No location is valid
}
[Test]
public void Parse_LocationNotMatchingPattern_StillReturnsLocation_ReportsFailure()
public void Parse_AnyLocation_ExtractsLocationWithoutValidation()
{
// Arrange
var locationConfig = new LocationParsingConfiguration
{
LocationPatterns = new List<string> { "Room *" }
};
// Act
TimeLocationParser.Parse("10:00 a.m. Unknown Location", locationConfig,
out string time, out string location, out bool locationParseSuccess);
TimeLocationParser.Parse("10:00 a.m. Unknown Location",
out string time, out string location);
// Assert
Assert.That(time, Is.EqualTo("10:00 a.m."));
Assert.That(location, Is.EqualTo("Unknown Location"));
Assert.That(locationParseSuccess, Is.False);
}
[Test]
public void Parse_LocationWithTimeComponent_CleansTimeComponent()
{
// Arrange
var locationConfig = new LocationParsingConfiguration
{
LocationPatterns = new List<string> { "Exhibit Hall *" }
};
// Act
TimeLocationParser.Parse("10:00 a.m. - 12:15 p.m. Exhibit Hall C", locationConfig,
out string time, out string location, out bool locationParseSuccess);
TimeLocationParser.Parse("10:00 a.m. - 12:15 p.m. Exhibit Hall C",
out string time, out string location);
// Assert
Assert.That(time, Is.EqualTo("10:00 a.m. - 12:15 p.m."));
@@ -121,16 +79,15 @@ public class TimeLocationParser_Tests
}
[Test]
public void Parse_NoLocationConfig_StillExtractsTimeAndLocation()
public void Parse_AnyLocation_ExtractsAsIs()
{
// Act
TimeLocationParser.Parse("3:00 p.m. Room A", null,
out string time, out string location, out bool locationParseSuccess);
TimeLocationParser.Parse("3:00 p.m. Room A",
out string time, out string location);
// Assert
Assert.That(time, Is.EqualTo("3:00 p.m."));
Assert.That(location, Is.EqualTo("Room A"));
Assert.That(locationParseSuccess, Is.False); // No patterns to match against
}
[Test]