<?php
declare(strict_types=1);
$root=realpath($argv[1]??'');if(!$root||!is_file($root.'/vendor/autoload.php')){exit(78);}
$loader=require $root.'/vendor/autoload.php';$loader->setPsr4('app\\',$root.'/app/');$loader->setPsr4('cores\\',$root.'/cores/');spl_autoload_register(static function(string $class)use($root):void{foreach(['app\\'=>'app/','cores\\'=>'cores/'] as $prefix=>$dir){if(strpos($class,$prefix)===0){$file=$root.'/'.$dir.str_replace('\\','/',substr($class,strlen($prefix))).'.php';if(is_file($file)){require $file;}return;}}},true,true);
$count=0;
foreach([\app\store\model\Coupon::class,\app\terminal\model\Coupon::class] as $class){
    $make=static function(array $extra)use($class){$m=(new ReflectionClass($class))->newInstanceWithoutConstructor();$m->data(array_merge(['coupon_id'=>11,'name'=>'CDX_ADMIN_CONTRACT','total_num'=>10,'receive_num'=>0,'expire_type'=>10,'scene'=>20,'unavailable_dates'=>null,'unavailable_time_ranges'=>'[]'], $extra));return $m;};
    foreach([[0,'0.00'],[12.34,'12.34'],[99999999.99,'99999999.99'],['0.00','0.00'],['12.34','12.34'],[null,null],['invalid','invalid']] as [$value,$expected]){
        $m=$make(['reduce_price'=>$value,'min_price'=>$value,'write_off_limit_amount'=>$value]);$out=$m->toArray();
        foreach(['reduce_price','min_price','write_off_limit_amount'] as $field){++$count;if($out[$field]!==$expected){throw new RuntimeException('Known DECIMAL response mismatch '.$class.' '.$field);}++$count;if($m->getData($field)!==$value){throw new RuntimeException('Raw input mutated');}}
        ++$count;if($out['coupon_id']!==11||$out['scene']!==20||$out['unavailable_dates']!==null||$out['unavailable_time_ranges']!=='[]'){throw new RuntimeException('Unrelated fields changed');}
    }
    ++$count;if(array_intersect(['reduce_price','min_price','write_off_limit_amount'],array_keys($make([])->toArray()))){throw new RuntimeException('Missing field fabricated');}
}
echo json_encode(['status'=>'pass','assertions'=>$count,'database_requests'=>0,'scope'=>'serializer_only_no_constructor_hydrate']),PHP_EOL;
