]> granicus.if.org Git - icu/commitdiff
ICU-4229 Check for duplicate reorder codes
authorMark Davis <mark@macchiato.com>
Tue, 15 Dec 2015 20:21:08 +0000 (20:21 +0000)
committerMark Davis <mark@macchiato.com>
Tue, 15 Dec 2015 20:21:08 +0000 (20:21 +0000)
X-SVN-Rev: 38132

icu4j/main/classes/core/src/com/ibm/icu/impl/locale/LocaleValidityChecker.java
icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/TestLocaleValidity.java

index b51a48f8ca1fa6344ab1c264c4426da20079cdd0..cd812040498d3c2edd5ecdb22f7d3bbce09a9bb7 100644 (file)
@@ -131,6 +131,7 @@ public class LocaleValidityChecker {
         ValueType valueType = null;
         SpecialCase specialCase = null;
         StringBuilder prefix = new StringBuilder();
+        Set<String> seen = new HashSet<String>();
         // TODO: is empty -u- valid?
         for (String subtag : SEPARATOR.split(extensionString)) {
             if (subtag.length() == 2) {
@@ -160,6 +161,12 @@ public class LocaleValidityChecker {
                         prefix.append('-').append(subtag);
                         subtag = prefix.toString();
                     }
+                    break;
+                case multiple:
+                    if (typeCount == 1) {
+                        seen.clear();
+                    }
+                    break;
                 }
                 switch (specialCase) {
                 case anything: 
@@ -174,7 +181,8 @@ public class LocaleValidityChecker {
                     }
                     continue;
                 case reorder:
-                    if (!isScriptReorder(subtag)) {
+                    boolean newlyAdded = seen.add(subtag);
+                    if (!newlyAdded || !isScriptReorder(subtag)) {
                         return where.set(Datatype.u, key+"-"+subtag);
                     }
                     continue;
index b7ba2b52f7d14a5c7f3c5a96764916ac4772d674..7dd270fd9dc527de731cf61e114c2d49d8f6ec31 100644 (file)
@@ -120,6 +120,7 @@ public class TestLocaleValidity extends TestFmwk {
                 {"{u, kk-falsx}", "en-u-kk-falsx"},
                 {"{u, kn-falsx}", "en-u-kn-falsx"},
                 {"{u, kr-symbox}", "en-u-kr-latn-digit-symbox"}, // reorder codes, multiple
+                {"{u, kr-latn}", "en-u-kr-latn-digit-latn"}, // reorder codes, duplicat
                 {"{u, ks-identix}", "en-u-ks-identix"},
                 {"{u, kv-currencx}", "en-u-kv-currencx"},
                 {"{u, nu-ahox}", "en-u-nu-ahox"},