Das Ändern von Kategorie oder Klasse im Kontoblatt lud bisher die ganze Seite neu, um die Zeile zu aktualisieren – dabei sprang der Bildschirm nach ganz oben. kontoblatt.js schickt die Auswahl jetzt per fetch im Hintergrund; Kategorie, Klasse und das Symbol der Bargeld-Abgleichspalte aktualisieren sich an Ort und Stelle, die Bildlaufposition bleibt stehen. Ohne JavaScript bleibt es bei der bisherigen Weiterleitung.
94 lines
4.5 KiB
PHP
94 lines
4.5 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
use Finanzmanager\View;
|
||
|
||
class DarstellungTest extends TestCase
|
||
{
|
||
protected string $testName = 'Test 05: Darstellung (Formate auf Deutsch)';
|
||
|
||
public function run(): void
|
||
{
|
||
$this->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', '<script>'), '<script>'),
|
||
'Ein Hinweis wird maskiert'
|
||
);
|
||
}
|
||
}
|