/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.telephony; import android.telephony.PhoneNumberFormattingTextWatcher; import android.test.AndroidTestCase; import android.text.Editable; import android.text.Selection; import android.text.SpannableStringBuilder; import android.text.TextWatcher; public class PhoneNumberWatcherTest extends AndroidTestCase { public void testAppendChars() { final String multiChars = "65012345"; final String formatted1 = "(650) 123-45"; TextWatcher textWatcher = getTextWatcher(); SpannableStringBuilder number = new SpannableStringBuilder(); // Append more than one chars textWatcher.beforeTextChanged(number, 0, 0, multiChars.length()); number.append(multiChars); Selection.setSelection(number, number.length()); textWatcher.onTextChanged(number, 0, 0, number.length()); textWatcher.afterTextChanged(number); assertEquals(formatted1, number.toString()); assertEquals(formatted1.length(), Selection.getSelectionEnd(number)); // Append one chars final char appendChar = '6'; final String formatted2 = "(650) 123-456"; int len = number.length(); textWatcher.beforeTextChanged(number, number.length(), 0, 1); number.append(appendChar); Selection.setSelection(number, number.length()); textWatcher.onTextChanged(number, len, 0, 1); textWatcher.afterTextChanged(number); assertEquals(formatted2, number.toString()); assertEquals(formatted2.length(), Selection.getSelectionEnd(number)); } public void testRemoveLastChars() { final String init = "65012345678"; final String result1 = "(650) 123-4567"; TextWatcher textWatcher = getTextWatcher(); // Remove the last char. SpannableStringBuilder number = new SpannableStringBuilder(init); int len = number.length(); textWatcher.beforeTextChanged(number, len - 1, 1, 0); number.delete(len - 1, len); Selection.setSelection(number, number.length()); textWatcher.onTextChanged(number, number.length() - 1, 1, 0); textWatcher.afterTextChanged(number); assertEquals(result1, number.toString()); assertEquals(result1.length(), Selection.getSelectionEnd(number)); // Remove last 5 chars final String result2 = "650-123"; textWatcher.beforeTextChanged(number, number.length() - 4, 4, 0); number.delete(number.length() - 5, number.length()); Selection.setSelection(number, number.length()); textWatcher.onTextChanged(number, number.length(), 4, 0); textWatcher.afterTextChanged(number); assertEquals(result2, number.toString()); assertEquals(result2.length(), Selection.getSelectionEnd(number)); } public void testInsertChars() { final String init = "650-23"; final String expected1 = "650-123"; TextWatcher textWatcher = getTextWatcher(); // Insert one char SpannableStringBuilder number = new SpannableStringBuilder(init); textWatcher.beforeTextChanged(number, 3, 0, 1); number.insert(3, "1"); // 6501-23 Selection.setSelection(number, 4); // make the cursor at right of 1 textWatcher.onTextChanged(number, 3, 0, 1); textWatcher.afterTextChanged(number); assertEquals(expected1, number.toString()); // the cursor should still at the right of '1' assertEquals(5, Selection.getSelectionEnd(number)); // Insert multiple chars final String expected2 = "(650) 145-6723"; textWatcher.beforeTextChanged(number, 5, 0, 4); number.insert(5, "4567"); // change to 650-1456723 Selection.setSelection(number, 9); // the cursor is at the right of '7'. textWatcher.onTextChanged(number, 7, 0, 4); textWatcher.afterTextChanged(number); assertEquals(expected2, number.toString()); // the cursor should be still at the right of '7' assertEquals(12, Selection.getSelectionEnd(number)); } public void testStopFormatting() { final String init = "(650) 123"; final String expected1 = "(650) 123 4"; TextWatcher textWatcher = getTextWatcher(); // Append space SpannableStringBuilder number = new SpannableStringBuilder(init); textWatcher.beforeTextChanged(number, 9, 0, 2); number.insert(9, " 4"); // (6501) 23 4 Selection.setSelection(number, number.length()); // make the cursor at right of 4 textWatcher.onTextChanged(number, 9, 0, 2); textWatcher.afterTextChanged(number); assertEquals(expected1, number.toString()); // the cursor should still at the right of '1' assertEquals(expected1.length(), Selection.getSelectionEnd(number)); // Delete a ')' final String expected2 ="(650 123"; textWatcher = getTextWatcher(); number = new SpannableStringBuilder(init); textWatcher.beforeTextChanged(number, 4, 1, 0); number.delete(4, 5); // (6501 23 4 Selection.setSelection(number, 5); // make the cursor at right of 1 textWatcher.onTextChanged(number, 4, 1, 0); textWatcher.afterTextChanged(number); assertEquals(expected2, number.toString()); // the cursor should still at the right of '1' assertEquals(5, Selection.getSelectionEnd(number)); // Insert a hyphen final String expected3 ="(650) 12-3"; textWatcher = getTextWatcher(); number = new SpannableStringBuilder(init); textWatcher.beforeTextChanged(number, 8, 0, 1); number.insert(8, "-"); // (650) 12-3 Selection.setSelection(number, 9); // make the cursor at right of - textWatcher.onTextChanged(number, 8, 0, 1); textWatcher.afterTextChanged(number); assertEquals(expected3, number.toString()); // the cursor should still at the right of '-' assertEquals(9, Selection.getSelectionEnd(number)); } public void testRestartFormatting() { final String init = "(650) 123"; final String expected1 = "(650) 123 4"; TextWatcher textWatcher = getTextWatcher(); // Append space SpannableStringBuilder number = new SpannableStringBuilder(init); textWatcher.beforeTextChanged(number, 9, 0, 2); number.insert(9, " 4"); // (650) 123 4 Selection.setSelection(number, number.length()); // make the cursor at right of 4 textWatcher.onTextChanged(number, 9, 0, 2); textWatcher.afterTextChanged(number); assertEquals(expected1, number.toString()); // the cursor should still at the right of '4' assertEquals(expected1.length(), Selection.getSelectionEnd(number)); // Clear the current string, and start formatting again. int len = number.length(); textWatcher.beforeTextChanged(number, 0, len, 0); number.delete(0, len); textWatcher.onTextChanged(number, 0, len, 0); textWatcher.afterTextChanged(number); final String expected2 = "650-1234"; number = new SpannableStringBuilder(init); textWatcher.beforeTextChanged(number, 9, 0, 1); number.insert(9, "4"); // (650) 1234 Selection.setSelection(number, number.length()); // make the cursor at right of 4 textWatcher.onTextChanged(number, 9, 0, 1); textWatcher.afterTextChanged(number); assertEquals(expected2, number.toString()); // the cursor should still at the right of '4' assertEquals(expected2.length(), Selection.getSelectionEnd(number)); } public void testTextChangedByOtherTextWatcher() { final TextWatcher cleanupTextWatcher = new TextWatcher() { @Override public void afterTextChanged(Editable s) { s.clear(); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } }; final String init = "(650) 123"; final String expected1 = ""; TextWatcher textWatcher = getTextWatcher(); SpannableStringBuilder number = new SpannableStringBuilder(init); textWatcher.beforeTextChanged(number, 5, 0, 1); number.insert(5, "4"); // (6504) 123 Selection.setSelection(number, 5); // make the cursor at right of 4 textWatcher.onTextChanged(number, 5, 0, 1); number.setSpan(cleanupTextWatcher, 0, number.length(), 0); textWatcher.afterTextChanged(number); assertEquals(expected1, number.toString()); } /** * Test the case where some other component is auto-completing what the user is typing */ public void testAutoCompleteWithFormattedNumber() { String init = "650-1"; String expected = "+1-650-123-4567"; // Different formatting than ours testReplacement(init, expected, expected); } /** * Test the case where some other component is auto-completing what the user is typing */ public void testAutoCompleteWithFormattedNameAndNumber() { String init = "650-1"; String expected = "Test User <650-123-4567>"; testReplacement(init, expected, expected); } /** * Test the case where some other component is auto-completing what the user is typing */ public void testAutoCompleteWithNumericNameAndNumber() { String init = "650"; String expected = "2nd Test User <650-123-4567>"; testReplacement(init, expected, expected); } /** * Test the case where some other component is auto-completing what the user is typing */ public void testAutoCompleteWithUnformattedNumber() { String init = "650-1"; String expected = "6501234567"; testReplacement(init, expected, expected); } /** * Test the case where some other component is auto-completing what the user is typing, where * the deleted text doesn't have any formatting and neither does the replacement text: in this * case the replacement text should be formatted by the PhoneNumberFormattingTextWatcher. */ public void testAutoCompleteUnformattedWithUnformattedNumber() { String init = "650"; String replacement = "6501234567"; String expected = "(650) 123-4567"; testReplacement(init, replacement, expected); String init2 = "650"; String replacement2 = "16501234567"; String expected2 = "1 650-123-4567"; testReplacement(init2, replacement2, expected2); } /** * Helper method for testing replacing the entire string with another string * @param init The initial string * @param expected */ private void testReplacement(String init, String replacement, String expected) { TextWatcher textWatcher = getTextWatcher(); SpannableStringBuilder number = new SpannableStringBuilder(init); // Replace entire text with the given values textWatcher.beforeTextChanged(number, 0, init.length(), replacement.length()); number.replace(0, init.length(), replacement, 0, replacement.length()); Selection.setSelection(number, replacement.length()); // move the cursor to the end textWatcher.onTextChanged(number, 0, init.length(), replacement.length()); textWatcher.afterTextChanged(number); assertEquals(expected, number.toString()); // the cursor should be still at the end assertEquals(expected.length(), Selection.getSelectionEnd(number)); } private TextWatcher getTextWatcher() { return new PhoneNumberFormattingTextWatcher("US"); } }