1 package com.android.contacts.common; 2 3 import android.provider.ContactsContract.CommonDataKinds.Phone; 4 import android.test.suitebuilder.annotation.SmallTest; 5 6 import junit.framework.TestCase; 7 8 /** 9 * Tests for MoreContactsUtils. 10 */ 11 @SmallTest 12 public 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