|
1 /* |
|
2 * Copyright (c) 2007 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, |
|
20 * CA 95054 USA or visit www.sun.com if you need additional information or |
|
21 * have any questions. |
|
22 */ |
|
23 /* |
|
24 @test |
|
25 @bug 4049325 4073127 4083270 4106034 4108126 |
|
26 @summary test Resource Bundle |
|
27 @build TestResource TestResource_de TestResource_fr TestResource_fr_CH |
|
28 @build TestResource_it FakeTestResource |
|
29 @run main ResourceBundleTest |
|
30 */ |
|
31 /* |
|
32 * |
|
33 * |
|
34 * (C) Copyright Taligent, Inc. 1996, 1997 - All Rights Reserved |
|
35 * (C) Copyright IBM Corp. 1996 - 1998 - All Rights Reserved |
|
36 * |
|
37 * Portions copyright (c) 2007 Sun Microsystems, Inc. |
|
38 * All Rights Reserved. |
|
39 * |
|
40 * The original version of this source code and documentation |
|
41 * is copyrighted and owned by Taligent, Inc., a wholly-owned |
|
42 * subsidiary of IBM. These materials are provided under terms |
|
43 * of a License Agreement between Taligent and Sun. This technology |
|
44 * is protected by multiple US and International patents. |
|
45 * |
|
46 * This notice and attribution to Taligent may not be removed. |
|
47 * Taligent is a registered trademark of Taligent, Inc. |
|
48 * |
|
49 * Permission to use, copy, modify, and distribute this software |
|
50 * and its documentation for NON-COMMERCIAL purposes and without |
|
51 * fee is hereby granted provided that this copyright notice |
|
52 * appears in all copies. Please refer to the file "copyright.html" |
|
53 * for further important copyright and licensing information. |
|
54 * |
|
55 * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF |
|
56 * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED |
|
57 * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A |
|
58 * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR |
|
59 * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR |
|
60 * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. |
|
61 * |
|
62 */ |
|
63 |
|
64 import java.text.*; |
|
65 import java.util.*; |
|
66 import java.io.*; |
|
67 |
|
68 public class ResourceBundleTest extends RBTestFmwk { |
|
69 public static void main(String[] args) throws Exception { |
|
70 new ResourceBundleTest().run(args); |
|
71 } |
|
72 |
|
73 public ResourceBundleTest() { |
|
74 makePropertiesFile(); |
|
75 } |
|
76 |
|
77 public void TestResourceBundle() { |
|
78 Locale saveDefault = Locale.getDefault(); |
|
79 Locale.setDefault(new Locale("fr", "FR")); |
|
80 |
|
81 // load up the resource bundle, and make sure we got the right one |
|
82 ResourceBundle bundle = ResourceBundle.getBundle("TestResource"); |
|
83 if (!bundle.getClass().getName().equals("TestResource_fr")) |
|
84 errln("Expected TestResource_fr, got " + bundle.getClass().getName()); |
|
85 |
|
86 // these resources are defines in ResourceBundle_fr |
|
87 String test1 = bundle.getString("Time"); |
|
88 if (!test1.equals("Time keeps on slipping...")) |
|
89 errln("TestResource_fr returned wrong value for \"Time\": got " + test1); |
|
90 |
|
91 test1 = bundle.getString("For"); |
|
92 if (!test1.equals("Four score and seven years ago...")) |
|
93 errln("TestResource_fr returned wrong value for \"For\": got " + test1); |
|
94 |
|
95 String[] test2 = bundle.getStringArray("All"); |
|
96 if (test2.length != 4) |
|
97 errln("TestResource_fr returned wrong number of elements for \"All\": got " + test2.length); |
|
98 else if (!test2[0].equals("'Twas brillig, and the slithy toves") || |
|
99 !test2[1].equals("Did gyre and gimble in the wabe.") || |
|
100 !test2[2].equals("All mimsy were the borogoves,") || |
|
101 !test2[3].equals("And the mome raths outgrabe.")) |
|
102 errln("TestResource_fr returned the wrong value for one of the elements in \"All\""); |
|
103 |
|
104 Object test3 = bundle.getObject("Good"); |
|
105 if (test3 == null || test3.getClass() != Integer.class) |
|
106 errln("TestResource_fr returned an object of the wrong class for \"Good\""); |
|
107 else if (((Integer)test3).intValue() != 3) |
|
108 errln("TestResource_fr returned the wrong value for \"Good\": got " + test3); |
|
109 |
|
110 // This resource is defined in TestResource and inherited by TestResource_fr |
|
111 test2 = bundle.getStringArray("Men"); |
|
112 if (test2.length != 3) |
|
113 errln("TestResource_fr returned wrong number of elements for \"Men\": got " + test2.length); |
|
114 else if (!test2[0].equals("1") || |
|
115 !test2[1].equals("2") || |
|
116 !test2[2].equals("C")) |
|
117 errln("TestResource_fr returned the wrong value for one of the elements in \"All\""); |
|
118 |
|
119 // This resource is defined in neither TestResource not TestResource_fr |
|
120 try { |
|
121 test3 = bundle.getObject("Is"); |
|
122 errln("TestResource_fr returned a value for \"Is\" when it shouldn't: got " + test3); |
|
123 } |
|
124 catch (MissingResourceException e) { |
|
125 } |
|
126 |
|
127 String[] keys = { "Now", "Time", "For", "All", "Good", "Men", "Come" }; |
|
128 checkKeys(bundle.getKeys(), keys); |
|
129 |
|
130 Locale.setDefault(saveDefault); |
|
131 } |
|
132 |
|
133 public void TestListResourceBundle() { |
|
134 // load up the resource and check to make sure we got the right class |
|
135 // (we don't define be_BY or be, so we fall back on the root default) |
|
136 ResourceBundle bundle = ResourceBundle.getBundle("TestResource", |
|
137 new Locale("be", "BY")); |
|
138 if (!bundle.getClass().getName().equals("TestResource")) |
|
139 errln("Expected TestResource, got " + bundle.getClass().getName()); |
|
140 |
|
141 doListResourceBundleTest(bundle); |
|
142 } |
|
143 |
|
144 /** |
|
145 * @bug 4073127 |
|
146 * Repeat TestListResourceBundle on TestResource_it, which is a ListResourceBundle |
|
147 * with NO contents. It should gracefully inherit everything from the root |
|
148 * TestResource. |
|
149 */ |
|
150 public void TestEmptyListResourceBundle() { |
|
151 ResourceBundle bundle = ResourceBundle.getBundle("TestResource", |
|
152 new Locale("it", "IT")); |
|
153 doListResourceBundleTest(bundle); |
|
154 } |
|
155 |
|
156 private void doListResourceBundleTest(ResourceBundle bundle) { |
|
157 // load up the resource and check to make sure we got the right class |
|
158 // all of these resources are defined in TestResource; it doesn' inherit from anybody |
|
159 String test1 = bundle.getString("Now"); |
|
160 if (!test1.equals("Now is the time for all...")) |
|
161 errln("TestResource returned wrong value for \"Now\": got " + test1); |
|
162 |
|
163 test1 = bundle.getString("Time"); |
|
164 if (!test1.equals("Howdy Doody Time!")) |
|
165 errln("TestResource returned wrong value for \"Time\": got " + test1); |
|
166 |
|
167 test1 = bundle.getString("Come"); |
|
168 if (!test1.equals("Come into my parlor...")) |
|
169 errln("TestResource returned wrong value for \"Come\": got " + test1); |
|
170 |
|
171 Object test3 = bundle.getObject("Good"); |
|
172 if (test3 == null || test3.getClass() != Integer.class) |
|
173 errln("TestResource returned an object of the wrong class for \"Good\""); |
|
174 else if (((Integer)test3).intValue() != 27) |
|
175 errln("TestResource returned the wrong value for \"Good\": got " + test3); |
|
176 |
|
177 String[] test2 = bundle.getStringArray("Men"); |
|
178 if (test2.length != 3) |
|
179 errln("TestResource returned wrong number of elements for \"Men\": got " + test2.length); |
|
180 else if (!test2[0].equals("1") || |
|
181 !test2[1].equals("2") || |
|
182 !test2[2].equals("C")) |
|
183 errln("TestResource returned the wrong value for one of the elements in \"All\""); |
|
184 |
|
185 // this item isn't defined in TestResource |
|
186 try { |
|
187 test3 = bundle.getObject("All"); |
|
188 errln("TestResource_en returned a value for \"All\" when it shouldn't: got " + test3); |
|
189 } |
|
190 catch (MissingResourceException e) { |
|
191 } |
|
192 |
|
193 String[] keys = { "Now", "Time", "Good", "Men", "Come" }; |
|
194 checkKeys(bundle.getKeys(), keys); |
|
195 } |
|
196 |
|
197 /** |
|
198 * @bug 4049325 |
|
199 * @ summary Bug 4049325 says ResourceBundle.findBundle() uses a hard-coded '/' as |
|
200 * the directory separator when searching for properties files. Interestingly, it |
|
201 * still works on my NT installation. I can't tell whether this is a required |
|
202 * property of all Java implementations (the magic appears to happen ClassLoader. |
|
203 * getResourceAsStream(), which is a native function) or a lucky property of my |
|
204 * particular implementation. If this bug regresses, this test may still pass |
|
205 * because a lower-level facility translates the / to the platform-specific separator |
|
206 * for us. |
|
207 */ |
|
208 public void TestPropertyResourceBundle() { |
|
209 ResourceBundle bundle = ResourceBundle.getBundle("TestResource", |
|
210 new Locale("es", "ES")); |
|
211 |
|
212 // these resources are defined in TestResource_es.properties |
|
213 String test = bundle.getString("Now"); |
|
214 if (!test.equals("How now brown cow")) |
|
215 errln("TestResource_es returned wrong value for \"Now\": got " + test); |
|
216 |
|
217 test = bundle.getString("Is"); |
|
218 if (!test.equals("Is there a dog?")) |
|
219 errln("TestResource_es returned wrong value for \"Is\": got " + test); |
|
220 |
|
221 test = bundle.getString("The"); |
|
222 if (!test.equals("The rain in Spain")) |
|
223 errln("TestResource_es returned wrong value for \"The\": got " + test); |
|
224 |
|
225 test = bundle.getString("Time"); |
|
226 if (!test.equals("Time marches on...")) |
|
227 errln("TestResource_es returned wrong value for \"Time\": got " + test); |
|
228 |
|
229 // this resource is defined in TestResource and inherited by TestResource_es |
|
230 String[] test2 = bundle.getStringArray("Men"); |
|
231 if (test2.length != 3) |
|
232 errln("TestResource returned wrong number of elements for \"Men\": got " + test2.length); |
|
233 else if (!test2[0].equals("1") || |
|
234 !test2[1].equals("2") || |
|
235 !test2[2].equals("C")) |
|
236 errln("TestResource returned the wrong value for one of the elements in \"All\""); |
|
237 |
|
238 // this resource is defined in neither TestResource nor TestResource_es |
|
239 try { |
|
240 test = bundle.getString("All"); |
|
241 errln("TestResource_es returned a value for \"All\" when it shouldn't: got " + test); |
|
242 } |
|
243 catch (MissingResourceException e) { |
|
244 } |
|
245 |
|
246 String[] keys = { "Now", "Is", "The", "Time", "Good", "Men", "Come" }; |
|
247 checkKeys(bundle.getKeys(), keys); |
|
248 } |
|
249 |
|
250 /** |
|
251 * @bug 4108126 |
|
252 */ |
|
253 public void TestGetLocale() { |
|
254 // try to find TestResource_fr_CH. Should get fr_CH as its locale |
|
255 ResourceBundle test = ResourceBundle.getBundle("TestResource", |
|
256 new Locale("fr", "CH", "")); |
|
257 Locale locale = test.getLocale(); |
|
258 if (!(locale.getLanguage().equals("fr")) || !(locale.getCountry().equals("CH"))) |
|
259 errln("Actual locale for TestResource_fr_CH should have been fr_CH, got " + locale); |
|
260 |
|
261 // try to find TestResource_fr_BE, which doesn't exist. Should get fr as its locale |
|
262 test = ResourceBundle.getBundle("TestResource", |
|
263 new Locale("fr", "BE", "")); |
|
264 locale = test.getLocale(); |
|
265 if (!(locale.getLanguage().equals("fr")) || !(locale.getCountry().equals(""))) |
|
266 errln("Actual locale for TestResource_fr_BE should have been fr, got " + locale); |
|
267 |
|
268 // try to find TestResource_iw_IL, which doesn't exist. Should get root locale |
|
269 // as its locale |
|
270 test = ResourceBundle.getBundle("TestResource", |
|
271 new Locale("iw", "IL", "")); |
|
272 locale = test.getLocale(); |
|
273 if (!(locale.getLanguage().equals("")) || !(locale.getCountry().equals(""))) |
|
274 errln("Actual locale for TestResource_iw_IL should have been the root locale, got " |
|
275 + locale); |
|
276 } |
|
277 |
|
278 /* |
|
279 * @bug 4083270 |
|
280 */ |
|
281 public void TestNonSubclass() { |
|
282 // ResourceBundle.getBundle should never return an object that isn't an instance |
|
283 // of ResourceBundle or one of its subclasses. We have a class called FakeTestResource |
|
284 // in this package that isn't a ResourceBundle. If we get that back, we barf. |
|
285 // (Actually, at the time I fixed this bug, getResource() would throw a |
|
286 // ClassCastException in that case.) |
|
287 // There's also a properties file called FakeTestResource; we should get back a |
|
288 // PropertyResourceBundle pointing to that file. |
|
289 Object test1 = ResourceBundle.getBundle("FakeTestResource", |
|
290 Locale.US); |
|
291 |
|
292 if (!(test1 instanceof ResourceBundle)) |
|
293 errln("Got back a " + test1.getClass().getName() + " instead of a PropertyResourceBundle when looking for FakeTestResource."); |
|
294 |
|
295 ResourceBundle test = (ResourceBundle)test1; |
|
296 |
|
297 // there's also a properties file called FakeTestResource. getBundle() should |
|
298 // find it, and it should have the following contents |
|
299 String message = test.getString("message"); |
|
300 if (!message.equals("Hello!")) |
|
301 errln("Supposedly found FakeTestResource.properties, but it had the wrong contents."); |
|
302 } |
|
303 |
|
304 /* |
|
305 * @bug 4106034 |
|
306 */ |
|
307 public void TestErrorMessage() { |
|
308 // Ensure that the message produced by the exception thrown |
|
309 // by ResourceBundle.getObject contains both the class name and |
|
310 // the key name. |
|
311 final String className = "TestResource"; |
|
312 final String keyName = "DontGetThis"; |
|
313 ResourceBundle bundle = ResourceBundle.getBundle(className, |
|
314 new Locale("it", "IT")); |
|
315 try { |
|
316 Object o = bundle.getObject(keyName); |
|
317 errln(bundle.getClass().getName()+" returned a value for tag \""+keyName+"\" when it should have thrown an exception. It returned "+o); |
|
318 } catch (MissingResourceException e) { |
|
319 String message = e.getMessage(); |
|
320 boolean found = false; |
|
321 if (message.indexOf(className) < 0) { |
|
322 errln("MissingResourceException error message did not contain class name."); |
|
323 } |
|
324 if (message.indexOf(keyName) < 0) { |
|
325 errln("MissingResourceException error message did not contain resource key name."); |
|
326 } |
|
327 } |
|
328 } |
|
329 |
|
330 |
|
331 private void makePropertiesFile() { |
|
332 try { |
|
333 // |
|
334 // The getProperty call is to ensure that this test will work with |
|
335 // the JTREG test harness. When running in the harness, the current |
|
336 // directory is often set to someplace that isn't on the CLASSPATH, |
|
337 // so we can't just create the properties files in the current |
|
338 // directory. But the harness uses the "test.classes" property to |
|
339 // tell us where the classes directory is. |
|
340 // |
|
341 String classesDir = System.getProperty("test.classes", "."); |
|
342 File file = new File(classesDir, "TestResource_es.properties"); |
|
343 if (!file.exists()) { |
|
344 FileOutputStream stream = new FileOutputStream(file); |
|
345 Properties props = new Properties(); |
|
346 |
|
347 props.put("Now", "How now brown cow"); |
|
348 props.put("Is", "Is there a dog?"); |
|
349 props.put("The", "The rain in Spain"); |
|
350 props.put("Time", "Time marches on..."); |
|
351 |
|
352 props.save(stream, "Test property list"); |
|
353 |
|
354 stream.close(); |
|
355 } |
|
356 |
|
357 file = new File(classesDir, "FakeTestResource.properties"); |
|
358 if (!file.exists()) { |
|
359 FileOutputStream stream = new FileOutputStream(file); |
|
360 Properties props = new Properties(); |
|
361 |
|
362 props.put("message", "Hello!"); |
|
363 |
|
364 props.save(stream, "Test property list"); |
|
365 |
|
366 stream.close(); |
|
367 } |
|
368 } |
|
369 catch (java.io.IOException e) { |
|
370 errln("Got exception: " + e); |
|
371 } |
|
372 } |
|
373 |
|
374 private void checkKeys(Enumeration testKeys, String[] expectedKeys) { |
|
375 Hashtable hash = new Hashtable(); |
|
376 String element; |
|
377 int elementCount = 0; |
|
378 |
|
379 for (int i=0; i < expectedKeys.length; i++) |
|
380 hash.put(expectedKeys[i], expectedKeys[i]); |
|
381 |
|
382 while (testKeys.hasMoreElements()) { |
|
383 element = (String)testKeys.nextElement(); |
|
384 elementCount++; |
|
385 if (!hash.containsKey(element)) |
|
386 errln(element + " missing from key list."); |
|
387 } |
|
388 |
|
389 if (elementCount != expectedKeys.length) |
|
390 errln("Wrong number of elements in key list: expected " + expectedKeys.length + |
|
391 " got " + elementCount); |
|
392 } |
|
393 } |