14b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki/* 24b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki * Copyright (C) 2016 The Android Open Source Project 34b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki * 44b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki * Licensed under the Apache License, Version 2.0 (the "License"); 54b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki * you may not use this file except in compliance with the License. 64b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki * You may obtain a copy of the License at 74b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki * 84b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki * http://www.apache.org/licenses/LICENSE-2.0 94b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki * 104b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki * Unless required by applicable law or agreed to in writing, software 114b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki * distributed under the License is distributed on an "AS IS" BASIS, 124b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki * See the License for the specific language governing permissions and 144b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki * limitations under the License. 154b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki */ 164b0653168fa54d3744585c031e609330cd15d2f1Makoto Onukipackage com.android.providers.contacts; 174b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki 184b0653168fa54d3744585c031e609330cd15d2f1Makoto Onukiimport android.icu.text.AlphabeticIndex; 194b0653168fa54d3744585c031e609330cd15d2f1Makoto Onukiimport android.icu.text.AlphabeticIndex.ImmutableIndex; 204b0653168fa54d3744585c031e609330cd15d2f1Makoto Onukiimport android.test.AndroidTestCase; 214b0653168fa54d3744585c031e609330cd15d2f1Makoto Onukiimport android.test.suitebuilder.annotation.Suppress; 224b0653168fa54d3744585c031e609330cd15d2f1Makoto Onukiimport android.util.Log; 234b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki 244b0653168fa54d3744585c031e609330cd15d2f1Makoto Onukiimport java.util.Arrays; 254b0653168fa54d3744585c031e609330cd15d2f1Makoto Onukiimport java.util.Locale; 264b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki 274b0653168fa54d3744585c031e609330cd15d2f1Makoto Onukipublic class ContactsIcuTest extends AndroidTestCase { 284b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki private static final String TAG = "ContactsIcuTest"; 294b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki 304b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki private static ImmutableIndex buildIndex(String... localeTags) { 314b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki final AlphabeticIndex ai = new AlphabeticIndex(Locale.forLanguageTag(localeTags[0])); 324b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki 334b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki // Add secondary locales, if any. 344b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki for (int i = 1; i < localeTags.length; i++) { 354b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki ai.addLabels(Locale.forLanguageTag(localeTags[i])); 364b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki } 374b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki 384b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki final ImmutableIndex index = ai.buildImmutableIndex(); 394b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki 404b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki Log.d(TAG, "Locales=" + Arrays.asList(localeTags)); 414b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki ContactLocaleUtils.dumpIndex(index); 424b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki 434b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki return index; 444b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki } 454b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki 464b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki private static String getBucket(ImmutableIndex index, String name) { 474b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki return index.getBucket(index.getBucketIndex(name)).getLabel(); 484b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki } 494b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki 504b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki private static boolean checkBucket(ImmutableIndex index, String expectedBucket, String str) { 514b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki 524b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki boolean okay = true; 534b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki 544b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki // Test each unicode character in the given string. 554b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki final int length = str.length(); 564b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki int offset = 0; 574b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki while (offset < length) { 584b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki final int codePoint = Character.codePointAt(str, offset); 594b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki 604b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki final String ch = new String(new int[]{codePoint}, 0, 1); 614b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki 624b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki final String actual = getBucket(index, ch); 634b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki 644b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki if (!expectedBucket.equals(actual)) { 654b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki Log.e(TAG, "Bucket for '" + ch + "' expected to be '" 664b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki + expectedBucket + "', but was '" + actual + "'"); 674b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki okay = false; 684b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki } 694b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki 704b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki offset += Character.charCount(codePoint); 714b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki } 724b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki 734b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki return okay; 744b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki } 754b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki 764b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki @Suppress // This test doesn't pass since android's ICU data doesn't cover rarely used chars. 774b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki public void testTraditionalChineseStrokeCounts() { 784b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki final ImmutableIndex index = buildIndex("zh-Hant-TW"); 794b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki 804b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki boolean okay = true; 814b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki // Data generated from: https://en.wiktionary.org/wiki/Index:Chinese_total_strokes 824b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki okay &= checkBucket(index, "1劃", "一丨丶丿乀乁乙乚乛亅"); 834b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki okay &= checkBucket(index, "2劃", "㐅丁丂七丄丅丆丩丷乂乃乄乜九了二亠人亻儿入八冂冖冫几"); 844b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki okay &= checkBucket(index, "3劃", "㐃㐄㐇㐈㐉㔾㔿万丈三上下丌个丫丸久乆乇么义乊乞也习乡"); 854b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki okay &= checkBucket(index, "4劃", "㐊㐋㐧㓀㓁㓅㔫㔹㕕㕚㕛㝉㞢㠪㢧㲸㸦不"); 864b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki okay &= checkBucket(index, "5劃", "㐀㐌㐍㐎㐏㐰㐱㐲㐳㐴㐵㐶㐷㒰㒱㓚㓛㓜"); 874b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki okay &= checkBucket(index, "10劃", "㑣㑥㑦㑧㑨㑩㑪㑫㑬㑭㒭㓐㓑㓒"); 884b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki okay &= checkBucket(index, "20劃", "㒤㒥㒦㒹㔒㘓㘔㘥㚀㜶㜷㜸㠤"); 894b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki okay &= checkBucket(index, "39劃", "靐"); 904b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki okay &= checkBucket(index, "48劃", "龘"); 914b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki 924b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki assertTrue("Some tests failed. See logcat for details", okay); 934b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki 944b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki /* 954b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiD ContactsIcuTest: Locales=[zh-Hant-TW] 964b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiD ContactLocale: Labels=[…,1劃,2劃,3劃,4劃,5劃,6劃,7劃,8劃,9劃,10劃,11劃,12劃,13劃,14劃,15劃,16劃,17劃,18劃,19劃,20劃,21劃,22劃,23劃,24劃,25劃,26劃,27劃,28劃,29劃,30劃,31劃,32劃,33劃,35劃,36劃,39劃,48劃,…] 974b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㐅' expected to be '2劃', but was '48劃' 984b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㐃' expected to be '3劃', but was '48劃' 994b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㐇' expected to be '3劃', but was '48劃' 1004b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㐈' expected to be '3劃', but was '48劃' 1014b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㐉' expected to be '3劃', but was '48劃' 1024b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㔿' expected to be '3劃', but was '48劃' 1034b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㐊' expected to be '4劃', but was '48劃' 1044b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㐋' expected to be '4劃', but was '48劃' 1054b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㐧' expected to be '4劃', but was '48劃' 1064b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㓀' expected to be '4劃', but was '48劃' 1074b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㓅' expected to be '4劃', but was '48劃' 1084b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㕕' expected to be '4劃', but was '48劃' 1094b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㕚' expected to be '4劃', but was '48劃' 1104b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㕛' expected to be '4劃', but was '48劃' 1114b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㝉' expected to be '4劃', but was '48劃' 1124b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㞢' expected to be '4劃', but was '48劃' 1134b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㠪' expected to be '4劃', but was '48劃' 1144b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㢧' expected to be '4劃', but was '48劃' 1154b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㲸' expected to be '4劃', but was '48劃' 1164b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㐌' expected to be '5劃', but was '48劃' 1174b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㐍' expected to be '5劃', but was '48劃' 1184b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㐎' expected to be '5劃', but was '48劃' 1194b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㐏' expected to be '5劃', but was '48劃' 1204b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㒱' expected to be '5劃', but was '48劃' 1214b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㓚' expected to be '5劃', but was '48劃' 1224b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㓛' expected to be '5劃', but was '48劃' 1234b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㓜' expected to be '5劃', but was '48劃' 1244b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㑣' expected to be '10劃', but was '48劃' 1254b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㑧' expected to be '10劃', but was '48劃' 1264b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㑨' expected to be '10劃', but was '48劃' 1274b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㑩' expected to be '10劃', but was '48劃' 1284b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㑪' expected to be '10劃', but was '48劃' 1294b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㑫' expected to be '10劃', but was '48劃' 1304b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㑬' expected to be '10劃', but was '48劃' 1314b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㑭' expected to be '10劃', but was '48劃' 1324b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㒭' expected to be '10劃', but was '48劃' 1334b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㓐' expected to be '10劃', but was '48劃' 1344b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㓑' expected to be '10劃', but was '48劃' 1354b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㓒' expected to be '10劃', but was '48劃' 1364b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㒤' expected to be '20劃', but was '48劃' 1374b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㒦' expected to be '20劃', but was '48劃' 1384b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㒹' expected to be '20劃', but was '48劃' 1394b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㔒' expected to be '20劃', but was '48劃' 1404b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㘓' expected to be '20劃', but was '48劃' 1414b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㘔' expected to be '20劃', but was '48劃' 1424b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㚀' expected to be '20劃', but was '48劃' 1434b0653168fa54d3744585c031e609330cd15d2f1Makoto OnukiE ContactsIcuTest: Bucket for '㠤' expected to be '20劃', but was '48劃' 1444b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki */ 1454b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki } 1464b0653168fa54d3744585c031e609330cd15d2f1Makoto Onuki} 147