feat(h5): update skin scoring, age display and capture countdown
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
'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 [[79.99,'改善'],[80,'良好'],[89.99,'良好'],[90,'优秀'],[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?'改善':'良好';
|
||||
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');
|
||||
Reference in New Issue
Block a user