public async Task Can_Evolve_Until_Termination_Condition_Fulfilled_Or_Canceled_Without_Throwing() { const int delay = 100; var strategy = MockObject.CreateOperationStrategy(); var population = MockObject.CreatePopulation(); population.Chromosomes = MockObject.CreateChromosomes(10).ToImmutableHashSet(); IGeneticAlgorithm genetic = new GeneticAlgorithm(strategy); using (var cts = new CancellationTokenSource()) { var preEvolutionStates = genetic.EvolutionStates; var evolution = genetic.TryEvolveUntil(population, _ => false, cts.Token); await Task.Delay(delay); cts.Cancel(); var(result, succeed) = await evolution; Assert.False(succeed); var afterEvolutionStates = genetic.EvolutionStates; Assert.True(afterEvolutionStates.EvolutionCount > preEvolutionStates.EvolutionCount); Assert.True(afterEvolutionStates.EvolutionTime > preEvolutionStates.EvolutionTime); var differentTime = afterEvolutionStates.EvolutionTime - preEvolutionStates.EvolutionTime; Assert.True(differentTime >= MockObject.CreateProximateAccuracyTimeSpan(delay)); Assert.Equal(afterEvolutionStates.EvolutionCount - preEvolutionStates.EvolutionCount, result.EvolutionCount); Assert.Equal(afterEvolutionStates.EvolutionTime - preEvolutionStates.EvolutionTime, result.EvolutionTime); } using (var cts = new CancellationTokenSource()) { const int time = 50; var evolution = genetic.TryEvolveUntil( population, s => s.EvolutionTime >= TimeSpan.FromMilliseconds(time), cts.Token); await Task.Delay(delay); var(result, succeed) = await evolution; Assert.True(succeed); Assert.True(result.EvolutionTime >= MockObject.CreateProximateAccuracyTimeSpan(time)); } }
public async Task Can_Evolve_Until_Cancelled_Whithout_Throwing() { const int time = 100; var population = MockObject.CreatePopulation(); population.Chromosomes = MockObject.CreateChromosomes(10).ToImmutableHashSet(); IGeneticAlgorithm genetic = new Core.GeneticAlgorithm(MockObject.CreateOperationStrategy()); using (var cts = new CancellationTokenSource()) { var evolution = genetic.TryEvolve(population, cts.Token); await Task.Delay(time); cts.Cancel(); var result = await evolution; Assert.True(result.EvolutionTime >= MockObject.CreateProximateAccuracyTimeSpan(time)); Assert.True(cts.IsCancellationRequested); } }