<?php
require '/workspace/zhct/zhctproject/store/env.php';define('APP_PATH','/workspace/zhct/zhctproject/store/application/');require '/workspace/zhct/zhctproject/store/thinkphp/base.php';
set_exception_handler(static function(Throwable $error):void{echo json_encode(['passed'=>false,'class'=>get_class($error),'message'=>$error->getMessage()]),"\n";exit(2);});
$candidate='/tmp/cdx-ms-candidate-20261010/application/api/';require $candidate.'controller/MarketingStrategy.php';require $candidate.'service/MarketingStrategy.php';
$output=new ReflectionMethod(\app\api\controller\MarketingStrategy::class,'normalizeMarketingResponse');$output->setAccessible(true);$clock=new ReflectionMethod(\app\api\service\MarketingStrategy::class,'applyDmClock');$clock->setAccessible(true);$checks=0;$assert=static function($a,$b,string $reason)use(&$checks):void{++$checks;if($a!==$b)throw new RuntimeException($reason);};
$row=['strategy_name'=>'OWNED','strategy_value'=>0.02,'create_time'=>'2026-10-10 11:22:33.123456','update_time'=>'2026-10-10 11:22:33.000000','time_ranges'=>[['strategy_value'=>0.02]],'other_time'=>'2026-10-10 11:22:33.000000'];$expected=$row;$expected['strategy_value']='0.02';$expected['create_time']='2026-10-10 11:22:33';$expected['update_time']='2026-10-10 11:22:33';$assert($output->invoke(null,$row,true),$expected,'DM main fields');$assert($output->invoke(null,$row,false),$row,'MySQL full original');$assert($output->invoke(null,['data'=>[$row]],true),['data'=>[$expected]],'List nesting');
foreach([null,'','0.00','001.20',100000000] as $value){$r=['strategy_name'=>'OWNED','strategy_value'=>$value];$assert($output->invoke(null,$r,true),$r,'Preserve null/string/out-of-range');}
foreach(['2026-02-30 11:22:33.000000','2026-10-10 24:00:00.000000','2026-10-10 11:22:33',null,'',1720000000] as $value){$r=['strategy_name'=>'OWNED','create_time'=>$value];$assert($output->invoke(null,$r,true),$r,'Preserve invalid/nonfraction time');}$assert($output->invoke(null,['time_ranges'=>[['strategy_value'=>0.02]]],true),['time_ranges'=>[['strategy_value'=>0.02]]],'Do not cast nested explicit floats');
$data=['strategy_name'=>'OWNED','priority'=>7,'strategy_value'=>0.02,'remark'=>null];$assert($clock->invoke(null,$data,null,false),$data,'MySQL create untouched');$assert($clock->invoke(null,$data,$data,false),$data,'MySQL update untouched');$new=$clock->invoke(null,$data,null,true);$assert($new['create_time']===$new['update_time'],true,'Create one shared expression');$assert((string)$new['create_time'],'CAST(CURRENT_TIMESTAMP AS TIMESTAMP(0))','Trusted DB second expression');unset($new['create_time'],$new['update_time']);$assert($new,$data,'Create business untouched');$assert($clock->invoke(null,$data,$data,true),$data,'No-op untouched');
$old=$data;$old['priority']='7';$assert($clock->invoke(null,$data,$old,true),$data,'Integer string equivalent');$old=$data;$old['strategy_value']='0.02';$assert($clock->invoke(null,$data,$old,true),$data,'DEC10 numeric representation equivalent');$zero=$data;$zero['strategy_value']=0.0;$old=$zero;$old['strategy_value']=0;$assert($clock->invoke(null,$zero,$old,true),$zero,'DEC10 integer zero equivalent');$old=$data;$old['remark']='';$changed=$clock->invoke(null,$data,$old,true);$assert(isset($changed['update_time']),true,'NULL different empty string');$assert(array_key_exists('create_time',$changed),false,'Changed update never writes create_time');$old=$data;$old['strategy_name']='OTHER';$changed=$clock->invoke(null,$data,$old,true);$assert(isset($changed['update_time']),true,'Changed name clock');$assert($clock->invoke(null,$data,['strategy_name'=>'OTHER'],false),$data,'MySQL changed untouched');echo 'PRIVATE_MARKETING_CONTRACT_PASS '.$checks." checks\n";
