1f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov/*
2f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov * Copyright (C) 2009 The Android Open Source Project
3f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov *
4f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License");
5f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov * you may not use this file except in compliance with the License.
6f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov * You may obtain a copy of the License at
7f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov *
8f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov *      http://www.apache.org/licenses/LICENSE-2.0
9f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov *
10f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov * Unless required by applicable law or agreed to in writing, software
11f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS,
12f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov * See the License for the specific language governing permissions and
14f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov * limitations under the License.
15f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov */
168920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens
17f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikovpackage com.android.providers.contacts;
18f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
19d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikovimport android.provider.ContactsContract.FullNameStyle;
20f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikovimport android.test.suitebuilder.annotation.SmallTest;
21f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
2238210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport junit.framework.TestCase;
2338210445730ee04c351c7cc1b3800cfe23e34325Makoto Onuki
24eb8d2387e312748e4f1d92e00b4dcc7eb8085e15Dmitri Plotnikovimport java.text.Collator;
25eb8d2387e312748e4f1d92e00b4dcc7eb8085e15Dmitri Plotnikovimport java.util.Arrays;
26f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikovimport java.util.Locale;
27f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
28f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov/**
29f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov * Unit tests for {@link NameLookupBuilder}.
308920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens *
318920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens * Run the test like this:
328920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens * <code>
338920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens * adb shell am instrument -e class com.android.providers.contacts.NameLookupBuilderTest -w \
348920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens *         com.android.providers.contacts.tests/android.test.InstrumentationTestRunner
358920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens * </code>
36f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov */
37f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov@SmallTest
38f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikovpublic class NameLookupBuilderTest extends TestCase {
39f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
40f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov    private static class TestNameLookupBuilder extends NameLookupBuilder {
41f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
42f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov        StringBuilder sb = new StringBuilder();
43f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
44f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov        public TestNameLookupBuilder(NameSplitter splitter) {
45f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov            super(splitter);
46f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov        }
47f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
48f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov        @Override
49f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov        protected String normalizeName(String name) {
50f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
51f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov            // TO make the test more readable, simply return the name unnormalized
52f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov            return name;
53f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov        }
54f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
55f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov        @Override
56f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov        protected String[] getCommonNicknameClusters(String normalizedName) {
57f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov            if (normalizedName.equals("Bill")) {
58f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                return new String[] {"*William"};
59f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov            } else if (normalizedName.equals("Al")) {
60f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                return new String[] {"*Alex", "*Alice"};
61f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov            }
62f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov            return null;
63f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov        }
64f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
65f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov        public String inserted() {
66f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov            return sb.toString();
67f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov        }
68f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
69f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov        @Override
70f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov        protected void insertNameLookup(long rawContactId, long dataId, int lookupType,
71f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                String string) {
72f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov            sb.append("(").append(lookupType).append(":").append(string).append(")");
73f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov        }
74f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov    }
75f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
76f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov    private TestNameLookupBuilder mBuilder;
77f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
78f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov    @Override
79f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov    protected void setUp() throws Exception {
80f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov        super.setUp();
81f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov        mBuilder = new TestNameLookupBuilder(
82f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                new NameSplitter("Mr", "", "", "", Locale.getDefault()));
83f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov    }
84f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
85f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov    public void testEmptyName() {
86d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikov        mBuilder.insertNameLookup(0, 0, "", FullNameStyle.UNDEFINED);
87f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov        assertEquals("", mBuilder.inserted());
88f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov    }
89f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
90f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov    public void testSingleUniqueName() {
91d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikov        mBuilder.insertNameLookup(0, 0, "Foo", FullNameStyle.UNDEFINED);
92f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov        assertEquals("(0:Foo)(2:Foo)", mBuilder.inserted());
93f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov    }
94f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
95f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov    public void testSingleUniqueNameWithPrefix() {
96d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikov        mBuilder.insertNameLookup(0, 0, "Mr. Foo", FullNameStyle.UNDEFINED);
97f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov        assertEquals("(0:Foo)(2:Foo)", mBuilder.inserted());
98f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov    }
99f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
100f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov    public void testTwoUniqueNames() {
101d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikov        mBuilder.insertNameLookup(0, 0, "Foo Bar", FullNameStyle.UNDEFINED);
102f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov        assertEquals("(0:Foo.Bar)(2:FooBar)(1:Bar.Foo)(2:BarFoo)", mBuilder.inserted());
103f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov    }
104f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
105f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov    public void testThreeUniqueNames() {
106d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikov        mBuilder.insertNameLookup(0, 0, "Foo Bar Baz", FullNameStyle.UNDEFINED);
107f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
108f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov        // All permutations
109f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov        assertEquals(
110f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(0:Foo.Bar.Baz)(2:FooBarBaz)" +
111f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Foo.Baz.Bar)(2:FooBazBar)" +
112f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
113f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Bar.Foo.Baz)(2:BarFooBaz)" +
114f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Bar.Baz.Foo)(2:BarBazFoo)" +
115f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
116f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Baz.Bar.Foo)(2:BazBarFoo)" +
117f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Baz.Foo.Bar)(2:BazFooBar)", mBuilder.inserted());
118f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov    }
119f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
120f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov    public void testFourUniqueNames() {
121d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikov        mBuilder.insertNameLookup(0, 0, "Foo Bar Baz Biz", FullNameStyle.UNDEFINED);
122f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
123f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov        // All permutations
124f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov        assertEquals(
125f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(0:Foo.Bar.Baz.Biz)(2:FooBarBazBiz)" +
126f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Foo.Bar.Biz.Baz)(2:FooBarBizBaz)" +
127f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Foo.Baz.Bar.Biz)(2:FooBazBarBiz)" +
128f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Foo.Baz.Biz.Bar)(2:FooBazBizBar)" +
129f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Foo.Biz.Baz.Bar)(2:FooBizBazBar)" +
130f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Foo.Biz.Bar.Baz)(2:FooBizBarBaz)" +
131f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
132f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Bar.Foo.Baz.Biz)(2:BarFooBazBiz)" +
133f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Bar.Foo.Biz.Baz)(2:BarFooBizBaz)" +
134f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Bar.Baz.Foo.Biz)(2:BarBazFooBiz)" +
135f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Bar.Baz.Biz.Foo)(2:BarBazBizFoo)" +
136f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Bar.Biz.Baz.Foo)(2:BarBizBazFoo)" +
137f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Bar.Biz.Foo.Baz)(2:BarBizFooBaz)" +
138f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
139f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Baz.Bar.Foo.Biz)(2:BazBarFooBiz)" +
140f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Baz.Bar.Biz.Foo)(2:BazBarBizFoo)" +
141f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Baz.Foo.Bar.Biz)(2:BazFooBarBiz)" +
142f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Baz.Foo.Biz.Bar)(2:BazFooBizBar)" +
143f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Baz.Biz.Foo.Bar)(2:BazBizFooBar)" +
144f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Baz.Biz.Bar.Foo)(2:BazBizBarFoo)" +
145f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
146f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Biz.Bar.Baz.Foo)(2:BizBarBazFoo)" +
147f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Biz.Bar.Foo.Baz)(2:BizBarFooBaz)" +
148f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Biz.Baz.Bar.Foo)(2:BizBazBarFoo)" +
149f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Biz.Baz.Foo.Bar)(2:BizBazFooBar)" +
150f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Biz.Foo.Baz.Bar)(2:BizFooBazBar)" +
151f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Biz.Foo.Bar.Baz)(2:BizFooBarBaz)", mBuilder.inserted());
152f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov    }
153f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
154f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov    public void testSingleNickname() {
155d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikov        mBuilder.insertNameLookup(0, 0, "Bill", FullNameStyle.UNDEFINED);
156f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov        assertEquals("(0:Bill)(2:Bill)(1:*William)", mBuilder.inserted());
157f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov    }
158f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
159f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov    public void testSingleNameWithTwoNicknames() {
160d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikov        mBuilder.insertNameLookup(0, 0, "Al", FullNameStyle.UNDEFINED);
161f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov        assertEquals("(0:Al)(2:Al)(1:*Alex)(1:*Alice)", mBuilder.inserted());
162f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov    }
163f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
164f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov    public void testTwoNamesOneOfWhichIsNickname() {
165d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikov        mBuilder.insertNameLookup(0, 0, "Foo Al", FullNameStyle.UNDEFINED);
166f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov        assertEquals(
167f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(0:Foo.Al)(2:FooAl)" +
168f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Al.Foo)(2:AlFoo)" +
169f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Foo.*Alex)(1:*Alex.Foo)" +
170f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Foo.*Alice)(1:*Alice.Foo)", mBuilder.inserted());
171f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov    }
172f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov
173f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov    public void testTwoNamesBothNickname() {
174d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikov        mBuilder.insertNameLookup(0, 0, "Bill Al", FullNameStyle.UNDEFINED);
175f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov        assertEquals(
176f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(0:Bill.Al)(2:BillAl)" +
177f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Al.Bill)(2:AlBill)" +
178f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:*William.Al)(1:Al.*William)" +
179f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:*William.*Alex)(1:*Alex.*William)" +
180f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:*William.*Alice)(1:*Alice.*William)" +
181f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Bill.*Alex)(1:*Alex.Bill)" +
182f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                "(1:Bill.*Alice)(1:*Alice.Bill)", mBuilder.inserted());
183f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov    }
184c91ffc49403818f280c382f01bbfd5cd9a9bca6bDmitri Plotnikov
185d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikov    public void testChineseName() {
186eb8d2387e312748e4f1d92e00b4dcc7eb8085e15Dmitri Plotnikov        // Only run this test when Chinese collation is supported
187eb8d2387e312748e4f1d92e00b4dcc7eb8085e15Dmitri Plotnikov        if (!Arrays.asList(Collator.getAvailableLocales()).contains(Locale.CHINA)) {
188eb8d2387e312748e4f1d92e00b4dcc7eb8085e15Dmitri Plotnikov            return;
189eb8d2387e312748e4f1d92e00b4dcc7eb8085e15Dmitri Plotnikov        }
190eb8d2387e312748e4f1d92e00b4dcc7eb8085e15Dmitri Plotnikov
191d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikov        mBuilder.insertNameLookup(0, 0, "\u695A\u8FAD", FullNameStyle.CHINESE);
192d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikov        assertEquals(
193d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikov                "(0:\u695A\u8FAD)" +
19492ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov                "(2:\u695A\u8FAD)",
19592ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov                mBuilder.inserted());
196d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikov    }
197d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikov
19856f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee    public void testKoreanName() {
19992ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov        // Only run this test when Korean collation is supported.
20056f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee        if (!Arrays.asList(Collator.getAvailableLocales()).contains(Locale.KOREA)) {
20156f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee            return;
20256f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee        }
20356f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee
20456f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee        // Lee Sang Il
20556f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee        mBuilder.insertNameLookup(0, 0, "\uC774\uC0C1\uC77C", FullNameStyle.KOREAN);
20656f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee        assertEquals(
20756f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee                "(0:\uC774\uC0C1\uC77C)" + // Lee Sang Il
20892ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov                "(2:\uC774\uC0C1\uC77C)",
20956f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee                mBuilder.inserted());
21056f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee    }
21156f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee
21256f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee    public void testKoreanNameWithTwoCharactersFamilyName() {
21356f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee        // Only run this test when Chinese collation is supported.
21456f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee        if (!Arrays.asList(Collator.getAvailableLocales()).contains(Locale.KOREA)) {
21556f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee            return;
21656f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee        }
21756f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee
21856f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee        // Sun Woo Young Nyeu
21956f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee        mBuilder.insertNameLookup(0, 0, "\uC120\uC6B0\uC6A9\uB140", FullNameStyle.KOREAN);
22056f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee        assertEquals(
22156f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee                "(0:\uC120\uC6B0\uC6A9\uB140)" + // Sun Woo Young Nyeu
22292ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov                "(2:\uC120\uC6B0\uC6A9\uB140)",  // Sun Woo Young Nyeu
22356f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee                mBuilder.inserted());
22456f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee    }
22556f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee
226c91ffc49403818f280c382f01bbfd5cd9a9bca6bDmitri Plotnikov    public void testMultiwordName() {
227d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikov        mBuilder.insertNameLookup(0, 0, "Jo Jeffrey John Jessy Longname", FullNameStyle.UNDEFINED);
228c91ffc49403818f280c382f01bbfd5cd9a9bca6bDmitri Plotnikov        String actual = mBuilder.inserted();
229339603c831c0f0440312c40bee7008bef93dac95Dmitri Plotnikov
230339603c831c0f0440312c40bee7008bef93dac95Dmitri Plotnikov        // Exact name
231339603c831c0f0440312c40bee7008bef93dac95Dmitri Plotnikov        assertTrue(actual.contains("(0:Jo.Jeffrey.John.Jessy.Longname)"));
232339603c831c0f0440312c40bee7008bef93dac95Dmitri Plotnikov
233339603c831c0f0440312c40bee7008bef93dac95Dmitri Plotnikov        // Full collation key
234339603c831c0f0440312c40bee7008bef93dac95Dmitri Plotnikov        assertTrue(actual.contains("(2:JoJeffreyJohnJessyLongname)"));
235339603c831c0f0440312c40bee7008bef93dac95Dmitri Plotnikov
236339603c831c0f0440312c40bee7008bef93dac95Dmitri Plotnikov        // Variant: four longest parts
237339603c831c0f0440312c40bee7008bef93dac95Dmitri Plotnikov        assertTrue(actual.contains("(1:Longname.Jeffrey.Jessy.John)"));
238339603c831c0f0440312c40bee7008bef93dac95Dmitri Plotnikov
239339603c831c0f0440312c40bee7008bef93dac95Dmitri Plotnikov        // All individual words
240339603c831c0f0440312c40bee7008bef93dac95Dmitri Plotnikov        assertTrue(actual.contains("(2:Jo"));
241339603c831c0f0440312c40bee7008bef93dac95Dmitri Plotnikov        assertTrue(actual.contains("(2:Jeffrey"));
242339603c831c0f0440312c40bee7008bef93dac95Dmitri Plotnikov        assertTrue(actual.contains("(2:John"));
243339603c831c0f0440312c40bee7008bef93dac95Dmitri Plotnikov        assertTrue(actual.contains("(2:Jessy"));
244339603c831c0f0440312c40bee7008bef93dac95Dmitri Plotnikov        assertTrue(actual.contains("(2:Longname"));
245c91ffc49403818f280c382f01bbfd5cd9a9bca6bDmitri Plotnikov    }
246f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov}
247