You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by sc...@apache.org on 2014/02/06 22:28:52 UTC

svn commit: r1565445 - in /uima/uimaj/trunk/uimaj-core/src: main/java/org/apache/uima/internal/util/IntVector.java test/java/org/apache/uima/internal/util/IntVectorTest.java

Author: schor
Date: Thu Feb  6 21:28:52 2014
New Revision: 1565445

URL: http://svn.apache.org/r1565445
Log:
[UIMA-3603] fix edge case for 0 length vector in sortDedup in IntVector, add tests

Modified:
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/IntVector.java
    uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/internal/util/IntVectorTest.java

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/IntVector.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/IntVector.java?rev=1565445&r1=1565444&r2=1565445&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/IntVector.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/internal/util/IntVector.java Thu Feb  6 21:28:52 2014
@@ -316,6 +316,9 @@ public class IntVector implements Serial
    * @return an updated value for this vector, with the values sorted and duplicates removed
    */
   public IntVector sortDedup() {
+    if (pos == 0) {
+      return this;  // handle empty edge case https://issues.apache.org/jira/browse/UIMA-3603
+    }
     Arrays.sort(array, 0, pos);
     int prev = array[0];
     int cpyfromIndex = 1;
@@ -331,7 +334,9 @@ public class IntVector implements Serial
     }
 
     // copyfromIndex == 1 past end or the index of first duplicate
-    cpytoIndex = cpyfromIndex ++;  
+    cpytoIndex = cpyfromIndex ++;
+    // now cpytoIndex = 1 past end or index of 1st duplicate,
+    //     cpyfromIndex is one beyond that (next one to check)
     
     for (; cpyfromIndex < pos; ) {
       final int v = array[cpyfromIndex++];

Modified: uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/internal/util/IntVectorTest.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/internal/util/IntVectorTest.java?rev=1565445&r1=1565444&r2=1565445&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/internal/util/IntVectorTest.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/test/java/org/apache/uima/internal/util/IntVectorTest.java Thu Feb  6 21:28:52 2014
@@ -43,6 +43,21 @@ public class IntVectorTest extends TestC
     iv.sortDedup();
     assertTrue(Arrays.equals(iv.toArray(), new int[] {2, 3, 4, 5, 6, 7, 8, 9}));    
 
+    // check 3 edge cases: no dups, and last 2 items are dups, and 0 length
+    iv = new IntVector();
+    iv.add(new int[] {1, 3, 5, 7});
+    iv.sortDedup();
+    assertTrue(Arrays.equals(iv.toArray(), new int[] {1, 3, 5, 7}));
+    
+    iv = new IntVector();
+    iv.add(new int[] {1,3, 5, 7, 7});
+    iv.sortDedup();
+    assertTrue(Arrays.equals(iv.toArray(), new int[] {1, 3, 5, 7}));
+    
+    iv = new IntVector();
+    iv.sortDedup();
+    assertTrue(Arrays.equals(iv.toArray(), new int[] {}));
+    
   }
   
   // verify that several CASes in a pool in different views share the same type system