package ngenes2.evolver; import ngenes2.evolver.monitor.GenerationMonitor; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import ngenes2.breeder.Breeder; import ngenes2.evolver.stop.MaxGeneration; import ngenes2.evolver.stop.StopCondition; import ngenes2.individual.Individual; import ngenes2.ops.crossover.Crossover; import ngenes2.ops.mutator.Mutator; import ngenes2.ops.selector.Selector; import ngenes2.population.Population; import ngenes2.util.Properties; import org.junit.Test; import org.mockito.ArgumentMatcher; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import static org.mockito.Mockito.*; public class ClassicEvolverTest { private static Individual anyIndividual() { return argThat(new ArgumentMatcher<Individual>() { @Override public boolean matches(Object argument) { return argument instanceof Individual; } }); } private static Population anyPopulation() { return argThat(new ArgumentMatcher<Population>() { @Override public boolean matches(Object argument) { return argument instanceof Population; } }); } @Test public void testEvolve() { final Individual ind = mock(Individual.class); final int numGen = 3; final int popSize = 100; final List<Individual> lst = new ArrayList(2); lst.add(ind); lst.add(ind); final List<Individual> selectedLst = new ArrayList<Individual>(popSize); for( int i=0; i<popSize; i++ ) { selectedLst.add(ind); } final Selector sel = mock(Selector.class); when(sel.select(anyInt(),anyPopulation())).thenAnswer( new Answer<Iterator>() { public Iterator answer(InvocationOnMock invocation) throws Throwable { return selectedLst.iterator(); } }); Breeder breeder = mock(Breeder.class); when( breeder.childrenNumber() ).thenReturn(2); GenerationMonitor monitor = mock( GenerationMonitor.class ); Properties props = new Properties().put("max_generation",numGen); StopCondition stop = new MaxGeneration(props); final Evolver flow = new ClassicEvolver( sel, breeder, monitor,stop); final Population pop = mock(Population.class); when( pop.size() ).thenReturn( popSize ); when( pop.get( anyInt() ) ).thenReturn( ind ); flow.evolve(pop); verify( sel, times( numGen )).select( anyInt(), anyPopulation() ); verify( breeder, times(numGen*popSize/2) ).breed(anyPopulation(), anyList()); verify( monitor, times(numGen) ).newGeneration(anyInt(), anyPopulation()); } }