dd-timer/tests/unit/domain/InventaireCalculator.test.ts
POL Mickaël 203c423f19 test: 302 tests unitaires + 20 E2E Playwright (couverture 94%)
- Unit : domain (GaugeCalculator, Enclos, Dragodinde, XpTable, Race, Tier...)
- Unit : application (commands, queries, CommandBus)
- Fonctionnel : breeding-workflow, enclos-management, timer-workflow
- Régression : gauge-tier, gauge-recharge, xp-timer, level-target, breeding
- E2E Playwright + Electron : navigation, timer, recharge jauge,
  accouplement, persistance des données

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 05:43:29 +02:00

80 lines
2.6 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import { InventaireCalculator } from '@domain/services/InventaireCalculator';
describe('InventaireCalculator', () => {
const calc = new InventaireCalculator();
it('empty inventory produces nothing', () => {
const r = calc.compute({});
expect(r.generations).toHaveLength(0);
});
it('zero stock produces nothing', () => {
const r = calc.compute({ 'Rousse': { m: 0, f: 0 } });
expect(r.generations).toHaveLength(0);
});
it('\u2642 Rousse + \u2640 Dor\u00e9e produces Dor\u00e9e et Rousse', () => {
const r = calc.compute({
'Rousse': { m: 1, f: 0 },
'Dor\u00e9e': { m: 0, f: 1 },
});
expect(r.generations.length).toBeGreaterThanOrEqual(1);
const gen2 = r.generations.find(g => g.gen === 2);
expect(gen2).toBeDefined();
expect(gen2!.crossings.some(c => c.name === 'Dor\u00e9e et Rousse')).toBe(true);
});
it('\u2640 Rousse + \u2642 Dor\u00e9e also produces (reversed genders)', () => {
const r = calc.compute({
'Rousse': { m: 0, f: 1 },
'Dor\u00e9e': { m: 1, f: 0 },
});
const gen2 = r.generations.find(g => g.gen === 2);
expect(gen2).toBeDefined();
expect(gen2!.crossings.some(c => c.name === 'Dor\u00e9e et Rousse')).toBe(true);
});
it('same gender cannot breed (\u2642+\u2642)', () => {
const r = calc.compute({
'Rousse': { m: 2, f: 0 },
'Dor\u00e9e': { m: 2, f: 0 },
});
expect(r.generations).toHaveLength(0);
});
it('same gender cannot breed (\u2640+\u2640)', () => {
const r = calc.compute({
'Rousse': { m: 0, f: 2 },
'Dor\u00e9e': { m: 0, f: 2 },
});
expect(r.generations).toHaveLength(0);
});
it('babies cascade to next generation', () => {
const r = calc.compute({
'Rousse': { m: 2, f: 2 },
'Amande': { m: 2, f: 2 },
'Dor\u00e9e': { m: 2, f: 2 },
});
const gen2 = r.generations.find(g => g.gen === 2);
expect(gen2).toBeDefined();
expect(gen2!.crossings.length).toBeGreaterThan(0);
// Check if gen 3 exists (cascade from gen 2 babies)
// This depends on whether gen 2 babies can breed with each other
});
it('multiple pairs produce multiple babies', () => {
const r = calc.compute({
'Rousse': { m: 3, f: 3 },
'Dor\u00e9e': { m: 3, f: 3 },
});
const gen2 = r.generations.find(g => g.gen === 2);
expect(gen2).toBeDefined();
const dr = gen2!.crossings.find(c => c.name === 'Dor\u00e9e et Rousse');
expect(dr).toBeDefined();
// With 3\u2642+3\u2640 of each, we can make up to 3 pairs (limited by one side)
expect(dr!.qty).toBeGreaterThanOrEqual(3);
});
});