FamilyRelationGraph.test.js 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. var assert = require('assert')
  2. function getEnergy(energyMap, memberId, dimensionCode) {
  3. var data = energyMap[memberId]
  4. if (!data) return 0
  5. var key = dimensionCode + 'Score'
  6. var val = data[key]
  7. return (typeof val !== 'undefined' && val !== null) ? val : 0
  8. }
  9. function getAvatarSize(energy, isSelf) {
  10. var clamped = Math.max(0, Math.min(100, energy))
  11. var base = 64 + (clamped / 100) * 56
  12. if (isSelf) return Math.max(96, base + 16)
  13. return base
  14. }
  15. function getLayoutMode(memberCount) {
  16. if (memberCount <= 3) return 'row'
  17. return 'multi-row'
  18. }
  19. function getDisplayOrder(members, selfId) {
  20. var self = null
  21. var others = []
  22. for (var i = 0; i < members.length; i++) {
  23. if (members[i].id == selfId) {
  24. self = members[i]
  25. } else {
  26. others.push(members[i])
  27. }
  28. }
  29. if (members.length === 2) return [self, others[0]]
  30. if (members.length === 3 && others.length >= 2) return [others[0], self, others[1]]
  31. return [self].concat(others)
  32. }
  33. function getLineEndPoints(selfCX, selfCY, selfR, otherCX, otherCY, otherR) {
  34. var dx = otherCX - selfCX
  35. var dy = otherCY - selfCY
  36. var dist = Math.sqrt(dx * dx + dy * dy)
  37. if (dist < 1) return null
  38. var ux = dx / dist
  39. var uy = dy / dist
  40. return {
  41. x1: selfCX + ux * selfR,
  42. y1: selfCY + uy * selfR,
  43. x2: otherCX - ux * otherR,
  44. y2: otherCY - uy * otherR
  45. }
  46. }
  47. assert.strictEqual(getAvatarSize(0, false), 64, 'min size for other at energy 0')
  48. assert.strictEqual(getAvatarSize(100, false), 120, 'max size for other at energy 100')
  49. assert.strictEqual(getAvatarSize(50, false), 92, 'mid size for other at energy 50')
  50. assert.strictEqual(getAvatarSize(0, true), 96, 'self min is 96')
  51. assert.strictEqual(getAvatarSize(100, true), 136, 'self max energy: 64+56+16=136')
  52. assert.strictEqual(getAvatarSize(-10, false), 64, 'negative energy clamped to 0')
  53. assert.strictEqual(getAvatarSize(150, false), 120, 'energy >100 clamped to 100')
  54. assert.strictEqual(getLayoutMode(0), 'row', '0 members → row (but v-if hides)')
  55. assert.strictEqual(getLayoutMode(2), 'row', '2 members → row')
  56. assert.strictEqual(getLayoutMode(3), 'row', '3 members → row')
  57. assert.strictEqual(getLayoutMode(4), 'multi-row', '4 members → multi-row')
  58. assert.strictEqual(getLayoutMode(10), 'multi-row', '10 members → multi-row')
  59. var m2 = [{ id: 1, nickname: '爸' }, { id: 2, nickname: '我' }]
  60. var order2 = getDisplayOrder(m2, 2)
  61. assert.strictEqual(order2[0].id, 2, '2-person: self first')
  62. assert.strictEqual(order2[1].id, 1, '2-person: other second')
  63. var m3 = [{ id: 1, nickname: '爸' }, { id: 2, nickname: '我' }, { id: 3, nickname: '妈' }]
  64. var order3 = getDisplayOrder(m3, 2)
  65. assert.strictEqual(order3[0].id, 1, '3-person: other1 left')
  66. assert.strictEqual(order3[1].id, 2, '3-person: self center')
  67. assert.strictEqual(order3[2].id, 3, '3-person: other2 right')
  68. var pts = getLineEndPoints(100, 100, 30, 300, 100, 20)
  69. assert.strictEqual(pts.x1, 130, 'line start x = self center + self radius')
  70. assert.strictEqual(pts.x2, 280, 'line end x = other center - other radius')
  71. assert.strictEqual(pts.y1, 100, 'line start y = self center y')
  72. assert.strictEqual(pts.y2, 100, 'line end y = other center y')
  73. var em = { 1: { bodyScore: 80, mindScore: 40 } }
  74. assert.strictEqual(getEnergy(em, 1, 'body'), 80, 'get body energy')
  75. assert.strictEqual(getEnergy(em, 1, 'mind'), 40, 'get mind energy')
  76. assert.strictEqual(getEnergy(em, 2, 'body'), 0, 'missing member returns 0')
  77. console.log('All FamilyRelationGraph tests passed!')