'use strict'; // Input is private, sanitized real-case data outside Git. No HTTP writes, // upstream API calls, scoring recalculation or production database access. const fs=require('node:fs'), assert=require('node:assert/strict'), UI=require('../js/report-ui'); const input=process.env.H5_COPY_CASE_FILE; if (!input) throw Error('Set H5_COPY_CASE_FILE to private JSON outside the repository'); const cases=JSON.parse(fs.readFileSync(input,'utf8')); let views=0, careItems=0; for(const c of cases) { const bytes=JSON.stringify(c), out=UI.forDisplay(c.vm,c.result,c.saved); assert.equal(JSON.stringify(c),bytes,c.id+' immutable input'); assert.deepEqual(out.product,c.saved.product,c.id+' saved recommendation'); assert.deepEqual(out.care.map(v=>v.name),c.saved.care.map(v=>v.name),c.id+' care selection/order'); assert.equal(out.views.length,7); for(const v of out.views) { views++; assert.equal(v.level,UI.levelForScore(v.S),c.id+' '+v.key); assert(!/[{}]|undefined|NaN/.test(v.text),c.id+' unresolved copy'); if(v.key==='wrinkles'&&v.level==='优秀') { const vars=c.vm.cats.wrinkles.vars; if(vars.wr_cnt!=null) assert(v.text.includes('皱纹 '+vars.wr_cnt+' 条')); if(vars.fl_cnt!=null) assert(v.text.includes('细纹 '+vars.fl_cnt+' 条')); assert(!/无静态深纹|均无明显皱纹|固化趋势/.test(v.text)); } if(v.key==='acne'&&c.vm.cats.acne.vars.acne_cnt>0) { assert(v.text.includes('局部皮损仍需关注')); assert(!v.text.includes('未检出')); } } for(const item of out.care) { careItems++; const v=out.views.find(v=>v.key===item.key); assert(v,c.id+' legacy name unresolved: '+item.name); assert.equal(item.level,v.level); assert.equal(item.text,v.advice.care+v.advice.lifestyle); } } console.log(`PASS ${cases.length} real cases, ${views} views, ${careItems} care items: score-based grades, factual copy, legacy care names, immutable scores/product/order`);