1package com.android.contacts.common;
2
3import android.provider.ContactsContract.CommonDataKinds.Phone;
4import android.test.suitebuilder.annotation.SmallTest;
5
6import junit.framework.TestCase;
7
8/**
9 * Tests for MoreContactsUtils.
10 */
11@SmallTest
12public class MoreContactUtilsTest extends TestCase {
13
14    public void testShouldCollapse() throws Exception {
15        assertCollapses("1", true, null, null, null, null);
16        assertCollapses("2", true, "a", "b", "a", "b");
17
18        assertCollapses("11", false, "a", null, null, null);
19        assertCollapses("12", false, null, "a", null, null);
20        assertCollapses("13", false, null, null, "a", null);
21        assertCollapses("14", false, null, null, null, "a");
22
23        assertCollapses("21", false, "a", "b", null, null);
24        assertCollapses("22", false, "a", "b", "a", null);
25        assertCollapses("23", false, "a", "b", null, "b");
26        assertCollapses("24", false, "a", "b", "a", "x");
27        assertCollapses("25", false, "a", "b", "x", "b");
28
29        assertCollapses("31", false, null, null, "a", "b");
30        assertCollapses("32", false, "a", null, "a", "b");
31        assertCollapses("33", false, null, "b", "a", "b");
32        assertCollapses("34", false, "a", "x", "a", "b");
33        assertCollapses("35", false, "x", "b", "a", "b");
34
35        assertCollapses("41", true, Phone.CONTENT_ITEM_TYPE, null, Phone.CONTENT_ITEM_TYPE, null);
36        assertCollapses("42", true, Phone.CONTENT_ITEM_TYPE, "1", Phone.CONTENT_ITEM_TYPE, "1");
37
38        assertCollapses("51", false, Phone.CONTENT_ITEM_TYPE, "1", Phone.CONTENT_ITEM_TYPE, "2");
39        assertCollapses("52", false, Phone.CONTENT_ITEM_TYPE, "1", Phone.CONTENT_ITEM_TYPE, null);
40        assertCollapses("53", false, Phone.CONTENT_ITEM_TYPE, null, Phone.CONTENT_ITEM_TYPE, "2");
41
42        // Test phone numbers
43        assertCollapses("60", true, Phone.CONTENT_ITEM_TYPE, "1234567", Phone.CONTENT_ITEM_TYPE,
44                "1234567");
45        assertCollapses("61", false, Phone.CONTENT_ITEM_TYPE, "1234567", Phone.CONTENT_ITEM_TYPE,
46                "1234568");
47        assertCollapses("62", true, Phone.CONTENT_ITEM_TYPE, "1234567;0", Phone.CONTENT_ITEM_TYPE,
48                "1234567;0");
49        assertCollapses("63", false, Phone.CONTENT_ITEM_TYPE, "1234567;89321",
50                Phone.CONTENT_ITEM_TYPE, "1234567;89322");
51        assertCollapses("64", true, Phone.CONTENT_ITEM_TYPE, "1234567;89321",
52                Phone.CONTENT_ITEM_TYPE, "1234567;89321");
53        assertCollapses("65", false, Phone.CONTENT_ITEM_TYPE, "1234567;0111111111",
54                Phone.CONTENT_ITEM_TYPE, "1234567;");
55        assertCollapses("66", false, Phone.CONTENT_ITEM_TYPE, "12345675426;91970xxxxx",
56                Phone.CONTENT_ITEM_TYPE, "12345675426");
57        assertCollapses("67", false, Phone.CONTENT_ITEM_TYPE, "12345675426;23456xxxxx",
58                Phone.CONTENT_ITEM_TYPE, "12345675426;234567xxxx");
59        assertCollapses("68", true, Phone.CONTENT_ITEM_TYPE, "1234567;1234567;1234567",
60                Phone.CONTENT_ITEM_TYPE, "1234567;1234567;1234567");
61        assertCollapses("69", false, Phone.CONTENT_ITEM_TYPE, "1234567;1234567;1234567",
62                Phone.CONTENT_ITEM_TYPE, "1234567;1234567");
63
64        // test some numbers with country and area code
65        assertCollapses("70", true, Phone.CONTENT_ITEM_TYPE, "+49 (89) 12345678",
66                Phone.CONTENT_ITEM_TYPE, "+49 (89) 12345678");
67        assertCollapses("71", true, Phone.CONTENT_ITEM_TYPE, "+49 (89) 12345678",
68                Phone.CONTENT_ITEM_TYPE, "+49 (89)12345678");
69        assertCollapses("72", true, Phone.CONTENT_ITEM_TYPE, "+49 (8092) 1234",
70                Phone.CONTENT_ITEM_TYPE, "+49 (8092)1234");
71        assertCollapses("73", false, Phone.CONTENT_ITEM_TYPE, "0049 (8092) 1234",
72                Phone.CONTENT_ITEM_TYPE, "+49/80921234");
73        assertCollapses("74", false, Phone.CONTENT_ITEM_TYPE, "+49 (89) 12345678",
74                Phone.CONTENT_ITEM_TYPE, "+49 (89) 12345679");
75
76        // test special handling of collapsing country code for NANP region only
77        // This is non symmetrical, because we prefer the number with the +1.
78        assertEquals("100", true, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE,
79                "+1 (415) 555-1212", Phone.CONTENT_ITEM_TYPE, "(415) 555-1212"));
80        assertEquals("101", true, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE,
81                "+14155551212", Phone.CONTENT_ITEM_TYPE, "4155551212"));
82        assertEquals("102", false, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE,
83                "(415) 555-1212", Phone.CONTENT_ITEM_TYPE, "+1 (415) 555-1212"));
84        assertEquals("103", false, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE,
85                "4155551212", Phone.CONTENT_ITEM_TYPE, "+14155551212"));
86        // Require explicit +1 country code declaration to collapse
87        assertEquals("104", false, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE,
88                "1-415-555-1212", Phone.CONTENT_ITEM_TYPE, "415-555-1212"));
89        assertEquals("105", false, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE,
90                "14155551212", Phone.CONTENT_ITEM_TYPE, "4155551212"));
91        assertEquals("106", false, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE,
92                "+1 (415) 555-1212", Phone.CONTENT_ITEM_TYPE, " 1 (415) 555-1212"));
93        assertEquals("107", false, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE,
94                "+14155551212", Phone.CONTENT_ITEM_TYPE, " 14155551212"));
95        assertEquals("108", false, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE,
96                "1 (415) 555-1212", Phone.CONTENT_ITEM_TYPE, "+1 (415) 555-1212"));
97        assertEquals("109", false, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE,
98                "14155551212", Phone.CONTENT_ITEM_TYPE, "+14155551212"));
99
100        // test some numbers with wait symbol and area code
101        assertCollapses("200", true, Phone.CONTENT_ITEM_TYPE, "+49 (8092) 1234;89321",
102                Phone.CONTENT_ITEM_TYPE, "+49/80921234;89321");
103        assertCollapses("201", false, Phone.CONTENT_ITEM_TYPE, "+49 (8092) 1234;89321",
104                Phone.CONTENT_ITEM_TYPE, "+49/80921235;89321");
105        assertCollapses("202", false, Phone.CONTENT_ITEM_TYPE, "+49 (8092) 1234;89322",
106                Phone.CONTENT_ITEM_TYPE, "+49/80921234;89321");
107        assertCollapses("203", true, Phone.CONTENT_ITEM_TYPE, "1234567;+49 (8092) 1234",
108                Phone.CONTENT_ITEM_TYPE, "1234567;+49/80921234");
109
110        assertCollapses("300", true, Phone.CONTENT_ITEM_TYPE, "", Phone.CONTENT_ITEM_TYPE, "");
111
112        assertCollapses("301", false, Phone.CONTENT_ITEM_TYPE, "1", Phone.CONTENT_ITEM_TYPE, "");
113
114        assertCollapses("302", false, Phone.CONTENT_ITEM_TYPE, "", Phone.CONTENT_ITEM_TYPE, "1");
115
116        assertCollapses("303", true, Phone.CONTENT_ITEM_TYPE, "---", Phone.CONTENT_ITEM_TYPE, "---");
117
118        assertCollapses("304", false, Phone.CONTENT_ITEM_TYPE, "1-/().", Phone.CONTENT_ITEM_TYPE,
119                "--$%1");
120
121        // Test numbers using keypad letters. This is non-symmetrical, because we prefer
122        // the version with letters.
123        assertEquals("400", true, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE,
124                "abcdefghijklmnopqrstuvwxyz", Phone.CONTENT_ITEM_TYPE,
125                "22233344455566677778889999"));
126        assertEquals("401", false, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE,
127                "22233344455566677778889999", Phone.CONTENT_ITEM_TYPE,
128                "abcdefghijklmnopqrstuvwxyz"));
129
130        assertCollapses("402", false, Phone.CONTENT_ITEM_TYPE, "1;2", Phone.CONTENT_ITEM_TYPE,
131                "12");
132
133        assertCollapses("403", false, Phone.CONTENT_ITEM_TYPE, "1,2", Phone.CONTENT_ITEM_TYPE,
134                "12");
135    }
136
137    public void testShouldCollapse_collapsesSameNumberWithDifferentFormats() {
138        assertEquals("1", true, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE,
139                "555-1212", Phone.CONTENT_ITEM_TYPE, "5551212"));
140        assertEquals("1", true, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE,
141                "415-555-1212", Phone.CONTENT_ITEM_TYPE, "(415) 555-1212"));
142        assertEquals("2", true, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE,
143                "4155551212", Phone.CONTENT_ITEM_TYPE, "(415) 555-1212"));
144        assertEquals("3", true, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE,
145                "1-415-555-1212", Phone.CONTENT_ITEM_TYPE, "1 (415) 555-1212"));
146        assertEquals("4", true, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE,
147                "14155551212", Phone.CONTENT_ITEM_TYPE, "1 (415) 555-1212"));
148    }
149
150    private void assertCollapses(String message, boolean expected, CharSequence mimetype1,
151            CharSequence data1, CharSequence mimetype2, CharSequence data2) {
152        assertEquals(message, expected, MoreContactUtils.shouldCollapse(mimetype1, data1, mimetype2,
153                data2));
154        assertEquals(message, expected, MoreContactUtils.shouldCollapse(mimetype2, data2, mimetype1,
155                data1));
156
157        // If data1 and data2 are the same instance, make sure the same test passes with different
158        // instances.
159        if (data1 == data2 && data1 != null) {
160            // Create a different instance
161            final CharSequence data2_newref = new StringBuilder(data2).append("").toString();
162
163            if (data1 == data2_newref) {
164                // In some cases no matter what we do the runtime reuses the same instance, so
165                // we can't do the "different instance" test.
166                return;
167            }
168
169            // we have two different instances, now make sure we get the same result as before
170            assertEquals(message, expected, MoreContactUtils.shouldCollapse(mimetype1, data1,
171                    mimetype2, data2_newref));
172            assertEquals(message, expected, MoreContactUtils.shouldCollapse(mimetype2, data2_newref,
173                    mimetype1, data1));
174        }
175    }
176}
177