37 lines
2.4 KiB
JavaScript
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');
|