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.InputMethodInfo;
     24 import android.view.inputmethod.InputMethodSubtype;
     25 
     26 import com.android.inputmethod.latin.R;
     27 import com.android.inputmethod.latin.RichInputMethodManager;
     28 import com.android.inputmethod.latin.RichInputMethodSubtype;
     29 
     30 import java.util.ArrayList;
     31 import java.util.Locale;
     32 
     33 @SmallTest
     34 public class SubtypeLocaleUtilsTests extends AndroidTestCase {
     35     // All input method subtypes of LatinIME.
     36     private final ArrayList<RichInputMethodSubtype> mSubtypesList = new ArrayList<>();
     37 
     38     private RichInputMethodManager mRichImm;
     39     private Resources mRes;
     40     private InputMethodSubtype mSavedAddtionalSubtypes[];
     41 
     42     InputMethodSubtype EN_US;
     43     InputMethodSubtype EN_GB;
     44     InputMethodSubtype ES_US;
     45     InputMethodSubtype FR;
     46     InputMethodSubtype FR_CA;
     47     InputMethodSubtype FR_CH;
     48     InputMethodSubtype DE;
     49     InputMethodSubtype DE_CH;
     50     InputMethodSubtype HI;
     51     InputMethodSubtype SR;
     52     InputMethodSubtype ZZ;
     53     InputMethodSubtype DE_QWERTY;
     54     InputMethodSubtype FR_QWERTZ;
     55     InputMethodSubtype EN_US_AZERTY;
     56     InputMethodSubtype EN_UK_DVORAK;
     57     InputMethodSubtype ES_US_COLEMAK;
     58     InputMethodSubtype ZZ_AZERTY;
     59     InputMethodSubtype ZZ_PC;
     60 
     61     // These are preliminary subtypes and may not exist.
     62     InputMethodSubtype HI_LATN; // Hinglish
     63     InputMethodSubtype SR_LATN; // Serbian Latin
     64     InputMethodSubtype HI_LATN_DVORAK; // Hinglis Dvorak
     65     InputMethodSubtype SR_LATN_QWERTY; // Serbian Latin Qwerty
     66 
     67     @Override
     68     protected void setUp() throws Exception {
     69         super.setUp();
     70         final Context context = getContext();
     71         mRes = context.getResources();
     72         RichInputMethodManager.init(context);
     73         mRichImm = RichInputMethodManager.getInstance();
     74 
     75         // Save and reset additional subtypes
     76         mSavedAddtionalSubtypes = mRichImm.getAdditionalSubtypes();
     77         final InputMethodSubtype[] predefinedAddtionalSubtypes =
     78                 AdditionalSubtypeUtils.createAdditionalSubtypesArray(
     79                         AdditionalSubtypeUtils.createPrefSubtypes(
     80                                 mRes.getStringArray(R.array.predefined_subtypes)));
     81         mRichImm.setAdditionalInputMethodSubtypes(predefinedAddtionalSubtypes);
     82 
     83         final InputMethodInfo imi = mRichImm.getInputMethodInfoOfThisIme();
     84         final int subtypeCount = imi.getSubtypeCount();
     85         for (int index = 0; index < subtypeCount; index++) {
     86             final InputMethodSubtype subtype = imi.getSubtypeAt(index);
     87             mSubtypesList.add(new RichInputMethodSubtype(subtype));
     88         }
     89 
     90         EN_US = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
     91                 Locale.US.toString(), "qwerty");
     92         EN_GB = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
     93                 Locale.UK.toString(), "qwerty");
     94         ES_US = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
     95                 "es_US", "spanish");
     96         FR = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
     97                 Locale.FRENCH.toString(), "azerty");
     98         FR_CA = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
     99                 Locale.CANADA_FRENCH.toString(), "qwerty");
    100         FR_CH = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
    101                 "fr_CH", "swiss");
    102         DE = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
    103                 Locale.GERMAN.toString(), "qwertz");
    104         DE_CH = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
    105                 "de_CH", "swiss");
    106         HI = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
    107                 "hi", "hindi");
    108         SR = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
    109                 "sr", "south_slavic");
    110         ZZ = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet(
    111                 SubtypeLocaleUtils.NO_LANGUAGE, "qwerty");
    112         DE_QWERTY = AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype(
    113                 Locale.GERMAN.toString(), "qwerty");
    114         FR_QWERTZ = AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype(
    115                 Locale.FRENCH.toString(), "qwertz");
    116         EN_US_AZERTY = AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype(
    117                 Locale.US.toString(), "azerty");
    118         EN_UK_DVORAK = AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype(
    119                 Locale.UK.toString(), "dvorak");
    120         ES_US_COLEMAK = AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype(
    121                 "es_US", "colemak");
    122         ZZ_AZERTY = AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype(
    123                 SubtypeLocaleUtils.NO_LANGUAGE, "azerty");
    124         ZZ_PC = AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype(
    125                 SubtypeLocaleUtils.NO_LANGUAGE, "pcqwerty");
    126 
    127         HI_LATN = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet("hi_ZZ", "qwerty");
    128         if (HI_LATN != null) {
    129             HI_LATN_DVORAK = AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype(
    130                     "hi_ZZ", "dvorak");
    131         }
    132         SR_LATN = mRichImm.findSubtypeByLocaleAndKeyboardLayoutSet("sr_ZZ", "serbian_qwertz");
    133         if (SR_LATN != null) {
    134             SR_LATN_QWERTY = AdditionalSubtypeUtils.createAsciiEmojiCapableAdditionalSubtype(
    135                     "sr_ZZ", "qwerty");
    136         }
    137     }
    138 
    139     @Override
    140     protected void tearDown() throws Exception {
    141         // Restore additional subtypes.
    142         mRichImm.setAdditionalInputMethodSubtypes(mSavedAddtionalSubtypes);
    143         super.tearDown();
    144     }
    145 
    146     public void testAllFullDisplayName() {
    147         for (final RichInputMethodSubtype subtype : mSubtypesList) {
    148             final String subtypeName = SubtypeLocaleUtils
    149                     .getSubtypeDisplayNameInSystemLocale(subtype.getRawSubtype());
    150             if (subtype.isNoLanguage()) {
    151                 final String layoutName = SubtypeLocaleUtils
    152                         .getKeyboardLayoutSetDisplayName(subtype.getRawSubtype());
    153                 assertTrue(subtypeName, subtypeName.contains(layoutName));
    154             } else {
    155                 final String languageName = SubtypeLocaleUtils
    156                         .getSubtypeLocaleDisplayNameInSystemLocale(subtype.getLocale().toString());
    157                 assertTrue(subtypeName, subtypeName.contains(languageName));
    158             }
    159         }
    160     }
    161 
    162     public void testKeyboardLayoutSetName() {
    163         assertEquals("en_US", "qwerty", SubtypeLocaleUtils.getKeyboardLayoutSetName(EN_US));
    164         assertEquals("en_GB", "qwerty", SubtypeLocaleUtils.getKeyboardLayoutSetName(EN_GB));
    165         assertEquals("es_US", "spanish", SubtypeLocaleUtils.getKeyboardLayoutSetName(ES_US));
    166         assertEquals("fr", "azerty", SubtypeLocaleUtils.getKeyboardLayoutSetName(FR));
    167         assertEquals("fr_CA", "qwerty", SubtypeLocaleUtils.getKeyboardLayoutSetName(FR_CA));
    168         assertEquals("fr_CH", "swiss", SubtypeLocaleUtils.getKeyboardLayoutSetName(FR_CH));
    169         assertEquals("de", "qwertz", SubtypeLocaleUtils.getKeyboardLayoutSetName(DE));
    170         assertEquals("de_CH", "swiss", SubtypeLocaleUtils.getKeyboardLayoutSetName(DE_CH));
    171         assertEquals("hi", "hindi", SubtypeLocaleUtils.getKeyboardLayoutSetName(HI));
    172         assertEquals("sr", "south_slavic", SubtypeLocaleUtils.getKeyboardLayoutSetName(SR));
    173         assertEquals("zz", "qwerty", SubtypeLocaleUtils.getKeyboardLayoutSetName(ZZ));
    174 
    175         assertEquals("de qwerty", "qwerty", SubtypeLocaleUtils.getKeyboardLayoutSetName(DE_QWERTY));
    176         assertEquals("fr qwertz", "qwertz", SubtypeLocaleUtils.getKeyboardLayoutSetName(FR_QWERTZ));
    177         assertEquals("en_US azerty", "azerty",
    178                 SubtypeLocaleUtils.getKeyboardLayoutSetName(EN_US_AZERTY));
    179         assertEquals("en_UK dvorak", "dvorak",
    180                 SubtypeLocaleUtils.getKeyboardLayoutSetName(EN_UK_DVORAK));
    181         assertEquals("es_US colemak", "colemak",
    182                 SubtypeLocaleUtils.getKeyboardLayoutSetName(ES_US_COLEMAK));
    183         assertEquals("zz azerty", "azerty",
    184                 SubtypeLocaleUtils.getKeyboardLayoutSetName(ZZ_AZERTY));
    185 
    186         // These are preliminary subtypes and may not exist.
    187         if (HI_LATN != null) {
    188             assertEquals("hi_ZZ", "qwerty", SubtypeLocaleUtils.getKeyboardLayoutSetName(HI_LATN));
    189             assertEquals("hi_ZZ dvorak", "dvorak",
    190                     SubtypeLocaleUtils.getKeyboardLayoutSetName(HI_LATN_DVORAK));
    191         }
    192         if (SR_LATN != null) {
    193             assertEquals("sr_ZZ", "serbian_qwertz",
    194                     SubtypeLocaleUtils.getKeyboardLayoutSetName(SR_LATN));
    195             assertEquals("sr_ZZ qwerty", "qwerty",
    196                     SubtypeLocaleUtils.getKeyboardLayoutSetName(SR_LATN_QWERTY));
    197         }
    198     }
    199 
    200     // InputMethodSubtype's display name in system locale (en_US).
    201     //               isAdditionalSubtype (T=true, F=false)
    202     // locale layout         |  display name
    203     // ------ -------------- - ----------------------
    204     //  en_US qwerty         F  English (US)            exception
    205     //  en_GB qwerty         F  English (UK)            exception
    206     //  es_US spanish        F  Spanish (US)            exception
    207     //  fr    azerty         F  French
    208     //  fr_CA qwerty         F  French (Canada)
    209     //  fr_CH swiss          F  French (Switzerland)
    210     //  de    qwertz         F  German
    211     //  de_CH swiss          F  German (Switzerland)
    212     //  hi    hindi          F  Hindi
    213     //  hi_ZZ qwerty         F  Hinglish                exception
    214     //  sr    south_slavic   F  Serbian
    215     //  sr_ZZ serbian_qwertz F  Serbian (Latin)         exception
    216     //  zz    qwerty         F  Alphabet (QWERTY)
    217     //  fr    qwertz         T  French (QWERTZ)
    218     //  de    qwerty         T  German (QWERTY)
    219     //  en_US azerty         T  English (US) (AZERTY)   exception
    220     //  en_UK dvorak         T  English (UK) (Dvorak)   exception
    221     //  es_US colemak        T  Spanish (US) (Colemak)  exception
    222     //  hi_ZZ dvorak         T  Hinglish (Dvorka)       exception
    223     //  sr_ZZ qwerty         T  Serbian (QWERTY)        exception
    224     //  zz    pc             T  Alphabet (PC)
    225 
    226     public void testPredefinedSubtypesInEnglishSystemLocale() {
    227         final RunInLocale<Void> tests = new RunInLocale<Void>() {
    228             @Override
    229             protected Void job(final Resources res) {
    230                 assertEquals("en_US", "English (US)",
    231                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(EN_US));
    232                 assertEquals("en_GB", "English (UK)",
    233                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(EN_GB));
    234                 assertEquals("es_US", "Spanish (US)",
    235                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(ES_US));
    236                 assertEquals("fr", "French",
    237                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(FR));
    238                 assertEquals("fr_CA", "French (Canada)",
    239                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(FR_CA));
    240                 assertEquals("fr_CH", "French (Switzerland)",
    241                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(FR_CH));
    242                 assertEquals("de", "German",
    243                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(DE));
    244                 assertEquals("de_CH", "German (Switzerland)",
    245                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(DE_CH));
    246                 assertEquals("hi", "Hindi",
    247                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(HI));
    248                 assertEquals("sr", "Serbian",
    249                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(SR));
    250                 assertEquals("zz", "Alphabet (QWERTY)",
    251                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(ZZ));
    252                 // These are preliminary subtypes and may not exist.
    253                 if (HI_LATN != null) {
    254                     assertEquals("hi_ZZ", "Hinglish",
    255                             SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(HI_LATN));
    256                 }
    257                 if (SR_LATN != null) {
    258                     assertEquals("sr_ZZ", "Serbian (Latin)",
    259                             SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(SR_LATN));
    260                 }
    261                 return null;
    262             }
    263         };
    264         tests.runInLocale(mRes, Locale.ENGLISH);
    265     }
    266 
    267     public void testAdditionalSubtypesInEnglishSystemLocale() {
    268         final RunInLocale<Void> tests = new RunInLocale<Void>() {
    269             @Override
    270             protected Void job(final Resources res) {
    271                 assertEquals("fr qwertz", "French (QWERTZ)",
    272                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(FR_QWERTZ));
    273                 assertEquals("de qwerty", "German (QWERTY)",
    274                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(DE_QWERTY));
    275                 assertEquals("en_US azerty", "English (US) (AZERTY)",
    276                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(EN_US_AZERTY));
    277                 assertEquals("en_UK dvorak","English (UK) (Dvorak)",
    278                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(EN_UK_DVORAK));
    279                 assertEquals("es_US colemak", "Spanish (US) (Colemak)",
    280                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(ES_US_COLEMAK));
    281                 assertEquals("zz azerty", "Alphabet (AZERTY)",
    282                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(ZZ_AZERTY));
    283                 assertEquals("zz pc", "Alphabet (PC)",
    284                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(ZZ_PC));
    285                 // These are preliminary subtypes and may not exist.
    286                 if (HI_LATN_DVORAK != null) {
    287                     assertEquals("hi_ZZ", "Hinglish (Dvorak)",
    288                             SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(HI_LATN_DVORAK));
    289                 }
    290                 if (SR_LATN_QWERTY != null) {
    291                     assertEquals("sr_ZZ", "Serbian (QWERTY)",
    292                             SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(SR_LATN_QWERTY));
    293                 }
    294                 return null;
    295             }
    296         };
    297         tests.runInLocale(mRes, Locale.ENGLISH);
    298     }
    299 
    300     // InputMethodSubtype's display name in system locale (fr).
    301     //        isAdditionalSubtype (T=true, F=false)
    302     // locale layout  |  display name
    303     // ------ ------- - ----------------------
    304     //  en_US qwerty         F  Anglais (tats-Unis)             exception
    305     //  en_GB qwerty         F  Anglais (Royaume-Uni)            exception
    306     //  es_US spanish        F  Espagnol (tats-Unis)            exception
    307     //  fr    azerty         F  Franais
    308     //  fr_CA qwerty         F  Franais (Canada)
    309     //  fr_CH swiss          F  Franais (Suisse)
    310     //  de    qwertz         F  Allemand
    311     //  de_CH swiss          F  Allemand (Suisse)
    312     //  hi    hindi          F  Hindi                            exception
    313     //  hi_ZZ qwerty         F  Hindi/Anglais                    exception
    314     //  sr    south_slavic   F  Serbe                            exception
    315     //  sr_ZZ serbian_qwertz F  Serbe (latin)                    exception
    316     //  zz    qwerty         F  Alphabet latin (QWERTY)
    317     //  fr    qwertz         T  Franais (QWERTZ)
    318     //  de    qwerty         T  Allemand (QWERTY)
    319     //  en_US azerty         T  Anglais (tats-Unis) (AZERTY)    exception
    320     //  en_UK dvorak         T  Anglais (Royaume-Uni) (Dvorak)   exception
    321     //  es_US colemak        T  Espagnol (tats-Unis) (Colemak)  exception
    322     //  hi_ZZ dvorak         T  Hindi/Anglais (Dvorka)           exception
    323     //  sr_ZZ qwerty         T  Serbe (QWERTY)                   exception
    324     //  zz    pc             T  Alphabet latin (PC)
    325 
    326     public void testPredefinedSubtypesInFrenchSystemLocale() {
    327         final RunInLocale<Void> tests = new RunInLocale<Void>() {
    328             @Override
    329             protected Void job(final Resources res) {
    330                 assertEquals("en_US", "Anglais (tats-Unis)",
    331                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(EN_US));
    332                 assertEquals("en_GB", "Anglais (Royaume-Uni)",
    333                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(EN_GB));
    334                 assertEquals("es_US", "Espagnol (tats-Unis)",
    335                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(ES_US));
    336                 assertEquals("fr", "Franais",
    337                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(FR));
    338                 assertEquals("fr_CA", "Franais (Canada)",
    339                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(FR_CA));
    340                 assertEquals("fr_CH", "Franais (Suisse)",
    341                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(FR_CH));
    342                 assertEquals("de", "Allemand",
    343                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(DE));
    344                 assertEquals("de_CH", "Allemand (Suisse)",
    345                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(DE_CH));
    346                 assertEquals("hi", "Hindi",
    347                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(HI));
    348                 assertEquals("sr", "Serbe",
    349                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(SR));
    350                 assertEquals("zz", "Alphabet latin (QWERTY)",
    351                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(ZZ));
    352                 // These are preliminary subtypes and may not exist.
    353                 if (HI_LATN != null) {
    354                     assertEquals("hi_ZZ", "Hindi/Anglais",
    355                             SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(HI_LATN));
    356                 }
    357                 if (SR_LATN != null) {
    358                     assertEquals("sr_ZZ", "Serbe (latin)",
    359                             SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(SR_LATN));
    360                 }
    361                 return null;
    362             }
    363         };
    364         tests.runInLocale(mRes, Locale.FRENCH);
    365     }
    366 
    367     public void testAdditionalSubtypesInFrenchSystemLocale() {
    368         final RunInLocale<Void> tests = new RunInLocale<Void>() {
    369             @Override
    370             protected Void job(final Resources res) {
    371                 assertEquals("fr qwertz", "Franais (QWERTZ)",
    372                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(FR_QWERTZ));
    373                 assertEquals("de qwerty", "Allemand (QWERTY)",
    374                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(DE_QWERTY));
    375                 assertEquals("en_US azerty", "Anglais (tats-Unis) (AZERTY)",
    376                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(EN_US_AZERTY));
    377                 assertEquals("en_UK dvorak", "Anglais (Royaume-Uni) (Dvorak)",
    378                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(EN_UK_DVORAK));
    379                 assertEquals("es_US colemak", "Espagnol (tats-Unis) (Colemak)",
    380                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(ES_US_COLEMAK));
    381                 assertEquals("zz azerty", "Alphabet latin (AZERTY)",
    382                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(ZZ_AZERTY));
    383                 assertEquals("zz pc", "Alphabet latin (PC)",
    384                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(ZZ_PC));
    385                 // These are preliminary subtypes and may not exist.
    386                 if (HI_LATN_DVORAK != null) {
    387                     assertEquals("hi_ZZ", "Hindi/Anglais (Dvorak)",
    388                             SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(HI_LATN_DVORAK));
    389                 }
    390                 if (SR_LATN_QWERTY != null) {
    391                     assertEquals("sr_ZZ", "Serbe (QWERTY)",
    392                             SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(SR_LATN_QWERTY));
    393                 }
    394                 return null;
    395             }
    396         };
    397         tests.runInLocale(mRes, Locale.FRENCH);
    398     }
    399 
    400     // InputMethodSubtype's display name in system locale (hi).
    401     //        isAdditionalSubtype (T=true, F=false)
    402     // locale layout  |  display name
    403     // ------ ------- - ----------------------
    404     //  hi    hindi   F  
    405     //  hi_ZZ qwerty  F  
    406     //  hi_ZZ dvorak  T   (Dvorak)
    407 
    408     public void testHinglishSubtypesInHindiSystemLocale() {
    409         final RunInLocale<Void> tests = new RunInLocale<Void>() {
    410             @Override
    411             protected Void job (final Resources res) {
    412                 assertEquals("hi", "",
    413                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(HI));
    414                 // These are preliminary subtypes and may not exist.
    415                 if (HI_LATN != null) {
    416                     assertEquals("hi_ZZ", "",
    417                             SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(HI_LATN));
    418                     assertEquals("hi_ZZ", " (Dvorak)",
    419                             SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(HI_LATN_DVORAK));
    420                 }
    421                 return null;
    422             }
    423         };
    424         tests.runInLocale(mRes, new Locale("hi"));
    425     }
    426 
    427     // InputMethodSubtype's display name in system locale (sr).
    428     //               isAdditionalSubtype (T=true, F=false)
    429     // locale layout         |  display name
    430     // ------ -------------- - ----------------------
    431     //  sr    south_slavic   F  
    432     //  sr_ZZ serbian_qwertz F   ()
    433     //  sr_ZZ qwerty         T   (QWERTY)
    434 
    435     public void testSerbianLatinSubtypesInSerbianSystemLocale() {
    436         final RunInLocale<Void> tests = new RunInLocale<Void>() {
    437             @Override
    438             protected Void job (final Resources res) {
    439                 assertEquals("sr", "",
    440                         SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(SR));
    441                 // These are preliminary subtypes and may not exist.
    442                 if (SR_LATN != null) {
    443                     assertEquals("sr_ZZ", " ()",
    444                             SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(SR_LATN));
    445                     assertEquals("sr_ZZ", " (QWERTY)",
    446                             SubtypeLocaleUtils.getSubtypeDisplayNameInSystemLocale(SR_LATN_QWERTY));
    447                 }
    448                 return null;
    449             }
    450         };
    451         tests.runInLocale(mRes, new Locale("sr"));
    452     }
    453 
    454     public void testIsRtlLanguage() {
    455         // Known Right-to-Left language subtypes.
    456         final InputMethodSubtype ARABIC = mRichImm
    457                 .findSubtypeByLocaleAndKeyboardLayoutSet("ar", "arabic");
    458         assertNotNull("Arabic", ARABIC);
    459         final InputMethodSubtype FARSI = mRichImm
    460                 .findSubtypeByLocaleAndKeyboardLayoutSet("fa", "farsi");
    461         assertNotNull("Farsi", FARSI);
    462         final InputMethodSubtype HEBREW = mRichImm
    463                 .findSubtypeByLocaleAndKeyboardLayoutSet("iw", "hebrew");
    464         assertNotNull("Hebrew", HEBREW);
    465 
    466         for (final RichInputMethodSubtype subtype : mSubtypesList) {
    467             final InputMethodSubtype rawSubtype = subtype.getRawSubtype();
    468             final String subtypeName = SubtypeLocaleUtils
    469                     .getSubtypeDisplayNameInSystemLocale(rawSubtype);
    470             if (rawSubtype.equals(ARABIC) || rawSubtype.equals(FARSI)
    471                     || rawSubtype.equals(HEBREW)) {
    472                 assertTrue(subtypeName, subtype.isRtlSubtype());
    473             } else {
    474                 assertFalse(subtypeName, subtype.isRtlSubtype());
    475             }
    476         }
    477     }
    478 }
    479