jdk/test/java/util/ResourceBundle/ResourceBundleTest.java
changeset 2 90ce3da70b43
child 5506 202f599c92aa
equal deleted inserted replaced
0:fd16c54261b3 2:90ce3da70b43
       
     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 }