<?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/api/service/Card.php';$reflection=new \ReflectionClass('app\\api\\service\\Card');$checks=0;$fails=[];
$check=static function($label,$actual,$wanted)use(&$checks,&$fails){$checks++;if($actual!==$wanted){$fails[]=$label;}};
foreach(['normalizeCardListResponseRow','normalizeCardLogResponseRow'] as $name){$check($name.'.present',$reflection->hasMethod($name),true);}
if($fails){echo json_encode(['assertions'=>$checks,'failures'=>$fails,'database_operations'=>0]),PHP_EOL;exit(1);}
$object=$reflection->newInstanceWithoutConstructor();$list=$reflection->getMethod('normalizeCardListResponseRow');$list->setAccessible(true);$log=$reflection->getMethod('normalizeCardLogResponseRow');$log->setAccessible(true);
$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],[[],[]]];
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($dates as $i=>[$value,$formatted]){foreach([[$list,'issue_time'],[$log,'operate_time']] as [$method,$field]){$row=[$field=>$value,'other_time'=>$value,'operate_date'=>$value,'cost'=>1.25,'id'=>7];$expected=$row;$expected[$field]=$dm?$formatted:$value;$check($driver.'.'.$field.$i,$method->invoke($object,$row),$expected);}}
 foreach([0,1,2,3,4,5,127,128,255,-1,256,PHP_INT_MAX,'1','01',1.0,1.25,false,null,[], '1e0'] as $i=>$value){$row=['card_status'=>$value,'id'=>PHP_INT_MAX,'cost'=>'1.00','amount'=>1.25];$expected=$row;if($dm&&is_int($value)&&$value>=0&&$value<=255){$expected['card_status']=(string)$value;}$check($driver.'.status'.$i,$list->invoke($object,$row),$expected);$check($driver.'.log-other-status'.$i,$log->invoke($object,$row),$row);}
 $check($driver.'.list-absent',$list->invoke($object,[]),[]);$check($driver.'.log-absent',$log->invoke($object,[]),[]);
}
$source=file_get_contents($root.'/application/api/service/Card.php');
foreach([['public function getList(', 'public function getIssueStaff(', '$item = $this->normalizeCardListResponseRow($item);'],['public function getLogList(', 'public function exportLog(', '$item = $this->normalizeCardLogResponseRow($item);']] as [$begin,$end,$call]){$start=strpos($source,$begin);$finish=strpos($source,$end,$start);$check($begin.'.real-loop-call',strpos(substr($source,$start,$finish-$start),$call)!==false,true);}
echo json_encode(['assertions'=>$checks,'failures'=>$fails,'database_operations'=>0]),PHP_EOL;exit($fails?1:0);
}
