Persönliche Klausurlast pro Woche, Mitarbeit-Reset und Sitzplan-Strichliste
CI / build-and-test (push) Canceled after 0s
CI / build-and-test (push) Canceled after 0s
- Klausuren: neuer ExamWeekLoadService zählt eigene Klausuren je ISO-Woche über alle Kurse hinweg (Klassen-Kollisionen deckt bereits der externe Klausurplaner ab). Hinweis direkt im ExamDialog beim Datum, zusätzlich neue Dashboard-Karte "Klausurwochen" für die 60-Tage-Vorausschau. - Mitarbeit: Schnelleingabe-Dialog kann eine Bewertung jetzt per Entf auf "nicht bewertet" zurücksetzen (bisher nur im Sitzplatz-Dialog möglich). - Sitzplan: Strichliste "gemeldet"/"gemeldet und drangekommen" direkt auf der Sitzplatz-Kachel (ParticipationEntry.RaisedHandCount/CalledOnCount); schlägt im Sitzplatz-Dialog eine Quantitätsbewertung vor (ein Klick zum Übernehmen, nie automatisch). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
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<Exam>
|
||||
{
|
||||
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<Exam> { 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<Exam>
|
||||
{
|
||||
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<Exam> { 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<Exam>
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
using LehrerApp.Core.Models;
|
||||
using Xunit;
|
||||
|
||||
namespace LehrerApp.Tests;
|
||||
|
||||
/// Tests für den Quantitäts-Vorschlag aus der Sitzplan-Strichliste (Nutzer-Feedback):
|
||||
/// wie oft sich jemand meldet, schlägt direkt eine Quantitätsbewertung vor.
|
||||
public sealed class ParticipationCountSuggestionTests
|
||||
{
|
||||
[Theory]
|
||||
[InlineData(0, -2)]
|
||||
[InlineData(1, -1)]
|
||||
[InlineData(2, 0)]
|
||||
[InlineData(3, 0)]
|
||||
[InlineData(4, 1)]
|
||||
[InlineData(5, 1)]
|
||||
[InlineData(6, 2)]
|
||||
[InlineData(20, 2)]
|
||||
public void SuggestQuantity_Scale5_BildetMeldungszahlAufStufeAb(int raisedHandCount, int expected)
|
||||
{
|
||||
Assert.Equal(expected, ParticipationCountSuggestion.SuggestQuantity(AspectValueType.Scale5, raisedHandCount));
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData(AspectValueType.Scale3)]
|
||||
[InlineData(AspectValueType.Binary)]
|
||||
[InlineData(AspectValueType.Points)]
|
||||
public void SuggestQuantity_AndereTypen_GibtKeinenVorschlag(AspectValueType type)
|
||||
{
|
||||
Assert.Null(ParticipationCountSuggestion.SuggestQuantity(type, 5));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user