Files
dflike/server/src/systems/__tests__/relationshipHelpers.test.ts
T
2026-03-07 19:20:26 +00:00

119 lines
3.9 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import { classify, getPartnerCap, getFriendCap, getEffectiveClassification } from '../relationshipHelpers.js';
import { createBondRegistry, addBond, dissolveBond } from '../bondRegistry.js';
describe('relationshipHelpers', () => {
describe('classify', () => {
it('returns Devoted for value >= 80', () => {
expect(classify(80)).toBe('Devoted');
expect(classify(100)).toBe('Devoted');
});
it('returns Close Friend for value 50-79', () => {
expect(classify(50)).toBe('Close Friend');
expect(classify(79)).toBe('Close Friend');
});
it('returns Friend for value 20-49', () => {
expect(classify(20)).toBe('Friend');
expect(classify(49)).toBe('Friend');
});
it('returns Acquaintance for value 5-19', () => {
expect(classify(5)).toBe('Acquaintance');
expect(classify(19)).toBe('Acquaintance');
});
it('returns Stranger for value -4 to 4', () => {
expect(classify(0)).toBe('Stranger');
expect(classify(4)).toBe('Stranger');
expect(classify(-4)).toBe('Stranger');
});
it('returns Wary for value -19 to -5', () => {
expect(classify(-5)).toBe('Wary');
expect(classify(-19)).toBe('Wary');
});
it('returns Rival for value -49 to -20', () => {
expect(classify(-20)).toBe('Rival');
expect(classify(-49)).toBe('Rival');
});
it('returns Enemy for value -79 to -50', () => {
expect(classify(-50)).toBe('Enemy');
expect(classify(-79)).toBe('Enemy');
});
it('returns Nemesis for value <= -80', () => {
expect(classify(-80)).toBe('Nemesis');
expect(classify(-100)).toBe('Nemesis');
});
});
describe('getPartnerCap', () => {
it('returns 1 for average stats', () => {
expect(getPartnerCap(10, 10)).toBe(1);
});
it('returns 2 for high sociability and empathy', () => {
expect(getPartnerCap(15, 14)).toBe(2);
});
it('returns 1 if only sociability is high', () => {
expect(getPartnerCap(15, 10)).toBe(1);
});
it('returns 1 if only empathy is high', () => {
expect(getPartnerCap(10, 14)).toBe(1);
});
});
describe('getFriendCap', () => {
it('returns baseCap for sociability 10', () => {
expect(getFriendCap(10)).toBe(5);
});
it('increases with high sociability', () => {
expect(getFriendCap(16)).toBe(8);
});
it('decreases with low sociability', () => {
expect(getFriendCap(6)).toBe(3);
});
});
describe('getEffectiveClassification with bonds', () => {
it('should return Partner when active partner bond exists', () => {
const registry = createBondRegistry();
addBond(registry, 1, 2, 'partner', 0);
const allRels = new Map([[2, { value: 85 }]]);
const result = getEffectiveClassification(2, 85, allRels, 10, 10, registry, 1);
expect(result).toBe('Partner');
});
it('should return Devoted when no partner bond despite high value', () => {
const registry = createBondRegistry();
const allRels = new Map([[2, { value: 85 }]]);
const result = getEffectiveClassification(2, 85, allRels, 10, 10, registry, 1);
expect(result).toBe('Devoted');
});
it('should return Devoted when bond is former', () => {
const registry = createBondRegistry();
addBond(registry, 1, 2, 'partner', 0);
dissolveBond(registry, 1, 2, 'partner');
const allRels = new Map([[2, { value: 85 }]]);
const result = getEffectiveClassification(2, 85, allRels, 10, 10, registry, 1);
expect(result).toBe('Devoted');
});
it('should still return Devoted without registry (backward compat)', () => {
const allRels = new Map([[2, { value: 85 }]]);
// Without registry, no bond override, falls through to raw classify
const result = getEffectiveClassification(2, 85, allRels, 10, 10);
expect(result).toBe('Devoted');
});
});
});