1/*
2 *  Licensed to the Apache Software Foundation (ASF) under one or more
3 *  contributor license agreements.  See the NOTICE file distributed with
4 *  this work for additional information regarding copyright ownership.
5 *  The ASF licenses this file to You under the Apache License, Version 2.0
6 *  (the "License"); you may not use this file except in compliance with
7 *  the License.  You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 *  limitations under the License.
16 */
17
18package org.apache.harmony.tests.java.util;
19
20import dalvik.annotation.KnownFailure;
21import java.io.File;
22import java.net.MalformedURLException;
23import java.net.URL;
24import java.net.URLClassLoader;
25import java.util.Enumeration;
26import java.util.Locale;
27import java.util.MissingResourceException;
28import java.util.ResourceBundle;
29import java.util.StringTokenizer;
30import java.util.Vector;
31import org.apache.harmony.tests.java.util.support.B;
32import tests.support.resource.Support_Resources;
33
34public class ResourceBundleTest extends junit.framework.TestCase {
35
36    public void test_getCandidateLocales() throws Exception {
37        ResourceBundle.Control c = ResourceBundle.Control.getControl(ResourceBundle.Control.FORMAT_DEFAULT);
38        assertEquals("[en_US, en, ]", c.getCandidateLocales("base", Locale.US).toString());
39        assertEquals("[de_CH, de, ]", c.getCandidateLocales("base", new Locale("de", "CH")).toString());
40    }
41
42    public void test_getBaseName() {
43        String name = "tests.support.Support_TestResource";
44        ResourceBundle bundle = ResourceBundle.getBundle(name);
45        assertEquals(name, bundle.getBaseBundleName());
46
47        bundle = ResourceBundle.getBundle(name, Locale.getDefault());
48        assertEquals(name, bundle.getBaseBundleName());
49
50        assertNull(new Mock_ResourceBundle().getBaseBundleName());
51    }
52
53    /**
54     * java.util.ResourceBundle#getBundle(java.lang.String,
55     *        java.util.Locale)
56     */
57    public void test_getBundleLjava_lang_StringLjava_util_Locale() {
58        ResourceBundle bundle;
59        String name = "tests.support.Support_TestResource";
60        Locale defLocale = Locale.getDefault();
61
62        Locale.setDefault(new Locale("en", "US"));
63        bundle = ResourceBundle.getBundle(name, new Locale("fr", "FR", "VAR"));
64        assertEquals("Wrong bundle fr_FR_VAR", "frFRVARValue4", bundle.getString("parent4"));
65
66        bundle = ResourceBundle.getBundle(name, new Locale("fr", "FR", "v1"));
67        assertEquals("Wrong bundle fr_FR_v1", "frFRValue4", bundle.getString("parent4"));
68
69        bundle = ResourceBundle.getBundle(name, new Locale("fr", "US", "VAR"));
70        assertEquals("Wrong bundle fr_US_var", "frValue4", bundle.getString("parent4"));
71
72        bundle = ResourceBundle.getBundle(name, new Locale("de", "FR", "VAR"));
73        assertEquals("Wrong bundle de_FR_var", "enUSValue4", bundle.getString("parent4"));
74
75        Locale.setDefault(new Locale("fr", "FR", "VAR"));
76        bundle = ResourceBundle.getBundle(name, new Locale("de", "FR", "v1"));
77        assertEquals("Wrong bundle de_FR_var 2", "frFRVARValue4", bundle.getString("parent4"));
78
79        Locale.setDefault(new Locale("de", "US"));
80        bundle = ResourceBundle.getBundle(name, new Locale("de", "FR", "var"));
81        assertEquals("Wrong bundle de_FR_var 2", "parentValue4", bundle.getString("parent4")
82                );
83
84        try {
85            ResourceBundle.getBundle(null, Locale.US);
86            fail("NullPointerException expected");
87        } catch (NullPointerException ee) {
88            //expected
89        }
90        try {
91            ResourceBundle.getBundle("blah", (Locale) null);
92            fail("NullPointerException expected");
93        } catch (NullPointerException ee) {
94            //expected
95        }
96
97
98        try {
99            ResourceBundle.getBundle("", new Locale("xx", "yy"));
100            fail("MissingResourceException expected");
101        } catch (MissingResourceException ee) {
102            //expected
103        }
104    }
105
106    /**
107     * java.util.ResourceBundle#getBundle(java.lang.String,
108     *        java.util.Locale, java.lang.ClassLoader)
109     */
110    @KnownFailure("It's not allowed to pass null as parent class loader to"
111            + " a new ClassLoader anymore. Maybe we need to change"
112            + " URLClassLoader to allow this? It's not specified.")
113    public void test_getBundleLjava_lang_StringLjava_util_LocaleLjava_lang_ClassLoader() {
114        String classPath = System.getProperty("java.class.path");
115        StringTokenizer tok = new StringTokenizer(classPath, File.pathSeparator);
116        Vector<URL> urlVec = new Vector<URL>();
117        String resPackage = Support_Resources.RESOURCE_PACKAGE;
118        try {
119            while (tok.hasMoreTokens()) {
120                String path = tok.nextToken();
121                String url;
122                if (new File(path).isDirectory())
123                    url = "file:" + path + resPackage + "subfolder/";
124                else
125                    url = "jar:file:" + path + "!" + resPackage + "subfolder/";
126                urlVec.addElement(new URL(url));
127            }
128        } catch (MalformedURLException e) {
129        }
130        URL[] urls = new URL[urlVec.size()];
131        for (int i = 0; i < urlVec.size(); i++)
132            urls[i] = urlVec.elementAt(i);
133        URLClassLoader loader = new URLClassLoader(urls, null);
134
135        String name = Support_Resources.RESOURCE_PACKAGE_NAME
136                + ".hyts_resource";
137        ResourceBundle bundle = ResourceBundle.getBundle(name, Locale
138                .getDefault());
139            assertEquals("Wrong value read", "parent", bundle.getString("property"));
140        bundle = ResourceBundle.getBundle(name, Locale.getDefault(), loader);
141        assertEquals("Wrong cached value",
142                "resource", bundle.getString("property"));
143
144        try {
145            ResourceBundle.getBundle(null, Locale.getDefault(), loader);
146            fail("NullPointerException expected");
147        } catch (NullPointerException ee) {
148            //expected
149        }
150
151        try {
152            ResourceBundle.getBundle(name, null, loader);
153            fail("NullPointerException expected");
154        } catch (NullPointerException ee) {
155            //expected
156        }
157
158        try {
159            ResourceBundle.getBundle(name, Locale.getDefault(), (ClassLoader) null);
160            fail("NullPointerException expected");
161        } catch (NullPointerException ee) {
162            //expected
163        }
164
165        try {
166            ResourceBundle.getBundle("", Locale.getDefault(), loader);
167            fail("MissingResourceException expected");
168        } catch (MissingResourceException ee) {
169            //expected
170        }
171
172        // Regression test for Harmony-3823
173        B bb = new B();
174        String s = bb.find("nonexistent");
175        s = bb.find("name");
176        assertEquals("Wrong property got", "Name", s);
177    }
178
179    /**
180     * java.util.ResourceBundle#getString(java.lang.String)
181     */
182    public void test_getStringLjava_lang_String() {
183        ResourceBundle bundle;
184        String name = "tests.support.Support_TestResource";
185        Locale.setDefault(new Locale("en", "US"));
186        bundle = ResourceBundle.getBundle(name, new Locale("fr", "FR", "VAR"));
187        assertEquals("Wrong value parent4",
188                "frFRVARValue4", bundle.getString("parent4"));
189        assertEquals("Wrong value parent3",
190                "frFRValue3", bundle.getString("parent3"));
191        assertEquals("Wrong value parent2",
192                "frValue2", bundle.getString("parent2"));
193        assertEquals("Wrong value parent1",
194                "parentValue1", bundle.getString("parent1"));
195        assertEquals("Wrong value child3",
196                "frFRVARChildValue3", bundle.getString("child3"));
197        assertEquals("Wrong value child2",
198                "frFRVARChildValue2", bundle.getString("child2"));
199        assertEquals("Wrong value child1",
200                "frFRVARChildValue1", bundle.getString("child1"));
201
202        try {
203            bundle.getString(null);
204            fail("NullPointerException expected");
205        } catch (NullPointerException ee) {
206            //expected
207        }
208
209        try {
210            bundle.getString("");
211            fail("MissingResourceException expected");
212        } catch (MissingResourceException ee) {
213            //expected
214        }
215
216        try {
217            bundle.getString("IntegerVal");
218            fail("ClassCastException expected");
219        } catch (ClassCastException ee) {
220            //expected
221        }
222    }
223    public void test_getBundle_getClassName() {
224        // Regression test for Harmony-1759
225        Locale locale = Locale.GERMAN;
226        String nonExistentBundle = "Non-ExistentBundle";
227        try {
228            ResourceBundle.getBundle(nonExistentBundle, locale, this.getClass()
229                    .getClassLoader());
230            fail("MissingResourceException expected!");
231        } catch (MissingResourceException e) {
232            assertEquals(nonExistentBundle + "_" + locale, e.getClassName());
233        }
234
235        try {
236            ResourceBundle.getBundle(nonExistentBundle, locale);
237            fail("MissingResourceException expected!");
238        } catch (MissingResourceException e) {
239            assertEquals(nonExistentBundle + "_" + locale, e.getClassName());
240        }
241
242        locale = Locale.getDefault();
243        try {
244            ResourceBundle.getBundle(nonExistentBundle);
245            fail("MissingResourceException expected!");
246        } catch (MissingResourceException e) {
247            assertEquals(nonExistentBundle + "_" + locale, e.getClassName());
248        }
249    }
250
251    class Mock_ResourceBundle extends ResourceBundle {
252        @Override
253        public Enumeration<String> getKeys() {
254            return null;
255        }
256
257        @Override
258        protected Object handleGetObject(String key) {
259            return null;
260        }
261    }
262
263    public void test_constructor() {
264        assertNotNull(new Mock_ResourceBundle());
265    }
266
267    public void test_getLocale() {
268        ResourceBundle bundle;
269        String name = "tests.support.Support_TestResource";
270        Locale loc = Locale.getDefault();
271        Locale.setDefault(new Locale("en", "US"));
272
273        bundle = ResourceBundle.getBundle(name, new Locale("fr", "FR", "VAR"));
274        assertEquals("fr_FR_VAR", bundle.getLocale().toString());
275
276        bundle = ResourceBundle.getBundle(name, new Locale("fr", "FR", "v1"));
277        assertEquals("fr_FR", bundle.getLocale().toString());
278
279        bundle = ResourceBundle.getBundle(name, new Locale("fr", "US", "VAR"));
280        assertEquals("fr", bundle.getLocale().toString());
281
282        bundle = ResourceBundle.getBundle(name, new Locale("de", "FR", "VAR"));
283        assertEquals("en_US", bundle.getLocale().toString());
284
285        bundle = ResourceBundle.getBundle(name, new Locale("de", "FR", "v1"));
286        assertEquals("en_US", bundle.getLocale().toString());
287
288        bundle = ResourceBundle.getBundle(name, new Locale("de", "FR", "var"));
289        assertEquals("en_US", bundle.getLocale().toString());
290
291        Locale.setDefault(loc);
292    }
293
294    public void test_getObjectLjava_lang_String() {
295        ResourceBundle bundle;
296        String name = "tests.support.Support_TestResource";
297        Locale.setDefault(new Locale("en", "US"));
298        bundle = ResourceBundle.getBundle(name, new Locale("fr", "FR", "VAR"));
299        assertEquals("Wrong value parent4",
300                "frFRVARValue4", (String)bundle.getObject("parent4"));
301        assertEquals("Wrong value parent3",
302                "frFRValue3", (String)bundle.getObject("parent3"));
303        assertEquals("Wrong value parent2",
304                "frValue2", (String) bundle.getObject("parent2"));
305        assertEquals("Wrong value parent1",
306                "parentValue1", (String)bundle.getObject("parent1"));
307        assertEquals("Wrong value child3",
308                "frFRVARChildValue3", (String)bundle.getObject("child3"));
309        assertEquals("Wrong value child2",
310                "frFRVARChildValue2", (String) bundle.getObject("child2"));
311        assertEquals("Wrong value child1",
312                "frFRVARChildValue1", (String)bundle.getObject("child1"));
313        assertEquals("Wrong value IntegerVal",
314                1, bundle.getObject("IntegerVal"));
315
316        try {
317            bundle.getObject(null);
318            fail("NullPointerException expected");
319        } catch (NullPointerException ee) {
320            //expected
321        }
322
323        try {
324            bundle.getObject("");
325            fail("MissingResourceException expected");
326        } catch (MissingResourceException ee) {
327            //expected
328        }
329    }
330
331    public void test_getStringArrayLjava_lang_String() {
332        ResourceBundle bundle;
333        String name = "tests.support.Support_TestResource";
334        Locale.setDefault(new Locale("en", "US"));
335        bundle = ResourceBundle.getBundle(name, new Locale("fr", "FR", "VAR"));
336
337        String[] array = bundle.getStringArray("StringArray");
338        for(int i = 0; i < array.length; i++) {
339            assertEquals("Str" + (i + 1), array[i]);
340        }
341
342        try {
343            bundle.getStringArray(null);
344            fail("NullPointerException expected");
345        } catch (NullPointerException ee) {
346            //expected
347        }
348
349        try {
350            bundle.getStringArray("");
351            fail("MissingResourceException expected");
352        } catch (MissingResourceException ee) {
353            //expected
354        }
355
356        try {
357            bundle.getStringArray("IntegerVal");
358            fail("ClassCastException expected");
359        } catch (ClassCastException ee) {
360            //expected
361        }
362    }
363
364    public void test_getBundleLjava_lang_String() {
365        ResourceBundle bundle;
366        String name = "tests.support.Support_TestResource";
367        Locale defLocale = Locale.getDefault();
368
369        Locale.setDefault(new Locale("en", "US"));
370        bundle = ResourceBundle.getBundle(name);
371        assertEquals("enUSValue4", bundle.getString("parent4"));
372
373        Locale.setDefault(new Locale("fr", "FR", "v1"));
374        bundle = ResourceBundle.getBundle(name);
375        assertEquals("Wrong bundle fr_FR_v1", "frFRValue4", bundle.getString("parent4"));
376
377        Locale.setDefault(new Locale("fr", "US", "VAR"));
378        bundle = ResourceBundle.getBundle(name);
379        assertEquals("Wrong bundle fr_US_var", "frValue4", bundle.getString("parent4"));
380
381        Locale.setDefault(new Locale("de", "FR", "VAR"));
382        bundle = ResourceBundle.getBundle(name);
383        assertEquals("Wrong bundle de_FR_var", "parentValue4", bundle.getString("parent4"));
384
385        Locale.setDefault(new Locale("de", "FR", "v1"));
386        bundle = ResourceBundle.getBundle(name);
387        assertEquals("Wrong bundle de_FR_var 2", "parentValue4", bundle.getString("parent4"));
388
389        Locale.setDefault(new Locale("de", "FR", "var"));
390        bundle = ResourceBundle.getBundle(name);
391        assertEquals("Wrong bundle de_FR_var 2", "parentValue4", bundle.getString("parent4"));
392
393        try {
394            ResourceBundle.getBundle(null);
395            fail("NullPointerException expected");
396        } catch (NullPointerException ee) {
397            //expected
398        }
399
400        try {
401            ResourceBundle.getBundle("");
402            fail("MissingResourceException expected");
403        } catch (MissingResourceException ee) {
404            //expected
405        }
406
407        Locale.setDefault(defLocale);
408    }
409
410    // http://b/26879578
411    public void testBundleWithUtf8Values() {
412        ResourceBundle bundle = ResourceBundle.getBundle(
413                "org.apache.harmony.tests.java.util.TestUtf8ResourceBundle");
414        assertEquals("Страх мой удивительный UTF-8 синтаксического анализа",
415                bundle.getString("key"));
416    }
417}
418