var assert = require('assert') function getEnergy(energyMap, memberId, dimensionCode) { var data = energyMap[memberId] if (!data) return 0 var key = dimensionCode + 'Score' var val = data[key] return (typeof val !== 'undefined' && val !== null) ? val : 0 } function getAvatarSize(energy, isSelf) { var clamped = Math.max(0, Math.min(100, energy)) var base = 64 + (clamped / 100) * 56 if (isSelf) return Math.max(96, base + 16) return base } function getLayoutMode(memberCount) { if (memberCount <= 3) return 'row' return 'multi-row' } function getDisplayOrder(members, selfId) { var self = null var others = [] for (var i = 0; i < members.length; i++) { if (members[i].id == selfId) { self = members[i] } else { others.push(members[i]) } } if (members.length === 2) return [self, others[0]] if (members.length === 3 && others.length >= 2) return [others[0], self, others[1]] return [self].concat(others) } function getLineEndPoints(selfCX, selfCY, selfR, otherCX, otherCY, otherR) { var dx = otherCX - selfCX var dy = otherCY - selfCY var dist = Math.sqrt(dx * dx + dy * dy) if (dist < 1) return null var ux = dx / dist var uy = dy / dist return { x1: selfCX + ux * selfR, y1: selfCY + uy * selfR, x2: otherCX - ux * otherR, y2: otherCY - uy * otherR } } assert.strictEqual(getAvatarSize(0, false), 64, 'min size for other at energy 0') assert.strictEqual(getAvatarSize(100, false), 120, 'max size for other at energy 100') assert.strictEqual(getAvatarSize(50, false), 92, 'mid size for other at energy 50') assert.strictEqual(getAvatarSize(0, true), 96, 'self min is 96') assert.strictEqual(getAvatarSize(100, true), 136, 'self max energy: 64+56+16=136') assert.strictEqual(getAvatarSize(-10, false), 64, 'negative energy clamped to 0') assert.strictEqual(getAvatarSize(150, false), 120, 'energy >100 clamped to 100') assert.strictEqual(getLayoutMode(0), 'row', '0 members → row (but v-if hides)') assert.strictEqual(getLayoutMode(2), 'row', '2 members → row') assert.strictEqual(getLayoutMode(3), 'row', '3 members → row') assert.strictEqual(getLayoutMode(4), 'multi-row', '4 members → multi-row') assert.strictEqual(getLayoutMode(10), 'multi-row', '10 members → multi-row') var m2 = [{ id: 1, nickname: '爸' }, { id: 2, nickname: '我' }] var order2 = getDisplayOrder(m2, 2) assert.strictEqual(order2[0].id, 2, '2-person: self first') assert.strictEqual(order2[1].id, 1, '2-person: other second') var m3 = [{ id: 1, nickname: '爸' }, { id: 2, nickname: '我' }, { id: 3, nickname: '妈' }] var order3 = getDisplayOrder(m3, 2) assert.strictEqual(order3[0].id, 1, '3-person: other1 left') assert.strictEqual(order3[1].id, 2, '3-person: self center') assert.strictEqual(order3[2].id, 3, '3-person: other2 right') var pts = getLineEndPoints(100, 100, 30, 300, 100, 20) assert.strictEqual(pts.x1, 130, 'line start x = self center + self radius') assert.strictEqual(pts.x2, 280, 'line end x = other center - other radius') assert.strictEqual(pts.y1, 100, 'line start y = self center y') assert.strictEqual(pts.y2, 100, 'line end y = other center y') var em = { 1: { bodyScore: 80, mindScore: 40 } } assert.strictEqual(getEnergy(em, 1, 'body'), 80, 'get body energy') assert.strictEqual(getEnergy(em, 1, 'mind'), 40, 'get mind energy') assert.strictEqual(getEnergy(em, 2, 'body'), 0, 'missing member returns 0') console.log('All FamilyRelationGraph tests passed!')