$expected) { $path = __DIR__ . '/' . $relative; if (!is_file($path) || hash_file('sha256', $path) !== $expected) { throw new RuntimeException('Source manifest mismatch: ' . $relative); } $command = escapeshellarg(PHP_BINARY) . ' -l ' . escapeshellarg($path); $lines = []; exec($command, $lines, $code); if ($code !== 0) { throw new RuntimeException('PHP syntax failure: ' . $relative); } } require __DIR__ . '/libs/NetzfahrplanV4Bezugszaehler.php'; require __DIR__ . '/libs/NetzfahrplanV4Betriebsdaten.php'; require __DIR__ . '/libs/ManagerNetzfahrplanV4Trait.php'; require __DIR__ . '/tests/fixtures/NativeV4Scenarios.php'; require __DIR__ . '/tests/fixtures/V4BezugszaehlerScenarios.php'; $native = \Belevo\EnelixEMS\Tests\NativeV4Scenarios::run(); $meters = \Belevo\EnelixEMS\Tests\V4BezugszaehlerScenarios::run(); if (count($native) !== 24 || count($meters) !== 20) { throw new RuntimeException('Expected 24 native and 20 meter scenarios.'); } foreach (array_merge($native, $meters) as $name) { echo 'PASS ', $name, "\n"; } echo 'PHP ', PHP_VERSION, ': 44 offline conversion scenarios passed.', "\n"; echo "NOT a full EMS suite and NOT an IP-Symcon runtime/physical test.\n"; } catch (Throwable $error) { fwrite(STDERR, 'FAIL: ' . $error->getMessage() . "\n"); exit(1); }