dd-timer/tests/unit/domain/BreedingService.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

58 lines
1.9 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import { BreedingService } from '@domain/services/BreedingService';
describe('BreedingService', () => {
const svc = new BreedingService();
it('deduces baby from two parents (order A)', () => {
expect(svc.deduceBaby('Rousse', 'Dorée')).toBe('Dorée et Rousse');
});
it('deduces baby from two parents (order B — bidirectional)', () => {
expect(svc.deduceBaby('Dorée', 'Rousse')).toBe('Dorée et Rousse');
});
it('returns null for incompatible parents', () => {
expect(svc.deduceBaby('Rousse', 'Rousse')).toBeNull();
});
it('returns null for unknown parents', () => {
expect(svc.deduceBaby('Unknown', 'Dorée')).toBeNull();
});
it('lists compatible partners for Rousse', () => {
const partners = svc.getCompatiblePartners('Rousse');
expect(partners.length).toBeGreaterThan(0);
expect(partners.some(p => p.partner === 'Dorée')).toBe(true);
expect(partners.some(p => p.partner === 'Amande')).toBe(true);
});
it('returns empty array for unknown race', () => {
expect(svc.getCompatiblePartners('Unknown')).toEqual([]);
});
it('gets parents for a baby race', () => {
const parents = svc.getParents('Dorée et Rousse');
expect(parents).toEqual(['Rousse', 'Dorée']);
});
it('returns null parents for base race', () => {
expect(svc.getParents('Rousse')).toBeNull();
});
it('gets generation of a race', () => {
expect(svc.getGeneration('Rousse')).toBe(1);
expect(svc.getGeneration('Dorée et Rousse')).toBe(2);
});
it('all recipes are bidirectionally deducible', () => {
// For every known recipe, both orderings should work
const parents = svc.getParents('Amande et Dorée');
expect(parents).not.toBeNull();
if (parents) {
expect(svc.deduceBaby(parents[0], parents[1])).toBe('Amande et Dorée');
expect(svc.deduceBaby(parents[1], parents[0])).toBe('Amande et Dorée');
}
});
});