public void CrossoverWithNullParents()
 {
     using (var parameters = new ExpressionEvolverGeneticAlgorithmParameters(
                a => a))
     {
         parameters.Crossover(null);
     }
 }
 public void CrossoverWithEmptyParents()
 {
     using (var parameters = new ExpressionEvolverGeneticAlgorithmParameters(
                a => a))
     {
         parameters.Crossover(new List <Chromosome <Expression <Func <double, double> > > >().AsReadOnly());
     }
 }
        public void CrossoverOnDisposedObject()
        {
            ExpressionEvolverGeneticAlgorithmParameters parameters = null;

            using (parameters = new ExpressionEvolverGeneticAlgorithmParameters(
                       a => a)) { }

            parameters.Crossover(new List <Chromosome <Expression <Func <double, double> > > >().AsReadOnly());
        }
        public void Crossover()
        {
            Expression <Func <double, double> > evenExpression = x => x / 2;
            Expression <Func <double, double> > oddExpression  = x => 3 * x + 1;

            var random = Substitute.For <SecureRandom>();

            var nextCallCount = 0;

            random.Next(Arg.Any <int>()).Returns((_) =>
            {
                var result = 0;
                if (nextCallCount == 0)
                {
                    result = 1;
                }
                else if (nextCallCount == 1)
                {
                    result = 4;
                }
                else
                {
                    throw new InvalidOperationException("Too many Next(int) calls.");
                }

                nextCallCount++;
                return(result);
            });

            using (var parameters = new ExpressionEvolverGeneticAlgorithmParameters(
                       new RandomObjectGenerator().Generate <ReadOnlyCollection <ExpressionEvolverResult> >(),
                       random))
            {
                var children = parameters.Crossover(new List <Chromosome <Expression <Func <double, double> > > > {
                    new Chromosome <Expression <Func <double, double> > >(evenExpression, 0d),
                    new Chromosome <Expression <Func <double, double> > >(oddExpression, 0d)
                }.AsReadOnly());

                Assert.AreEqual(2, children.Count);
                Assert.AreEqual("x => 0.5", children[0].ToString());
                Assert.AreEqual("x => ((3 * x) + x)", children[1].ToString());
            }
        }