<?php
declare(strict_types=1);
require '/workspace/zhct/zhctproject/ai_api/vendor/autoload.php';$model=$argv[1]??'/workspace/zhct/zhctproject/ai_api/app/terminal/model/meal/Meal.php';$service=$argv[2]??'/workspace/zhct/zhctproject/ai_api/app/terminal/service/meal/Meal.php';require $model;require $service;$mc=\app\terminal\model\meal\Meal::class;$sc=\app\terminal\service\meal\Meal::class;$pass=0;$fail=[];$assert=static function($v,$n)use(&$pass,&$fail){if($v)$pass++;else $fail[]=$n;};if(!method_exists($mc,'formatInfosDecimals')||!method_exists($sc,'mealTimeResponse')){echo json_encode(['assertions'=>1,'passed'=>0,'failed'=>['Original direct DEC/date projections reproduce missing narrow boundary']]),"\n";exit(1);}
$manager=new \think\DbManager;$manager->setConfig(['default'=>'unit','connections'=>['unit'=>['type'=>\app\common\database\Dm::class,'hostname'=>'127.0.0.1','database'=>'UNIT_ONLY','username'=>'','password'=>'','hostport'=>5238]]]);\think\Container::getInstance()->instance(\think\DbManager::class,$manager);$decimal=new ReflectionMethod($mc,'formatInfosDecimals');$decimal->setAccessible(true);$time=new ReflectionMethod($sc,'mealTimeResponse');$time->setAccessible(true);$fields=array_merge(['dishes_weight'],array_column(\app\common\enum\dishes\Nutrient::data(),'field'));$assert(count($fields)===38,'Exact observed 38 DEC fields');foreach($fields as $field){$row=[$field=>12.3,'id'=>21,'dishes_id'=>31,'unobserved_ratio'=>0.7];$out=$decimal->invoke(null,$row);$assert($out[$field]==='12.30','DM exact decimal string '.$field);$assert($out['id']===21&&$out['dishes_id']===31&&$out['unobserved_ratio']===0.7,'IDs and unobserved fields unchanged '.$field);$assert($row[$field]===12.3,'Input row unchanged '.$field);}
foreach([[['energy'=>null],['energy'=>null]],[[],[]],[['energy'=>'12.3'],['energy'=>'12.3']],[['energy'=>0],['energy'=>'0.00']],[['energy'=>99999999.99],['energy'=>'99999999.99']]] as $i=>[$row,$expected])$assert($decimal->invoke(null,$row)===$expected,'NULL/missing/text/zero/bound '.$i);
foreach([['2026-10-10 12:13:14.000000','2026-10-10 12:13:14'],['2026-10-10 12:13:14','2026-10-10 12:13:14'],['2026-10-10 12:13:14.000001','2026-10-10 12:13:14.000001'],['2026-02-31 12:13:14.000000','2026-02-31 12:13:14.000000'],['2026-10-10 25:13:14.000000','2026-10-10 25:13:14.000000'],['2026-10-10T12:13:14Z','2026-10-10T12:13:14Z'],[null,null],['',''],[21,21]] as $i=>[$input,$want])$assert($time->invoke(null,$input)===$want,'DM legal zero-fraction only '.$i);
$assert($time->invoke(null,'2026-10-10 12:13:14.0000000')==='2026-10-10 12:13:14.0000000','Unverified seven-digit fraction stays byte-identical');$assert($time->invoke(null,'0000-01-01 12:13:14.000000')==='0000-01-01 12:13:14.000000','Year zero is not promoted into valid business date');
$mysql=new \think\DbManager;$mysql->setConfig(['default'=>'unit','connections'=>['unit'=>['type'=>'mysql']]]);\think\Container::getInstance()->instance(\think\DbManager::class,$mysql);$row=[];foreach($fields as $f)$row[$f]=12.3;$assert($decimal->invoke(null,$row)===$row,'MySQL all scalar types untouched');$assert($time->invoke(null,'2026-10-10 12:13:14.000000')==='2026-10-10 12:13:14.000000','MySQL exact date bytes untouched');$assert($manager->getQueryTimes()===0&&$mysql->getQueryTimes()===0,'Real connector unit tests issue no DB query');$text=file_get_contents($model);$assert(strpos($text,'$infos[] = self::formatInfosDecimals($info);')!==false,'Actual getInfos append applies only this projection');$text=file_get_contents($service);$assert(strpos($text,"\$data['meal_time'] = self::mealTimeResponse(\$lastMeal['meal_time']);")!==false,'Actual infos date assignment uses source-bound helper');echo json_encode(['assertions'=>$pass+count($fail),'passed'=>$pass,'failed'=>$fail]),"\n";exit($fail?1:0);
