monatsnamen(); $this->betraege(); $this->datumsformat(); $this->bargeldMarke(); } private function monatsnamen(): void { $this->assertEquals('Januar', View::monat(1), 'Erster Monat heißt Januar'); $this->assertEquals('März', View::monat(3), 'Umlaut im Monatsnamen bleibt erhalten'); $this->assertEquals('Dezember', View::monat(12), 'Letzter Monat heißt Dezember'); $this->assertEquals('Mär', View::monat(3, true), 'Kurzform mit Umlaut'); $this->assertEquals('Dez', View::monat(12, true), 'Kurzform des letzten Monats'); $this->assertEquals(12, count(View::MONATE), 'Zwölf Monatsnamen'); $this->assertEquals(12, count(View::MONATE_KURZ), 'Zwölf Kurzformen'); // Vollständige Sollliste: date('F') liefert englische Namen, und für // April, August, September und November fällt das nicht auf, weil sie // in beiden Sprachen gleich heißen. Deshalb Wert für Wert vergleichen. $soll = ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember']; foreach ($soll as $i => $name) { $this->assertEquals($name, View::monat($i + 1), 'Monat ' . ($i + 1) . ' heißt ' . $name); $this->assertNotEmpty(View::monat($i + 1, true), 'Kurzform für Monat ' . ($i + 1) . ' vorhanden'); } // Ungültige Werte dürfen die Oberfläche nicht zerlegen. $this->assertEquals('0', View::monat(0), 'Unbekannter Monat gibt die Zahl zurück'); $this->assertEquals('13', View::monat(13), 'Monat außerhalb des Bereichs gibt die Zahl zurück'); } private function betraege(): void { $this->assertEquals('1.234,50', View::betrag(1234.5, false), 'Deutsches Zahlenformat'); $this->assertEquals("1.234,50\u{00A0}€", View::betrag(1234.5), 'Währung mit geschütztem Leerzeichen'); $this->assertEquals('-58.457,07', View::betrag(-58457.07, false), 'Negativer Betrag'); $this->assertEquals('betrag negativ', View::betragKlasse(-1), 'Negative Beträge werden markiert'); $this->assertEquals('betrag', View::betragKlasse(0), 'Null gilt nicht als negativ'); } private function datumsformat(): void { $this->assertEquals('18.03.2026', View::datum('2026-03-18'), 'Deutsches Datumsformat'); $this->assertEquals('18.03.2026', View::datum('2026-03-18 14:22:01'), 'Zeitanteil wird abgeschnitten'); $this->assertEquals('–', View::datum(null), 'Leeres Datum als Gedankenstrich'); } /** * Das Symbol der Bargeld-Abgleichspalte – eigenständig in View, damit die * Schnellzuordnung im Kontoblatt es auch für die Ajax-Antwort bilden kann, * ohne die Seite neu zu laden. */ private function bargeldMarke(): void { $gefunden = View::bargeldMarke('gefunden', null); $this->assert(str_contains($gefunden, 'bargeld-gefunden'), 'Gefunden bekommt seine Klasse'); $this->assert(str_contains($gefunden, '✓'), 'Und sein Zeichen'); $this->assert(str_contains($gefunden, 'Im Bargeld-Tool gefunden'), 'Und den Standardtitel'); $fehlt = View::bargeldMarke('fehlt', null); $this->assert(str_contains($fehlt, 'bargeld-fehlt'), 'Fehlt bekommt seine Klasse'); $this->assert(str_contains($fehlt, '✗'), 'Und sein Zeichen'); $fehler = View::bargeldMarke('fehler', 'Zeitüberschreitung'); $this->assert(str_contains($fehler, 'bargeld-fehler'), 'Fehler bekommt seine Klasse'); $this->assert(str_contains($fehler, '!'), 'Und sein Zeichen'); $this->assert(str_contains($fehler, 'Zeitüberschreitung'), 'Ein eigener Hinweis geht vor dem Standardtitel'); $neutral = View::bargeldMarke(null, null); $this->assert(str_contains($neutral, 'bargeld-neutral'), 'Ohne Status der graue Kreis'); $this->assert(str_contains($neutral, '●'), 'Und sein Zeichen'); $unbekannt = View::bargeldMarke('unfug', null); $this->assertEquals($neutral, $unbekannt, 'Ein unbekannter Status gilt wie kein Status'); $this->assert( str_contains(View::bargeldMarke('gefunden', '