Home | History | Annotate | Download | only in utils
      1 /*
      2  * Copyright (C) 2011 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 com.android.inputmethod.latin.utils;
     18 
     19 import android.content.Context;
     20 import android.content.res.Resources;
     21 import android.test.AndroidTestCase;
     22 import android.test.suitebuilder.annotation.SmallTest;
     23 import android.view.inputmethod.InputMethodSubtype;
     24 
     25 import com.android.inputmethod.latin.R;
     26 import com.android.inputmethod.latin.RichInputMethodManager;
     27 
     28 import java.util.ArrayList;
     29 import java.util.Locale;
     30 
     31 @SmallTest
     32 public class SubtypeLocaleUtilsTests extends AndroidTestCase {
     33     // Locale to subtypes list.
     34     private final ArrayList<InputMethodSubtype> mSubtypesList = CollectionUtils.newArrayList();
     35 
     36     private RichInputMethodManager mRichImm;
     37     private Resources mRes;
     38 
     39     InputMethodSubtype EN_US;
     40     InputMethodSubtype EN_GB;
     41     InputMethodSubtype ES_US;
     42     InputMethodSubtype FR;
     43     InputMethodSubtype FR_CA;
     44     InputMethodSubtype DE;
     45     InputMethodSubtype ZZ;
     46     InputMethodSubtype DE_QWERTY;
     47     InputMethodSubtype FR_QWERTZ;
     48     InputMethodSubtype EN_US_AZERTY;
     49     InputMethodSubtype EN_UK_DVORAK;
     50     InputMethodSubtype ES_US_COLEMAK;
     51     InputMethodSubtype ZZ_AZERTY;
     52     InputMethodSubtype ZZ_PC;
     53 
     54     @Override
     55     protected void setUp() throws Exception {
     56         super.setUp();
     57         final Context context = getContext();
     58         RichInputMethodManager.init(context);
     59         mRichImm = RichInputMethodManager.getInstance();
     60         mRes = context.getResources();
     61         SubtypeLocaleUtils.init(context);
     62 
     63         EN_US = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
     64                 Locale.US.toString(), "qwerty");
     65         EN_GB = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
     66                 Locale.UK.toString(), "qwerty");
     67         ES_US = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
     68                 "es_US", "spanish");
     69         FR = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
     70                 Locale.FRENCH.toString(), "azerty");
     71         FR_CA = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
     72                 Locale.CANADA_FRENCH.toString(), "qwerty");
     73         DE = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
     74                 Locale.GERMAN.toString(), "qwertz");
     75         ZZ = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
     76                 SubtypeLocaleUtils.NO_LANGUAGE, "qwerty");
     77         DE_QWERTY = AdditionalSubtypeUtils.createAdditionalSubtype(
     78                 Locale.GERMAN.toString(), "qwerty", null);
     79         FR_QWERTZ = AdditionalSubtypeUtils.createAdditionalSubtype(
     80                 Locale.FRENCH.toString(), "qwertz", null);
     81         EN_US_AZERTY = AdditionalSubtypeUtils.createAdditionalSubtype(
     82                 Locale.US.toString(), "azerty", null);
     83         EN_UK_DVORAK = AdditionalSubtypeUtils.createAdditionalSubtype(
     84                 Locale.UK.toString(), "dvorak", null);
     85         ES_US_COLEMAK = AdditionalSubtypeUtils.createAdditionalSubtype(
     86                 "es_US", "colemak", null);
     87         ZZ_AZERTY = AdditionalSubtypeUtils.createAdditionalSubtype(
     88                 SubtypeLocaleUtils.NO_LANGUAGE, "azerty", null);
     89         ZZ_PC = AdditionalSubtypeUtils.createAdditionalSubtype(
     90                 SubtypeLocaleUtils.NO_LANGUAGE, "pcqwerty", null);
     91 
     92     }
     93 
     94     public void testAllFullDisplayName() {
     95         for (final InputMethodSubtype subtype : mSubtypesList) {
     96             final String subtypeName =
     97                     SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(subtype);
     98             if (SubtypeLocaleUtils.isNoLanguage(subtype)) {
     99                 final String noLanguage = mRes.getString(R.string.subtype_no_language);
    100                 assertTrue(subtypeName, subtypeName.contains(noLanguage));
    101             } else {
    102                 final String languageName =
    103                         SubtypeLocaleUtils.getSubtypeLocaleDisplayName(subtype.getLocale());
    104                 assertTrue(subtypeName, subtypeName.contains(languageName));
    105             }
    106         }
    107     }
    108 
    109     public void testKeyboardLayoutSetName() {
    110         assertEquals("en_US", "qwerty", SubtypeLocaleUtils.getKeyboardLayoutSetName(EN_US));
    111         assertEquals("en_GB", "qwerty", SubtypeLocaleUtils.getKeyboardLayoutSetName(EN_GB));
    112         assertEquals("es_US", "spanish", SubtypeLocaleUtils.getKeyboardLayoutSetName(ES_US));
    113         assertEquals("fr   ", "azerty", SubtypeLocaleUtils.getKeyboardLayoutSetName(FR));
    114         assertEquals("fr_CA", "qwerty", SubtypeLocaleUtils.getKeyboardLayoutSetName(FR_CA));
    115         assertEquals("de   ", "qwertz", SubtypeLocaleUtils.getKeyboardLayoutSetName(DE));
    116         assertEquals("zz   ", "qwerty", SubtypeLocaleUtils.getKeyboardLayoutSetName(ZZ));
    117     }
    118 
    119     // InputMethodSubtype's display name in system locale (en_US).
    120     //        isAdditionalSubtype (T=true, F=false)
    121     // locale layout  |  display name
    122     // ------ ------- - ----------------------
    123     //  en_US qwerty  F  English (US)            exception
    124     //  en_GB qwerty  F  English (UK)            exception
    125     //  es_US spanish F  Spanish (US)            exception
    126     //  fr    azerty  F  French
    127     //  fr_CA qwerty  F  French (Canada)
    128     //  de    qwertz  F  German
    129     //  zz    qwerty  F  Alphabet (QWERTY)
    130     //  fr    qwertz  T  French (QWERTZ)
    131     //  de    qwerty  T  German (QWERTY)
    132     //  en_US azerty  T  English (US) (AZERTY)   exception
    133     //  en_UK dvorak  T  English (UK) (Dvorak)   exception
    134     //  es_US colemak T  Spanish (US) (Colemak)  exception
    135     //  zz    pc      T  Alphabet (PC)
    136 
    137     public void testPredefinedSubtypesInEnglishSystemLocale() {
    138         final RunInLocale<Void> tests = new RunInLocale<Void>() {
    139             @Override
    140             protected Void job(final Resources res) {
    141                 assertEquals("en_US", "English (US)",
    142                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(EN_US));
    143                 assertEquals("en_GB", "English (UK)",
    144                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(EN_GB));
    145                 assertEquals("es_US", "Spanish (US)",
    146                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(ES_US));
    147                 assertEquals("fr   ", "French",
    148                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(FR));
    149                 assertEquals("fr_CA", "French (Canada)",
    150                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(FR_CA));
    151                 assertEquals("de   ", "German",
    152                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(DE));
    153                 assertEquals("zz   ", "Alphabet (QWERTY)",
    154                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(ZZ));
    155                 return null;
    156             }
    157         };
    158         tests.runInLocale(mRes, Locale.ENGLISH);
    159     }
    160 
    161     public void testAdditionalSubtypesInEnglishSystemLocale() {
    162         final RunInLocale<Void> tests = new RunInLocale<Void>() {
    163             @Override
    164             protected Void job(final Resources res) {
    165                 assertEquals("fr qwertz",    "French (QWERTZ)",
    166                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(FR_QWERTZ));
    167                 assertEquals("de qwerty",    "German (QWERTY)",
    168                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(DE_QWERTY));
    169                 assertEquals("en_US azerty", "English (US) (AZERTY)",
    170                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(EN_US_AZERTY));
    171                 assertEquals("en_UK dvorak", "English (UK) (Dvorak)",
    172                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(EN_UK_DVORAK));
    173                 assertEquals("es_US colemak","Spanish (US) (Colemak)",
    174                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(ES_US_COLEMAK));
    175                 assertEquals("zz pc",    "Alphabet (PC)",
    176                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(ZZ_PC));
    177                 return null;
    178             }
    179         };
    180         tests.runInLocale(mRes, Locale.ENGLISH);
    181     }
    182 
    183     // InputMethodSubtype's display name in system locale (fr).
    184     //        isAdditionalSubtype (T=true, F=false)
    185     // locale layout  |  display name
    186     // ------ ------- - ----------------------
    187     //  en_US qwerty  F  Anglais (tats-Unis)            exception
    188     //  en_GB qwerty  F  Anglais (Royaume-Uni)            exception
    189     //  es_US spanish F  Espagnol (tats-Unis)            exception
    190     //  fr    azerty  F  Franais
    191     //  fr_CA qwerty  F  Franais (Canada)
    192     //  de    qwertz  F  Allemand
    193     //  zz    qwerty  F  Aucune langue (QWERTY)
    194     //  fr    qwertz  T  Franais (QWERTZ)
    195     //  de    qwerty  T  Allemand (QWERTY)
    196     //  en_US azerty  T  Anglais (tats-Unis) (AZERTY)   exception
    197     //  en_UK dvorak  T  Anglais (Royaume-Uni) (Dvorak)   exception
    198     //  es_US colemak T  Espagnol (tats-Unis) (Colemak)  exception
    199     //  zz    pc      T  Alphabet (PC)
    200 
    201     public void testPredefinedSubtypesInFrenchSystemLocale() {
    202         final RunInLocale<Void> tests = new RunInLocale<Void>() {
    203             @Override
    204             protected Void job(final Resources res) {
    205                 assertEquals("en_US", "Anglais (tats-Unis)",
    206                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(EN_US));
    207                 assertEquals("en_GB", "Anglais (Royaume-Uni)",
    208                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(EN_GB));
    209                 assertEquals("es_US", "Espagnol (tats-Unis)",
    210                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(ES_US));
    211                 assertEquals("fr   ", "Franais",
    212                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(FR));
    213                 assertEquals("fr_CA", "Franais (Canada)",
    214                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(FR_CA));
    215                 assertEquals("de   ", "Allemand",
    216                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(DE));
    217                 assertEquals("zz   ", "Alphabet latin (QWERTY)",
    218                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(ZZ));
    219                 return null;
    220             }
    221         };
    222         tests.runInLocale(mRes, Locale.FRENCH);
    223     }
    224 
    225     public void testAdditionalSubtypesInFrenchSystemLocale() {
    226         final RunInLocale<Void> tests = new RunInLocale<Void>() {
    227             @Override
    228             protected Void job(final Resources res) {
    229                 assertEquals("fr qwertz",    "Franais (QWERTZ)",
    230                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(FR_QWERTZ));
    231                 assertEquals("de qwerty",    "Allemand (QWERTY)",
    232                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(DE_QWERTY));
    233                 assertEquals("en_US azerty", "Anglais (tats-Unis) (AZERTY)",
    234                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(EN_US_AZERTY));
    235                 assertEquals("en_UK dvorak", "Anglais (Royaume-Uni) (Dvorak)",
    236                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(EN_UK_DVORAK));
    237                 assertEquals("es_US colemak","Espagnol (tats-Unis) (Colemak)",
    238                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(ES_US_COLEMAK));
    239                 assertEquals("zz pc",    "Alphabet latin (PC)",
    240                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(ZZ_PC));
    241                 return null;
    242             }
    243         };
    244         tests.runInLocale(mRes, Locale.FRENCH);
    245     }
    246 
    247     public void testAllFullDisplayNameForSpacebar() {
    248         for (final InputMethodSubtype subtype : mSubtypesList) {
    249             final String subtypeName =
    250                     SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(subtype);
    251             final String spacebarText = SubtypeLocaleUtils.getFullDisplayName(subtype);
    252             final String languageName =
    253                     SubtypeLocaleUtils.getSubtypeLocaleDisplayName(subtype.getLocale());
    254             if (SubtypeLocaleUtils.isNoLanguage(subtype)) {
    255                 assertFalse(subtypeName, spacebarText.contains(languageName));
    256             } else {
    257                 assertTrue(subtypeName, spacebarText.contains(languageName));
    258             }
    259         }
    260     }
    261 
    262    public void testAllMiddleDisplayNameForSpacebar() {
    263         for (final InputMethodSubtype subtype : mSubtypesList) {
    264             final String subtypeName =
    265                     SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(subtype);
    266             final String spacebarText = SubtypeLocaleUtils.getMiddleDisplayName(subtype);
    267             if (SubtypeLocaleUtils.isNoLanguage(subtype)) {
    268                 assertEquals(subtypeName,
    269                         SubtypeLocaleUtils.getKeyboardLayoutSetName(subtype), spacebarText);
    270             } else {
    271                 assertEquals(subtypeName,
    272                         SubtypeLocaleUtils.getSubtypeLocaleDisplayName(subtype.getLocale()),
    273                         spacebarText);
    274             }
    275         }
    276     }
    277 
    278     public void testAllShortDisplayNameForSpacebar() {
    279         for (final InputMethodSubtype subtype : mSubtypesList) {
    280             final String subtypeName =
    281                     SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(subtype);
    282             final Locale locale = SubtypeLocaleUtils.getSubtypeLocale(subtype);
    283             final String spacebarText = SubtypeLocaleUtils.getShortDisplayName(subtype);
    284             final String languageCode = StringUtils.capitalizeFirstCodePoint(
    285                     locale.getLanguage(), locale);
    286             if (SubtypeLocaleUtils.isNoLanguage(subtype)) {
    287                 assertEquals(subtypeName, "", spacebarText);
    288             } else {
    289                 assertEquals(subtypeName, languageCode, spacebarText);
    290             }
    291         }
    292     }
    293 
    294     // InputMethodSubtype's display name for spacebar text in its locale.
    295     //        isAdditionalSubtype (T=true, F=false)
    296     // locale layout  | Short  Middle      Full
    297     // ------ ------- - ---- --------- ----------------------
    298     //  en_US qwerty  F  En  English   English (US)           exception
    299     //  en_GB qwerty  F  En  English   English (UK)           exception
    300     //  es_US spanish F  Es  Espaol   Espaol (EE.UU.)       exception
    301     //  fr    azerty  F  Fr  Franais  Franais
    302     //  fr_CA qwerty  F  Fr  Franais  Franais (Canada)
    303     //  de    qwertz  F  De  Deutsch   Deutsch
    304     //  zz    qwerty  F      QWERTY    QWERTY
    305     //  fr    qwertz  T  Fr  Franais  Franais
    306     //  de    qwerty  T  De  Deutsch   Deutsch
    307     //  en_US azerty  T  En  English   English (US)
    308     //  zz    azerty  T      AZERTY    AZERTY
    309 
    310     private final RunInLocale<Void> testsPredefinedSubtypesForSpacebar = new RunInLocale<Void>() {
    311         @Override
    312         protected Void job(final Resources res) {
    313             assertEquals("en_US", "English (US)", SubtypeLocaleUtils.getFullDisplayName(EN_US));
    314             assertEquals("en_GB", "English (UK)", SubtypeLocaleUtils.getFullDisplayName(EN_GB));
    315             assertEquals("es_US", "Espaol (EE.UU.)",
    316                     SubtypeLocaleUtils.getFullDisplayName(ES_US));
    317             assertEquals("fr   ", "Franais",     SubtypeLocaleUtils.getFullDisplayName(FR));
    318             assertEquals("fr_CA", "Franais (Canada)",
    319                     SubtypeLocaleUtils.getFullDisplayName(FR_CA));
    320             assertEquals("de   ", "Deutsch",      SubtypeLocaleUtils.getFullDisplayName(DE));
    321             assertEquals("zz   ", "QWERTY",       SubtypeLocaleUtils.getFullDisplayName(ZZ));
    322 
    323             assertEquals("en_US", "English",  SubtypeLocaleUtils.getMiddleDisplayName(EN_US));
    324             assertEquals("en_GB", "English",  SubtypeLocaleUtils.getMiddleDisplayName(EN_GB));
    325             assertEquals("es_US", "Espaol",  SubtypeLocaleUtils.getMiddleDisplayName(ES_US));
    326             assertEquals("fr   ", "Franais", SubtypeLocaleUtils.getMiddleDisplayName(FR));
    327             assertEquals("fr_CA", "Franais", SubtypeLocaleUtils.getMiddleDisplayName(FR_CA));
    328             assertEquals("de   ", "Deutsch",  SubtypeLocaleUtils.getMiddleDisplayName(DE));
    329             assertEquals("zz   ", "QWERTY",   SubtypeLocaleUtils.getMiddleDisplayName(ZZ));
    330 
    331             assertEquals("en_US", "En", SubtypeLocaleUtils.getShortDisplayName(EN_US));
    332             assertEquals("en_GB", "En", SubtypeLocaleUtils.getShortDisplayName(EN_GB));
    333             assertEquals("es_US", "Es", SubtypeLocaleUtils.getShortDisplayName(ES_US));
    334             assertEquals("fr   ", "Fr", SubtypeLocaleUtils.getShortDisplayName(FR));
    335             assertEquals("fr_CA", "Fr", SubtypeLocaleUtils.getShortDisplayName(FR_CA));
    336             assertEquals("de   ", "De", SubtypeLocaleUtils.getShortDisplayName(DE));
    337             assertEquals("zz   ", "",   SubtypeLocaleUtils.getShortDisplayName(ZZ));
    338             return null;
    339         }
    340     };
    341 
    342     private final RunInLocale<Void> testsAdditionalSubtypesForSpacebar = new RunInLocale<Void>() {
    343         @Override
    344         protected Void job(final Resources res) {
    345             assertEquals("fr qwertz",    "Franais",
    346                     SubtypeLocaleUtils.getFullDisplayName(FR_QWERTZ));
    347             assertEquals("de qwerty",    "Deutsch",
    348                     SubtypeLocaleUtils.getFullDisplayName(DE_QWERTY));
    349             assertEquals("en_US azerty", "English (US)",
    350                     SubtypeLocaleUtils.getFullDisplayName(EN_US_AZERTY));
    351             assertEquals("zz azerty",    "AZERTY",
    352                     SubtypeLocaleUtils.getFullDisplayName(ZZ_AZERTY));
    353 
    354             assertEquals("fr qwertz",    "Franais",
    355                     SubtypeLocaleUtils.getMiddleDisplayName(FR_QWERTZ));
    356             assertEquals("de qwerty",    "Deutsch",
    357                     SubtypeLocaleUtils.getMiddleDisplayName(DE_QWERTY));
    358             assertEquals("en_US azerty", "English",
    359                     SubtypeLocaleUtils.getMiddleDisplayName(EN_US_AZERTY));
    360             assertEquals("zz azerty",    "AZERTY",
    361                     SubtypeLocaleUtils.getMiddleDisplayName(ZZ_AZERTY));
    362 
    363             assertEquals("fr qwertz",    "Fr", SubtypeLocaleUtils.getShortDisplayName(FR_QWERTZ));
    364             assertEquals("de qwerty",    "De", SubtypeLocaleUtils.getShortDisplayName(DE_QWERTY));
    365             assertEquals("en_US azerty", "En",
    366                     SubtypeLocaleUtils.getShortDisplayName(EN_US_AZERTY));
    367             assertEquals("zz azerty",    "",   SubtypeLocaleUtils.getShortDisplayName(ZZ_AZERTY));
    368             return null;
    369         }
    370     };
    371 
    372     public void testPredefinedSubtypesForSpacebarInEnglish() {
    373         testsPredefinedSubtypesForSpacebar.runInLocale(mRes, Locale.ENGLISH);
    374     }
    375 
    376     public void testAdditionalSubtypeForSpacebarInEnglish() {
    377         testsAdditionalSubtypesForSpacebar.runInLocale(mRes, Locale.ENGLISH);
    378     }
    379 
    380     public void testPredefinedSubtypesForSpacebarInFrench() {
    381         testsPredefinedSubtypesForSpacebar.runInLocale(mRes, Locale.FRENCH);
    382     }
    383 
    384     public void testAdditionalSubtypeForSpacebarInFrench() {
    385         testsAdditionalSubtypesForSpacebar.runInLocale(mRes, Locale.FRENCH);
    386     }
    387 }
    388