<?php
declare(strict_types=1);

require __DIR__ . '/race_worker_exit_policy.php';

$fields = array_fill(0, 20, '0');
$fields[0] = 'S';
$fields[19] = '123456';
$parsed = raceParseProcStat('4321 (php -S private) ' . implode(' ', $fields));
if ($parsed !== ['state' => 'S', 'start_ticks' => '123456']) {
    throw new RuntimeException('Stat parser did not select field 22');
}
$cases = [
    [null, '123456', false, 'exited'],
    [null, '123456', true, 'port_reoccupied'],
    [['state' => 'Z', 'start_ticks' => '123456'], '123456', false, 'exited'],
    [['state' => 'X', 'start_ticks' => '123456'], '123456', false, 'exited'],
    [['state' => 'Z', 'start_ticks' => '123456'], '123456', true, 'port_reoccupied'],
    [['state' => 'S', 'start_ticks' => '123456'], '123456', false, 'active'],
    [['state' => 'R', 'start_ticks' => '123456'], '123456', true, 'active'],
    [['state' => 'S', 'start_ticks' => '999999'], '123456', false, 'pid_reused'],
    [['state' => 'Z', 'start_ticks' => '999999'], '123456', false, 'pid_reused'],
    [null, '', false, 'identity_unknown'],
];
foreach ($cases as $index => $case) {
    if (raceWorkerExitDecision($case[0], $case[1], $case[2]) !== $case[3]) {
        throw new RuntimeException('Worker exit policy case ' . $index . ' failed');
    }
}
foreach (['malformed', '4321 (x) S 0', '4321 (x) Q ' . implode(' ', array_slice($fields, 1))]
    as $bad) {
    try {
        raceParseProcStat($bad);
        throw new RuntimeException('Malformed process stat accepted');
    } catch (RuntimeException $error) {
        if ($error->getMessage() === 'Malformed process stat accepted') throw $error;
    }
}
echo json_encode(['status' => 'offline_pass', 'cases' => count($cases),
    'malformed_denied' => 3, 'workers_started' => false,
    'db_connected' => false, 'business_http_sent' => false,
    'dml_sent' => false]), PHP_EOL;
