using Flaro.Core.Library; namespace Flaro.Core.Tests; /// Wann ein saisonaler Anlass gilt. /// /// /// Der Fall, an dem eine naive Prüfung scheitert: Silvester geht vom /// 28. Dezember bis zum 2. Januar. Ein Vergleich, der nur „von ≤ heute ≤ /// bis" kennt, fände diesen Zeitraum nie — und die Reihe stünde genau in /// den Tagen nicht da, für die sie gedacht ist. /// public class SaisonanlassTests { private static DateTimeOffset Am(int monat, int tag) => new(2026, monat, tag, 12, 0, 0, TimeSpan.Zero); private static Saisonanlass Anlass(string von, string bis) => new("Probe", von, bis, ["irgendwas"], []); [TestCase(10, 1, true)] [TestCase(10, 15, true)] [TestCase(11, 1, true)] [TestCase(9, 30, false)] [TestCase(11, 2, false)] public void Ein_Zeitraum_im_Jahr_gilt_von_Rand_zu_Rand(int monat, int tag, bool erwartet) => Assert.That(Anlass("10-01", "11-01").Gilt(Am(monat, tag)), Is.EqualTo(erwartet)); [TestCase(12, 28, true)] [TestCase(12, 31, true)] [TestCase(1, 1, true)] [TestCase(1, 2, true)] [TestCase(1, 3, false)] [TestCase(12, 27, false)] [TestCase(6, 15, false)] public void Ein_Zeitraum_ueber_den_Jahreswechsel_gilt_auch(int monat, int tag, bool erwartet) => Assert.That(Anlass("12-28", "01-02").Gilt(Am(monat, tag)), Is.EqualTo(erwartet)); [Test] public void Ein_einzelner_Tag_ist_ein_Zeitraum_von_null_Laenge() { var august = Anlass("08-01", "08-01"); Assert.Multiple(() => { Assert.That(august.Gilt(Am(8, 1)), Is.True); Assert.That(august.Gilt(Am(8, 2)), Is.False); Assert.That(august.Gilt(Am(7, 31)), Is.False); }); } [TestCase("")] [TestCase("Oktober")] [TestCase("13-01")] [TestCase("10-32")] [TestCase("10")] public void Ein_unleserliches_Datum_gilt_nie(string von) => Assert.That(Anlass(von, "11-01").Gilt(Am(10, 15)), Is.False); /// Ein Anlass ohne Stichwort und ohne Genre fände nie etwas. /// /// /// Ihn stillschweigend zu speichern hiesse, den Benutzer den Fehler /// woanders suchen zu lassen — die Reihe erschiene einfach nicht. /// [Test] public void Ohne_Stichwort_und_ohne_Genre_ist_ein_Anlass_unbrauchbar() { Assert.Multiple(() => { Assert.That(new Saisonanlass("Leer", "10-01", "11-01", [], []).Brauchbar, Is.False); Assert.That(new Saisonanlass("", "10-01", "11-01", ["x"], []).Brauchbar, Is.False); Assert.That(new Saisonanlass("Mit Genre", "10-01", "11-01", [], ["Horror"]).Brauchbar, Is.True); Assert.That(new Saisonanlass("Mit Wort", "10-01", "11-01", ["x"], []).Brauchbar, Is.True); }); } /// Die Vorgabe deckt das Jahr ab, ohne sich zu überschneiden. /// /// /// Zwei gleichzeitig geltende Anlässe wären kein Fehler — der Server /// nimmt den ersten —, aber einer davon stünde nie da, und das merkte /// niemand. /// [Test] public void Die_vorangelegten_Anlaesse_ueberschneiden_sich_nicht() { for (var tag = new DateTimeOffset(2026, 1, 1, 12, 0, 0, TimeSpan.Zero); tag.Year == 2026; tag = tag.AddDays(1)) { var geltend = Saisonanlass.Vorgabe.Where(a => a.Gilt(tag)).Select(a => a.Name).ToList(); Assert.That(geltend, Has.Count.LessThanOrEqualTo(1), $"am {tag:dd.MM.} gelten mehrere: {string.Join(", ", geltend)}"); } } }