Introduce unit testing on calculation objects

This commit is contained in:
2025-12-02 20:06:05 -05:00
parent 8039e751d8
commit 1c38003027
10 changed files with 1203 additions and 51 deletions
+54 -37
View File
@@ -1,12 +1,19 @@
using Core.Calculation;
using Core.Entities;
using Tests.Parsers;
using Tests.Builders;
using Tests.Fixtures;
namespace Tests.Calculation;
[TestFixture]
public class TeamSchedulerTest
{
[SetUp]
public void SetUp()
{
BuilderExtensions.ResetAllBuilders();
}
[Test]
public void Prototype_Test()
{
@@ -17,40 +24,57 @@ public class TeamSchedulerTest
[Test]
public void SolutionTest()
{
var events = TestEntityHandler.GetEvents();
var students = TestEntityHandler.GetStudents(events);
var allTeams = TestEntityHandler.GetTeams(events, students);
var teams = allTeams;
// Create test data with regional team events for TeamScheduler
var robotics = EventDefinitionBuilder.Team("Robotics", 2, 5).AsRegionalEvent().Build();
var biotech = EventDefinitionBuilder.Team("Biotechnology", 2, 6).AsRegionalEvent().Build();
var webDesign = EventDefinitionBuilder.Team("Website Design", 3, 6).AsRegionalEvent().Build();
var videoGame = EventDefinitionBuilder.Team("Video Game Design", 2, 6).AsRegionalEvent().Build();
var engineering = EventDefinitionBuilder.Team("Engineering Design", 3, 6).AsRegionalEvent().Build();
var cybersecurity = EventDefinitionBuilder.Team("Cybersecurity", 2, 6).AsRegionalEvent().Build();
teams =
(from e in events
from t in teams
where t.Event == e
//&& t.Students.Count > 1
&& (e.EventFormat == EventFormat.Team && e.RegionalEvent)
select t).ToArray();
teams =
teams.Where(t => !t.Event.Name.Contains("Tech Bowl")).ToArray();
var events = new[] { robotics, biotech, webDesign, videoGame, engineering, cybersecurity };
//var eventAssignment = new EventAssignment(events, students);
//var teams = eventAssignment.Solve();
// Create students
var alice = StudentBuilder.Default().WithName("Alice", "A").WithGrade(9).WithTsaYear(1).Build();
var bob = StudentBuilder.Default().WithName("Bob", "B").WithGrade(10).WithTsaYear(2).Build();
var carol = StudentBuilder.Default().WithName("Carol", "C").WithGrade(11).WithTsaYear(3).Build();
var david = StudentBuilder.Default().WithName("David", "D").WithGrade(9).WithTsaYear(1).Build();
var eve = StudentBuilder.Default().WithName("Eve", "E").WithGrade(10).WithTsaYear(2).Build();
var frank = StudentBuilder.Default().WithName("Frank", "F").WithGrade(11).WithTsaYear(3).Build();
var grace = StudentBuilder.Default().WithName("Grace", "G").WithGrade(9).WithTsaYear(1).Build();
var henry = StudentBuilder.Default().WithName("Henry", "H").WithGrade(10).WithTsaYear(2).Build();
TeamSchedulerSolution solution;
if (true)
var students = new[] { alice, bob, carol, david, eve, frank, grace, henry };
// Create teams with student assignments
var allTeams = new[]
{
var teamScheduler = new TeamScheduler(teams, 3, students);
solution = teamScheduler.Solve();
}
else
{
var teamScheduler = new TeamScheduler_DecisionTree(teams, 3);
solution = teamScheduler.Solve();
}
TeamBuilder.Default().ForEvent(robotics).WithStudentsAndCaptain(alice, bob, carol).WithIdentifier("Robotics A").Build(),
TeamBuilder.Default().ForEvent(biotech).WithStudentsAndCaptain(david, eve, frank).WithIdentifier("Biotech A").Build(),
TeamBuilder.Default().ForEvent(webDesign).WithStudentsAndCaptain(grace, henry, alice).WithIdentifier("WebDesign A").Build(),
TeamBuilder.Default().ForEvent(videoGame).WithStudentsAndCaptain(bob, david).WithIdentifier("VideoGame A").Build(),
TeamBuilder.Default().ForEvent(engineering).WithStudentsAndCaptain(carol, eve, frank).WithIdentifier("Engineering A").Build(),
TeamBuilder.Default().ForEvent(cybersecurity).WithStudentsAndCaptain(grace, henry).WithIdentifier("Cybersecurity A").Build()
};
//solution = new UnassignedStudentScheduler(allTeams, solution.TimeSlots).ScheduleStrategy(UnassignedScheduleStrategy.BiggestGroup);
//solution = new UnassignedStudentScheduler(allTeams, solution.TimeSlots).ScheduleStrategy(UnassignedScheduleStrategy.IndividualEvents);
// Filter to only regional team events (matching original test logic)
var teams = allTeams
.Where(t => t.Event.EventFormat == EventFormat.Team && t.Event.RegionalEvent)
.ToArray();
// Verify we have teams to schedule
Assert.That(teams, Is.Not.Empty, "Should have teams to schedule");
// Run TeamScheduler with 3 time slots
var teamScheduler = new TeamScheduler(teams, 3, students);
var solution = teamScheduler.Solve();
// Verify solution
Assert.That(solution, Is.Not.Null);
Assert.That(solution.TimeSlots, Is.Not.Null);
Assert.That(solution.TimeSlots.Length, Is.EqualTo(3), "Should have 3 time slots");
// Print solution (matching original test output format)
var i = 1;
foreach (var slot in solution.TimeSlots)
{
@@ -73,17 +97,10 @@ public class TeamSchedulerTest
}
var unassigned = UnassignedStudentScheduler.UnassignedStudents(students, slot.Teams).ToList();
if (unassigned.Any())
Console.WriteLine("\tunassigned");
Console.WriteLine($"\t\t{string.Join(", ", unassigned.Select(s => s.FirstName))}");
}
//var allScheduledTeams = timeSlots.SelectMany(list => list).GroupBy(t => t.Name).SelectMany(g => g).Distinct();
//foreach (var allScheduledTeam in allScheduledTeams.OrderBy(a => a.Name))
//{
// Console.WriteLine($"{allScheduledTeam.Name}");
// Console.WriteLine($"\t{string.Join(", ", allScheduledTeam.Students.Select(s => s.FirstName))}");
//}
}
}