1 /*
   2  * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 /*
  25  * @test
  26  * @bug 4052440 8062588 8210406
  27  * @summary Generic tests for the pluggable locales feature
  28  * @library providersrc/foobarutils
  29  *          providersrc/barprovider
  30  *          providersrc/fooprovider
  31  * @modules java.base/sun.util.locale.provider
  32  * @build com.foobar.Utils
  33  *        com.bar.*
  34  *        com.foo.*
  35  * @run main/othervm -Djava.locale.providers=JRE,SPI GenericTest
  36  */
  37 
  38 import java.util.Arrays;
  39 import java.util.HashSet;
  40 import java.util.Locale;
  41 import java.util.Set;
  42 
  43 import com.bar.CalendarDataProviderImpl;
  44 import com.bar.CalendarNameProviderImpl;
  45 import com.bar.CurrencyNameProviderImpl;
  46 import com.bar.CurrencyNameProviderImpl2;
  47 import com.bar.GenericTimeZoneNameProviderImpl;
  48 import com.bar.LocaleNameProviderImpl;
  49 import com.bar.TimeZoneNameProviderImpl;
  50 import com.foo.BreakIteratorProviderImpl;
  51 import com.foo.CollatorProviderImpl;
  52 import com.foo.DateFormatProviderImpl;
  53 import com.foo.DateFormatSymbolsProviderImpl;
  54 import com.foo.DecimalFormatSymbolsProviderImpl;
  55 import com.foo.NumberFormatProviderImpl;
  56 
  57 import sun.util.locale.provider.LocaleProviderAdapter;
  58 
  59 public class GenericTest {
  60 
  61     // test providers
  62     BreakIteratorProviderImpl breakIP = new BreakIteratorProviderImpl();
  63     CollatorProviderImpl collatorP = new CollatorProviderImpl();
  64     DateFormatProviderImpl dateFP = new DateFormatProviderImpl();
  65     DateFormatSymbolsProviderImpl dateFSP = new DateFormatSymbolsProviderImpl();
  66     DecimalFormatSymbolsProviderImpl decimalFSP = new DecimalFormatSymbolsProviderImpl();
  67     NumberFormatProviderImpl numberFP = new NumberFormatProviderImpl();
  68     CurrencyNameProviderImpl currencyNP = new CurrencyNameProviderImpl();
  69     CurrencyNameProviderImpl2 currencyNP2 = new CurrencyNameProviderImpl2();
  70     LocaleNameProviderImpl localeNP = new LocaleNameProviderImpl();
  71     TimeZoneNameProviderImpl tzNP = new TimeZoneNameProviderImpl();
  72     GenericTimeZoneNameProviderImpl tzGenNP = new GenericTimeZoneNameProviderImpl();
  73     CalendarDataProviderImpl calDataP = new CalendarDataProviderImpl();
  74     CalendarNameProviderImpl calNameP = new CalendarNameProviderImpl();
  75 
  76     public static void main(String[] s) {
  77         new GenericTest();
  78     }
  79 
  80     GenericTest() {
  81         availableLocalesTest();
  82         localeFallbackTest();
  83     }
  84 
  85     /**
  86      * Make sure that all the locales are available from the existing providers
  87      */
  88     void availableLocalesTest() {
  89         // Check that Locale.getAvailableLocales() returns the union of the JRE supported
  90         // locales and providers' locales
  91         HashSet<Locale> result =
  92             new HashSet<>(Arrays.asList(Locale.getAvailableLocales()));
  93         HashSet<Locale> expected =
  94             new HashSet<>(Arrays.asList(LocaleProviderAdapter.forJRE().getAvailableLocales()));
  95         expected.addAll(Arrays.asList(breakIP.getAvailableLocales()));
  96         expected.addAll(Arrays.asList(collatorP.getAvailableLocales()));
  97         expected.addAll(Arrays.asList(dateFP.getAvailableLocales()));
  98         expected.addAll(Arrays.asList(dateFSP.getAvailableLocales()));
  99         expected.addAll(Arrays.asList(decimalFSP.getAvailableLocales()));
 100         expected.addAll(Arrays.asList(numberFP.getAvailableLocales()));
 101         expected.addAll(Arrays.asList(currencyNP.getAvailableLocales()));
 102         expected.addAll(Arrays.asList(currencyNP2.getAvailableLocales()));
 103         expected.addAll(Arrays.asList(localeNP.getAvailableLocales()));
 104         expected.addAll(Arrays.asList(tzNP.getAvailableLocales()));
 105         expected.addAll(Arrays.asList(tzGenNP.getAvailableLocales()));
 106         expected.addAll(Arrays.asList(calDataP.getAvailableLocales()));
 107         expected.addAll(Arrays.asList(calNameP.getAvailableLocales()));
 108         if (!result.equals(expected)) {
 109             throw new RuntimeException("Locale.getAvailableLocales() does not return the union of locales: diff="
 110                                        + getDiff(result, expected));
 111         }
 112     }
 113 
 114     /**
 115      * test with "xx_YY_ZZ", which is an example locale not contained
 116      * in Locale.getAvailableLocales().  Fallback tests for supported locales
 117      * are done in each xxxProviderTest test cases.
 118      */
 119     void localeFallbackTest() {
 120         Locale xx = new Locale("xx");
 121         Locale dispLocale = new Locale ("xx", "YY", "ZZ");
 122 
 123         String xxname = xx.getDisplayLanguage(xx);
 124         String expected = localeNP.getDisplayLanguage(xx.getLanguage(), dispLocale);
 125         if (!xxname.equals(expected)) {
 126             throw new RuntimeException("Locale fallback did not perform correctly. got: "+xxname+" expected: "+expected);
 127         }
 128     }
 129 
 130     private static String getDiff(Set set1, Set set2) {
 131         Set s1 = (Set)((HashSet)set1).clone();
 132         s1.removeAll(set2);
 133 
 134         Set s2 = (Set)((HashSet)set2).clone();
 135         s2.removeAll(set1);
 136         s2.addAll(s1);
 137         return s2.toString();
 138     }
 139 }