package com.android.contacts.common; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.test.suitebuilder.annotation.SmallTest; import junit.framework.TestCase; /** * Tests for MoreContactsUtils. */ @SmallTest public class MoreContactUtilsTest extends TestCase { public void testShouldCollapse() throws Exception { assertCollapses("1", true, null, null, null, null); assertCollapses("2", true, "a", "b", "a", "b"); assertCollapses("11", false, "a", null, null, null); assertCollapses("12", false, null, "a", null, null); assertCollapses("13", false, null, null, "a", null); assertCollapses("14", false, null, null, null, "a"); assertCollapses("21", false, "a", "b", null, null); assertCollapses("22", false, "a", "b", "a", null); assertCollapses("23", false, "a", "b", null, "b"); assertCollapses("24", false, "a", "b", "a", "x"); assertCollapses("25", false, "a", "b", "x", "b"); assertCollapses("31", false, null, null, "a", "b"); assertCollapses("32", false, "a", null, "a", "b"); assertCollapses("33", false, null, "b", "a", "b"); assertCollapses("34", false, "a", "x", "a", "b"); assertCollapses("35", false, "x", "b", "a", "b"); assertCollapses("41", true, Phone.CONTENT_ITEM_TYPE, null, Phone.CONTENT_ITEM_TYPE, null); assertCollapses("42", true, Phone.CONTENT_ITEM_TYPE, "1", Phone.CONTENT_ITEM_TYPE, "1"); assertCollapses("51", false, Phone.CONTENT_ITEM_TYPE, "1", Phone.CONTENT_ITEM_TYPE, "2"); assertCollapses("52", false, Phone.CONTENT_ITEM_TYPE, "1", Phone.CONTENT_ITEM_TYPE, null); assertCollapses("53", false, Phone.CONTENT_ITEM_TYPE, null, Phone.CONTENT_ITEM_TYPE, "2"); // Test phone numbers assertCollapses("60", true, Phone.CONTENT_ITEM_TYPE, "1234567", Phone.CONTENT_ITEM_TYPE, "1234567"); assertCollapses("61", false, Phone.CONTENT_ITEM_TYPE, "1234567", Phone.CONTENT_ITEM_TYPE, "1234568"); assertCollapses("62", true, Phone.CONTENT_ITEM_TYPE, "1234567;0", Phone.CONTENT_ITEM_TYPE, "1234567;0"); assertCollapses("63", false, Phone.CONTENT_ITEM_TYPE, "1234567;89321", Phone.CONTENT_ITEM_TYPE, "1234567;89322"); assertCollapses("64", true, Phone.CONTENT_ITEM_TYPE, "1234567;89321", Phone.CONTENT_ITEM_TYPE, "1234567;89321"); assertCollapses("65", false, Phone.CONTENT_ITEM_TYPE, "1234567;0111111111", Phone.CONTENT_ITEM_TYPE, "1234567;"); assertCollapses("66", false, Phone.CONTENT_ITEM_TYPE, "12345675426;91970xxxxx", Phone.CONTENT_ITEM_TYPE, "12345675426"); assertCollapses("67", false, Phone.CONTENT_ITEM_TYPE, "12345675426;23456xxxxx", Phone.CONTENT_ITEM_TYPE, "12345675426;234567xxxx"); assertCollapses("68", true, Phone.CONTENT_ITEM_TYPE, "1234567;1234567;1234567", Phone.CONTENT_ITEM_TYPE, "1234567;1234567;1234567"); assertCollapses("69", false, Phone.CONTENT_ITEM_TYPE, "1234567;1234567;1234567", Phone.CONTENT_ITEM_TYPE, "1234567;1234567"); // test some numbers with country and area code assertCollapses("70", true, Phone.CONTENT_ITEM_TYPE, "+49 (89) 12345678", Phone.CONTENT_ITEM_TYPE, "+49 (89) 12345678"); assertCollapses("71", true, Phone.CONTENT_ITEM_TYPE, "+49 (89) 12345678", Phone.CONTENT_ITEM_TYPE, "+49 (89)12345678"); assertCollapses("72", true, Phone.CONTENT_ITEM_TYPE, "+49 (8092) 1234", Phone.CONTENT_ITEM_TYPE, "+49 (8092)1234"); assertCollapses("73", false, Phone.CONTENT_ITEM_TYPE, "0049 (8092) 1234", Phone.CONTENT_ITEM_TYPE, "+49/80921234"); assertCollapses("74", false, Phone.CONTENT_ITEM_TYPE, "+49 (89) 12345678", Phone.CONTENT_ITEM_TYPE, "+49 (89) 12345679"); // test special handling of collapsing country code for NANP region only // This is non symmetrical, because we prefer the number with the +1. assertEquals("100", true, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, "+1 (415) 555-1212", Phone.CONTENT_ITEM_TYPE, "(415) 555-1212")); assertEquals("101", true, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, "+14155551212", Phone.CONTENT_ITEM_TYPE, "4155551212")); assertEquals("102", false, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, "(415) 555-1212", Phone.CONTENT_ITEM_TYPE, "+1 (415) 555-1212")); assertEquals("103", false, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, "4155551212", Phone.CONTENT_ITEM_TYPE, "+14155551212")); // Require explicit +1 country code declaration to collapse assertEquals("104", false, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, "1-415-555-1212", Phone.CONTENT_ITEM_TYPE, "415-555-1212")); assertEquals("105", false, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, "14155551212", Phone.CONTENT_ITEM_TYPE, "4155551212")); assertEquals("106", false, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, "+1 (415) 555-1212", Phone.CONTENT_ITEM_TYPE, " 1 (415) 555-1212")); assertEquals("107", false, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, "+14155551212", Phone.CONTENT_ITEM_TYPE, " 14155551212")); assertEquals("108", false, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, "1 (415) 555-1212", Phone.CONTENT_ITEM_TYPE, "+1 (415) 555-1212")); assertEquals("109", false, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, "14155551212", Phone.CONTENT_ITEM_TYPE, "+14155551212")); // test some numbers with wait symbol and area code assertCollapses("200", true, Phone.CONTENT_ITEM_TYPE, "+49 (8092) 1234;89321", Phone.CONTENT_ITEM_TYPE, "+49/80921234;89321"); assertCollapses("201", false, Phone.CONTENT_ITEM_TYPE, "+49 (8092) 1234;89321", Phone.CONTENT_ITEM_TYPE, "+49/80921235;89321"); assertCollapses("202", false, Phone.CONTENT_ITEM_TYPE, "+49 (8092) 1234;89322", Phone.CONTENT_ITEM_TYPE, "+49/80921234;89321"); assertCollapses("203", true, Phone.CONTENT_ITEM_TYPE, "1234567;+49 (8092) 1234", Phone.CONTENT_ITEM_TYPE, "1234567;+49/80921234"); assertCollapses("300", true, Phone.CONTENT_ITEM_TYPE, "", Phone.CONTENT_ITEM_TYPE, ""); assertCollapses("301", false, Phone.CONTENT_ITEM_TYPE, "1", Phone.CONTENT_ITEM_TYPE, ""); assertCollapses("302", false, Phone.CONTENT_ITEM_TYPE, "", Phone.CONTENT_ITEM_TYPE, "1"); assertCollapses("303", true, Phone.CONTENT_ITEM_TYPE, "---", Phone.CONTENT_ITEM_TYPE, "---"); assertCollapses("304", false, Phone.CONTENT_ITEM_TYPE, "1-/().", Phone.CONTENT_ITEM_TYPE, "--$%1"); // Test numbers using keypad letters. This is non-symmetrical, because we prefer // the version with letters. assertEquals("400", true, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, "abcdefghijklmnopqrstuvwxyz", Phone.CONTENT_ITEM_TYPE, "22233344455566677778889999")); assertEquals("401", false, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, "22233344455566677778889999", Phone.CONTENT_ITEM_TYPE, "abcdefghijklmnopqrstuvwxyz")); assertCollapses("402", false, Phone.CONTENT_ITEM_TYPE, "1;2", Phone.CONTENT_ITEM_TYPE, "12"); assertCollapses("403", false, Phone.CONTENT_ITEM_TYPE, "1,2", Phone.CONTENT_ITEM_TYPE, "12"); } public void testShouldCollapse_collapsesSameNumberWithDifferentFormats() { assertEquals("1", true, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, "555-1212", Phone.CONTENT_ITEM_TYPE, "5551212")); assertEquals("1", true, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, "415-555-1212", Phone.CONTENT_ITEM_TYPE, "(415) 555-1212")); assertEquals("2", true, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, "4155551212", Phone.CONTENT_ITEM_TYPE, "(415) 555-1212")); assertEquals("3", true, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, "1-415-555-1212", Phone.CONTENT_ITEM_TYPE, "1 (415) 555-1212")); assertEquals("4", true, MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, "14155551212", Phone.CONTENT_ITEM_TYPE, "1 (415) 555-1212")); } private void assertCollapses(String message, boolean expected, CharSequence mimetype1, CharSequence data1, CharSequence mimetype2, CharSequence data2) { assertEquals(message, expected, MoreContactUtils.shouldCollapse(mimetype1, data1, mimetype2, data2)); assertEquals(message, expected, MoreContactUtils.shouldCollapse(mimetype2, data2, mimetype1, data1)); // If data1 and data2 are the same instance, make sure the same test passes with different // instances. if (data1 == data2 && data1 != null) { // Create a different instance final CharSequence data2_newref = new StringBuilder(data2).append("").toString(); if (data1 == data2_newref) { // In some cases no matter what we do the runtime reuses the same instance, so // we can't do the "different instance" test. return; } // we have two different instances, now make sure we get the same result as before assertEquals(message, expected, MoreContactUtils.shouldCollapse(mimetype1, data1, mimetype2, data2_newref)); assertEquals(message, expected, MoreContactUtils.shouldCollapse(mimetype2, data2_newref, mimetype1, data1)); } } }