SpellCheckerSubtypeTest.java revision 658c29e86ef7c2d4c3a3fa8ebad5726d692e7c68
1/* 2 * Copyright (C) 2015 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 17package android.view.textservice; 18 19import android.os.Parcel; 20import android.test.InstrumentationTestCase; 21import android.test.suitebuilder.annotation.SmallTest; 22 23import java.util.Arrays; 24import java.util.Locale; 25 26import static android.test.MoreAsserts.assertNotEqual; 27 28/** 29 * TODO: Most of part can be, and probably should be, moved to CTS. 30 */ 31public class SpellCheckerSubtypeTest extends InstrumentationTestCase { 32 private static final String SUBTYPE_SUBTYPE_LOCALE_STRING_A = "en_GB"; 33 private static final int SUBTYPE_NAME_RES_ID_A = 0x12345; 34 private static final String SUBTYPE_EXTRA_VALUE_A = "Key1=Value1,Key2=Value2"; 35 private static final String SUBTYPE_SUBTYPE_LOCALE_STRING_B = "en_IN"; 36 private static final int SUBTYPE_NAME_RES_ID_B = 0x54321; 37 private static final String SUBTYPE_EXTRA_VALUE_B = "Key3=Value3,Key4=Value4"; 38 39 private static int defaultHashCodeAlgorithm(String locale, String extraValue) { 40 return Arrays.hashCode(new Object[] {locale, extraValue}); 41 } 42 43 private static final SpellCheckerSubtype cloneViaParcel(final SpellCheckerSubtype original) { 44 Parcel parcel = null; 45 try { 46 parcel = Parcel.obtain(); 47 original.writeToParcel(parcel, 0); 48 parcel.setDataPosition(0); 49 return SpellCheckerSubtype.CREATOR.createFromParcel(parcel); 50 } finally { 51 if (parcel != null) { 52 parcel.recycle(); 53 } 54 } 55 } 56 57 @SmallTest 58 public void testSubtype() throws Exception { 59 final SpellCheckerSubtype subtype = new SpellCheckerSubtype(SUBTYPE_NAME_RES_ID_A, 60 SUBTYPE_SUBTYPE_LOCALE_STRING_A, SUBTYPE_EXTRA_VALUE_A); 61 62 assertEquals(SUBTYPE_NAME_RES_ID_A, subtype.getNameResId()); 63 assertEquals(SUBTYPE_SUBTYPE_LOCALE_STRING_A, subtype.getLocale()); 64 assertEquals("Value1", subtype.getExtraValueOf("Key1")); 65 assertEquals("Value2", subtype.getExtraValueOf("Key2")); 66 // Historically we have used SpellCheckerSubtype#hashCode() to track which subtype is 67 // enabled, and it is supposed to be stored in SecureSettings. Therefore we have to 68 // keep using the same algorithm for compatibility reasons. 69 assertEquals( 70 defaultHashCodeAlgorithm(SUBTYPE_SUBTYPE_LOCALE_STRING_A, SUBTYPE_EXTRA_VALUE_A), 71 subtype.hashCode()); 72 73 final SpellCheckerSubtype clonedSubtype = cloneViaParcel(subtype); 74 assertEquals(SUBTYPE_NAME_RES_ID_A, clonedSubtype.getNameResId()); 75 assertEquals(SUBTYPE_SUBTYPE_LOCALE_STRING_A, clonedSubtype.getLocale()); 76 assertEquals("Value1", clonedSubtype.getExtraValueOf("Key1")); 77 assertEquals("Value2", clonedSubtype.getExtraValueOf("Key2")); 78 assertEquals( 79 defaultHashCodeAlgorithm(SUBTYPE_SUBTYPE_LOCALE_STRING_A, SUBTYPE_EXTRA_VALUE_A), 80 clonedSubtype.hashCode()); 81 } 82 83 @SmallTest 84 public void testGetLocaleObject() throws Exception { 85 assertEquals(new Locale("en"), new SpellCheckerSubtype( 86 SUBTYPE_NAME_RES_ID_A, "en", SUBTYPE_EXTRA_VALUE_A).getLocaleObject()); 87 assertEquals(new Locale("en", "US"), new SpellCheckerSubtype( 88 SUBTYPE_NAME_RES_ID_A, "en_US", SUBTYPE_EXTRA_VALUE_A).getLocaleObject()); 89 assertEquals(new Locale("en", "US", "POSIX"), new SpellCheckerSubtype( 90 SUBTYPE_NAME_RES_ID_A, "en_US_POSIX", SUBTYPE_EXTRA_VALUE_A).getLocaleObject()); 91 92 // Special rewrite rule for "tl" was not yet supported in spell checker. 93 // TODO: Match the behavior to InputMethodSubtype. 94 assertEquals(new Locale("tl"), new SpellCheckerSubtype( 95 SUBTYPE_NAME_RES_ID_A, "tl", SUBTYPE_EXTRA_VALUE_A).getLocaleObject()); 96 assertEquals(new Locale("tl", "PH"), new SpellCheckerSubtype( 97 SUBTYPE_NAME_RES_ID_A, "tl_PH", SUBTYPE_EXTRA_VALUE_A).getLocaleObject()); 98 assertEquals(new Locale("tl", "PH", "POSIX"), new SpellCheckerSubtype( 99 SUBTYPE_NAME_RES_ID_A, "tl_PH_POSIX", SUBTYPE_EXTRA_VALUE_A).getLocaleObject()); 100 101 // So far rejecting invalid/unexpected locale strings is out of the scope. 102 assertEquals(new Locale("a"), new SpellCheckerSubtype( 103 SUBTYPE_NAME_RES_ID_A, "a", SUBTYPE_EXTRA_VALUE_A).getLocaleObject()); 104 assertEquals(new Locale("a b c"), new SpellCheckerSubtype( 105 SUBTYPE_NAME_RES_ID_A, "a b c", SUBTYPE_EXTRA_VALUE_A).getLocaleObject()); 106 assertEquals(new Locale("en-US"), new SpellCheckerSubtype( 107 SUBTYPE_NAME_RES_ID_A, "en-US", SUBTYPE_EXTRA_VALUE_A).getLocaleObject()); 108 } 109 110 @SmallTest 111 public void testEquality() throws Exception { 112 assertEquals( 113 new SpellCheckerSubtype(SUBTYPE_NAME_RES_ID_A, SUBTYPE_SUBTYPE_LOCALE_STRING_A, 114 SUBTYPE_EXTRA_VALUE_A), 115 new SpellCheckerSubtype(SUBTYPE_NAME_RES_ID_A, SUBTYPE_SUBTYPE_LOCALE_STRING_A, 116 SUBTYPE_EXTRA_VALUE_A)); 117 assertNotEqual( 118 new SpellCheckerSubtype(SUBTYPE_NAME_RES_ID_A, SUBTYPE_SUBTYPE_LOCALE_STRING_A, 119 SUBTYPE_EXTRA_VALUE_A), 120 new SpellCheckerSubtype(SUBTYPE_NAME_RES_ID_B, SUBTYPE_SUBTYPE_LOCALE_STRING_B, 121 SUBTYPE_EXTRA_VALUE_A)); 122 assertNotEqual( 123 new SpellCheckerSubtype(SUBTYPE_NAME_RES_ID_A, SUBTYPE_SUBTYPE_LOCALE_STRING_A, 124 SUBTYPE_EXTRA_VALUE_A), 125 new SpellCheckerSubtype(SUBTYPE_NAME_RES_ID_A, SUBTYPE_SUBTYPE_LOCALE_STRING_B, 126 SUBTYPE_EXTRA_VALUE_A)); 127 assertNotEqual( 128 new SpellCheckerSubtype(SUBTYPE_NAME_RES_ID_A, SUBTYPE_SUBTYPE_LOCALE_STRING_A, 129 SUBTYPE_EXTRA_VALUE_A), 130 new SpellCheckerSubtype(SUBTYPE_NAME_RES_ID_A, SUBTYPE_SUBTYPE_LOCALE_STRING_A, 131 SUBTYPE_EXTRA_VALUE_B)); 132 } 133} 134