- 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>
80 lines
2.6 KiB
TypeScript
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);
|
|
});
|
|
});
|