Author: erans
Date: Thu Jan 16 15:26:29 2014
New Revision: 1558833

URL: http://svn.apache.org/r1558833
Log:
MATH-1088
Ensure that bad usage will raise an exception.

Modified:
    
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/util/MultidimensionalCounter.java
    
commons/proper/math/trunk/src/test/java/org/apache/commons/math3/util/MultidimensionalCounterTest.java

Modified: 
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/util/MultidimensionalCounter.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/util/MultidimensionalCounter.java?rev=1558833&r1=1558832&r2=1558833&view=diff
==============================================================================
--- 
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/util/MultidimensionalCounter.java
 (original)
+++ 
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/util/MultidimensionalCounter.java
 Thu Jan 16 15:26:29 2014
@@ -17,6 +17,7 @@
 
 package org.apache.commons.math3.util;
 
+import java.util.NoSuchElementException;
 import org.apache.commons.math3.exception.DimensionMismatchException;
 import org.apache.commons.math3.exception.NotStrictlyPositiveException;
 import org.apache.commons.math3.exception.OutOfRangeException;
@@ -77,6 +78,10 @@ public class MultidimensionalCounter imp
          * Unidimensional counter.
          */
         private int count = -1;
+        /**
+         * Maximum value for {@link #count}.
+         */
+        private final int maxCount = totalSize - 1;
 
         /**
          * Create an iterator
@@ -90,19 +95,20 @@ public class MultidimensionalCounter imp
          * {@inheritDoc}
          */
         public boolean hasNext() {
-            for (int i = 0; i < dimension; i++) {
-                if (counter[i] != size[i] - 1) {
-                    return true;
-                }
-            }
-            return false;
+            return count < maxCount;
         }
 
         /**
          * @return the unidimensional count after the counter has been
          * incremented by {@code 1}.
+         * @throws NoSuchElementException if {@link #hasNext()} would have
+         * returned {@code false}.
          */
         public Integer next() {
+            if (!hasNext()) {
+                throw new NoSuchElementException();
+            }
+
             for (int i = last; i >= 0; i--) {
                 if (counter[i] == size[i] - 1) {
                     counter[i] = 0;

Modified: 
commons/proper/math/trunk/src/test/java/org/apache/commons/math3/util/MultidimensionalCounterTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/util/MultidimensionalCounterTest.java?rev=1558833&r1=1558832&r2=1558833&view=diff
==============================================================================
--- 
commons/proper/math/trunk/src/test/java/org/apache/commons/math3/util/MultidimensionalCounterTest.java
 (original)
+++ 
commons/proper/math/trunk/src/test/java/org/apache/commons/math3/util/MultidimensionalCounterTest.java
 Thu Jan 16 15:26:29 2014
@@ -17,6 +17,7 @@
 
 package org.apache.commons.math3.util;
 
+import java.util.NoSuchElementException;
 import org.apache.commons.math3.exception.DimensionMismatchException;
 import org.apache.commons.math3.exception.OutOfRangeException;
 import org.apache.commons.math3.exception.NotStrictlyPositiveException;
@@ -24,7 +25,9 @@ import org.junit.Assert;
 import org.junit.Test;
 
 /**
+ * Test cases for the {@link MultidimensionalCounter} class.
  *
+ * @version $Id$
  */
 public class MultidimensionalCounterTest {
     @Test
@@ -101,6 +104,38 @@ public class MultidimensionalCounterTest
     }
 
     @Test
+    public void testIterator() {
+        final int dim1 = 3;
+        final int dim2 = 4;
+
+        final MultidimensionalCounter.Iterator iter
+            = new MultidimensionalCounter(dim1, dim2).iterator();
+
+        final int max = dim1 * dim2;
+        for (int i = 0; i < max; i++) {
+            Assert.assertTrue(iter.hasNext());
+
+            // Should not throw.
+            iter.next();
+        }
+
+        Assert.assertFalse(iter.hasNext());
+    }
+
+    @Test(expected=NoSuchElementException.class)
+    public void testIteratorNoMoreElements() {
+        final MultidimensionalCounter.Iterator iter
+            = new MultidimensionalCounter(4, 2).iterator();
+
+        while (iter.hasNext()) {
+            iter.next();
+        }
+
+        // No more elements: should throw.
+        iter.next();
+    }
+
+    @Test
     public void testMulti2UniConversion() {
         final MultidimensionalCounter c = new MultidimensionalCounter(2, 4, 5);
         Assert.assertEquals(c.getCount(1, 2, 3), 33);
@@ -150,6 +185,8 @@ public class MultidimensionalCounterTest
         };
 
         final int totalSize = c.getSize();
+        Assert.assertEquals(expected.length, totalSize);
+
         final int nDim = c.getDimension();
         final MultidimensionalCounter.Iterator iter = c.iterator();
         for (int i = 0; i < totalSize; i++) {


Reply via email to