1 
   2 /*
   3  * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
   4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   5  *
   6  * This code is free software; you can redistribute it and/or modify it
   7  * under the terms of the GNU General Public License version 2 only, as
   8  * published by the Free Software Foundation.
   9  *
  10  * This code is distributed in the hope that it will be useful, but WITHOUT
  11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  13  * version 2 for more details (a copy is included in the LICENSE file that
  14  * accompanied this code).
  15  *
  16  * You should have received a copy of the GNU General Public License version
  17  * 2 along with this work; if not, write to the Free Software Foundation,
  18  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  19  *
  20  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  21  * or visit www.oracle.com if you need additional information or have any
  22  * questions.
  23  */
  24 
  25  /*
  26  * @test
  27  * @bug 8145136
  28  * @summary Tests CLDR 28/29 newly added feature LikelySubtags is correctly reflected in JDK.
  29  * @run main/othervm -Djava.locale.providers=CLDR Bug8145136
  30  */
  31 import java.util.Arrays;
  32 import java.util.List;
  33 import java.util.Locale;
  34 import java.util.stream.Collectors;
  35 
  36 public class Bug8145136 {
  37 
  38     public static void main(String[] args) {
  39         /* This Golden data is names of all *.xml files which contain locale
  40            specific data in CLDR 29. With newly added feature LikelySubtags,
  41            these locales should be present in output of getAvailableLocales()
  42            method.
  43          */
  44         List<String> likelySubtagsLocales = List.of("", "af-NA", "af", "af-ZA",
  45                 "agq-CM", "agq", "ak-GH", "ak", "am-ET", "am", "ar-001", "ar-AE",
  46                 "ar-BH", "ar-DJ", "ar-DZ", "ar-EG", "ar-EH", "ar-ER", "ar-IL",
  47                 "ar-IQ", "ar-JO", "ar-KM", "ar-KW", "ar-LB", "ar-LY", "ar-MA",
  48                 "ar-MR", "ar-OM", "ar-PS", "ar-QA", "ar-SA", "ar-SD", "ar-SO",
  49                 "ar-SS", "ar-SY", "ar-TD", "ar-TN", "ar", "ar-YE", "asa-TZ",
  50                 "asa", "as-IN", "ast-ES", "ast", "as", "az-Cyrl-AZ", "az-Cyrl",
  51                 "az-Latn-AZ", "az-Latn", "az", "bas-CM", "bas", "be-BY", "bem",
  52                 "bem-ZM", "be", "bez-TZ", "bez", "bg-BG", "bg", "bm-ML", "bm",
  53                 "bn-BD", "bn-IN", "bn", "bo-CN", "bo-IN", "bo", "br-FR", "brx-IN",
  54                 "br", "brx", "bs-Cyrl-BA", "bs-Cyrl", "bs-Latn-BA", "bs-Latn",
  55                 "bs", "ca-AD", "ca-ES-VALENCIA", "ca-ES", "ca-FR", "ca-IT", "ca",
  56                 "ce-RU", "ce", "cgg-UG", "cgg", "chr-US", "chr", "ckb-IQ", "ckb-IR",
  57                 "ckb", "cs-CZ", "cs", "cu-RU", "cu", "cy-GB", "cy", "da-DK",
  58                 "da-GL", "dav-KE", "dav", "da", "de-AT", "de-BE", "de-CH", "de-DE",
  59                 "de-LI", "de-LU", "de", "dje-NE", "dje", "dsb-DE", "dsb", "dua-CM",
  60                 "dua", "dyo-SN", "dyo", "dz-BT", "dz", "ebu-KE", "ebu", "ee-GH",
  61                 "ee-TG", "ee", "el-CY", "el-GR", "el", "en-001", "en-150", "en-AG",
  62                 "en-AI", "en-AS", "en-AT", "en-AU", "en-BB", "en-BE", "en-BI",
  63                 "en-BM", "en-BS", "en-BW", "en-BZ", "en-CA", "en-CC", "en-CH",
  64                 "en-CK", "en-CM", "en-CX", "en-CY", "en-DE", "en-DG", "en-DK",
  65                 "en-DM", "en-ER", "en-FI", "en-FJ", "en-FK", "en-FM", "en-GB",
  66                 "en-GD", "en-GG", "en-GH", "en-GI", "en-GM", "en-GU", "en-GY",
  67                 "en-HK", "en-IE", "en-IL", "en-IM", "en-IN", "en-IO", "en-JE",
  68                 "en-JM", "en-KE", "en-KI", "en-KN", "en-KY", "en-LC", "en-LR",
  69                 "en-LS", "en-MG", "en-MH", "en-MO", "en-MP", "en-MS", "en-MT",
  70                 "en-MU", "en-MW", "en-MY", "en-NA", "en-NF", "en-NG", "en-NL",
  71                 "en-NR", "en-NU", "en-NZ", "en-PG", "en-PH", "en-PK", "en-PN",
  72                 "en-PR", "en-PW", "en-RW", "en-SB", "en-SC", "en-SD", "en-SE",
  73                 "en-SG", "en-SH", "en-SI", "en-SL", "en-SS", "en-SX", "en-SZ",
  74                 "en-TC", "en-TK", "en-TO", "en-TT", "en-TV", "en-TZ", "en-UG",
  75                 "en-UM", "en-US-POSIX", "en-US", "en-VC", "en-VG", "en-VI",
  76                 "en-VU", "en-WS", "en", "en-ZA", "en-ZM", "en-ZW", "eo-001",
  77                 "eo", "es-419", "es-AR", "es-BO", "es-BR", "es-CL", "es-CO",
  78                 "es-CR", "es-CU", "es-DO", "es-EA", "es-EC", "es-ES", "es-GQ",
  79                 "es-GT", "es-HN", "es-IC", "es-MX", "es-NI", "es-PA", "es-PE",
  80                 "es-PH", "es-PR", "es-PY", "es-SV", "es-US", "es-UY", "es-VE",
  81                 "es", "et-EE", "et", "eu-ES", "eu", "ewo-CM", "ewo", "fa-AF",
  82                 "fa-IR", "fa", "ff-CM", "ff-GN", "ff-MR", "ff-SN", "ff", "fi-FI",
  83                 "fil-PH", "fil", "fi", "fo-DK", "fo-FO", "fo", "fr-BE", "fr-BF",
  84                 "fr-BI", "fr-BJ", "fr-BL", "fr-CA", "fr-CD", "fr-CF", "fr-CG",
  85                 "fr-CH", "fr-CI", "fr-CM", "fr-DJ", "fr-DZ", "fr-FR", "fr-GA",
  86                 "fr-GF", "fr-GN", "fr-GP", "fr-GQ", "fr-HT", "fr-KM", "fr-LU",
  87                 "fr-MA", "fr-MC", "fr-MF", "fr-MG", "fr-ML", "fr-MQ", "fr-MR",
  88                 "fr-MU", "fr-NC", "fr-NE", "fr-PF", "fr-PM", "fr-RE", "fr-RW",
  89                 "fr-SC", "fr-SN", "fr-SY", "fr-TD", "fr-TG", "fr-TN", "fr-VU",
  90                 "fr-WF", "fr", "fr-YT", "fur-IT", "fur", "fy-NL", "fy", "ga-IE",
  91                 "ga", "gd-GB", "gd", "gl-ES", "gl", "gsw-CH", "gsw-FR", "gsw-LI",
  92                 "gsw", "gu-IN", "gu", "guz-KE", "guz", "gv-IM", "gv", "ha-GH", "ha-NE",
  93                 "ha-NG", "haw-US", "haw", "ha", "iw-IL", "iw", "hi-IN", "hi", "hr-BA",
  94                 "hr-HR", "hr", "hsb-DE", "hsb", "hu-HU", "hu", "hy-AM", "hy", "in-ID",
  95                 "in", "ig-NG", "ig", "ii-CN", "ii", "is-IS", "is", "it-CH", "it-IT",
  96                 "it-SM", "it", "ja-JP", "ja", "jgo-CM", "jgo", "jmc-TZ", "jmc", "kab-DZ",
  97                 "kab", "ka-GE", "kam-KE", "kam", "ka", "kde-TZ", "kde", "kea-CV", "kea",
  98                 "khq-ML", "khq", "ki-KE", "ki", "kkj-CM", "kkj", "kk-KZ", "kk", "kl-GL",
  99                 "kln-KE", "kln", "kl", "km-KH", "km", "kn-IN", "kn", "kok-IN", "ko-KP",
 100                 "ko-KR", "kok", "ko", "ksb-TZ", "ksb", "ksf-CM", "ksf", "ksh-DE", "ksh",
 101                 "ks-IN", "ks", "kw-GB", "kw", "ky-KG", "ky", "lag-TZ", "lag", "lb-LU",
 102                 "lb", "lg-UG", "lg", "lkt-US", "lkt", "ln-AO", "ln-CD", "ln-CF", "ln-CG",
 103                 "ln", "lo-LA", "lo", "lrc-IQ", "lrc-IR", "lrc", "lt-LT", "lt", "lu-CD",
 104                 "luo-KE", "luo", "lu", "luy-KE", "luy", "lv-LV", "lv", "mas-KE", "mas-TZ",
 105                 "mas", "mer-KE", "mer", "mfe-MU", "mfe", "mgh-MZ", "mgh", "mg-MG", "mgo-CM",
 106                 "mgo", "mg", "mk-MK", "mk", "ml-IN", "ml", "mn-MN", "mn", "mr-IN", "mr",
 107                 "ms-BN", "ms-MY", "ms-SG", "ms", "mt-MT", "mt", "mua-CM", "mua", "my-MM",
 108                 "my", "mzn-IR", "mzn", "naq-NA", "naq", "nb-NO", "nb-SJ", "nb", "nd",
 109                 "nd-ZW", "ne-IN", "ne-NP", "ne", "nl-AW", "nl-BE", "nl-BQ", "nl-CW",
 110                 "nl-NL", "nl-SR", "nl-SX", "nl", "nmg-CM", "nmg", "nnh-CM", "nnh",
 111                 "nn-NO", "nn", "nus-SS", "nus", "nyn-UG", "nyn", "om-ET", "om-KE",
 112                 "om", "or-IN", "or", "os-GE", "os-RU", "os", "pa-Arab-PK", "pa-Arab",
 113                 "pa-Guru-IN", "pa-Guru", "pa", "pl-PL", "pl", "prg-001", "prg", "ps-AF",
 114                 "ps", "pt-AO", "pt-BR", "pt-CH", "pt-CV", "pt-GQ", "pt-GW", "pt-LU",
 115                 "pt-MO", "pt-MZ", "pt-PT", "pt-ST", "pt-TL", "pt", "qu-BO", "qu-EC",
 116                 "qu-PE", "qu", "rm-CH", "rm", "rn-BI", "rn", "rof-TZ", "rof", "ro-MD",
 117                 "ro-RO", "ro", "ru-BY", "ru-KG", "ru-KZ", "ru-MD", "ru-RU", "ru-UA",
 118                 "ru", "rwk-TZ", "rwk", "rw-RW", "rw", "sah-RU", "sah", "saq-KE",
 119                 "saq", "sbp-TZ", "sbp", "se-FI", "seh-MZ", "seh", "se-NO", "se-SE",
 120                 "ses-ML", "ses", "se", "sg-CF", "sg", "shi-Latn-MA", "shi-Latn",
 121                 "shi-Tfng-MA", "shi-Tfng", "shi", "si-LK", "si", "sk-SK", "sk",
 122                 "sl-SI", "sl", "smn-FI", "smn", "sn", "sn-ZW", "so-DJ", "so-ET",
 123                 "so-KE", "so-SO", "so", "sq-AL", "sq-MK", "sq-XK", "sq", "sr-Cyrl-BA",
 124                 "sr-Cyrl-ME", "sr-Cyrl-RS", "sr-Cyrl-XK", "sr-Cyrl", "sr-Latn-BA",
 125                 "sr-Latn-ME", "sr-Latn-RS", "sr-Latn-XK", "sr-Latn", "sr", "sv-AX",
 126                 "sv-FI", "sv-SE", "sv", "sw-CD", "sw-KE", "sw-TZ", "sw-UG", "sw",
 127                 "ta-IN", "ta-LK", "ta-MY", "ta-SG", "ta", "te-IN", "teo-KE", "teo-UG",
 128                 "teo", "te", "th-TH", "th", "ti-ER", "ti-ET", "ti", "tk-TM", "tk",
 129                 "to-TO", "to", "tr-CY", "tr-TR", "tr", "twq-NE", "twq", "tzm-MA", "tzm",
 130                 "ug-CN", "ug", "uk-UA", "uk", "ur-IN", "ur-PK", "ur", "uz-Arab-AF",
 131                 "uz-Arab", "uz-Cyrl-UZ", "uz-Cyrl", "uz-Latn-UZ", "uz-Latn", "uz",
 132                 "vai-Latn-LR", "vai-Latn", "vai-Vaii-LR", "vai-Vaii", "vai", "vi-VN",
 133                 "vi", "vo-001", "vo", "vun-TZ", "vun", "wae-CH", "wae", "xog-UG",
 134                 "xog", "yav-CM", "yav", "ji-001", "ji", "yo-BJ", "yo-NG", "yo",
 135                 "yue-HK", "yue", "zgh-MA", "zgh", "zh-Hans-CN", "zh-Hans-HK",
 136                 "zh-Hans-MO", "zh-Hans-SG", "zh-Hans", "zh-Hant-HK", "zh-Hant-MO",
 137                 "zh-Hant-TW", "zh-Hant", "zh", "zu", "zu-ZA");
 138         List<Locale> availableLocales = Arrays.asList(Locale.getAvailableLocales());
 139 
 140         List<Locale> localesNotFound = likelySubtagsLocales.stream()
 141                 .map(Locale::forLanguageTag)
 142                 .filter(l -> !availableLocales.contains(l))
 143                 .collect(Collectors.toList());
 144 
 145         if (localesNotFound.size() > 0) {
 146             throw new RuntimeException("Locales " + localesNotFound
 147                     + " not found in Available Locales list");
 148         }
 149     }
 150 
 151 }