You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ah...@apache.org on 2019/09/16 18:59:07 UTC

[commons-rng] 11/13: Reinstate ignored tests for all zero seeds.

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-rng.git

commit 5f595c2efba368f5da74215628cf065f1742c3ea
Author: Alex Herbert <ah...@apache.org>
AuthorDate: Sat Sep 14 20:50:13 2019 +0100

    Reinstate ignored tests for all zero seeds.
    
    The test now checks the generator is functional (produces non-zero
    output). If true it is tested statistically. If false the generator is
    assumed to be non-functional and the test is skipped.
    
    This allows the test to ignore xor-shift based generators that require
    some bits in the state pool.
---
 .../rng/simple/ProvidersCommonParametricTest.java  | 28 +++++++++++++++++++---
 1 file changed, 25 insertions(+), 3 deletions(-)

diff --git a/commons-rng-simple/src/test/java/org/apache/commons/rng/simple/ProvidersCommonParametricTest.java b/commons-rng-simple/src/test/java/org/apache/commons/rng/simple/ProvidersCommonParametricTest.java
index ff12153..882f0b0 100644
--- a/commons-rng-simple/src/test/java/org/apache/commons/rng/simple/ProvidersCommonParametricTest.java
+++ b/commons-rng-simple/src/test/java/org/apache/commons/rng/simple/ProvidersCommonParametricTest.java
@@ -29,7 +29,6 @@ import java.io.ByteArrayInputStream;
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.Assume;
-import org.junit.Ignore;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
@@ -134,19 +133,23 @@ public class ProvidersCommonParametricTest {
         checkNextIntegerInRange(rng, 10, 10000);
     }
 
-    @Ignore@Test
+    @Test
     public void testZeroIntArraySeed() {
         // Exercise capacity to escape all "zero" state.
         final int[] zero = new int[2000]; // Large enough to fill the entire state with zeroes.
         final UniformRandomProvider rng = RandomSource.create(originalSource, zero, originalArgs);
+        Assume.assumeTrue("RNG is non-functional with an all zero seed: " + originalSource,
+                createsNonZeroLongOutput(rng, 2000));
         checkNextIntegerInRange(rng, 10, 10000);
     }
 
-    @Ignore@Test
+    @Test
     public void testZeroLongArraySeed() {
         // Exercise capacity to escape all "zero" state.
         final long[] zero = new long[2000]; // Large enough to fill the entire state with zeroes.
         final UniformRandomProvider rng = RandomSource.create(originalSource, zero, originalArgs);
+        Assume.assumeTrue("RNG is non-functional with an all zero seed: " + originalSource,
+                createsNonZeroLongOutput(rng, 2000));
         checkNextIntegerInRange(rng, 10, 10000);
     }
 
@@ -359,4 +362,23 @@ public class ProvidersCommonParametricTest {
                         " (" + numFailures + " out of " + numTests + " tests failed)");
         }
     }
+
+    /**
+     * Return true if the generator creates non-zero output from
+     * {@link UniformRandomProvider#nextLong()} within the given number of cycles.
+     *
+     * @param rng Random generator.
+     * @param cycles Number of cycles.
+     * @return true if non-zero output
+     */
+    private static boolean createsNonZeroLongOutput(UniformRandomProvider rng,
+                                                    int cycles) {
+        boolean nonZero = false;
+        for (int i = 0; i < cycles; i++) {
+            if (rng.nextLong() != 0) {
+                nonZero = true;
+            }
+        }
+        return nonZero;
+    }
 }