'use strict'; const assert=require('node:assert/strict'), SS=require('../js/skin-score'), UI=require('../js/report-ui'), Copy=require('../js/report-copy'); const Original=require('./fixtures/report-copy-before-two-fixes.cjs'); // Strict scope guard: every care template and 20 other conclusion templates // must be byte-for-byte identical to the released baseline. assert.deepEqual(Copy.care,Original.care); for(const key of Object.keys(Original.conclusion)) for(const level of Object.keys(Original.conclusion[key])) { if(key==='wrinkles'&&level==='优秀') continue; assert.equal(Copy.conclusion[key][level],Original.conclusion[key][level],key+' '+level+' must stay original'); } const r=structuredClone(SS.MOCK_RESULT), vm=SS.buildViewModel(r,SS.MOCK_SIDE,{}); vm.cats.wrinkles.P=76;Object.assign(vm.cats.wrinkles.vars,{wr_cnt:10,fl_cnt:10}); vm.cats.acne.P=95; Object.assign(vm.cats.acne.vars,{acne_cnt:2,acne_detail:'丘疹2处',acne_counts_complete:true,acne_counts:{closed_comedones:0,acne:2,acne_pustule:0,acne_nodule:0,acne_mark:0}}); const before=JSON.stringify({vm,r}),ui=UI.build(vm,r),view=k=>ui.views.find(v=>v.key===k); assert.equal(view('wrinkles').text,'全脸共检测到皱纹 10 条、细纹 10 条;整体纹路状态较好,建议维持日常淡纹与保湿护理。'); assert.equal(view('acne').text,'检测到 2 处皮损(丘疹2处),局部皮损仍需关注。'); assert.equal(view('acne').level,'优秀'); assert.equal(JSON.stringify({vm,r}),before); const saved={gradeRule:UI.gradeRule,copyRule:'retired',product:{tier:3,title:'旧推荐'},care:ui.views.slice().reverse().map(v=>({name:v.name,text:'旧护理'}))}; const bytes=JSON.stringify(saved),display=UI.forDisplay(vm,r,saved); assert.equal(display.copyRule,UI.copyRule);assert.deepEqual(display.product,saved.product); assert.deepEqual(display.care.map(v=>v.name),saved.care.map(v=>v.name)); assert.equal(JSON.stringify(saved),bytes); for(const item of display.care){const v=view(item.key);assert.equal(item.level,v.level);assert.equal(item.text,Copy.care[item.key][v.level].care+Copy.care[item.key][v.level].lifestyle);} assert.equal(UI.forDisplay(vm,r,{...saved,care:saved.care.slice(0,2)}).care.length,2); const unknown={name:'未知旧项目',text:'保留原文'}; assert.deepEqual(UI.forDisplay(vm,r,{...saved,care:[unknown]}).care[0],unknown); const missing=structuredClone(vm);Object.assign(missing.cats.wrinkles.vars,{wr_cnt:null,fl_cnt:null}); const text=UI.build(missing,{}).views.find(v=>v.key==='wrinkles').text; assert(text.includes('计数未获取'));assert(!text.includes('皱纹 0 条'));assert(!/[{}]|undefined|NaN/.test(text)); console.log('PASS strict two-copy scope: all care and 20 other templates unchanged; excellent wrinkles, detected acne, legacy care mapping and immutable data');