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