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";