/// <summary>
                /// Tests that samplers
                /// in <see cref="RandomNumberGenerator"/>
                /// filling an array with a sample fail
                /// when parameter sampleSize is too big to
                /// fit in the destination array.
                /// </summary>
                /// <typeparam name="TSample">The type of a sample point.</typeparam>
                /// <typeparam name="TParameters">
                /// The type of the distribution parameters.</typeparam>
                /// <param name="sampleArrayFunc">
                /// A method returning a sample from a
                /// statistical distribution having the specified
                /// parameters.</param>
                /// <param name="distributionParameters">The parameters of the distribution
                /// from which the sample is drawn.</param>
                public static void SampleSizeIsTooBig <TSample, TParameters>(
                    SampleArrayFunc <TSample, TParameters> sampleArrayFunc,
                    TParameters[] distributionParameters)
                {
                    string STR_EXCEPT_PDF_SAMPLESIZE_ARRAYLENGTH_MISMATCH =
                        String.Format(
                            (string)Reflector.ExecuteStaticMember(
                                typeof(ImplementationServices),
                                "GetResourceString",
                                new string[] { "STR_EXCEPT_PDF_SAMPLESIZE_ARRAYLENGTH_MISMATCH" }),
                            "sampleSize",
                            "destinationArray",
                            "destinationIndex");


                    string parameterName = "sampleSize";

                    ArgumentExceptionAssert.Throw(
                        () =>
                    {
                        sampleArrayFunc(
                            sampleSize: 2,
                            destinationArray: new TSample[1],
                            destinationIndex: 0,
                            parameters: distributionParameters);
                    },
                        expectedType: typeof(ArgumentException),
                        expectedPartialMessage: STR_EXCEPT_PDF_SAMPLESIZE_ARRAYLENGTH_MISMATCH,
                        expectedParameterName: parameterName);
                }
                /// <summary>
                /// Tests that samplers
                /// in <see cref="RandomNumberGenerator"/>
                /// filling an array with a sample fail
                /// when parameter destinationIndex is negative.
                /// </summary>
                /// <typeparam name="TSample">The type of a sample point.</typeparam>
                /// <typeparam name="TParameters">
                /// The type of the distribution parameters.</typeparam>
                /// <param name="sampleArrayFunc">
                /// A method returning a sample from a
                /// statistical distribution having the specified
                /// parameters.</param>
                /// <param name="distributionParameters">The parameters of the distribution
                /// from which the sample is drawn.</param>
                public static void DestinationIndexIsNegative <TSample, TParameters>(
                    SampleArrayFunc <TSample, TParameters> sampleArrayFunc,
                    TParameters[] distributionParameters)
                {
                    string STR_EXCEPT_PAR_MUST_BE_NON_NEGATIVE =
                        (string)Reflector.ExecuteStaticMember(
                            typeof(ImplementationServices),
                            "GetResourceString",
                            new string[] { "STR_EXCEPT_PAR_MUST_BE_NON_NEGATIVE" });

                    string parameterName = "destinationIndex";

                    // distribution.Sample(sampleSize, destinationArray, destinationIndex)
                    ArgumentExceptionAssert.Throw(
                        () =>
                    {
                        sampleArrayFunc(
                            sampleSize: 1,
                            destinationArray: new TSample[1],
                            destinationIndex: -1,
                            parameters: distributionParameters);
                    },
                        expectedType: typeof(ArgumentOutOfRangeException),
                        expectedPartialMessage: STR_EXCEPT_PAR_MUST_BE_NON_NEGATIVE,
                        expectedParameterName: parameterName);
                }
                /// <summary>
                /// Tests that samplers
                /// in <see cref="RandomNumberGenerator"/>
                /// filling an array with a sample fail
                /// when parameter destinationArray is <b>null</b>.
                /// </summary>
                /// <typeparam name="TSample">The type of a sample point.</typeparam>
                /// <typeparam name="TParameters">
                /// The type of the distribution parameters.</typeparam>
                /// <param name="sampleArrayFunc">
                /// A method returning a sample from a
                /// statistical distribution having the specified
                /// parameters.</param>
                /// <param name="distributionParameters">The parameters of the distribution
                /// from which the sample is drawn.</param>
                public static void DestinationArrayIsNull <TSample, TParameters>(
                    SampleArrayFunc <TSample, TParameters> sampleArrayFunc,
                    TParameters[] distributionParameters)
                {
                    string parameterName = "destinationArray";

                    ArgumentExceptionAssert.Throw(
                        () =>
                    {
                        sampleArrayFunc(
                            sampleSize: 1,
                            destinationArray: null,
                            destinationIndex: 0,
                            parameters: distributionParameters);
                    },
                        expectedType: typeof(ArgumentNullException),
                        expectedPartialMessage: ArgumentExceptionAssert.NullPartialMessage,
                        expectedParameterName: parameterName);
                }
            /// <summary>
            /// Tests that methods
            /// of <see cref="RandomNumberGenerator"/>
            /// returning a sample of integers to an array from a
            /// statistical distribution
            /// terminates successfully when expected.
            /// </summary>
            /// <typeparam name="TParameters">
            /// The type of the distribution parameters.</typeparam>
            /// <param name="distributionMean">The mean of the distribution
            /// from which the sample has been drawn.</param>
            /// <param name="distributionVariance">
            /// The variance of the distribution
            /// from which the sample has been drawn.</param>
            /// <param name="sampleSize">The sample size.</param>
            /// <param name="delta">The required accuracy.</param>
            /// <param name="sampleArrayFunc">
            /// A method returning a sample from a
            /// statistical distribution having the specified
            /// parameters.</param>
            /// <param name="distributionParameters">The parameters of the distribution
            /// from which the sample is drawn.</param>
            public static void Int32Succeed <TParameters>(
                double distributionMean,
                double distributionVariance,
                int sampleSize,
                double delta,
                SampleArrayFunc <int, TParameters> sampleArrayFunc,
                params TParameters[] distributionParameters)
            {
                bool CanCheckChebyshevInequality =
                    !Double.IsInfinity(distributionMean)
                    &&
                    !Double.IsPositiveInfinity(distributionVariance);

                // distribution.Sample(sampleSize, destinationArray, destinationIndex)
                {
                    int   destinationSize  = sampleSize * 10;
                    int   partialSize      = sampleSize;
                    var   sample           = new int[destinationSize];
                    int[] destinationArray = sample;

                    IndexCollection destinationIndexes =
                        IndexCollection.Sequence(0, partialSize, destinationSize - 1);

                    foreach (var destinationIndex in destinationIndexes)
                    {
                        sampleArrayFunc(
                            partialSize,
                            destinationArray,
                            destinationIndex,
                            distributionParameters);
                    }

                    if (CanCheckChebyshevInequality)
                    {
                        RandomNumberGeneratorTest.CheckChebyshevInequality(
                            distributionMean: distributionMean,
                            distributionVariance: distributionVariance,
                            sampleMean: sample.Average(),
                            sampleSize: sampleSize,
                            delta: delta);
                    }
                }
            }
            /// <summary>
            /// Tests that methods
            /// of <see cref="RandomNumberGenerator"/>
            /// returning a sample of doubles to an array from a
            /// statistical distribution
            /// terminates successfully when expected.
            /// </summary>
            /// <typeparam name="TParameters">
            /// The type of the distribution parameters.</typeparam>
            /// <param name="distributionMean">The mean of the distribution
            /// from which the sample has been drawn.</param>
            /// <param name="distributionVariance">
            /// The variance of the distribution
            /// from which the sample has been drawn.</param>
            /// <param name="sampleSize">The sample size.</param>
            /// <param name="delta">The required accuracy.</param>
            /// <param name="sampleArrayFunc">
            /// A method returning a sample from a
            /// statistical distribution having the specified
            /// parameters.</param>
            /// <param name="distributionParameters">The parameters of the distribution
            /// from which the sample is drawn.</param>
            public static void DoubleSucceed <TParameters>(
                double distributionMean,
                double distributionVariance,
                int sampleSize,
                double delta,
                SampleArrayFunc <double, TParameters> sampleArrayFunc,
                params TParameters[] distributionParameters)
            {
                bool canCheckChebyshevInequality =
                    !Double.IsInfinity(distributionMean)
                    &&
                    !Double.IsPositiveInfinity(distributionVariance);

                // distribution.Sample(sampleSize, destinationArray, destinationIndex)
                {
                    int      destinationSize  = sampleSize * 10;
                    int      partialSize      = sampleSize;
                    var      sample           = DoubleMatrix.Dense(destinationSize, 1);
                    double[] destinationArray = sample.GetStorage();

                    IndexCollection destinationIndexes =
                        IndexCollection.Sequence(0, partialSize, destinationSize - 1);

                    foreach (var destinationIndex in destinationIndexes)
                    {
                        sampleArrayFunc(
                            partialSize,
                            destinationArray,
                            destinationIndex,
                            distributionParameters);
                    }

                    if (canCheckChebyshevInequality)
                    {
                        RandomNumberGeneratorTest.CheckChebyshevInequality(
                            distributionMean: distributionMean,
                            distributionVariance: distributionVariance,
                            sampleMean: Stat.Mean(sample),
                            sampleSize: sampleSize,
                            delta: delta);
                    }
                }
            }