public void GetChildOf_Should_Adjust_Gene_When_AdaptationMutation_Occurs()
        {
            int geneCount  = 3;
            int firstGene  = 2;
            int secondGene = 6;
            int thirdGene  = 81;

            MockRandomEnvironment.Setup(m => m.DoesAdaptationMutationOccur()).Returns(true);
            MockRandomEnvironment.SetupSequence(m => m.GetNextInt(It.IsAny <int>()))
            .Returns(geneCount)
            .Returns(firstGene)
            .Returns(secondGene)
            .Returns(thirdGene);
            MockRandomEnvironment.SetupSequence(m => m.GetRandomDirection())
            .Returns(Directions.Up)
            .Returns(Directions.Down)
            .Returns(Directions.Up);
            PopulationManager populationManagerTested = GetPopulationManager();

            List <double> fakeGenes = Enumerable.Range(0, 100).Select(i => (double)i).ToList();
            DNA           dad       = new DNA(String.Join("||", fakeGenes));
            DNA           mum       = new DNA(String.Join("||", fakeGenes));

            DNA result = populationManagerTested.GetChildOf(mum, dad);

            result.Genes[firstGene].Should().Be(dad.Genes[firstGene] * 1.05f);
            result.Genes[secondGene].Should().Be(dad.Genes[secondGene] * 0.95f);
            result.Genes[thirdGene].Should().Be(dad.Genes[thirdGene] * 1.05f);
        }
        public void GetChildOf_Should_Combine_Alternating_Dad_And_Mum_With_Given_Number_Of_Splits_When_Recombination_Occurs()
        {
            int        splits          = 3;
            Directions firstDirection  = Directions.Down;
            int        firstSplitSize  = 14;
            int        secondSplitSize = 34;

            MockRandomEnvironment.Setup(m => m.DoesRecombinationOccur()).Returns(true);
            MockRandomEnvironment.SetupSequence(m => m.GetNextInt(It.IsAny <int>()))
            .Returns(splits)
            .Returns(firstSplitSize)
            .Returns(secondSplitSize);
            MockRandomEnvironment.Setup(m => m.GetRandomDirection())
            .Returns(firstDirection);
            PopulationManager populationManagerTested = GetPopulationManager();
            List <double>     fakeDadGenes            = Enumerable.Range(0, 100).Select(i => (double)i).ToList();
            List <double>     fakeMumGenes            = Enumerable.Range(200, 100).Select(i => (double)i).ToList();
            DNA dad = new DNA(String.Join("||", fakeDadGenes));
            DNA mum = new DNA(String.Join("||", fakeMumGenes));

            DNA result = populationManagerTested.GetChildOf(mum, dad);

            result.Genes.Take(firstSplitSize)
            .Should().BeEquivalentTo(
                mum.Genes.Take(firstSplitSize)
                );
            result.Genes.Skip(firstSplitSize).Take(secondSplitSize)
            .Should().BeEquivalentTo(
                dad.Genes.Skip(firstSplitSize).Take(secondSplitSize)
                );
            result.Genes.Skip(firstSplitSize + secondSplitSize)
            .Should().BeEquivalentTo(
                mum.Genes.Skip(firstSplitSize + secondSplitSize)
                );
        }
        public void GetChildOf_Should_Return_DNA_With_Same_Number_Of_Genes_As_Parents()
        {
            PopulationManager populationManagerTested = GetPopulationManager();

            List <double> fakeGenes = Enumerable.Range(0, 100).Select(i => (double)i).ToList();
            DNA           dad       = new DNA(String.Join("||", fakeGenes));
            DNA           mum       = new DNA(String.Join("||", fakeGenes));

            DNA result = populationManagerTested.GetChildOf(mum, dad);

            result.Should().NotBeSameAs(dad);
            result.Should().NotBeSameAs(mum);
            result.Genes.Should().HaveCount(fakeGenes.Count);
        }
        public void GetChildOf_Should_Flip_Gene_When_FlipMutation_Occurs()
        {
            int gene = 62;

            MockRandomEnvironment.Setup(m => m.DoesFlipMutationOccur()).Returns(true);
            MockRandomEnvironment.Setup(m => m.GetNextInt(It.IsAny <int>()))
            .Returns(gene);
            PopulationManager populationManagerTested = GetPopulationManager();
            List <double>     fakeGenes = Enumerable.Range(0, 100).Select(i => (double)i).ToList();
            DNA dad = new DNA(String.Join("||", fakeGenes));
            DNA mum = new DNA(String.Join("||", fakeGenes));

            DNA result = populationManagerTested.GetChildOf(mum, dad);

            result.Genes[gene].Should().Be(-gene);
        }
        public void GetChildOf_Should_Reverse_Genes_When_InversionMutation_Occurs()
        {
            int fromGene = 2;
            int size     = 6;

            MockRandomEnvironment.Setup(m => m.DoesInversionMutationOccur()).Returns(true);
            MockRandomEnvironment.SetupSequence(m => m.GetNextInt(It.IsAny <int>()))
            .Returns(fromGene)
            .Returns(size);
            PopulationManager populationManagerTested = GetPopulationManager();

            List <double> fakeGenes = Enumerable.Range(0, 100).Select(i => (double)i).ToList();
            DNA           dad       = new DNA(String.Join("||", fakeGenes));
            DNA           mum       = new DNA(String.Join("||", fakeGenes));

            DNA result = populationManagerTested.GetChildOf(mum, dad);

            result.Genes.Skip(fromGene).Take(size).Should().BeInDescendingOrder();
        }
        public void GetChildOf_Should_Swap_Two_Genes_When_SwapMutation_Occurs()
        {
            int first  = 4;
            int second = 7;

            MockRandomEnvironment.Setup(m => m.DoesSwapMutationOccur()).Returns(true);
            MockRandomEnvironment.SetupSequence(m => m.GetNextInt(It.IsAny <int>()))
            .Returns(first)
            .Returns(second);
            PopulationManager populationManagerTested = GetPopulationManager();

            List <double> fakeGenes = Enumerable.Range(0, 100).Select(i => (double)i).ToList();
            DNA           dad       = new DNA(String.Join("||", fakeGenes));
            DNA           mum       = new DNA(String.Join("||", fakeGenes));

            DNA result = populationManagerTested.GetChildOf(mum, dad);

            result.Genes[first].Should().Be(second);
            result.Genes[second].Should().Be(first);
        }