Unterrichtsplanung: Serienerzeugung, Stundenraster, Aufsichten & Vertretung (Kapitel 4.2/4.3 Nachtrag)

Stunden serienweise aus dem Stundenplan erzeugen (4.2.5); Stundenraster
(Uhrzeiten je Stunde) in den Einstellungen mit Zeitbedarf-Rückmeldung im
Verlaufsplan-Editor; wiederkehrende Pausenaufsicht; neuer "Vertretung
eintragen"-Dialog für einmalige Vertretungsaufsicht, Vertretungsstunde,
Sondereinsätze (Ausflüge, Berufsmessen) und schlichten Stundenausfall.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-15 21:59:07 +02:00
co-authored by Claude Sonnet 5
parent 99b2de6519
commit d6dee72acc
30 changed files with 2743 additions and 48 deletions
@@ -0,0 +1,56 @@
using LehrerApp.Core.Services;
using Xunit;
namespace LehrerApp.Tests;
public sealed class PeriodScheduleServiceTests
{
[Fact]
public void NeueKonfiguration_HatKeineStundenHinterlegt()
{
using var temp = new TempAppData();
var service = new PeriodScheduleService(temp.Path);
Assert.Empty(service.Periods);
Assert.Null(service.GetTimes(1));
Assert.Equal(0, service.GetDurationMinutes(1));
}
[Fact]
public void SetPeriods_WirdUeberNeueInstanzHinwegPersistiert()
{
using var temp = new TempAppData();
new PeriodScheduleService(temp.Path).SetPeriods(
[
new PeriodTimeEntry { PeriodNumber = 1, Start = new TimeOnly(8, 0), End = new TimeOnly(8, 45) },
new PeriodTimeEntry { PeriodNumber = 2, Start = new TimeOnly(8, 45), End = new TimeOnly(9, 30) },
]);
var second = new PeriodScheduleService(temp.Path);
Assert.Equal(45, second.GetDurationMinutes(1));
Assert.Equal((new TimeOnly(8, 45), new TimeOnly(9, 30)), second.GetTimes(2));
}
[Fact]
public void SetPeriods_ErsetztVorherigeKonfigurationVollstaendig()
{
using var temp = new TempAppData();
var service = new PeriodScheduleService(temp.Path);
service.SetPeriods([new PeriodTimeEntry { PeriodNumber = 1, Start = new TimeOnly(8, 0), End = new TimeOnly(8, 45) }]);
service.SetPeriods([new PeriodTimeEntry { PeriodNumber = 2, Start = new TimeOnly(8, 45), End = new TimeOnly(9, 30) }]);
Assert.Null(service.GetTimes(1));
Assert.NotNull(service.GetTimes(2));
}
private sealed class TempAppData : IDisposable
{
public string Path { get; } = System.IO.Path.Combine(
System.IO.Path.GetTempPath(), $"lehrerapp-periodschedule-tests-{Guid.NewGuid():N}");
public TempAppData() => Directory.CreateDirectory(Path);
public void Dispose() { if (Directory.Exists(Path)) Directory.Delete(Path, recursive: true); }
}
}