This is an automated email from the ASF dual-hosted git repository. aherbert pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-statistics.git
commit 962ddfc467c0488948439528a21445422e6a4dc5 Author: Alex Herbert <aherb...@apache.org> AuthorDate: Thu Nov 17 15:58:45 2022 +0000 Use parameterized tests --- .../statistics/distribution/ArgumentUtilsTest.java | 50 ++++++++--------- .../distribution/BetaDistributionTest.java | 48 ++++++++--------- .../distribution/ChiSquaredDistributionTest.java | 63 ++++++++++++---------- 3 files changed, 84 insertions(+), 77 deletions(-) diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ArgumentUtilsTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ArgumentUtilsTest.java index 82c09f9..59a33f1 100644 --- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ArgumentUtilsTest.java +++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ArgumentUtilsTest.java @@ -17,37 +17,37 @@ package org.apache.commons.statistics.distribution; import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; /** * Test for {@link ArgumentUtils}. */ class ArgumentUtilsTest { - @Test - void testIsFiniteStrictlyPositive() { - final double[] good = {Double.MIN_VALUE, 1, 2, 3, Double.MAX_VALUE}; - final double[] bad = {0, -0.0, -Double.MIN_VALUE, -Double.MAX_VALUE, - Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NaN}; - for (final double x : good) { - Assertions.assertTrue(ArgumentUtils.isFiniteStrictlyPositive(x), () -> Double.toString(x)); - } - for (final double x : bad) { - Assertions.assertFalse(ArgumentUtils.isFiniteStrictlyPositive(x), () -> Double.toString(x)); - } + @ParameterizedTest + @ValueSource(doubles = {Double.MIN_VALUE, 1, 2, 3, Double.MAX_VALUE}) + void testIsFiniteStrictlyPositiveTrue(double x) { + Assertions.assertTrue(ArgumentUtils.isFiniteStrictlyPositive(x), () -> Double.toString(x)); } - @Test - void testCheckProbability() { - // Currently this allows -0.0 - final double[] good = {-0.0, 0.0, Double.MIN_VALUE, 1 - 0x1.0p-53, 1}; - final double[] bad = {-Double.MIN_VALUE, -0.1, -1, -2, Math.nextUp(1.0), 1.1, -Double.MAX_VALUE, - Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NaN}; - for (final double p : good) { - Assertions.assertDoesNotThrow(() -> ArgumentUtils.checkProbability(p), () -> Double.toString(p)); - } - for (final double p : bad) { - Assertions.assertThrows(IllegalArgumentException.class, - () -> ArgumentUtils.checkProbability(p), () -> Double.toString(p)); - } + @ParameterizedTest + @ValueSource(doubles = {0, -0.0, -Double.MIN_VALUE, -Double.MAX_VALUE, + Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NaN}) + void testIsFiniteStrictlyPositiveFalse(double x) { + Assertions.assertFalse(ArgumentUtils.isFiniteStrictlyPositive(x), () -> Double.toString(x)); + } + + @ParameterizedTest + @ValueSource(doubles = {-0.0, 0.0, Double.MIN_VALUE, 1 - 0x1.0p-53, 1}) + void testCheckProbability(double p) { + Assertions.assertDoesNotThrow(() -> ArgumentUtils.checkProbability(p), () -> Double.toString(p)); + } + + @ParameterizedTest + @ValueSource(doubles = {-Double.MIN_VALUE, -0.1, -1, -2, 1.0 + 0x1.0p-52, 1.1, -Double.MAX_VALUE, + Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NaN}) + void testCheckProbabilityThrows(double p) { + Assertions.assertThrows(IllegalArgumentException.class, + () -> ArgumentUtils.checkProbability(p), () -> Double.toString(p)); } } diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BetaDistributionTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BetaDistributionTest.java index 86984ac..30ec9fd 100644 --- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BetaDistributionTest.java +++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/BetaDistributionTest.java @@ -73,31 +73,16 @@ class BetaDistributionTest extends BaseContinuousDistributionTest { * Precision tests for verifying that CDF calculates accurately in cases * where 1-cdf(x) is inaccurately 1. */ - @Test - void testCumulativePrecision() { - // Calculated using WolframAlpha - checkCumulativePrecision(5.0, 5.0, 0.0001, 1.2595800539968654e-18); - checkCumulativePrecision(4.0, 5.0, 0.00001, 6.999776002800025e-19); - checkCumulativePrecision(5.0, 4.0, 0.0001, 5.598600119996539e-19); - checkCumulativePrecision(6.0, 2.0, 0.001, 6.994000000000028e-18); - checkCumulativePrecision(2.0, 6.0, 1e-9, 2.0999999930000014e-17); - } - - /** - * Precision tests for verifying that survival function calculates accurately in cases - * where 1-sf(x) is inaccurately 1. - */ - @Test - void testSurvivalPrecision() { + @ParameterizedTest + @CsvSource({ // Calculated using WolframAlpha - checkSurvivalPrecision(5.0, 5.0, 0.9999, 1.2595800539961496e-18); - checkSurvivalPrecision(4.0, 5.0, 0.9999, 5.598600119993397e-19); - checkSurvivalPrecision(5.0, 4.0, 0.99998, 1.1199283217964632e-17); - checkSurvivalPrecision(6.0, 2.0, 0.999999999, 2.0999998742158932e-17); - checkSurvivalPrecision(2.0, 6.0, 0.999, 6.994000000000077e-18); - } - - private static void checkCumulativePrecision(double alpha, double beta, double value, double expected) { + "5.0, 5.0, 0.0001, 1.2595800539968654e-18", + "4.0, 5.0, 0.00001, 6.999776002800025e-19", + "5.0, 4.0, 0.0001, 5.598600119996539e-19", + "6.0, 2.0, 0.001, 6.994000000000028e-18", + "2.0, 6.0, 1e-9, 2.0999999930000014e-17", + }) + void testCumulativePrecision(double alpha, double beta, double value, double expected) { final double tolerance = 1e-22; final BetaDistribution dist = BetaDistribution.of(alpha, beta); Assertions.assertEquals( @@ -107,7 +92,20 @@ class BetaDistributionTest extends BaseContinuousDistributionTest { () -> "cumulative probability not precise at " + value + " for a=" + alpha + " & b=" + beta); } - private static void checkSurvivalPrecision(double alpha, double beta, double value, double expected) { + /** + * Precision tests for verifying that survival function calculates accurately in cases + * where 1-sf(x) is inaccurately 1. + */ + @ParameterizedTest + @CsvSource({ + // Calculated using WolframAlpha + "5.0, 5.0, 0.9999, 1.2595800539961496e-18", + "4.0, 5.0, 0.9999, 5.598600119993397e-19", + "5.0, 4.0, 0.99998, 1.1199283217964632e-17", + "6.0, 2.0, 0.999999999, 2.0999998742158932e-17", + "2.0, 6.0, 0.999, 6.994000000000077e-18", + }) + void testSurvivalPrecision(double alpha, double beta, double value, double expected) { final double tolerance = 1e-22; final BetaDistribution dist = BetaDistribution.of(alpha, beta); Assertions.assertEquals( diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ChiSquaredDistributionTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ChiSquaredDistributionTest.java index 57daa18..6917a97 100644 --- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ChiSquaredDistributionTest.java +++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ChiSquaredDistributionTest.java @@ -17,7 +17,10 @@ package org.apache.commons.statistics.distribution; -import org.junit.jupiter.api.Test; +import java.util.stream.Stream; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; /** * Test cases for {@link ChiSquaredDistribution}. @@ -50,37 +53,43 @@ class ChiSquaredDistributionTest extends BaseContinuousDistributionTest { //-------------------- Additional test cases ------------------------------- - @Test - void testAdditionalDensity() { + @ParameterizedTest + @MethodSource + void testAdditionalDensity(double df, double[] points, double[] values) { // Values have many digits above the decimal point so use relative tolerance final DoubleTolerance tol = createRelTolerance(5e-14); + testDensity(ChiSquaredDistribution.of(df), points, values, tol); + } - final double[] x = new double[]{-0.1, 1e-6, 0.5, 1, 2, 5}; + static Stream<Arguments> testAdditionalDensity() { // R 2.5: // x <- c(-0.1, 1e-6, 0.5, 1, 2, 5) - // print(dchisq(x, df=1), digits=17) - testDensity(ChiSquaredDistribution.of(1), x, new double[] { - 0.0, 398.942080930342626743, 0.439391289467722435, 0.241970724519143365, - 0.103776874355148693, 0.014644982561926489}, tol); - // print(dchisq(x, df=0.1), digits=17) - testDensity(ChiSquaredDistribution.of(0.1), x, new double[]{ - 0, 2.4864539972849805e+04, 7.4642387316120481e-02, - 3.0090777182393683e-02, 9.4472991589506262e-03, 8.8271993957607896e-04}, tol); - // print(dchisq(x, df=2), digits=17) - testDensity(ChiSquaredDistribution.of(2), x, new double[]{0, - 0.49999975000006253, 0.38940039153570244, - 0.30326532985631671, 0.18393972058572117, 0.04104249931194940}, tol); - // print(dchisq(x, df=10), digits=17) - testDensity(ChiSquaredDistribution.of(10), x, new double[]{0, - 1.3020826822918329e-27, 6.3378969976514082e-05, - 7.8975346316749191e-04, 7.6641550244050524e-03, 6.6800942890542614e-02}, tol); - // print(dchisq(x, df=100), digits=17) - testDensity(ChiSquaredDistribution.of(100), x, new double[]{0, - 0.0000000000000000e+00, 2.0200026568141969e-93, - 8.8562141121618944e-79, 3.0239224849774644e-64, 2.1290671364111626e-45}, tol); + final double[] x = new double[]{-0.1, 1e-6, 0.5, 1, 2, 5}; + return Stream.of( + // print(dchisq(x, df=1), digits=17) + Arguments.of(1, x, new double[] { + 0, 398.942080930342626743, 0.439391289467722435, 0.241970724519143365, + 0.103776874355148693, 0.014644982561926489}), + // print(dchisq(x, df=0.1), digits=17) + Arguments.of(0.1, x, new double[] { + 0, 2.4864539972849805e+04, 7.4642387316120481e-02, + 3.0090777182393683e-02, 9.4472991589506262e-03, 8.8271993957607896e-04}), + // print(dchisq(x, df=2), digits=17) + Arguments.of(2, x, new double[] { + 0, 0.49999975000006253, 0.38940039153570244, + 0.30326532985631671, 0.18393972058572117, 0.04104249931194940}), + // print(dchisq(x, df=10), digits=17) + Arguments.of(10, x, new double[] { + 0, 1.3020826822918329e-27, 6.3378969976514082e-05, + 7.8975346316749191e-04, 7.6641550244050524e-03, 6.6800942890542614e-02}), + // print(dchisq(x, df=100), digits=17) + Arguments.of(100, x, new double[] { + 0, 0.0000000000000000e+00, 2.0200026568141969e-93, + 8.8562141121618944e-79, 3.0239224849774644e-64, 2.1290671364111626e-45}) - // TODO: - // Add more density checks with large DF and x points around the mean - // and into overflow for the underlying Gamma distribution. + // TODO: + // Add more density checks with large DF and x points around the mean + // and into overflow for the underlying Gamma distribution. + ); } }