Home | History | Annotate | Download | only in core
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.core;
     18 
     19 import junit.framework.TestCase;
     20 
     21 import java.nio.charset.Charset;
     22 import java.text.DateFormatSymbols;
     23 import java.util.Calendar;
     24 import java.util.Currency;
     25 import java.util.Locale;
     26 import java.util.Set;
     27 import java.util.TimeZone;
     28 import android.test.suitebuilder.annotation.MediumTest;
     29 import android.test.suitebuilder.annotation.SmallTest;
     30 import android.test.suitebuilder.annotation.LargeTest;
     31 import android.test.suitebuilder.annotation.Suppress;
     32 
     33 /**
     34  * Test some locale-dependent stuff for Android. This test mainly ensures that
     35  * our ICU configuration is correct and contains all the needed locales and
     36  * resource bundles.
     37  */
     38 public class LocaleTest extends TestCase {
     39 
     40     // Test basic Locale infrastructure.
     41     @SmallTest
     42     public void testLocale() throws Exception {
     43         Locale locale = new Locale("en");
     44         assertEquals("en", locale.toString());
     45 
     46         locale = new Locale("en", "US");
     47         assertEquals("en_US", locale.toString());
     48 
     49         locale = new Locale("en", "", "POSIX");
     50         assertEquals("en__POSIX", locale.toString());
     51 
     52         locale = new Locale("en", "US", "POSIX");
     53         assertEquals("en_US_POSIX", locale.toString());
     54     }
     55 
     56     /*
     57      * Tests some must-have locales. TODO: Add back "de". See discussion
     58      * immediately below this method.
     59      */
     60     @LargeTest
     61     public void testResourceBundles() throws Exception {
     62         Locale eng = new Locale("en", "US");
     63         DateFormatSymbols engSymbols = new DateFormatSymbols(eng);
     64 
     65         //Locale deu = new Locale("de", "DE");
     66         //DateFormatSymbols deuSymbols = new DateFormatSymbols(deu);
     67 
     68         TimeZone berlin = TimeZone.getTimeZone("Europe/Berlin");
     69 
     70         assertEquals("January", engSymbols.getMonths()[0]);
     71         //assertEquals("Januar", deuSymbols.getMonths()[0]);
     72 
     73         assertEquals("Sunday", engSymbols.getWeekdays()[Calendar.SUNDAY]);
     74         //assertEquals("Sonntag", deuSymbols.getWeekdays()[Calendar.SUNDAY]);
     75 
     76         assertEquals("Central European Time",
     77                 berlin.getDisplayName(false, TimeZone.LONG, eng));
     78         assertEquals("Central European Summer Time",
     79                 berlin.getDisplayName(true, TimeZone.LONG, eng));
     80 
     81         //assertEquals("Mitteleurop\u00E4ische Zeit",
     82         //        berlin.getDisplayName(false, TimeZone.LONG, deu));
     83         //assertEquals("Mitteleurop\u00E4ische Sommerzeit",
     84         //        berlin.getDisplayName(true, TimeZone.LONG, deu));
     85 
     86         assertTrue(engSymbols.getZoneStrings().length > 100);
     87     }
     88 
     89     /*
     90      * Disabled version of the above test. The version above omits
     91      * checks for stuff in the "de" locale, because we stripped that
     92      * out as part of the flash reduction effort (so that we could
     93      * still ship on Dream). We expect to have a baseline target that
     94      * includes a large enough system partition to include "de"
     95      * immediately after the last official release for Dream (whenever
     96      * that may be).
     97      *
     98     // Test some must-have locales.
     99     @LargeTest
    100     public void testResourceBundles() throws Exception {
    101         Locale eng = new Locale("en", "US");
    102         DateFormatSymbols engSymbols = new DateFormatSymbols(eng);
    103 
    104         Locale deu = new Locale("de", "DE");
    105         DateFormatSymbols deuSymbols = new DateFormatSymbols(deu);
    106 
    107         TimeZone berlin = TimeZone.getTimeZone("Europe/Berlin");
    108 
    109         assertEquals("January", engSymbols.getMonths()[0]);
    110         assertEquals("Januar", deuSymbols.getMonths()[0]);
    111 
    112         assertEquals("Sunday", engSymbols.getWeekdays()[Calendar.SUNDAY]);
    113         assertEquals("Sonntag", deuSymbols.getWeekdays()[Calendar.SUNDAY]);
    114 
    115         assertEquals("Central European Time",
    116                 berlin.getDisplayName(false, TimeZone.LONG, eng));
    117         assertEquals("Central European Summer Time",
    118                 berlin.getDisplayName(true, TimeZone.LONG, eng));
    119 
    120         assertEquals("Mitteleurop\u00E4ische Zeit",
    121                 berlin.getDisplayName(false, TimeZone.LONG, deu));
    122         assertEquals("Mitteleurop\u00E4ische Sommerzeit",
    123                 berlin.getDisplayName(true, TimeZone.LONG, deu));
    124 
    125         assertTrue(engSymbols.getZoneStrings().length > 100);
    126     }
    127     */
    128 
    129     // This one makes sure we have all necessary locales installed.
    130     // Suppress this flaky test for now.
    131     @Suppress
    132     public void testICULocales() {
    133         String[] locales = new String[] {
    134                 // List of locales currently required for Android.
    135                 "en_US", "es_US", "en_GB", "fr_FR", "de_DE", "de_AT", "cs_CZ", "nl_NL" };
    136 
    137         String[] mondays = new String[] {
    138                 "Monday", "lunes", "Monday", "lundi", "Montag", "Montag", "pond\u011bl\u00ed", "maandag" };
    139 
    140         String[] currencies = new String[] {
    141                 "USD", "USD", "GBP", "EUR", "EUR", "EUR", "CZK", "EUR"};
    142 
    143         for (int i = 0; i < locales.length; i++) {
    144             Locale l = new Locale(locales[i].substring(0, 2), locales[i].substring(3));
    145 
    146             // Check language part of locale.
    147             DateFormatSymbols d = new DateFormatSymbols(l);
    148             assertEquals("Monday name for " + locales[i] + " must match",
    149                     mondays[i], d.getWeekdays()[2]);
    150 
    151             // Check country part of locale.
    152             Currency c = Currency.getInstance(l);
    153             assertEquals("Currency code for " + locales[i] + " must match",
    154                     currencies[i], c.getCurrencyCode());
    155         }
    156     }
    157 
    158     // Regression test for 1118570: Create test cases for tracking ICU config
    159     // changes. This one makes sure we have the necessary converters installed
    160     // and don't lose the changes to the converter alias table.
    161     @MediumTest
    162     public void testICUConverters() {
    163         // List of encodings currently required for Android.
    164         String[] encodings = new String[] {
    165                 // Encoding required by the language specification.
    166                 "US-ASCII",
    167                 "UTF-8",
    168                 "UTF-16",
    169                 "UTF-16BE",
    170                 "UTF-16LE",
    171                 "ISO-8859-1",
    172 
    173                 // Additional encodings included in standard ICU
    174                 "ISO-8859-2",
    175                 "ISO-8859-3",
    176                 "ISO-8859-4",
    177                 "ISO-8859-5",
    178                 "ISO-8859-6",
    179                 "ISO-8859-7",
    180                 "ISO-8859-8",
    181                 "ISO-8859-8-I",
    182                 "ISO-8859-9",
    183                 "ISO-8859-10",
    184                 "ISO-8859-11",
    185                 "ISO-8859-13",
    186                 "ISO-8859-14",
    187                 "ISO-8859-15",
    188                 "ISO-8859-16",
    189                 "ISO-2022-JP",
    190                 "Windows-950",
    191                 "Windows-1250",
    192                 "Windows-1251",
    193                 "Windows-1252",
    194                 "Windows-1253",
    195                 "Windows-1254",
    196                 "Windows-1255",
    197                 "Windows-1256",
    198                 "Windows-1257",
    199                 "Windows-1258",
    200                 "Big5",
    201                 "CP864",
    202                 "CP874",
    203                 "EUC-CN",
    204                 "EUC-JP",
    205                 "KOI8-R",
    206                 "Macintosh",
    207                 "GBK",
    208                 "GB2312",
    209                 "EUC-KR",
    210 
    211                 // Additional encoding not included in standard ICU.
    212                 "GSM0338" };
    213 
    214         for (int i = 0; i < encodings.length; i++) {
    215             assertTrue("Charset " + encodings[i] + " must be supported",
    216                     Charset.isSupported(encodings[i]));
    217 
    218             Charset cs = Charset.forName(encodings[i]);
    219             android.util.Log.d("LocaleTest", cs.name());
    220 
    221             Set<String> aliases = cs.aliases();
    222             for (String s: aliases) {
    223                 android.util.Log.d("LocaleTest", " - " + s);
    224             }
    225         }
    226 
    227         // Test for valid encoding that is not included in Android. IBM-37 is
    228         // a perfect candidate for this, as it is being used for mainframes and
    229         // thus somewhat out of the scope of Android.
    230         assertFalse("Charset IBM-37 must not be supported",
    231                 Charset.isSupported("IBM-37"));
    232 
    233         // Test for a bogus encoding.
    234         assertFalse("Charset KLINGON must not be supported",
    235                 Charset.isSupported("KLINGON"));
    236 
    237         // Make sure our local change to the real translation table used for
    238         // EUC-JP doesn't get lost.
    239         Charset cs = Charset.forName("EUC-JP");
    240         assertTrue("EUC-JP must use 'ibm-954_P101-2007'", cs.aliases().contains("ibm-954_P101-2007"));
    241     }
    242 
    243 }
    244