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 
main(String[] s)76     public static void main(String[] s) {
77         new GenericTest();
78     }
79 
GenericTest()80     GenericTest() {
81         availableLocalesTest();
82         localeFallbackTest();
83     }
84 
85     /**
86      * Make sure that all the locales are available from the existing providers
87      */
availableLocalesTest()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      */
localeFallbackTest()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 
getDiff(Set set1, Set set2)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 }