'use strict'; const assert = require('node:assert/strict'); const SS = require('../js/skin-score'), UI = require('../js/report-ui'), Copy = require('../js/report-copy'); for (const [S, level] of [[7,'改善'],[7.94,'改善'],[7.95,'良好'],[8,'良好'],[8.94,'良好'],[8.95,'优秀'],[9,'优秀'],[9.3,'优秀'],[10,'优秀'],[null,null],[NaN,null]]) { assert.equal(UI.levelForScore(S), level); } const keys = ['contour','wrinkles','color','smooth','water','sens','acne']; for (const [P, level] of [[0,'改善'],[20,'改善'],[31.49,'改善'],[31.5,'良好'],[50,'良好'],[64.83,'良好'],[65,'优秀'],[76,'优秀'],[79,'优秀'],[100,'优秀'],[null,null]]) { const r = structuredClone(SS.MOCK_RESULT), vm = SS.buildViewModel(r, SS.MOCK_SIDE, {}); for (const key of ['contour','wrinkles','smooth','sens','acne']) vm.cats[key].P = P; Object.assign(vm.cats.tone.vars, {melanin:P,color_score:P,water_score:P,water_sev:0}); vm.cats.tone.vars.tone_scoring.color_score = P; const before = JSON.stringify({vm,r}), ui = UI.build(vm,r); for (const view of ui.views) { assert.equal(view.level,level,view.key+' P='+P); assert.deepEqual(view.advice,level ? Copy.care[view.key][level] : null); assert.equal(view.S,UI.scoreOfP(P)); } assert.equal(JSON.stringify({vm,r}),before); assert.equal(ui.gradeRule,UI.gradeRule); for (const care of ui.care) assert.equal(care.level,level); assert.deepEqual(ui.views.map(v=>v.key),keys); } const r = structuredClone(SS.MOCK_RESULT); r.eye_pouch_severity = {value:2}; r.score_info.wrinkle_score = 76; const vm = SS.buildViewModel(r,SS.MOCK_SIDE,{}), ui = UI.build(vm,r); assert.equal(UI.dimensionScore(vm.dims.firm.S),'9.3'); assert.equal(ui.views.find(v=>v.key==='contour').level,'优秀'); assert(!/眼袋|黑眼圈/.test(ui.views.find(v=>v.key==='contour').text),'contour conclusion omits eye problems at all grades'); const old = structuredClone(ui); delete old.gradeRule; old.views[0].level='改善';old.views[0].text='旧轮廓文案'; old.product={tier:3,title:'历史推荐不改'}; const oldBytes=JSON.stringify(old), vmBytes=JSON.stringify(vm); const display=UI.forDisplay(vm,r,old); assert.equal(display.views[0].level,'优秀'); assert.deepEqual(display.product,old.product); assert.deepEqual(display.care.map(v=>v.key),old.care.map(v=>v.key)); assert.equal(JSON.stringify(old),oldBytes);assert.equal(JSON.stringify(vm),vmBytes); assert.equal(UI.forDisplay(vm,r,ui),ui); console.log('PASS: seven views/advice use displayed 8/9 grades; rounding, missing, 9.3 case, unchanged contour copy, immutable history and product/order');