OpenNIT

Quelltext des aktuellen Standes

Fassung 1.1.1

IconAvailabilityTest.php

3 KB
<?php

declare(strict_types=1);

/**
 * Deckt ab, dass jedes benutzte Icon auch ankommt.
 *
 * Ein Icon-Name, den die mitgelieferte Schriftart nicht kennt, erzeugt keinen
 * Fehler – die Stelle bleibt einfach leer. Das fällt erst auf, wenn jemand
 * hinsieht. Die Namen aus Font Awesome 6 (`fa-xmark`, `fa-gear`,
 * `fa-triangle-exclamation` …) sind besonders verführerisch, weil sie überall
 * dokumentiert sind; die ausgelieferte Fassung kennt nur die älteren.
 */
return static function (): void {

    $wurzel = dirname(__DIR__);

    /** Alle Icons, die die mitgelieferte Schriftart darstellen kann. */
    $verfuegbar = static function () use ($wurzel): array {
        $css = (string)file_get_contents($wurzel . '/public/assets/fontawesome/css/fontawesome.min.css');
        preg_match_all('/\.(fa-[a-z0-9-]+):before/', $css, $m);
        return array_flip($m[1]);
    };

    /** Alle Icons, die Vorlagen und Skripte verwenden: Name => Fundstellen. */
    $benutzt = static function () use ($wurzel): array {
        $treffer = [];
        $dateien = array_merge(
            glob($wurzel . '/templates/*.php') ?: [],
            glob($wurzel . '/templates/*/*.php') ?: [],
            glob($wurzel . '/templates/*/*/*.php') ?: [],
            glob($wurzel . '/public/assets/js/*.js') ?: []
        );
        foreach ($dateien as $datei) {
            $inhalt = (string)file_get_contents($datei);
            // Nur mit Stil-Präfix (fas/far/fab …), wie der Umschalter es erwartet.
            preg_match_all('/\bfa[srlbd]?\s+(fa-[a-z0-9-]+)/', $inhalt, $m);
            foreach ($m[1] as $name) {
                $treffer[$name][] = str_replace($wurzel . '/', '', $datei);
            }
        }
        return $treffer;
    };

    test('Die mitgelieferte Schriftart kennt jedes benutzte Icon', function () use ($verfuegbar, $benutzt) {
        $da     = $verfuegbar();
        $fehlt  = [];
        foreach ($benutzt() as $name => $stellen) {
            if (!isset($da[$name])) {
                $fehlt[] = $name . ' (' . count($stellen) . 'x, z. B. ' . $stellen[0] . ')';
            }
        }
        assertSame([], $fehlt, "Diese Icons bleiben leer:\n  " . implode("\n  ", $fehlt));
    });

    test('Die Schriftart bringt ueberhaupt Icons mit', function () use ($verfuegbar) {
        // Schlägt der Auslesepfad fehl, wäre der Test oben immer grün.
        assertTrue(count($verfuegbar()) > 500, 'Die Icon-Liste konnte nicht gelesen werden');
    });

    test('Jedes benutzte Icon steht in der Emoji-Karte', function () use ($wurzel, $benutzt) {
        // Fehlt der Eintrag, bleibt das Icon im Emoji-Modus monochrom.
        $karte = (string)file_get_contents($wurzel . '/src/Core/IconMap.php');
        preg_match_all("/'(fa-[a-z0-9-]+)'\s*=>/", $karte, $m);
        $bekannt = array_flip($m[1]);

        $fehlt = [];
        foreach (array_keys($benutzt()) as $name) {
            if (!isset($bekannt[$name])) {
                $fehlt[] = $name;
            }
        }
        assertSame([], $fehlt, 'Ohne Eintrag in IconMap: ' . implode(', ', $fehlt));
    });
};