33 lines
2.7 KiB
JavaScript
33 lines
2.7 KiB
JavaScript
'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');
|