Applique .gitattributes sur tous les fichiers existants. Élimine les différences fantômes entre WSL et Windows. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
59 lines
2.3 KiB
TypeScript
Executable File
59 lines
2.3 KiB
TypeScript
Executable File
import { describe, it, expect } from 'vitest';
|
||
import { simulateStock } from '@domain/services/StockSimulator';
|
||
import { BREEDING_RECIPES } from '@domain/value-objects/Race';
|
||
|
||
describe('Régression : simulation inventaire identique au monolithe', () => {
|
||
it('8 Rousse (4♂/4♀) + 8 Dorée (4♂/4♀) + 8 Amande (4♂/4♀) → 20 bébés sur 4 générations', () => {
|
||
const r = simulateStock({
|
||
Rousse: { m: 4, f: 4 },
|
||
Dorée: { m: 4, f: 4 },
|
||
Amande: { m: 4, f: 4 },
|
||
});
|
||
|
||
// Gen2 : 3 croisements × 4 bébés = 12
|
||
const gen2 = r.crossings.filter(c => c.gen === 2);
|
||
expect(gen2).toHaveLength(3);
|
||
expect(gen2.map(c => c.baby).sort()).toEqual(
|
||
['Amande et Dorée', 'Amande et Rousse', 'Dorée et Rousse'],
|
||
);
|
||
for (const c of gen2) expect(c.count).toBe(4);
|
||
|
||
// Gen3 : Ebène×2 + Indigo×2 = 4
|
||
const gen3 = r.crossings.filter(c => c.gen === 3);
|
||
expect(gen3).toHaveLength(2);
|
||
expect(gen3.find(c => c.baby === 'Ebène')!.count).toBe(2);
|
||
expect(gen3.find(c => c.baby === 'Indigo')!.count).toBe(2);
|
||
|
||
// Gen4 : Ebène et Indigo×2
|
||
const gen4 = r.crossings.filter(c => c.gen === 4);
|
||
expect(gen4).toHaveLength(1);
|
||
expect(gen4[0]!.baby).toBe('Ebène et Indigo');
|
||
expect(gen4[0]!.count).toBe(2);
|
||
|
||
// Gen5 : Orchidée×2 (Pourpre reçoit 0 car EI alloué à floor(1/2)=0)
|
||
const gen5 = r.crossings.filter(c => c.gen === 5);
|
||
expect(gen5).toHaveLength(1);
|
||
expect(gen5[0]!.baby).toBe('Orchidée');
|
||
expect(gen5[0]!.count).toBe(2);
|
||
|
||
expect(r.crossings.reduce((s, c) => s + c.count, 0)).toBe(20);
|
||
});
|
||
|
||
it('la recette Ebène est Amande et Dorée + Dorée et Rousse (pas Amande et Rousse)', () => {
|
||
expect(BREEDING_RECIPES['Ebène']).toEqual(['Amande et Dorée', 'Dorée et Rousse']);
|
||
});
|
||
|
||
it('l\'algorithme glouton aurait donné 8 bébés sur 1 seule race — la version proportionnelle donne 12 sur 3 races', () => {
|
||
const r = simulateStock({
|
||
Rousse: { m: 4, f: 4 },
|
||
Dorée: { m: 4, f: 4 },
|
||
Amande: { m: 4, f: 4 },
|
||
});
|
||
// Vérifier qu'on ne voit PAS un seul croisement avec 8 bébés
|
||
for (const c of r.crossings.filter(x => x.gen === 2)) {
|
||
expect(c.count).toBeLessThanOrEqual(4);
|
||
}
|
||
expect(r.crossings.filter(c => c.gen === 2)).toHaveLength(3);
|
||
});
|
||
});
|