<?php
declare(strict_types=1);
require __DIR__ . '/SqlCoverageRecorder.php';
$checks = 0;
$equal = static function ($a, $b) use (&$checks): void {
    ++$checks;
    if ($a !== $b) throw new RuntimeException('Assertion ' . $checks . ' failed');
};
$fp = static function (string $sql): string { return SqlCoverageRecorder::fingerprint($sql)['fingerprint']; };
$equal($fp("SELECT * FROM t WHERE name='secret' AND id=123"), $fp("select * from t where name='other' and id=456"));
$escapedSql = <<<'SQL'
SELECT 'x\'y', 'a''b', 1.23e-4, 0xAB
SQL;
$equal($fp($escapedSql), $fp("SELECT 'nothing', 'else', 77, 0xFF"));
$equal($fp("SELECT /* private */ 1 -- private\n FROM t"), $fp('SELECT 2 FROM t'));
$equal($fp('SELECT `Name` FROM `Table`'), $fp('SELECT "name" FROM "table"'));
$equal($fp('SELECT id FROM t') === $fp('SELECT name FROM t'), false);
$equal(SqlCoverageRecorder::fingerprint('UPDATE t SET n=2')['operation'], 'update');
$previousLocale = setlocale(LC_CTYPE, 0);
set_error_handler(static function ($severity, $message, $file, $line) {
    throw new ErrorException($message, 0, $severity, $file, $line);
});
try {
    foreach (['C', 'C.UTF-8', 'en_US.ISO8859-1', 'en_US.UTF-8'] as $locale) {
        if (setlocale(LC_CTYPE, $locale) === false) continue;
        $equal(SqlCoverageRecorder::fingerprint('SELECT 中文 FROM t')['lexical_warning'], true);
        $equal(SqlCoverageRecorder::fingerprint("SELECT '中文' FROM t")['lexical_warning'], false);
    }
    $equal(SqlCoverageRecorder::fingerprint("SELECT 'unterminated")['lexical_warning'], true);
} finally {
    restore_error_handler(); setlocale(LC_CTYPE, $previousLocale);
}
$dir = sys_get_temp_dir() . '/cdx-recorder-test-' . bin2hex(random_bytes(8));
if (!mkdir($dir, 0700)) throw new RuntimeException('Cannot create test destination');
$path = $dir . '/events.jsonl';
$r = new SqlCoverageRecorder($path, '/no-business-root', 'PILOT_UNIT');
$r->observe("SELECT 'SECRET_SENTINEL', 15500001234 FROM private_table");
$r->finish();
$raw = file_get_contents($path);
$equal(strpos($raw, 'SECRET_SENTINEL'), false);
$equal(strpos($raw, '15500001234'), false);
$equal(strpos($raw, 'private_table'), false);
$equal(count(explode("\n", trim($raw))), 2);
unlink($path); rmdir($dir);
echo json_encode(['status' => 'passed', 'assertions' => $checks]), "\n";
