<?php
declare(strict_types=1);
$root=$argv[1]??'';require $root.'/vendor/autoload.php';require $root.'/vendor/topthink/framework/src/helper.php';require __DIR__.'/OrderReadResponseCandidate.php';require __DIR__.'/ControllerModelDoubles.php';
function getStoreId():int{return 2147001111;}
function app_name():string{return 'store';}
$common=file_get_contents($root.'/app/common.php');preg_match('/^function format_time\([^\n]+\n\{.*?^\}/ms',$common,$helper);eval($helper[0]);
require __DIR__.'/storeOrderControllerCandidate.php';require __DIR__.'/terminalOrderControllerCandidate.php';require __DIR__.'/storeRechargeControllerCandidate.php';require __DIR__.'/terminalRechargeControllerCandidate.php';
class BoundaryMysql extends \think\db\connector\Mysql {public function connect(array $config=[],$linkNum=0,$autoConnection=false):\PDO{throw new RuntimeException('No PDO permitted');}public function getFields(string $table):array{return [];}}
class BoundaryDm extends \app\common\database\Dm {public function connect(array $config=[],$linkNum=0,$autoConnection=false):\PDO{throw new RuntimeException('No PDO permitted');}public function getFields(string $table):array{return [];}}
$cfg=new \think\Config();$cfg->set(['success'=>200,'error'=>500],'status');\think\Container::getInstance()->instance(\think\Config::class,$cfg);\think\Container::getInstance()->instance('config',$cfg);\think\App::$trace_id='123456789abcd';$count=0;$check=static function($ok,$why)use(&$count){$count++;if(!$ok)throw new RuntimeException($why);};
$request=(new \think\Request())->withGet(['dataType'=>'all']);\think\Container::getInstance()->instance(\think\Request::class,$request);\think\Container::getInstance()->instance(\think\Cookie::class,new \think\Cookie($request));$wire=static function($response){if(!$response instanceof \think\response\Json)throw new RuntimeException('Actual controller must return Json');return json_decode($response->getContent(),true);};
foreach([false,true] as $dm){$db=new \think\DbManager();$db->setConfig(['default'=>'test','auto_timestamp'=>false,'connections'=>['test'=>['type'=>'\\'.($dm?BoundaryDm::class:BoundaryMysql::class),'builder'=>\think\db\builder\Mysql::class,'prefix'=>'yoshop_','fields_strict'=>false]]]);\think\Container::getInstance()->instance(\think\DbManager::class,$db);
foreach(['store','terminal'] as $module){$class='app\\'.$module.'\\controller\\Order';$rc=new ReflectionClass($class);$controller=$rc->newInstanceWithoutConstructor();$prop=new ReflectionProperty(\cores\BaseController::class,'request');$prop->setAccessible(true);$prop->setValue($controller,$request);
foreach([null,false,[]] as $missing){$GLOBALS['order_controller_detail']=$missing;$b=$wire($controller->detail(1));$check($b===['status'=>500,'message'=>'未找到该订单记录','data'=>[],'trace_id'=>'123456789abcd'],'Original null/false/empty error Json contract '.json_encode($b,JSON_UNESCAPED_UNICODE));}
foreach([['order_id'=>1,'total_price'=>$dm?0:'0.00','keep'=>[]],new \app\common\model\Order(['order_id'=>1,'order_status'=>20,'pay_status'=>10,'total_price'=>$dm?0:'0.00','coupon_money'=>$dm?0:'0.00','update_price'=>$dm?0:'0.00','order_price'=>$dm?0:'0.00','pay_time'=>0,'delivery_time'=>0,'receipt_time'=>0,'order_source_data'=>'{}'])] as $detail){$GLOBALS['order_controller_detail']=$detail;$b=$wire($controller->detail(1));$check($b['status']===200&&$b['data']['detail']['total_price']==='0.00','Real controller array or actual Model toArray money');$check($b['data']['detail']['order_id']===1,'ID unchanged');if(is_object($detail)){$check($b['data']['detail']['state_text']==='已取消','Real Model getter through Controller Json');$check($b['data']['detail']['update_price']===['symbol'=>'+','value'=>'0.00'],'Compound getter preserved');}}
$GLOBALS['order_controller_items']=[['order_id'=>1,'total_price'=>$dm?0:'0.00','user'=>['balance'=>$dm?0:'0.00','user_id'=>9],'goods'=>[['goods_price'=>$dm?0:'0.00','goods_id'=>8]]]];$b=$wire($controller->list('all'));$check($b['data']['dataType']==='all'&&$b['data']['list']['per_page']===10&&$b['data']['list']['total']===1,'Actual Paginator and outer shape');$check($b['data']['list']['data'][0]['user']['balance']==='0.00'&&$b['data']['list']['data'][0]['goods'][0]['goods_price']==='0.00','Nested exact DTO paths through Json');
$recharge='app\\'.$module.'\\controller\\user\\Recharge';$rr=new ReflectionClass($recharge);$ctrl=$rr->newInstanceWithoutConstructor();$prop->setValue($ctrl,$request);$GLOBALS['recharge_controller_items']=[['order_id'=>2,'pay_price'=>$dm?0:'0.00','user'=>['balance'=>$dm?0:'0.00'],'order_plan'=>['money'=>$dm?0:'0.00','plan_id'=>0]]];$b=$wire($ctrl->order());$check($b['data']['list']['per_page']===15&&$b['data']['list']['data'][0]['pay_price']==='0.00'&&$b['data']['list']['data'][0]['order_plan']['money']==='0.00','Actual recharge Controller/Paginator/Json');}
$check($db->getQueryTimes()===0,'Explicit noIO model dependencies and actual Controller serialization');}
echo json_encode(['assertions'=>$count,'PDO_opens'=>0,'actual_Controller_and_Json'=>true,'auth_bypass_only_in_unit_test'=>true]),"\n";
