#!/usr/bin/env php getPathname()] = true; } } return $bestand; } /** * Liefert die neu hinzugekommenen Pfade, ohne deren Unterpfade (sonst meldet * ein neues Verzeichnis auch jede darin liegende Datei einzeln). */ function neuePfade(array $vorher, array $nachher): array { $neu = array_keys(array_diff_key($nachher, $vorher)); sort($neu); $oberste = []; foreach ($neu as $pfad) { foreach ($oberste as $bekannt) { if (str_starts_with($pfad, $bekannt . '/')) continue 2; } $oberste[] = $pfad; } return $oberste; } // Alle Test-Dateien laden $testFiles = glob(__DIR__ . '/[0-9][0-9]*_*.php'); // Numerisch sortieren, damit 100_ hinter 99_ einsortiert wird usort($testFiles, fn(string $a, string $b): int => (int)basename($a) <=> (int)basename($b)); $testClasses = []; foreach ($testFiles as $file) { require_once $file; // Klassenname aus Dateiname ableiten: 01_BelegUploadTest.php → BelegUploadTest $base = basename($file, '.php'); $className = preg_replace('/^\d+_/', '', $base); if (class_exists($className)) { $testClasses[] = $className; } } if (empty($testClasses)) { fwrite(STDERR, "Keine Testklassen gefunden.\n"); exit(1); } if (!$jsonMode) { echo "\n\e[1m╔══════════════════════════════════════════╗\e[0m\n"; echo "\e[1m║ Steuerkram Test-Suite ║\e[0m\n"; echo "\e[1m╚══════════════════════════════════════════╝\e[0m\n"; } $allFailures = []; $dataVorher = datenBestand(); foreach ($testClasses as $class) { /** @var TestCase $test */ $test = new $class(); $failures = $test->execute(); $allFailures = array_merge($allFailures, $failures); } $summary = TestCase::globalSummary(); $rueckstaende = neuePfade($dataVorher, datenBestand()); if (!$jsonMode) { $total = $summary['passed'] + $summary['failed']; echo "\n\e[1m══════════════════════════════════════════\e[0m\n"; if ($summary['failed'] === 0) { echo "\e[32;1m✓ Alle {$summary['passed']} Tests bestanden.\e[0m\n"; } else { echo "\e[31;1m✗ {$summary['failed']} von {$total} Tests fehlgeschlagen:\e[0m\n"; foreach ($summary['failures'] as $failure) { echo " • {$failure}\n"; } } echo "\e[1m══════════════════════════════════════════\e[0m\n"; if ($rueckstaende) { echo "\n\e[33mHinweis: Der Testlauf hat Dateien in den Datenverzeichnissen hinterlassen:\e[0m\n"; foreach ($rueckstaende as $pfad) { echo " • {$pfad}\n"; } echo " Der zuständige Test sollte den Pfad über \e[1m\$this->registerTempPath()\e[0m anmelden.\n"; } echo "\n"; } else { echo json_encode([ 'passed' => $summary['passed'], 'failed' => $summary['failed'], 'failures' => $summary['failures'], ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); echo "\n"; } exit($summary['failed'] > 0 ? 1 : 0);