Files
juzi/h5/test/color-copy.js

37 lines
2.4 KiB
JavaScript

'use strict';
const assert=require('node:assert/strict');
const SS=require('../js/skin-score'),UI=require('../js/report-ui');
const descriptions=['无明显黑眼圈','仅存在轻度黑眼圈','存在中度黑眼圈','可见明显黑眼圈'];
const templates={
改善:'检测到当前肌肤色素分 88,存在色素沉着较显著,{note},整体透亮感不足。',
良好:'检测到当前肌肤色素分 88,局部有色素沉积;{note},整体状态稳定,局部透亮感稍弱。',
优秀:'检测到当前肌肤色素分 88,无明显色素沉积,{note};肤色均匀透亮。'
};
let checked=0;
for(const [P,level] of [[30,'改善'],[40,'良好'],[60,'良好'],[65,'优秀'],[79.99,'优秀'],[100,'优秀']]){
for(const severity of [0,1,2,3,null,undefined,-1,4,1.5,'2',NaN,Infinity]){
const result=structuredClone(SS.MOCK_RESULT);
result.score_info.melanin_score=88;
// Opposite score/type must never dictate the severity phrase.
result.score_info.dark_circle_score=severity===3?100:0;
result.dark_circle={value:3};
if(severity===undefined)delete result.dark_circle_severity;
else result.dark_circle_severity={value:severity};
const vm=SS.buildViewModel(result,SS.MOCK_SIDE,{});
vm.cats.tone.P=P;vm.cats.tone.level=P<80?'预警':P<90?'改善':'良好';
vm.cats.tone.vars.color_score=P; // Test independent color thresholds.
const before=JSON.stringify({vm,result});
const presentation=UI.build(vm,result),view=presentation.views.find(v=>v.key==='color');
const valid=Number.isInteger(severity)&&severity>=0&&severity<=3;
const expected=valid?templates[level].replace('{note}',descriptions[severity]):templates[level].replace(/\{note\}[,;]/,'');
assert.equal(view.level,level);assert.equal(view.text,expected);
assert(!view.text.includes('评分'));assert(!view.text.includes('20%'));assert(!/[{}]/.test(view.text));
assert.equal(JSON.stringify({vm,result}),before,'presentation never mutates scores or input');
checked++;
}
}
const missing=structuredClone(SS.MOCK_RESULT);delete missing.score_info.melanin_score;
const v=UI.build(SS.buildViewModel(missing,SS.MOCK_SIDE,{}),missing).views.find(v=>v.key==='color');
assert.equal(v.valid,false);assert(!v.text.includes('色素分'));
console.log('PASS color copy: '+checked+' level/severity combinations, score-independent severity, missing/invalid omission, boundaries and immutable scoring');