82 lines
2.9 KiB
PHP
82 lines
2.9 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
require dirname(__DIR__) . '/vendor/autoload.php';
|
|
|
|
use app\adminapi\logic\tcm\DiagnosisAiLogic;
|
|
|
|
function analysisParserExpect(bool $condition, string $message): void
|
|
{
|
|
if (!$condition) {
|
|
fwrite(STDERR, "FAIL: {$message}\n");
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
$parse = (new ReflectionClass(DiagnosisAiLogic::class))->getMethod('parseAnalysisResponse');
|
|
$validPayload = [
|
|
'diagnosis_advice' => '倾向气阴两虚,仍需结合舌脉复核。',
|
|
'risk_assessment' => [
|
|
['label' => '血糖控制不足风险', 'level' => 'high'],
|
|
['label' => '信息缺失导致误判风险', 'level' => 'medium'],
|
|
],
|
|
'treatment_advice' => '复核血糖记录与并发症筛查,再由医师确定方案。',
|
|
];
|
|
$json = json_encode($validPayload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
|
analysisParserExpect(is_string($json), 'fixture JSON encodes');
|
|
|
|
$parsed = $parse->invoke(null, $json);
|
|
analysisParserExpect($parsed === $validPayload, 'plain JSON parses without changing contract');
|
|
|
|
$fenced = "说明文字\n```json\n{$json}\n```\n后续文字";
|
|
analysisParserExpect($parse->invoke(null, $fenced) === $validPayload, 'fenced JSON with surrounding text parses');
|
|
|
|
$wrapped = json_encode(['data' => $json], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
|
analysisParserExpect(
|
|
is_string($wrapped) && $parse->invoke(null, $wrapped) === $validPayload,
|
|
'common string wrapper parses'
|
|
);
|
|
|
|
$invalidLevel = $validPayload;
|
|
$invalidLevel['risk_assessment'][0]['level'] = 'urgent';
|
|
analysisParserExpect(
|
|
$parse->invoke(null, json_encode($invalidLevel, JSON_UNESCAPED_UNICODE)) === null,
|
|
'unknown risk enum is rejected'
|
|
);
|
|
|
|
$tooManyRisks = $validPayload;
|
|
$tooManyRisks['risk_assessment'] = array_fill(0, 9, ['label' => '风险', 'level' => 'low']);
|
|
analysisParserExpect(
|
|
$parse->invoke(null, json_encode($tooManyRisks, JSON_UNESCAPED_UNICODE)) === null,
|
|
'more than eight risks is rejected'
|
|
);
|
|
|
|
$overlongAdvice = $validPayload;
|
|
$overlongAdvice['diagnosis_advice'] = str_repeat('诊', 1201);
|
|
analysisParserExpect(
|
|
$parse->invoke(null, json_encode($overlongAdvice, JSON_UNESCAPED_UNICODE)) === null,
|
|
'overlong advice is rejected rather than truncated'
|
|
);
|
|
|
|
$overlongLabel = $validPayload;
|
|
$overlongLabel['risk_assessment'][0]['label'] = str_repeat('险', 121);
|
|
analysisParserExpect(
|
|
$parse->invoke(null, json_encode($overlongLabel, JSON_UNESCAPED_UNICODE)) === null,
|
|
'overlong risk label is rejected'
|
|
);
|
|
|
|
$wrongType = $validPayload;
|
|
$wrongType['risk_assessment'] = 'low';
|
|
analysisParserExpect(
|
|
$parse->invoke(null, json_encode($wrongType, JSON_UNESCAPED_UNICODE)) === null,
|
|
'non-array risk assessment is rejected'
|
|
);
|
|
analysisParserExpect($parse->invoke(null, 'not json') === null, 'non-JSON response fails safely');
|
|
analysisParserExpect(
|
|
$parse->invoke(null, str_repeat('x', 32769)) === null,
|
|
'oversized upstream response fails safely'
|
|
);
|
|
|
|
echo "Diagnosis AI analysis parser: OK\n";
|