using LehrerApp.Core.Models; using LehrerApp.Core.Services; using Xunit; namespace LehrerApp.Tests; public class ExamWeekLoadServiceTests { private static Exam MakeExam(DateOnly date, ExamStatus status = ExamStatus.Planned) => new() { GroupId = Guid.NewGuid(), Title = "Klausur", Status = status, Date = date, }; [Fact] public void CountInSameWeek_ZaehltNurKlausurenInDerselbenIsoWoche() { // KW 12/2026: Montag 16.03. bis Sonntag 22.03. var monday = new DateOnly(2026, 3, 16); var exams = new List { MakeExam(monday), MakeExam(monday.AddDays(4)), // Freitag derselben Woche MakeExam(monday.AddDays(-1)), // Sonntag der Vorwoche MakeExam(monday.AddDays(7)), // Montag der Folgewoche }; var count = ExamWeekLoadService.CountInSameWeek(exams, monday.AddDays(2)); Assert.Equal(2, count); } [Fact] public void CountInSameWeek_SchliesstAngegebeneKlausurAus() { var monday = new DateOnly(2026, 3, 16); var editing = MakeExam(monday); var exams = new List { editing, MakeExam(monday.AddDays(1)) }; var count = ExamWeekLoadService.CountInSameWeek(exams, monday, editing.Id); Assert.Equal(1, count); } [Fact] public void FindOverloadedWeeks_MeldetNurWochenAbDemSchwellenwert() { var monday = new DateOnly(2026, 3, 16); var exams = new List { MakeExam(monday), MakeExam(monday.AddDays(1)), // KW 12: 2 -> unauffällig MakeExam(monday.AddDays(7)), MakeExam(monday.AddDays(8)), MakeExam(monday.AddDays(9)), // KW 13: 3 -> Meldung }; var overloaded = ExamWeekLoadService.FindOverloadedWeeks(exams); var week = Assert.Single(overloaded); Assert.Equal(3, week.ExamCount); Assert.Equal(monday.AddDays(7), week.WeekStart); } [Fact] public void FindOverloadedWeeks_OhneHaeufung_GibtLeereListeZurueck() { var monday = new DateOnly(2026, 3, 16); var exams = new List { MakeExam(monday), MakeExam(monday.AddDays(7)) }; Assert.Empty(ExamWeekLoadService.FindOverloadedWeeks(exams)); } [Fact] public void FindOverloadedWeeks_SortiertChronologisch() { var laterWeek = new DateOnly(2026, 4, 20); var earlierWeek = new DateOnly(2026, 3, 16); var exams = new List { MakeExam(laterWeek), MakeExam(laterWeek.AddDays(1)), MakeExam(laterWeek.AddDays(2)), MakeExam(earlierWeek), MakeExam(earlierWeek.AddDays(1)), MakeExam(earlierWeek.AddDays(2)), }; var overloaded = ExamWeekLoadService.FindOverloadedWeeks(exams); Assert.Equal(2, overloaded.Count); Assert.True(overloaded[0].WeekStart < overloaded[1].WeekStart); } }