From c9371924960fb62ec33bf0f5fc52c0d86ca0c831 Mon Sep 17 00:00:00 2001 From: James Kolpack Date: Wed, 7 Jan 2026 08:37:00 -0500 Subject: [PATCH] Add tests for event occurrence parsing results for 2024 and 2025 competitions This commit introduces new unit tests in EventOccurrenceParser_Tests to analyze and validate the parsing results for the 2025 Nationals, 2025 State, and 2024 State competitions. Each test verifies that the parser returns valid results without exceptions and provides detailed output on the total lines, occurrences parsed, and issues found. Additionally, a new method in TestEntityHandler has been added to retrieve the 2024 State competition event times file, supporting the new tests. --- Tests/Parsers/EventOccurrenceParser_Tests.cs | 133 +++++++++++++++++++ Tests/Parsers/TestEntityHandler.cs | 5 + 2 files changed, 138 insertions(+) diff --git a/Tests/Parsers/EventOccurrenceParser_Tests.cs b/Tests/Parsers/EventOccurrenceParser_Tests.cs index 7d30170..1aabd60 100644 --- a/Tests/Parsers/EventOccurrenceParser_Tests.cs +++ b/Tests/Parsers/EventOccurrenceParser_Tests.cs @@ -1,4 +1,5 @@ using Core.Entities; +using Core.Models; using Core.Parsers; namespace Tests.Parsers; @@ -134,4 +135,136 @@ public class EventOccurrenceParser_Tests Assert.Pass(); } + + [Test] + public void Analyze_2025Nationals_ParsingResults() + { + // Arrange + var events = TestEntityHandler.GetEvents(); + var fileInfo = TestEntityHandler.GetEventOccurrenceNationalsFileInfo(); + var locationConfig = LocationParsingConfiguration.Default; + var parser = new EventOccurrenceParser(fileInfo, events, locationConfig); + + // Act + var result = parser.Parse(); + + // Assert - Should parse without exceptions + Assert.That(result, Is.Not.Null, "Parser should return a result"); + + // Analyze and report results + var totalLines = File.ReadAllLines(fileInfo.FullName).Length; + var issuesByType = result.Issues.GroupBy(i => i.IssueType).ToDictionary(g => g.Key, g => g.Count()); + var totalParsed = result.Occurrences.Values.Sum(list => list.Count); + + Console.WriteLine($"\n=== 2025 TSA Nationals Competition Event Times Analysis ==="); + Console.WriteLine($"Total lines in file: {totalLines}"); + Console.WriteLine($"Total occurrences parsed: {totalParsed}"); + Console.WriteLine($"Total issues found: {result.Issues.Count}"); + Console.WriteLine($"Issues by type:"); + foreach (var kvp in issuesByType.OrderByDescending(x => x.Value)) + { + Console.WriteLine($" {kvp.Key}: {kvp.Value}"); + } + Console.WriteLine($"Events with occurrences: {result.Occurrences.Count}"); + Console.WriteLine($"Special events found:"); + if (result.Occurrences.ContainsKey(EventDefinition.GeneralSchedule)) + Console.WriteLine($" GeneralSchedule: {result.Occurrences[EventDefinition.GeneralSchedule].Count} occurrences"); + if (result.Occurrences.ContainsKey(EventDefinition.MeetTheCandidates)) + Console.WriteLine($" MeetTheCandidates: {result.Occurrences[EventDefinition.MeetTheCandidates].Count} occurrences"); + if (result.Occurrences.ContainsKey(EventDefinition.ChapterOfficerMeeting)) + Console.WriteLine($" ChapterOfficerMeeting: {result.Occurrences[EventDefinition.ChapterOfficerMeeting].Count} occurrences"); + if (result.Occurrences.ContainsKey(EventDefinition.VotingDelegateMeeting)) + Console.WriteLine($" VotingDelegateMeeting: {result.Occurrences[EventDefinition.VotingDelegateMeeting].Count} occurrences"); + + // Test passes if no exceptions were thrown + Assert.Pass($"Successfully parsed {totalParsed} occurrences with {result.Issues.Count} issues"); + } + + [Test] + public void Analyze_2025State_ParsingResults() + { + // Arrange + var events = TestEntityHandler.GetEvents(); + var fileInfo = TestEntityHandler.GetEventOccurrenceStateFileInfo(); + var locationConfig = LocationParsingConfiguration.Default; + var parser = new EventOccurrenceParser(fileInfo, events, locationConfig); + + // Act + var result = parser.Parse(); + + // Assert - Should parse without exceptions + Assert.That(result, Is.Not.Null, "Parser should return a result"); + + // Analyze and report results + var totalLines = File.ReadAllLines(fileInfo.FullName).Length; + var issuesByType = result.Issues.GroupBy(i => i.IssueType).ToDictionary(g => g.Key, g => g.Count()); + var totalParsed = result.Occurrences.Values.Sum(list => list.Count); + + Console.WriteLine($"\n=== 2025 TN TSA State Competition Event Times Analysis ==="); + Console.WriteLine($"Total lines in file: {totalLines}"); + Console.WriteLine($"Total occurrences parsed: {totalParsed}"); + Console.WriteLine($"Total issues found: {result.Issues.Count}"); + Console.WriteLine($"Issues by type:"); + foreach (var kvp in issuesByType.OrderByDescending(x => x.Value)) + { + Console.WriteLine($" {kvp.Key}: {kvp.Value}"); + } + Console.WriteLine($"Events with occurrences: {result.Occurrences.Count}"); + Console.WriteLine($"Special events found:"); + if (result.Occurrences.ContainsKey(EventDefinition.GeneralSchedule)) + Console.WriteLine($" GeneralSchedule: {result.Occurrences[EventDefinition.GeneralSchedule].Count} occurrences"); + if (result.Occurrences.ContainsKey(EventDefinition.MeetTheCandidates)) + Console.WriteLine($" MeetTheCandidates: {result.Occurrences[EventDefinition.MeetTheCandidates].Count} occurrences"); + if (result.Occurrences.ContainsKey(EventDefinition.ChapterOfficerMeeting)) + Console.WriteLine($" ChapterOfficerMeeting: {result.Occurrences[EventDefinition.ChapterOfficerMeeting].Count} occurrences"); + if (result.Occurrences.ContainsKey(EventDefinition.VotingDelegateMeeting)) + Console.WriteLine($" VotingDelegateMeeting: {result.Occurrences[EventDefinition.VotingDelegateMeeting].Count} occurrences"); + + // Test passes if no exceptions were thrown + Assert.Pass($"Successfully parsed {totalParsed} occurrences with {result.Issues.Count} issues"); + } + + [Test] + public void Analyze_2024State_ParsingResults() + { + // Arrange + var events = TestEntityHandler.GetEvents(); + var fileInfo = TestEntityHandler.GetEventOccurrenceState2024FileInfo(); + var locationConfig = LocationParsingConfiguration.Default; + var parser = new EventOccurrenceParser(fileInfo, events, locationConfig); + + // Act + var result = parser.Parse(); + + // Assert - Should parse without exceptions + Assert.That(result, Is.Not.Null, "Parser should return a result"); + + // Analyze and report results + var totalLines = File.ReadAllLines(fileInfo.FullName).Length; + var issuesByType = result.Issues.GroupBy(i => i.IssueType).ToDictionary(g => g.Key, g => g.Count()); + var totalParsed = result.Occurrences.Values.Sum(list => list.Count); + + Console.WriteLine($"\n=== 2024 TN TSA State Competition Event Times Analysis ==="); + Console.WriteLine($"Total lines in file: {totalLines}"); + Console.WriteLine($"Total occurrences parsed: {totalParsed}"); + Console.WriteLine($"Total issues found: {result.Issues.Count}"); + Console.WriteLine($"Issues by type:"); + foreach (var kvp in issuesByType.OrderByDescending(x => x.Value)) + { + Console.WriteLine($" {kvp.Key}: {kvp.Value}"); + } + Console.WriteLine($"Events with occurrences: {result.Occurrences.Count}"); + Console.WriteLine($"Special events found:"); + if (result.Occurrences.ContainsKey(EventDefinition.GeneralSchedule)) + Console.WriteLine($" GeneralSchedule: {result.Occurrences[EventDefinition.GeneralSchedule].Count} occurrences"); + if (result.Occurrences.ContainsKey(EventDefinition.MeetTheCandidates)) + Console.WriteLine($" MeetTheCandidates: {result.Occurrences[EventDefinition.MeetTheCandidates].Count} occurrences"); + if (result.Occurrences.ContainsKey(EventDefinition.ChapterOfficerMeeting)) + Console.WriteLine($" ChapterOfficerMeeting: {result.Occurrences[EventDefinition.ChapterOfficerMeeting].Count} occurrences"); + if (result.Occurrences.ContainsKey(EventDefinition.VotingDelegateMeeting)) + Console.WriteLine($" VotingDelegateMeeting: {result.Occurrences[EventDefinition.VotingDelegateMeeting].Count} occurrences"); + + // Test passes if no exceptions were thrown + Assert.Pass($"Successfully parsed {totalParsed} occurrences with {result.Issues.Count} issues"); + } } \ No newline at end of file diff --git a/Tests/Parsers/TestEntityHandler.cs b/Tests/Parsers/TestEntityHandler.cs index d96ffa4..fc6d5c8 100644 --- a/Tests/Parsers/TestEntityHandler.cs +++ b/Tests/Parsers/TestEntityHandler.cs @@ -27,6 +27,11 @@ public static class TestEntityHandler return FileUtility.GetContentFile(ContentDirectory, "2025 TN TSA State Competition Event Times.txt"); } + public static FileInfo GetEventOccurrenceState2024FileInfo() + { + return FileUtility.GetContentFile(ContentDirectory, "2024 TN TSA State Competition Event Times.txt"); + } + public static Student[] GetStudents(IList events) { //var studentEventRankingsCsv = "Student Event Rankings.csv";