import { describe, test, expect } from 'bun:test'; import { createPopulation, evolveGeneration, getPopulationStats, DEFAULT_EVOLUTION_CONFIG } from './evolution'; import { evaluatePopulation, DEFAULT_MATCH_CONFIG } from './selfPlay'; // Extended configuration for Long-term Test const LONG_RUN_CONFIG = { ...DEFAULT_EVOLUTION_CONFIG, populationSize: 50, // Smaller pop for faster test speed }; const MATCH_CONFIG = { ...DEFAULT_MATCH_CONFIG, matchesPerGenome: 6, // 2 Static + 2 Spinner + 2 Peer maxTicks: 300, }; describe('Curriculum Evolution Long-term', () => { test('Should reliably evolve High Fitness over 50 generations', () => { let population = createPopulation(LONG_RUN_CONFIG); const history: number[] = []; console.log('\n--- Starting Long-term Curriculum Test (50 Gens) ---'); for (let gen = 0; gen < 50; gen++) { try { // 1. Evaluate const evaluatedPop = evaluatePopulation(population, MATCH_CONFIG); const stats = getPopulationStats(evaluatedPop); history.push(stats.avgFitness); console.log(`Gen ${gen}: Avg ${stats.avgFitness.toFixed(2)} | Max ${stats.maxFitness.toFixed(2)} | Species ${stats.speciesCount}`); // Checks if (gen === 0) { if (stats.avgFitness <= 1.0) { console.error(`FAILURE at Gen 0: Avg Fitness ${stats.avgFitness} <= 1.0`); } expect(stats.avgFitness).toBeGreaterThan(1.0); } if (gen === 20) { if (stats.avgFitness <= 12.0) { console.error(`FAILURE at Gen 20: Avg Fitness ${stats.avgFitness} <= 12.0`); } expect(stats.avgFitness).toBeGreaterThan(12.0); } // 2. Evolve population = evolveGeneration(evaluatedPop, LONG_RUN_CONFIG); } catch (e) { console.error(`CRASH at Gen ${gen}:`, e); throw e; } } console.log('--- Test Complete ---'); // Final Success Criteria const finalStats = getPopulationStats(evaluatePopulation(population, MATCH_CONFIG)); console.log(`Final Gen: Avg ${finalStats.avgFitness.toFixed(2)}`); expect(finalStats.avgFitness).toBeGreaterThan(15.0); // Better than just Static + Spinner? }, 600000); // 10 minute timeout });