/// <summary>
        ///
        /// </summary>
        /// <param name="numberOfPrimesToFind"></param>
        /// <param name="isPrimeTester"></param>
        /// <param name="allowedVersionNumbers"></param>
        protected static void TestFindPrimesToPerformance(int numberOfPrimesToFind, IIsPrime isPrimeTester, int[] allowedVersionNumbers = null)
        {
            Type[] findPrimesToTypes = PerformanceTests.GetTestingTypes("PrimeNumbers.Model", "FindPrimesToV", allowedVersionNumbers);

            if ((findPrimesToTypes != null) &&
                (findPrimesToTypes.Any()))
            {
                Console.WriteLine($"FindPrimesTo Testing with {numberOfPrimesToFind.ToString("#,##0")}");

                foreach (Type type in findPrimesToTypes)
                {
                    IFindPrimesTo findPrimesToTester = (IFindPrimesTo)Activator.CreateInstance(type);

                    PerformanceTests.FindPrimesToTimer(findPrimesToTester, isPrimeTester, numberOfPrimesToFind);
                }
            }
            else
            {
                Console.WriteLine("No FindPrimesTo Classes found to test with");
            }

            Console.WriteLine();
        }
        protected static void TestRun()
        {
            //ulong numberToTest = ulong.MaxValue - 1;
            //for (ulong i = numberToTest; i > 0; i = i - 1)
            //{
            //    if (new IsPrimeV6().CheckIsPrime(i))
            //    {
            //        numberToTest = i;
            //        break;
            //    }
            //    else
            //    {
            //        Console.WriteLine($"{i.ToString("#,##0")} is not prime");
            //    }
            //}
            //ulong numberToTest = (int.MaxValue - 57);
            //ulong numberToTest = 32416190071; // bigprimes.net larges prime number.
            ulong numberToTest = 18446744073709551557;

            Console.WriteLine($"Testing with Number : {numberToTest.ToString("#,##0")}");
            Console.WriteLine($"int : {(((decimal)numberToTest / (decimal)int.MaxValue) * 100).ToString()}%");
            Console.WriteLine($"Uint : {(((decimal)numberToTest / (decimal)uint.MaxValue) * 100).ToString()}%");
            Console.WriteLine($"long : {(((decimal)numberToTest / (decimal)long.MaxValue) * 100).ToString()}%");
            Console.WriteLine($"Ulong : {(((decimal)numberToTest / (decimal)ulong.MaxValue) * 100).ToString()}%");
            Console.WriteLine();

            //Program.IsPrimeTimer(new PrimeNumbers.Model.IsPrime.IsPrimeV1(), numberToTest);
            //Program.IsPrimeTimer(new PrimeNumbers.Model.IsPrime.IsPrimeV2(), numberToTest);
            //Program.IsPrimeTimer(new PrimeNumbers.Model.IsPrime.IsPrimeV3(), numberToTest);
            //Program.IsPrimeTimer(new PrimeNumbers.Model.IsPrime.IsPrimeV4(), numberToTest);
            //Program.IsPrimeTimer(new PrimeNumbers.Model.IsPrime.IsPrimeV5(), numberToTest);
            //Program.IsPrimeTimer(new PrimeNumbers.Model.IsPrime.IsPrimeV6(), numberToTest);
            //Program.IsPrimeTimer(new PrimeNumbers.Model.IsPrime.IsPrimeV7(), numberToTest);
            //Program.IsPrimeTimer(new PrimeNumbers.Model.IsPrime.IsPrimeV8(), numberToTest);

            List <Task> tasks = new List <Task>();

            //tasks.Add(Task.Factory.StartNew(() => Program.IsPrimeTimer(new PrimeNumbers.Model.IsPrime.IsPrimeV1(), numberToTest)));
            //tasks.Add(Task.Factory.StartNew(() => Program.IsPrimeTimer(new PrimeNumbers.Model.IsPrime.IsPrimeV2(), numberToTest)));
            //tasks.Add(Task.Factory.StartNew(() => Program.IsPrimeTimer(new PrimeNumbers.Model.IsPrime.IsPrimeV3(), numberToTest)));
            //tasks.Add(Task.Factory.StartNew(() => Program.IsPrimeTimer(new PrimeNumbers.Model.IsPrime.IsPrimeV4(), numberToTest)));
            tasks.Add(Task.Factory.StartNew(() => PerformanceTests.IsPrimeTimer(new PrimeNumbers.Model.IsPrime.IsPrimeV5(), numberToTest)));
            tasks.Add(Task.Factory.StartNew(() => PerformanceTests.IsPrimeTimer(new PrimeNumbers.Model.IsPrime.IsPrimeV6(), numberToTest)));
            tasks.Add(Task.Factory.StartNew(() => PerformanceTests.IsPrimeTimer(new PrimeNumbers.Model.IsPrime.IsPrimeV7(), numberToTest)));
            tasks.Add(Task.Factory.StartNew(() => PerformanceTests.IsPrimeTimer(new PrimeNumbers.Model.IsPrime.IsPrimeV8(), numberToTest)));

            Console.WriteLine($"{DateTime.Now.ToString()} Tasks Running");
            Task.WaitAll(tasks.ToArray());

            //int numberofPrimesToFind = int.MaxValue - 57;
            //int numberofPrimesToFind = (int.MaxValue - 100) / 2;
            int numberofPrimesToFind = (int.MaxValue - 100) / 4;

            Console.WriteLine($"Finding {numberofPrimesToFind.ToString("#,##0")}");
            Console.WriteLine($"int : {(((decimal)numberofPrimesToFind / (decimal)int.MaxValue) * 100).ToString()}%");
            Console.WriteLine($"Uint : {(((decimal)numberofPrimesToFind / (decimal)uint.MaxValue) * 100).ToString()}%");
            Console.WriteLine($"long : {(((decimal)numberofPrimesToFind / (decimal)long.MaxValue) * 100).ToString()}%");
            Console.WriteLine($"Ulong : {(((decimal)numberofPrimesToFind / (decimal)ulong.MaxValue) * 100).ToString()}%");
            Console.WriteLine();

            //Program.NumberOfPrimesToFind(new PrimeNumbers.Model.FindPrimesTo.FindPrimesToV1(), new PrimeNumbers.Model.IsPrime.IsPrimeV1(), numberofPrimesToFind);
            //Program.NumberOfPrimesToFind(new PrimeNumbers.Model.FindPrimesTo.FindPrimesToV1(), new PrimeNumbers.Model.IsPrime.IsPrimeV2(), numberofPrimesToFind);
            //Program.NumberOfPrimesToFind(new PrimeNumbers.Model.FindPrimesTo.FindPrimesToV1(), new PrimeNumbers.Model.IsPrime.IsPrimeV3(), numberofPrimesToFind);
            //Program.NumberOfPrimesToFind(new PrimeNumbers.Model.FindPrimesTo.FindPrimesToV1(), new PrimeNumbers.Model.IsPrime.IsPrimeV4(), numberofPrimesToFind);
            //Program.NumberOfPrimesToFind(new PrimeNumbers.Model.FindPrimesTo.FindPrimesToV1(), new PrimeNumbers.Model.IsPrime.IsPrimeV5(), numberofPrimesToFind);
            //Program.NumberOfPrimesToFind(new PrimeNumbers.Model.FindPrimesTo.FindPrimesToV1(), new PrimeNumbers.Model.IsPrime.IsPrimeV6(), numberofPrimesToFind);
            //Program.NumberOfPrimesToFind(new PrimeNumbers.Model.FindPrimesTo.FindPrimesToV1(), new PrimeNumbers.Model.IsPrime.IsPrimeV7(), numberofPrimesToFind);
            //Program.NumberOfPrimesToFind(new PrimeNumbers.Model.FindPrimesTo.FindPrimesToV1(), new PrimeNumbers.Model.IsPrime.IsPrimeV8(), numberofPrimesToFind);

            tasks.Clear();

            tasks.Add(Task.Factory.StartNew(() => PerformanceTests.FindPrimesToTimer(new PrimeNumbers.Model.FindPrimesTo.FindPrimesToV1(), new PrimeNumbers.Model.IsPrime.IsPrimeV7(), numberofPrimesToFind)));
            tasks.Add(Task.Factory.StartNew(() => PerformanceTests.FindPrimesToTimer(new PrimeNumbers.Model.FindPrimesTo.FindPrimesToV2(), new PrimeNumbers.Model.IsPrime.IsPrimeV7(), numberofPrimesToFind)));
            tasks.Add(Task.Factory.StartNew(() => PerformanceTests.FindPrimesToTimer(new PrimeNumbers.Model.FindPrimesTo.FindPrimesToV3(), new PrimeNumbers.Model.IsPrime.IsPrimeV7(), numberofPrimesToFind)));
            tasks.Add(Task.Factory.StartNew(() => PerformanceTests.FindPrimesToTimer(new PrimeNumbers.Model.FindPrimesTo.FindPrimesToV4(), new PrimeNumbers.Model.IsPrime.IsPrimeV7(), numberofPrimesToFind)));
            tasks.Add(Task.Factory.StartNew(() => PerformanceTests.FindPrimesToTimer(new PrimeNumbers.Model.FindPrimesTo.FindPrimesToV5(), new PrimeNumbers.Model.IsPrime.IsPrimeV7(), numberofPrimesToFind)));

            Console.WriteLine($"{DateTime.Now.ToString()} Tasks Running");
            Task.WaitAll(tasks.ToArray());

            tasks.Clear();

            //tasks.Add(Task.Factory.StartNew(() => Program.NumberOfPrimesToFind(new PrimeNumbers.Model.FindPrimesTo.FindPrimesToV5(), new PrimeNumbers.Model.IsPrime.IsPrimeV1(), numberofPrimesToFind)));
            //tasks.Add(Task.Factory.StartNew(() => Program.NumberOfPrimesToFind(new PrimeNumbers.Model.FindPrimesTo.FindPrimesToV5(), new PrimeNumbers.Model.IsPrime.IsPrimeV2(), numberofPrimesToFind)));
            //tasks.Add(Task.Factory.StartNew(() => Program.NumberOfPrimesToFind(new PrimeNumbers.Model.FindPrimesTo.FindPrimesToV5(), new PrimeNumbers.Model.IsPrime.IsPrimeV3(), numberofPrimesToFind)));
            //tasks.Add(Task.Factory.StartNew(() => Program.NumberOfPrimesToFind(new PrimeNumbers.Model.FindPrimesTo.FindPrimesToV5(), new PrimeNumbers.Model.IsPrime.IsPrimeV4(), numberofPrimesToFind)));
            tasks.Add(Task.Factory.StartNew(() => PerformanceTests.FindPrimesToTimer(new PrimeNumbers.Model.FindPrimesTo.FindPrimesToV5(), new PrimeNumbers.Model.IsPrime.IsPrimeV5(), numberofPrimesToFind)));
            tasks.Add(Task.Factory.StartNew(() => PerformanceTests.FindPrimesToTimer(new PrimeNumbers.Model.FindPrimesTo.FindPrimesToV5(), new PrimeNumbers.Model.IsPrime.IsPrimeV6(), numberofPrimesToFind)));
            tasks.Add(Task.Factory.StartNew(() => PerformanceTests.FindPrimesToTimer(new PrimeNumbers.Model.FindPrimesTo.FindPrimesToV5(), new PrimeNumbers.Model.IsPrime.IsPrimeV7(), numberofPrimesToFind)));
            tasks.Add(Task.Factory.StartNew(() => PerformanceTests.FindPrimesToTimer(new PrimeNumbers.Model.FindPrimesTo.FindPrimesToV5(), new PrimeNumbers.Model.IsPrime.IsPrimeV8(), numberofPrimesToFind)));

            Console.WriteLine($"{DateTime.Now.ToString()} Tasks Running");
            Task.WaitAll(tasks.ToArray());

            //tasks.Clear();

            //tasks.Add(Task.Factory.StartNew(() => Program.NumberOfPrimesToFind(new PrimeNumbers.Model.FindPrimesTo.FindPrimesToV4(), new PrimeNumbers.Model.IsPrime.IsPrimeV7(), numberofPrimesToFind)));
            //tasks.Add(Task.Factory.StartNew(() => Program.NumberOfPrimesToFind(new PrimeNumbers.Model.FindPrimesTo.FindPrimesToV5(), new PrimeNumbers.Model.IsPrime.IsPrimeV7(), numberofPrimesToFind)));
            //tasks.Add(Task.Factory.StartNew(() => Program.NumberOfPrimesToFind(new PrimeNumbers.Model.FindPrimesTo.FindPrimesToV3(), new PrimeNumbers.Model.IsPrime.IsPrimeV7(), numberofPrimesToFind)));
            //tasks.Add(Task.Factory.StartNew(() => Program.NumberOfPrimesToFind(new PrimeNumbers.Model.FindPrimesTo.FindPrimesToV4(), new PrimeNumbers.Model.IsPrime.IsPrimeV7(), numberofPrimesToFind)));

            //Console.WriteLine($"{DateTime.Now.ToString()} Tasks Running");
            //Task.WaitAll(tasks.ToArray());

            //Program.NumberOfPrimesToFind(new PrimeNumbers.Model.FindPrimesTo.FindPrimesToV4(), new PrimeNumbers.Model.IsPrime.IsPrimeV7(), numberofPrimesToFind);
            //Program.NumberOfPrimesToFind(new PrimeNumbers.Model.FindPrimesTo.FindPrimesToV5(), new PrimeNumbers.Model.IsPrime.IsPrimeV7(), numberofPrimesToFind);
        }