public void CreateGene_Successful()
        {
            const string source     = @"
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;

namespace ConsoleApplication1
{
    class Calculations
    {
        double CalculateTotal(int quantity, int itemPrice)
        {
            double basePrice = quantity * itemPrice;

            if (basePrice > 1000)
            {
                return basePrice * 0.95;
            }
            else
            {
                return basePrice * 0.98;
            }
        }
    }
}";
            var          factory    = new RefactoringChromosome(3, source);
            var          chromosome = factory.GenerateGene(0);

            Assert.IsNotNull(chromosome);
        }
        public void LinesOfCode()
        {
            const string source = @"
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;

namespace ConsoleApplication1
{
    class Calculations
    {
        double CalculateTotal(int quantity, int itemPrice)
        {
            double basePrice = quantity * itemPrice;

            if (basePrice > 1000)
            {
                return basePrice * 0.95;
            }
            else
            {
                return basePrice * 0.98;
            }
        }
    }
}";

            var selection  = new EliteSelection();
            var crossover  = new OrderedCrossover();
            var mutation   = new ReverseSequenceMutation();
            var fitness    = new MetricsFitness <LinesOfCodeMetrics>();
            var chromosome = new RefactoringChromosome(3, source);
            var population = new Population(20, 30, chromosome);

            var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation)
            {
                Termination = new GenerationNumberTermination(50)
            };

            ga.Start();

            Assert.IsNotNull(ga.BestChromosome.Fitness);
            TestContext.WriteLine($"Best fitness is {ga.BestChromosome.Fitness} and source looks like: \n {ga.BestChromosome}");
        }
        public void CreateGene_OutOfBound()
        {
            const string source  = @"
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;

namespace ConsoleApplication1
{
    class Calculations
    {
        double CalculateTotal(int quantity, int itemPrice)
        {
            double basePrice = quantity * itemPrice;

            if (basePrice > 1000)
            {
                return basePrice * 0.95;
            }
            else
            {
                return basePrice * 0.98;
            }
        }
    }
}";
            var          factory = new RefactoringChromosome(3, source);

            foreach (var i in Enumerable.Range(0, 30))
            {
                var gene = factory.GenerateGene(i);
                Assert.IsNotNull(gene);
            }
        }