public void ConstructorTest()
        {
            // Valid input
            {
                var indexes = IndexCollection.Default(lastIndex: 5);

                var randomIndexPermutation = new
                                             RandomIndexPermutation(indexes: indexes);

                int i = 0;
                foreach (var index in randomIndexPermutation.Indexes)
                {
                    Assert.AreEqual(
                        expected: indexes[i],
                        actual: index);
                    i++;
                }
            }

            // indexes is null
            {
                IndexCollection indexes = null;

                ArgumentExceptionAssert.Throw(
                    () =>
                {
                    new RandomIndexPermutation(
                        indexes: indexes);
                },
                    expectedType: typeof(ArgumentNullException),
                    expectedPartialMessage: ArgumentExceptionAssert.NullPartialMessage,
                    expectedParameterName: "indexes");
            }
        }
            /// <summary>
            /// Tests that method
            /// <see cref="RandomIndexPermutation.Next"/>
            /// terminates successfully as expected.
            /// </summary>
            /// <param name="indexes">
            /// The indexes to permute.
            /// </param>
            /// <param name="numberOfRandomPermutations">
            /// The number of permutations to draw.
            /// </param>
            /// <param name="criticalValue">
            /// A quantile of the chi-squared distribution with a number of
            /// degrees of freedom equal to the <see cref="IndexCollection.Count"/>
            /// of <paramref name="indexes"/>
            /// minus <c>1</c>.
            /// To serve as the critical value for the Pearson's
            /// chi-squared test whose null hypothesis assume that the
            /// the distinct possible permutations
            /// are equiprobable.
            /// </param>
            /// <param name="delta">The required accuracy.
            /// Defaults to <c>.01</c>.</param>
            public static void Succeed(
                IndexCollection indexes,
                int numberOfRandomPermutations,
                double criticalValue,
                double delta = .01)
            {
                var randomPermutation = new RandomIndexPermutation(indexes);

                // Generate permutations

                var permutations = new IndexCollection[numberOfRandomPermutations];

                for (int i = 0; i < numberOfRandomPermutations; i++)
                {
                    permutations[i] = randomPermutation.Next();
                }

                // Check the number of distinct generated permutations

                var permutationIdentifiers =
                    IndexCollection.Default(numberOfRandomPermutations - 1);

                var actualDistinctPermutations =
                    IndexPartition.Create(
                        permutationIdentifiers,
                        (i) => { return(permutations[i]); });

                int numberOfActualDistinctPermutations =
                    actualDistinctPermutations.Count;

                Assert.AreEqual(
                    expected: SpecialFunctions.Factorial(indexes.Count),
                    actual: numberOfActualDistinctPermutations);

                // Compute the actual permutation probabilities

                DoubleMatrix actualPermutationProbabilities =
                    DoubleMatrix.Dense(
                        numberOfActualDistinctPermutations, 1);

                int j = 0;

                foreach (var identifier in actualDistinctPermutations.Identifiers)
                {
                    actualPermutationProbabilities[j] =
                        (double)actualDistinctPermutations[identifier].Count
                        /
                        (double)numberOfRandomPermutations;
                    j++;
                }

                // Check that the Chebyshev Inequality holds true
                // for each permutation probability

                var expectedPermutationProbabilities =
                    DoubleMatrix.Dense(
                        numberOfActualDistinctPermutations,
                        1,
                        1.0
                        /
                        (double)numberOfActualDistinctPermutations);

                for (int i = 0; i < numberOfActualDistinctPermutations; i++)
                {
                    ProbabilityDistributionTest.CheckChebyshevInequality(
                        new BernoulliDistribution(expectedPermutationProbabilities[i]),
                        actualPermutationProbabilities[i],
                        numberOfRandomPermutations,
                        delta);
                }

                // Check how good the actual permutation probabilities fit
                // the expected ones

                ProbabilityDistributionTest.CheckGoodnessOfFit(
                    expectedPermutationProbabilities,
                    actualPermutationProbabilities,
                    criticalValue);
            }