public void Cross_LessGenesThenSecondSwapPoint_Exception()
        {
            var target      = new TwoPointCrossover(1, 3);
            var chromosome1 = MockRepository.GenerateStub <ChromosomeBase>(3);

            ExceptionAssert.IsThrowing(new ArgumentOutOfRangeException("parents", "The swap point two index is 3, but there is only 3 genes. The swap should result at least one gene to each sides."), () =>
            {
                target.Cross(new List <IChromosome>()
                {
                    chromosome1,
                    chromosome1
                });
            });

            var chromosome2 = MockRepository.GenerateStub <ChromosomeBase>(4);

            ExceptionAssert.IsThrowing(new ArgumentOutOfRangeException("parents", "The swap point two index is 3, but there is only 4 genes. The swap should result at least one gene to each sides."), () =>
            {
                target.Cross(new List <IChromosome>()
                {
                    chromosome2,
                    chromosome2
                });
            });
        }
        public void Cross_LessGenesThenSecondSwapPoint_Exception()
        {
            var target      = new TwoPointCrossover(1, 3);
            var chromosome1 = Substitute.For <ChromosomeBase>(3);

            Assert.Catch <ArgumentOutOfRangeException>(() =>
            {
                target.Cross(new List <IChromosome>()
                {
                    chromosome1,
                    chromosome1
                });
            }, "The swap point two index is 3, but there is only 3 genes. The swap should result at least one gene to each sides.");

            var chromosome2 = Substitute.For <ChromosomeBase>(4);

            Assert.Catch <ArgumentOutOfRangeException>(() =>
            {
                target.Cross(new List <IChromosome>()
                {
                    chromosome2,
                    chromosome2
                });
            }, "The swap point two index is 3, but there is only 4 genes. The swap should result at least one gene to each sides.");
        }
        public void Cross_ChromosomeLengthLowerThan3_Exception()
        {
            var target      = new TwoPointCrossover(0, 1);
            var chromosome1 = Substitute.For <ChromosomeBase>(2);

            Assert.Catch <CrossoverException>(() =>
            {
                target.Cross(new List <IChromosome>()
                {
                    chromosome1,
                    chromosome1
                });
            }, "A chromosome should have, at least, 3 genes. {0} has only 2 gene.".With(chromosome1.GetType().Name));
        }
        public void Cross_ChromosomeLengthLowerThan3_Exception()
        {
            var target      = new TwoPointCrossover(0, 1);
            var chromosome1 = MockRepository.GenerateStub <ChromosomeBase>(2);


            ExceptionAssert.IsThrowing(new CrossoverException(target, "A chromosome should have, at least, 3 genes. {0} has only 2 gene.".With(chromosome1.GetType().Name)), () =>
            {
                target.Cross(new List <IChromosome>()
                {
                    chromosome1,
                    chromosome1
                });
            });
        }
        public void Cross_ParentsWithTwoGenes_Cross()
        {
            var target      = new TwoPointCrossover(0, 1);
            var chromosome1 = MockRepository.GenerateStub <ChromosomeBase>(4);

            chromosome1.ReplaceGenes(0, new Gene[]
            {
                new Gene(1),
                new Gene(2),
                new Gene(3),
                new Gene(4),
            });
            chromosome1.Expect(c => c.CreateNew()).Return(MockRepository.GenerateStub <ChromosomeBase>(4));

            var chromosome2 = MockRepository.GenerateStub <ChromosomeBase>(4);

            chromosome2.ReplaceGenes(0, new Gene[]
            {
                new Gene(5),
                new Gene(6),
                new Gene(7),
                new Gene(8)
            });
            chromosome2.Expect(c => c.CreateNew()).Return(MockRepository.GenerateStub <ChromosomeBase>(4));

            var actual = target.Cross(new List <IChromosome>()
            {
                chromosome1, chromosome2
            });

            Assert.AreEqual(2, actual.Count);
            Assert.AreEqual(4, actual[0].Length);
            Assert.AreEqual(4, actual[1].Length);

            Assert.AreEqual(1, actual[0].GetGene(0).Value);
            Assert.AreEqual(6, actual[0].GetGene(1).Value);
            Assert.AreEqual(3, actual[0].GetGene(2).Value);
            Assert.AreEqual(4, actual[0].GetGene(3).Value);

            Assert.AreEqual(5, actual[1].GetGene(0).Value);
            Assert.AreEqual(2, actual[1].GetGene(1).Value);
            Assert.AreEqual(7, actual[1].GetGene(2).Value);
            Assert.AreEqual(8, actual[1].GetGene(3).Value);
        }
        public IList <IChromosome> TwoPointCrossover()
        {
            var target = new TwoPointCrossover();

            return(target.Cross(CreateTwoParents()));
        }