Home | History | Annotate | Download | only in contacts
      1 /*
      2  * Copyright (C) 2010 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.providers.contacts;
     18 
     19 import android.provider.ContactsContract.FullNameStyle;
     20 import android.test.AndroidTestCase;
     21 import android.test.suitebuilder.annotation.SmallTest;
     22 
     23 import java.text.Collator;
     24 import java.util.Arrays;
     25 import java.util.HashSet;
     26 import java.util.Iterator;
     27 import java.util.Locale;
     28 
     29 @SmallTest
     30 public class ContactLocaleUtilsTest extends AndroidTestCase {
     31     private static final String LATIN_NAME = "John Smith";
     32     private static final String CHINESE_NAME = "\u675C\u9D51";
     33     private static final String CHINESE_LATIN_MIX_NAME_1 = "D\u675C\u9D51";
     34     private static final String CHINESE_LATIN_MIX_NAME_2 = "MARY \u675C\u9D51";
     35     private static final String[] CHINESE_NAME_KEY = {"\u9D51", "\u675C\u9D51", "JUAN", "DUJUAN",
     36             "J", "DJ"};
     37     private static final String[] CHINESE_LATIN_MIX_NAME_1_KEY = {"\u9D51", "\u675C\u9D51",
     38         "D \u675C\u9D51", "JUAN", "DUJUAN", "J", "DJ", "D DUJUAN", "DDJ"};
     39     private static final String[] CHINESE_LATIN_MIX_NAME_2_KEY = {"\u9D51", "\u675C\u9D51",
     40         "MARY \u675C\u9D51", "JUAN", "DUJUAN", "MARY DUJUAN", "J", "DJ", "MDJ"};
     41     private static final String[] LATIN_NAME_KEY = {"John Smith", "Smith", "JS", "S"};
     42 
     43 
     44     private ContactLocaleUtils mContactLocaleUtils = ContactLocaleUtils.getIntance();
     45 
     46     public void testContactLocaleUtilsBase() throws Exception {
     47         assertEquals(mContactLocaleUtils.getSortKey(LATIN_NAME, FullNameStyle.UNDEFINED),
     48                 LATIN_NAME);
     49         assertNull(mContactLocaleUtils.getNameLookupKeys(LATIN_NAME,
     50                 FullNameStyle.UNDEFINED));
     51     }
     52 
     53     public void testChineseContactLocaleUtils() throws Exception {
     54         if (!hasChineseCollator()) {
     55             return;
     56         }
     57 
     58         assertTrue(mContactLocaleUtils.getSortKey(CHINESE_NAME,
     59                 FullNameStyle.CHINESE).equalsIgnoreCase("DU \u675C JUAN \u9D51"));
     60 
     61         assertTrue(mContactLocaleUtils.getSortKey(CHINESE_LATIN_MIX_NAME_1,
     62                 FullNameStyle.CHINESE).equalsIgnoreCase("d DU \u675C JUAN \u9D51"));
     63 
     64         assertTrue(mContactLocaleUtils.getSortKey(CHINESE_LATIN_MIX_NAME_2,
     65                 FullNameStyle.CHINESE).equalsIgnoreCase("mary DU \u675C JUAN \u9D51"));
     66 
     67         Iterator<String> keys = mContactLocaleUtils.getNameLookupKeys(CHINESE_NAME,
     68                 FullNameStyle.CHINESE);
     69         verifyKeys(keys, CHINESE_NAME_KEY);
     70 
     71         keys = mContactLocaleUtils.getNameLookupKeys(CHINESE_LATIN_MIX_NAME_1,
     72                 FullNameStyle.CHINESE);
     73         verifyKeys(keys, CHINESE_LATIN_MIX_NAME_1_KEY);
     74 
     75         keys = mContactLocaleUtils.getNameLookupKeys(CHINESE_LATIN_MIX_NAME_2,
     76                 FullNameStyle.CHINESE);
     77         verifyKeys(keys, CHINESE_LATIN_MIX_NAME_2_KEY);
     78     }
     79 
     80     public void testChineseStyleNameWithDifferentLocale() throws Exception {
     81         if (!hasChineseCollator()) {
     82             return;
     83         }
     84         mContactLocaleUtils.setLocale(Locale.ENGLISH);
     85         assertEquals("DU \u675C JUAN \u9D51",
     86                 mContactLocaleUtils.getSortKey(CHINESE_NAME, FullNameStyle.CHINESE).toUpperCase());
     87         assertEquals("DU \u675C JUAN \u9D51",
     88                 mContactLocaleUtils.getSortKey(CHINESE_NAME, FullNameStyle.CJK).toUpperCase());
     89         mContactLocaleUtils.setLocale(Locale.CHINESE);
     90         assertEquals("DU \u675C JUAN \u9D51",
     91                 mContactLocaleUtils.getSortKey(CHINESE_NAME, FullNameStyle.CHINESE).toUpperCase());
     92         assertEquals("DU \u675C JUAN \u9D51",
     93                 mContactLocaleUtils.getSortKey(CHINESE_NAME, FullNameStyle.CJK).toUpperCase());
     94         assertEquals(LATIN_NAME, mContactLocaleUtils.getSortKey(LATIN_NAME, FullNameStyle.WESTERN));
     95 
     96         mContactLocaleUtils.setLocale(Locale.ENGLISH);
     97         Iterator<String> keys = mContactLocaleUtils.getNameLookupKeys(CHINESE_NAME,
     98                 FullNameStyle.CHINESE);
     99         verifyKeys(keys, CHINESE_NAME_KEY);
    100         keys = mContactLocaleUtils.getNameLookupKeys(CHINESE_NAME, FullNameStyle.CJK);
    101         verifyKeys(keys, CHINESE_NAME_KEY);
    102         mContactLocaleUtils.setLocale(Locale.CHINESE);
    103         keys = mContactLocaleUtils.getNameLookupKeys(CHINESE_NAME, FullNameStyle.CJK);
    104         verifyKeys(keys, CHINESE_NAME_KEY);
    105         keys = mContactLocaleUtils.getNameLookupKeys(LATIN_NAME, FullNameStyle.WESTERN);
    106         verifyKeys(keys, LATIN_NAME_KEY);
    107 
    108     }
    109 
    110     private void verifyKeys(final Iterator<String> resultKeys, final String[] expectedKeys)
    111             throws Exception {
    112         HashSet<String> allKeys = new HashSet<String>();
    113         while (resultKeys.hasNext()) {
    114             allKeys.add(resultKeys.next());
    115         }
    116         assertEquals(allKeys, new HashSet<String>(Arrays.asList(expectedKeys)));
    117     }
    118 
    119     private boolean hasChineseCollator() {
    120         final Locale locale[] = Collator.getAvailableLocales();
    121         for (int i = 0; i < locale.length; i++) {
    122             if (locale[i].equals(Locale.CHINA)) {
    123                 return true;
    124             }
    125         }
    126         return false;
    127     }
    128 }
    129