public void Cross_ParentsWithDiffLength_Cross()
        {
            var target      = new CutAndSpliceCrossover();
            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>(5);

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

            var repository = new MockRepository();
            var rnd        = repository.StrictMock <IRandomization>();

            using (repository.Ordered())
            {
                rnd.Expect(r => r.GetInt(1, 4)).Return(2);
                rnd.Expect(r => r.GetInt(1, 5)).Return(2);
            }

            repository.ReplayAll();

            RandomizationProvider.Current = rnd;

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

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

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

            Assert.AreEqual(5, actual[1].GetGene(0).Value);
            Assert.AreEqual(6, actual[1].GetGene(1).Value);
            Assert.AreEqual(7, actual[1].GetGene(2).Value);
            Assert.AreEqual(4, actual[1].GetGene(3).Value);
        }
        public void Cross_ParentsWithDiffLength_Cross()
        {
            var target      = new CutAndSpliceCrossover();
            var chromosome1 = Substitute.ForPartsOf <ChromosomeBase>(4);

            chromosome1.ReplaceGenes(0, new Gene[]
            {
                new Gene(1),
                new Gene(2),
                new Gene(3),
                new Gene(4),
            });
            chromosome1.CreateNew().Returns(Substitute.ForPartsOf <ChromosomeBase>(4));

            var chromosome2 = Substitute.ForPartsOf <ChromosomeBase>(5);

            chromosome2.ReplaceGenes(0, new Gene[]
            {
                new Gene(5),
                new Gene(6),
                new Gene(7),
                new Gene(8),
                new Gene(9),
            });
            chromosome2.CreateNew().Returns(Substitute.ForPartsOf <ChromosomeBase>(5));

            var rnd = Substitute.For <IRandomization>();

            rnd.GetInt(1, 4).Returns(2);
            rnd.GetInt(1, 5).Returns(2);

            RandomizationProvider.Current = rnd;

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

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

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

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

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