<?php
declare(strict_types=1);
require __DIR__ . '/ValueNormalizer.php';
$n = 0;
function same($expected, $actual): void {
    global $n;
    ++$n;
    if ($expected !== $actual) { throw new RuntimeException('Mismatch assertion ' . $n); }
}
function norm($value, string $type, int $precision = 0, int $scale = 0) {
    return ExactFetchValue::convert($value, ['native_type'=>$type,'precision'=>$precision,'scale'=>$scale]);
}
same(7, norm('7','int'));
same(0, norm('0','int'));
same(-7, norm('-7','smallint'));
same(PHP_INT_MAX, norm((string)PHP_INT_MAX,'bigint'));
same(PHP_INT_MIN, norm((string)PHP_INT_MIN,'bigint'));
same('9223372036854775808', norm('9223372036854775808','bigint'));
same('-9223372036854775809', norm('-9223372036854775809','bigint'));
same('18446744073709551615', norm('18446744073709551615','bigint'));
same(1.25, norm('1.25','double'));
same(1.0e-8, norm('1e-8','double'));
same(null, norm(null,'number',20,0));
same('9007199254740993.01', norm('9007199254740993.01','number',30,2));
same('1700000000.123456', norm('1700000000.123456','number',16,6));
same('1.20', norm('1.2','number',5,2));
same('0.00', norm('0','number',5,2));
same('0.00', norm('-0','number',5,2));
same('-1.20', norm('-1.2','number',5,2));
same('1.20', norm('1.2000','number',5,2));
same('18446744073709551615', norm('18446744073709551615','number',20,0));
same('1.2', norm('1.2','number'));
same('2026-10-01 01:02:03.000000', norm('2026-10-01 01:02:03.000000','timestamp'));
same('007', norm('007','varchar'));
same('', norm('','varchar'));
same(false, norm(false,'boolean'));
foreach ([['1.234','number',5,2], [9007199254740994.0,'number',30,2], ['1e30','number',38,2], ['1.1','bigint',0,0], ['INF','double',0,0]] as $bad) {
    $thrown = false;
    try { norm(...$bad); } catch (UnexpectedValueException $e) { $thrown = true; }
    same(true, $thrown);
}
echo json_encode(['assertions'=>$n,'status'=>'pass']) . PHP_EOL;
