<?php
declare(strict_types=1);
namespace think {class Config {public static $driver='mysql';public static function get($key){return self::$driver;}}}
namespace app\common\service {class BaseService {}}
namespace {
$root=$argv[1]??'';require $root.'/application/p/logic/MealOrder.php';require $root.'/application/p/logic/Api.php';
$checks=0;$fails=[];$check=static function($label,$actual,$expected)use(&$checks,&$fails){$checks++;if($actual!==$expected){$fails[]=$label;}};
$classes=[['app\\p\\logic\\MealOrder','normalizeConsumerOrderListRow'],['app\\p\\logic\\Api','normalizeFaceDataCreateTime']];
foreach($classes as [$class,$method]){if(!(new \ReflectionClass($class))->hasMethod($method)){$check($method.'.present',false,true);}}
if($fails){echo json_encode(['assertions'=>$checks,'failures'=>$fails,'database_operations'=>0]),PHP_EOL;exit(1);}
$order=new \ReflectionClass($classes[0][0]);$obj=$order->newInstanceWithoutConstructor();$m=$order->getMethod($classes[0][1]);$m->setAccessible(true);
$fields=['total_price','pay_price','cash_payment','subsidy_payment','gift_payment','refund_amount','cash_refund_amount','subsidy_refund_amount','gift_refund_amount','remain_balance'];
foreach(['mysql','app\\cores\\database\\Dm','\\app\\cores\\database\\Dm','other'] as $driver){
 \think\Config::$driver=$driver;$dm=ltrim($driver,'\\')==='app\\cores\\database\\Dm';
 foreach($fields as $field){foreach([[0,'0.00'],[1,'1.00'],[1.2,'1.20'],[-1.2,'-1.20'],[99999999.99,'99999999.99'],[-99999999.99,'-99999999.99'],['1.20','1.20'],[null,null],['1e2','1e2'],[100000000,100000000],[INF,INF],[NAN,NAN]] as $i=>[$v,$want]){$row=[$field=>$v,'id'=>7,'meal_number'=>1.25,'other_decimal'=>2.5];$actual=$m->invoke($obj,$row);if(is_float($v)&&is_nan($v)){$check($driver.$field.$i,is_nan($actual[$field]),true);}else{$expected=$row;$expected[$field]=$dm?$want:$v;$check($driver.$field.$i,$actual,$expected);}}}
 $check($driver.'.absent',$m->invoke($obj,[]),[]);
}
$dates=[['2026-10-10 12:34:56.000000','2026-10-10 12:34:56'],['2024-02-29 00:00:00.0','2024-02-29 00:00:00'],['2026-10-10 12:34:56','2026-10-10 12:34:56'],['2026-10-10 12:34:56.000001','2026-10-10 12:34:56.000001'],['2026-02-31 12:34:56.000000','2026-02-31 12:34:56.000000'],['2026-10-10 24:00:00.0','2026-10-10 24:00:00.0'],['2026-10-10 12:60:00.0','2026-10-10 12:60:00.0'],['2026-10-10 12:34:60.0','2026-10-10 12:34:60.0'],['0999-01-01 00:00:00.0','0999-01-01 00:00:00.0'],['0000-00-00 00:00:00.0','0000-00-00 00:00:00.0'],['2026-10-10 12:34:56.0000000','2026-10-10 12:34:56.0000000'],[null,null],['',''],['-','-'],[0,0],[[],[]]];
$face=new \ReflectionClass($classes[1][0]);$faceObj=$face->newInstanceWithoutConstructor();$fm=$face->getMethod($classes[1][1]);$fm->setAccessible(true);
foreach(['mysql','app\\cores\\database\\Dm'] as $driver){\think\Config::$driver=$driver;foreach($dates as $i=>[$value,$wanted]){$wanted=$driver==='mysql'?$value:$wanted;foreach(['pay_time','bind_time'] as $field){$row=[$field=>$value,'other_time'=>$value];$expected=$row;$expected[$field]=$wanted;$check($driver.'.'.$field.$i,$m->invoke($obj,$row),$expected);}$check($driver.'.face'.$i,$fm->invoke($faceObj,$value),$wanted);}}
$source=file_get_contents($root.'/application/p/logic/MealOrder.php');$start=strpos($source,'public function getOrderList(');$end=strpos($source,'public function getRefundOrderList(',$start);$body=substr($source,$start,$end-$start);
$check('order-real-loop-call',strpos($body,'$item = $this->normalizeConsumerOrderListRow($item);')!==false,true);
$faceSource=file_get_contents($root.'/application/p/logic/Api.php');$start=strpos($faceSource,'public function getFaceDataList($params, $type)');$end=strpos($faceSource,'public function receiveBodyFat(',$start);$body=substr($faceSource,$start,$end-$start);
$check('face-real-assignment-call',strpos($body,"\$tmp['createTime'] = \$this->normalizeFaceDataCreateTime(\$hardImg[0]['create_time']);")!==false,true);
echo json_encode(['assertions'=>$checks,'failures'=>$fails,'database_operations'=>0]),PHP_EOL;exit($fails?1:0);
}
