private void CheckRow(PrimeProcessor processor, int row, int[] primes, int sum)
        {
            var primeList = processor.PrimeTriplets(row);

            for (int i = 0; i < primes.Length; i++)
            {
                Assert.AreEqual(primeList[i + 1].Prime, primes[i]);
            }
            var sumPrimeTriplets = processor.SumOfPrimeTriplets(row);

            Assert.AreEqual(sumPrimeTriplets, sum);
        }
        public void PrimeTripletsTest()
        {
            //Problem 196 Prime triplets projecteuler.net/problem=196
            //Build a triangle from all positive integers in the following way:
            // 1
            // 2-  3-
            // 4   5-  6
            // 7-  8   9  10
            //11- 12  13- 14  15
            //16  17- 18  19- 20  21
            //22  23- 24  25  26  27  28
            //29- 30  31- 32  33  34  35  36
            //37- 38  39  40  41- 42  43- 44  45
            //46  47- 48  49  50  51  52  53- 54 55
            //56  57  58  59- 60  61- 62  63  64 65 66

            //Each positive integer has up to eight neighbours in the triangle.
            //A set of three primes is called a prime triplet if one of the three primes has the other two as neighbours in the triangle.
            //For example, in the second row, the prime numbers 2 and 3 are elements of some prime triplet.
            //If row 8 is considered, it contains two primes which are elements of some prime triplet, i.e. 29 and 31.
            //If row 9 is considered, it contains only one prime which is an element of some prime triplet: 37.
            //Define S(n) as the sum of the primes in row n which are elements of any prime triplet.
            //Then S(8)=60 and S(9)=37.
            //You are given that S(10000)=950007619.
            //Find  S(5678027) + S(7208785).

            // O( n * n * log(n) )

            var processor = new PrimeProcessor();
            var primeList = processor.PrimeTriplets(1);

            Assert.AreEqual(primeList[1].Prime, 1);

            int row = 2; int[] primes = new int[] { 2, 3 }; int sum = 5;

            CheckRow(processor, row, primes, sum);

            row = 3; primes = new int[] { 5 }; sum = 5;
            CheckRow(processor, row, primes, sum);

            row = 4; primes = new int[] { 7 }; sum = 7;
            CheckRow(processor, row, primes, sum);

            row = 5; primes = new int[] { 11, 13 }; sum = 24;
            CheckRow(processor, row, primes, sum);

            row = 6; primes = new int[] { 17, 19 }; sum = 36;
            CheckRow(processor, row, primes, sum);

            row = 7; primes = new int[] { 23 }; sum = 23;
            CheckRow(processor, row, primes, sum);

            row = 8; primes = new int[] { 29, 31 }; sum = 60;
            CheckRow(processor, row, primes, sum);

            row = 9; primes = new int[] { 37, 41, 43 }; sum = 37;
            CheckRow(processor, row, primes, sum);

            row = 10; primes = new int[] { 47, 53 }; sum = 47;
            CheckRow(processor, row, primes, sum);

            row = 11; primes = new int[] { 59, 61 }; sum = 120;
            CheckRow(processor, row, primes, sum);
        }