]> granicus.if.org Git - icu/commitdiff
ICU-7645 Make test insensitive to order of elements in HashSet.
authorMark Davis <mark@macchiato.com>
Sun, 2 Dec 2012 20:21:48 +0000 (20:21 +0000)
committerMark Davis <mark@macchiato.com>
Sun, 2 Dec 2012 20:21:48 +0000 (20:21 +0000)
X-SVN-Rev: 32916

icu4j/main/classes/core/src/com/ibm/icu/text/IdentifierInfo.java
icu4j/main/tests/core/src/com/ibm/icu/dev/test/text/SpoofCheckerTest.java

index 870a0193538f61d8768d8daeae771a686c28a312..32f81048f4a721a6b66962ae060f60d7e917525c 100644 (file)
@@ -8,9 +8,11 @@ package com.ibm.icu.text;
 
 import java.util.BitSet;
 import java.util.Collection;
+import java.util.Comparator;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
+import java.util.TreeSet;
 
 import com.ibm.icu.lang.UCharacter;
 import com.ibm.icu.lang.UCharacterCategory;
@@ -383,9 +385,16 @@ public class IdentifierInfo {
      * @return display form
      * @internal
      */
-    public static String displayAlternates(Collection<BitSet> alternates) {
+    public static String displayAlternates(Set<BitSet> alternates) {
+        if (alternates.size() == 0) {
+            return "";
+        }
         StringBuilder result = new StringBuilder();
-        for (BitSet item : alternates) {
+        Comparator<? super BitSet> foo;
+        // for consistent results
+        Set<BitSet> sorted = new TreeSet<BitSet>(BITSET_COMPARATOR);
+        sorted.addAll(alternates);
+        for (BitSet item : sorted) {
             if (result.length() != 0) {
                 result.append("; ");
             }
@@ -393,6 +402,26 @@ public class IdentifierInfo {
         }
         return result.toString();
     }
+    
+    /**
+     * Order BitSets, first by shortest, then by items.
+     * @internal
+     */
+    public static final Comparator<BitSet> BITSET_COMPARATOR = new Comparator<BitSet>() {
+
+        public int compare(BitSet arg0, BitSet arg1) {
+            int diff = arg0.cardinality() - arg1.cardinality();
+            if (diff != 0) return diff;
+            int i0 = arg0.nextSetBit(0);
+            int i1 = arg1.nextSetBit(0);
+            while ((diff = i0-i1) == 0) {
+                i0 = arg0.nextSetBit(i0+1);
+                i1 = arg1.nextSetBit(i1+1);
+            }
+            return diff;
+        }
+        
+    };
 
     /**
      * Produce a readable string of a set of scripts
index a1a0269052b237605531143eb24731538b38477d..d380c0241a51732f0843d5ca7a6b46c858dc4680 100644 (file)
@@ -502,13 +502,16 @@ public class SpoofCheckerTest extends TestFmwk {
         assertTrue("", IdentifierInfo.contains(bitset12, bitset12));
         assertTrue("", !IdentifierInfo.contains(bitset2, bitset12));
 
+        assertTrue("", IdentifierInfo.BITSET_COMPARATOR.compare(
+                IdentifierInfo.set(new BitSet(), UScript.ARABIC), 
+                IdentifierInfo.set(new BitSet(), UScript.LATIN)) < 0);
 //      displayAlternates(Collection<BitSet>)
 //      displayScripts(BitSet)
         String scriptString = IdentifierInfo.displayScripts(bitset12);
         assertEquals("", "Hang Latn", scriptString);
         Set<BitSet> alternates = new HashSet(Arrays.asList(bitset12, bitset2));
         String alternatesString = IdentifierInfo.displayAlternates(alternates);
-        assertEquals("", "Hang Latn; Hang", alternatesString);
+        assertEquals("", "Hang; Hang Latn", alternatesString);
 
 //        parseAlternates(String)
 //        parseScripts(String)