basename(dirname($path)), glob($root . '/*/module.json') ?: [] ); sort($moduleDirectories); $manifest = require __DIR__ . '/Symcon/manifest.php'; $registeredModules = array_keys($manifest); sort($registeredModules); self::assertSame( $moduleDirectories, $registeredModules, 'Jedes Modul benötigt einen Eintrag in tests/Symcon/manifest.php.' ); } public function testRegisteredScriptsReturnCallableTests(): void { $manifest = require __DIR__ . '/Symcon/manifest.php'; foreach ($manifest as $module => $definition) { self::assertArrayHasKey('file', $definition, $module); self::assertArrayHasKey('paths', $definition, $module); self::assertFileExists($definition['file'], $module); self::assertIsArray($definition['paths'], $module); self::assertNotEmpty($definition['paths'], $module); self::assertIsCallable(require $definition['file'], $module); } } public function testFrameworkAndRunnerScriptsExist(): void { foreach ([ 'TestContext.php', 'TestRunner.php', 'bootstrap.php', 'bin/affected-modules.php', 'bin/run-symcon-tests.sh', ] as $file) { self::assertFileExists(__DIR__ . '/Symcon/' . $file); } } public function testAffectedModuleResolverSelectsAllMatches(): void { self::assertSame( [ 'LadestationGateway', 'LadestationStandAlone', 'Manager', 'Pufferspeicher', 'VerbraucherEinStufig', 'Warmwassererwaermer', ], $this->resolveAffectedModules(['libs/Nachrichtenvertrag.php']) ); } public function testAffectedModuleResolverSelectsManagerForLicenseChecks(): void { self::assertSame( ['Manager'], $this->resolveAffectedModules(['libs/Lizenzpruefung.php']) ); } public function testAffectedModuleResolverSelectsAllModulesForFrameworkChanges(): void { self::assertSame( [ 'EaseeGateway', 'LadestationGateway', 'LadestationStandAlone', 'Manager', 'Pufferspeicher', 'VerbraucherEinStufig', 'Warmwassererwaermer', ], $this->resolveAffectedModules(['tests/Symcon/TestContext.php']) ); } /** @param list $paths * @return list */ private function resolveAffectedModules(array $paths): array { $argv = array_merge(['affected-modules.php'], $paths); ob_start(); require __DIR__ . '/Symcon/bin/affected-modules.php'; $output = ob_get_clean(); self::assertIsString($output); $modules = json_decode($output, true, 512, JSON_THROW_ON_ERROR); self::assertIsArray($modules); sort($modules); return $modules; } }