ChipsTest.java revision aca23c4de8d85b04e6044c9a8f047c337cf427c9
17cb970b6d9b60b9b9828d40fea8cff395a40ecd9Mindy Pereira/* 27cb970b6d9b60b9b9828d40fea8cff395a40ecd9Mindy Pereira * Copyright (C) 2011 The Android Open Source Project 37cb970b6d9b60b9b9828d40fea8cff395a40ecd9Mindy Pereira * 47cb970b6d9b60b9b9828d40fea8cff395a40ecd9Mindy Pereira * Licensed under the Apache License, Version 2.0 (the "License"); 57cb970b6d9b60b9b9828d40fea8cff395a40ecd9Mindy Pereira * you may not use this file except in compliance with the License. 67cb970b6d9b60b9b9828d40fea8cff395a40ecd9Mindy Pereira * You may obtain a copy of the License at 77cb970b6d9b60b9b9828d40fea8cff395a40ecd9Mindy Pereira * 87cb970b6d9b60b9b9828d40fea8cff395a40ecd9Mindy Pereira * http://www.apache.org/licenses/LICENSE-2.0 97cb970b6d9b60b9b9828d40fea8cff395a40ecd9Mindy Pereira * 107cb970b6d9b60b9b9828d40fea8cff395a40ecd9Mindy Pereira * Unless required by applicable law or agreed to in writing, software 117cb970b6d9b60b9b9828d40fea8cff395a40ecd9Mindy Pereira * distributed under the License is distributed on an "AS IS" BASIS, 127cb970b6d9b60b9b9828d40fea8cff395a40ecd9Mindy Pereira * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137cb970b6d9b60b9b9828d40fea8cff395a40ecd9Mindy Pereira * See the License for the specific language governing permissions and 147cb970b6d9b60b9b9828d40fea8cff395a40ecd9Mindy Pereira * limitations under the License. 157cb970b6d9b60b9b9828d40fea8cff395a40ecd9Mindy Pereira */ 167cb970b6d9b60b9b9828d40fea8cff395a40ecd9Mindy Pereira 177cb970b6d9b60b9b9828d40fea8cff395a40ecd9Mindy Pereirapackage com.android.ex.chips; 187cb970b6d9b60b9b9828d40fea8cff395a40ecd9Mindy Pereira 1901162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereiraimport android.content.Context; 2097cb25912dab282cf732757f68b0405ed005f00bMindy Pereiraimport android.graphics.Bitmap; 2197cb25912dab282cf732757f68b0405ed005f00bMindy Pereiraimport android.graphics.drawable.BitmapDrawable; 2297cb25912dab282cf732757f68b0405ed005f00bMindy Pereiraimport android.graphics.drawable.Drawable; 237cb970b6d9b60b9b9828d40fea8cff395a40ecd9Mindy Pereiraimport android.test.AndroidTestCase; 24fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereiraimport android.test.suitebuilder.annotation.SmallTest; 2501162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereiraimport android.text.Editable; 2601162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereiraimport android.text.SpannableStringBuilder; 27d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereiraimport android.text.style.ImageSpan; 2801162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereiraimport android.text.util.Rfc822Tokenizer; 29d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereiraimport android.widget.TextView; 3001162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 3101162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereiraimport com.android.ex.chips.RecipientEditTextView; 3201162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereiraimport com.android.ex.chips.RecipientEntry; 3301162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 34fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira@SmallTest 357cb970b6d9b60b9b9828d40fea8cff395a40ecd9Mindy Pereirapublic class ChipsTest extends AndroidTestCase { 368eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira private RecipientChip[] mMockRecips; 3701162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 388eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira private RecipientEntry[] mMockEntries; 3901162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 4001162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira private Rfc822Tokenizer mTokenizer; 4101162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 4201162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira private Editable mEditable; 4301162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 4401162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira class MockRecipientEditTextView extends RecipientEditTextView { 4501162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 4601162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira public MockRecipientEditTextView(Context context) { 4701162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira super(context, null); 4801162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira mTokenizer = new Rfc822Tokenizer(); 4901162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira setTokenizer(mTokenizer); 5001162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira } 5101162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 5201162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira @Override 5301162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira public RecipientChip[] getSortedRecipients() { 5401162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira return mMockRecips; 5501162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira } 5601162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 5701162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira @Override 5801162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira public Editable getText() { 5901162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira return mEditable; 6001162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira } 6101162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 6201162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira @Override 6301162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira public Editable getSpannable() { 6401162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira return mEditable; 6501162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira } 66d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 67d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira @Override 68d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira public int getLineHeight() { 69d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira return 48; 70d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira } 7197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira 7220c9d620e79ae28994856541761a951074551518Mindy Pereira @Override 73aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira Drawable getChipBackground(RecipientEntry contact) { 7497cb25912dab282cf732757f68b0405ed005f00bMindy Pereira return createChipBackground(); 7597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira } 7620c9d620e79ae28994856541761a951074551518Mindy Pereira 7720c9d620e79ae28994856541761a951074551518Mindy Pereira @Override 7820c9d620e79ae28994856541761a951074551518Mindy Pereira public int length() { 7920c9d620e79ae28994856541761a951074551518Mindy Pereira return mEditable != null ? mEditable.length() : 0; 8020c9d620e79ae28994856541761a951074551518Mindy Pereira } 8120c9d620e79ae28994856541761a951074551518Mindy Pereira 8220c9d620e79ae28994856541761a951074551518Mindy Pereira @Override 8320c9d620e79ae28994856541761a951074551518Mindy Pereira public String toString() { 8420c9d620e79ae28994856541761a951074551518Mindy Pereira return mEditable != null ? mEditable.toString() : ""; 8520c9d620e79ae28994856541761a951074551518Mindy Pereira } 8601162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira } 8701162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 8801162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira private MockRecipientEditTextView createViewForTesting() { 8901162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira mEditable = new SpannableStringBuilder(); 9001162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira MockRecipientEditTextView view = new MockRecipientEditTextView(getContext()); 9101162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira return view; 9201162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira } 9301162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 9401162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira public void testCreateDisplayText() { 9501162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira RecipientEditTextView view = createViewForTesting(); 9601162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira RecipientEntry entry = RecipientEntry.constructGeneratedEntry("User Name, Jr", 9701162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira "user@username.com"); 98aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira String testAddress = view.createAddressText(entry); 99aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira String testDisplay = view.createChipDisplayText(entry); 10001162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira assertEquals("Expected a properly formatted RFC email address", 101aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira "\"User Name, Jr\" <user@username.com>, ", testAddress); 102aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira assertEquals("Expected a displayable name", "User Name, Jr", testDisplay); 103aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira 10401162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 10501162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira RecipientEntry alreadyFormatted = RecipientEntry.constructFakeEntry("user@username.com, "); 106aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira testAddress = view.createAddressText(alreadyFormatted); 107aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira testDisplay = view.createChipDisplayText(alreadyFormatted); 10801162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira assertEquals("Expected a properly formatted RFC email address", "<user@username.com>, ", 109aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira testAddress); 110aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira assertEquals("Expected a displayable name", "user@username.com", testDisplay); 11101162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 11201162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira RecipientEntry alreadyFormattedNoSpace = RecipientEntry 11301162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira .constructFakeEntry("user@username.com,"); 114aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira testAddress = view.createAddressText(alreadyFormattedNoSpace); 11501162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira assertEquals("Expected a properly formatted RFC email address", "<user@username.com>, ", 116aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira testAddress); 11701162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 11801162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira RecipientEntry alreadyNamed = RecipientEntry.constructGeneratedEntry("User Name", 11901162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira "\"User Name, Jr\" <user@username.com>"); 120aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira testAddress = view.createAddressText(alreadyNamed); 121aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira testDisplay = view.createChipDisplayText(alreadyNamed); 12201162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira assertEquals( 12301162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira "Expected address that used the name not the excess address name", 124aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira "User Name <user@username.com>, ", testAddress); 125aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira assertEquals("Expected a displayable name", "User Name", testDisplay); 12601162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira } 1277cb970b6d9b60b9b9828d40fea8cff395a40ecd9Mindy Pereira 12801162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira public void testSanitizeBetween() { 129fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira // First, add 2 chips and then make sure we remove 130fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira // the extra content between them correctly. 1318eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira populateMocks(2); 13201162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira MockRecipientEditTextView view = createViewForTesting(); 13301162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira String first = (String) mTokenizer.terminateToken("FIRST"); 13401162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira String second = (String) mTokenizer.terminateToken("SECOND"); 13501162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira String extra = "EXTRA"; 136d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable = new SpannableStringBuilder(); 13701162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira mEditable.append(first + extra + second); 13801162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira int firstStart = mEditable.toString().indexOf(first); 13962397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira int firstEnd = firstStart + first.trim().length(); 14001162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira int secondStart = mEditable.toString().indexOf(second); 14162397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira int secondEnd = secondStart + second.trim().length(); 14201162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 2], firstStart, firstEnd, 0); 14301162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 1], secondStart, secondEnd, 0); 14401162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira view.sanitizeBetween(); 14501162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira String editableString = mEditable.toString(); 14601162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira assertEquals(editableString.indexOf(extra), -1); 14701162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira assertEquals(editableString.indexOf(first), firstStart); 14801162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira assertEquals(editableString.indexOf(second), secondStart - extra.length()); 14901162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira assertEquals(editableString, (first + second)); 150399bda87ad1a4d003609d6d27afc50c8359846b9Mindy Pereira 151fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira // Add 1 chip and make sure that we remove the extra stuff before it correctly. 15201162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira mEditable = new SpannableStringBuilder(); 1538eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira populateMocks(1); 1548eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira mEditable.append(extra); 15501162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira mEditable.append(first); 15601162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira firstStart = mEditable.toString().indexOf(first); 15701162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira firstEnd = firstStart + first.length(); 15801162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 1], firstStart, firstEnd, 0); 15901162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira view.sanitizeBetween(); 16001162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira assertEquals(mEditable.toString(), first); 1618eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), firstStart 1628eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira - extra.length()); 1638eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira } 1648eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira 165aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira public void testSanitizeEnd() { 166aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira // First, add 2 chips and then make sure we remove 167aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira // the extra content between them correctly. 168aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira populateMocks(2); 169aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira MockRecipientEditTextView view = createViewForTesting(); 170aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira String first = (String) mTokenizer.terminateToken("FIRST"); 171aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira String second = (String) mTokenizer.terminateToken("SECOND"); 172aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira String extra = "EXTRA"; 173aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira mEditable = new SpannableStringBuilder(); 174aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira mEditable.append(first + second); 175aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira int firstStart = mEditable.toString().indexOf(first); 176aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira int firstEnd = firstStart + first.trim().length(); 177aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira int secondStart = mEditable.toString().indexOf(second); 178aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira int secondEnd = secondStart + second.trim().length(); 179aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 2], firstStart, firstEnd, 0); 180aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 1], secondStart, secondEnd, 0); 181aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira view.sanitizeEnd(); 182aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira String editableString = mEditable.toString(); 183aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira assertEquals(editableString.indexOf(extra), -1); 184aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira assertEquals(editableString.indexOf(first), firstStart); 185aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira assertEquals(editableString.indexOf(second), secondStart); 186aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira assertEquals(editableString, (first + second)); 187aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira mEditable.append(extra); 188aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira editableString = mEditable.toString(); 189aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira assertEquals(mEditable.toString(), (first + second + extra)); 190aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira view.sanitizeEnd(); 191aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira assertEquals(mEditable.toString(), (first + second)); 192aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira } 193aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira 194d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira public void testMoreChip() { 195fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira // Add 3 chips: this is the trigger point at which the more chip will be created. 196fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira // Test that adding the chips and then creating and removing the more chip, as if 197fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira // the user were focusing/ removing focus from the chips field. 198d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira populateMocks(3); 199d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira MockRecipientEditTextView view = createViewForTesting(); 200d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira view.setMoreItem(createTestMoreItem()); 201d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String first = (String) mTokenizer.terminateToken("FIRST"); 202d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String second = (String) mTokenizer.terminateToken("SECOND"); 203d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String third = (String) mTokenizer.terminateToken("THIRD"); 204d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable = new SpannableStringBuilder(); 205d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.append(first+second+third); 206d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 207d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int firstStart = mEditable.toString().indexOf(first); 20862397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira int firstEnd = firstStart + first.trim().length(); 209d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int secondStart = mEditable.toString().indexOf(second); 21062397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira int secondEnd = secondStart + second.trim().length(); 211d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int thirdStart = mEditable.toString().indexOf(third); 21262397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira int thirdEnd = thirdStart + third.trim().length(); 213d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0); 214d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0); 215d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0); 216d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 217d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira view.createMoreChip(); 218d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.toString(), first+second+third); 219d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), firstStart); 220d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), secondStart); 221d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira // Find the more chip. 222d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira ImageSpan moreChip = view.getMoreChip(); 223d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(moreChip), thirdStart); 224d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanEnd(moreChip), thirdEnd); 225d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 226d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira view.removeMoreChip(); 227d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.toString(), first+second+third); 228d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), firstStart); 229d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 3]), firstEnd); 230d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), secondStart); 231d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), thirdStart); 232d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 1]), thirdEnd); 233d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira moreChip = view.getMoreChip(); 234d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(moreChip), -1); 235d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 236d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira // Rinse and repeat, just in case! 237d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira view.createMoreChip(); 238d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.toString(), first+second+third); 239d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), firstStart); 240d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), secondStart); 241d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira // Find the more chip. 242d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira moreChip = view.getMoreChip(); 243d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(moreChip), thirdStart); 244d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanEnd(moreChip), thirdEnd); 245d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 246d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira view.removeMoreChip(); 247d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.toString(), first+second+third); 248d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), firstStart); 249d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 3]), firstEnd); 250d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), secondStart); 251d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), thirdStart); 252d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 1]), thirdEnd); 253d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira moreChip = view.getMoreChip(); 254d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(moreChip), -1); 255d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira } 256d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 257d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira public void testMoreChipLotsOfUsers() { 258fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira // Test adding and removing the more chip in the case where we have a lot of users. 259d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira populateMocks(10); 260d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira MockRecipientEditTextView view = createViewForTesting(); 261d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira view.setMoreItem(createTestMoreItem()); 262d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String first = (String) mTokenizer.terminateToken("FIRST"); 263d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String second = (String) mTokenizer.terminateToken("SECOND"); 264d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String third = (String) mTokenizer.terminateToken("THIRD"); 265d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String fourth = (String) mTokenizer.terminateToken("FOURTH"); 266d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String fifth = (String) mTokenizer.terminateToken("FIFTH"); 267d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String sixth = (String) mTokenizer.terminateToken("SIXTH"); 268d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String seventh = (String) mTokenizer.terminateToken("SEVENTH"); 269d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String eigth = (String) mTokenizer.terminateToken("EIGHTH"); 270d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String ninth = (String) mTokenizer.terminateToken("NINTH"); 271d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String tenth = (String) mTokenizer.terminateToken("TENTH"); 272d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable = new SpannableStringBuilder(); 273d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.append(first+second+third+fourth+fifth+sixth+seventh+eigth+ninth+tenth); 274d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 275d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int firstStart = mEditable.toString().indexOf(first); 27662397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira int firstEnd = firstStart + first.trim().length(); 277d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int secondStart = mEditable.toString().indexOf(second); 27862397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira int secondEnd = secondStart + second.trim().length(); 279d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int thirdStart = mEditable.toString().indexOf(third); 28062397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira int thirdEnd = thirdStart + third.trim().length(); 281d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int fourthStart = mEditable.toString().indexOf(fourth); 28262397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira int fourthEnd = fourthStart + fourth.trim().length(); 283d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int fifthStart = mEditable.toString().indexOf(fifth); 28462397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira int fifthEnd = fifthStart + fifth.trim().length(); 285d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int sixthStart = mEditable.toString().indexOf(sixth); 28662397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira int sixthEnd = sixthStart + sixth.trim().length(); 287d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int seventhStart = mEditable.toString().indexOf(seventh); 28862397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira int seventhEnd = seventhStart + seventh.trim().length(); 289d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int eighthStart = mEditable.toString().indexOf(eigth); 29062397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira int eighthEnd = eighthStart + eigth.trim().length(); 291d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int ninthStart = mEditable.toString().indexOf(ninth); 29262397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira int ninthEnd = ninthStart + ninth.trim().length(); 293d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int tenthStart = mEditable.toString().indexOf(tenth); 29462397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira int tenthEnd = tenthStart + tenth.trim().length(); 295d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 10], firstStart, firstEnd, 0); 296d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 9], secondStart, secondEnd, 0); 297d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 8], thirdStart, thirdEnd, 0); 298d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 7], fourthStart, fourthEnd, 0); 299d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 6], fifthStart, fifthEnd, 0); 300d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 5], sixthStart, sixthEnd, 0); 301d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 4], seventhStart, seventhEnd, 0); 302d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 3], eighthStart, eighthEnd, 0); 303d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 2], ninthStart, ninthEnd, 0); 304d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 1], tenthStart, tenthEnd, 0); 305d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 306d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira view.createMoreChip(); 307d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.toString(), first + second + third + fourth + fifth + sixth 308d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira + seventh + eigth + ninth + tenth); 309d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 10]), firstStart); 310d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 9]), secondStart); 311d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira // Find the more chip. 312d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira ImageSpan moreChip = view.getMoreChip(); 313d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(moreChip), thirdStart); 314d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanEnd(moreChip), tenthEnd); 315d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 316d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira view.removeMoreChip(); 317d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.toString(), first + second + third + fourth + fifth + sixth 318d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira + seventh + eigth + ninth + tenth); 319d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 10]), firstStart); 320d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 9]), secondStart); 321d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 322d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 8]), thirdStart); 323d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 7]), fourthStart); 324d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 6]), fifthStart); 325d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 5]), sixthStart); 326d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 4]), seventhStart); 327d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), eighthStart); 328d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), ninthStart); 329d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), tenthStart); 330d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira moreChip = view.getMoreChip(); 331d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(moreChip), -1); 332d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 333d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira } 334d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 335d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira public void testMoreChipSpecialChars() { 336fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira // Make sure the more chip correctly handles extra tokenizer characters in the middle 337fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira // of chip text. 338d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira populateMocks(3); 339d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira MockRecipientEditTextView view = createViewForTesting(); 340d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira view.setMoreItem(createTestMoreItem()); 341d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String first = (String) mTokenizer.terminateToken("FI,RST"); 342d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String second = (String) mTokenizer.terminateToken("SE,COND"); 343d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String third = (String) mTokenizer.terminateToken("THI,RD"); 344d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable = new SpannableStringBuilder(); 345d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.append(first+second+third); 346d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 347d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int firstStart = mEditable.toString().indexOf(first); 34862397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira int firstEnd = firstStart + first.trim().length(); 349d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int secondStart = mEditable.toString().indexOf(second); 35062397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira int secondEnd = secondStart + second.trim().length(); 351d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int thirdStart = mEditable.toString().indexOf(third); 35262397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira int thirdEnd = thirdStart + third.trim().length(); 353d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0); 354d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0); 355d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0); 356d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 357d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira view.createMoreChip(); 358d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.toString(), first+second+third); 359d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), firstStart); 360d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), secondStart); 361d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira // Find the more chip. 362d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira ImageSpan moreChip = view.getMoreChip(); 363d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(moreChip), thirdStart); 364d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanEnd(moreChip), thirdEnd); 365d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 366d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira view.removeMoreChip(); 367d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.toString(), first+second+third); 368d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), firstStart); 369d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 3]), firstEnd); 370d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), secondStart); 371d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), thirdStart); 372d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 1]), thirdEnd); 373d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira moreChip = view.getMoreChip(); 374d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(moreChip), -1); 375d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira } 376d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 377dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira public void testMoreChipDupes() { 378fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira // Make sure the more chip is correctly added and removed when we have duplicate chips. 379dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira populateMocks(4); 380dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira MockRecipientEditTextView view = createViewForTesting(); 381dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira view.setMoreItem(createTestMoreItem()); 382dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira String first = (String) mTokenizer.terminateToken("FIRST"); 383dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira String second = (String) mTokenizer.terminateToken("SECOND"); 384dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira String third = (String) mTokenizer.terminateToken("THIRD"); 385dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira mEditable = new SpannableStringBuilder(); 386dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira mEditable.append(first+second+third+third); 387dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira 388dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int firstStart = mEditable.toString().indexOf(first); 38962397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira int firstEnd = firstStart + first.trim().length(); 390dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int secondStart = mEditable.toString().indexOf(second); 39162397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira int secondEnd = secondStart + second.trim().length(); 392dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int thirdStart = mEditable.toString().indexOf(third); 39362397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira int thirdEnd = thirdStart + third.trim().length(); 394dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int thirdNextStart = mEditable.toString().indexOf(third, thirdEnd); 39562397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira int thirdNextEnd = thirdNextStart + third.trim().length(); 396dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 4], firstStart, firstEnd, 0); 397dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 3], secondStart, secondEnd, 0); 398dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 2], thirdStart, thirdEnd, 0); 399dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdNextStart, thirdNextEnd, 0); 400dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira 401dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira view.createMoreChip(); 402dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira assertEquals(mEditable.toString(), first+second+third+third); 403dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 4]), firstStart); 404dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), secondStart); 405dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira // Find the more chip. 406dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira ImageSpan moreChip = view.getMoreChip(); 407dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira assertEquals(mEditable.getSpanStart(moreChip), thirdStart); 408dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira assertEquals(mEditable.getSpanEnd(moreChip), thirdNextEnd); 409dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira 410dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira view.removeMoreChip(); 411dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira assertEquals(mEditable.toString(), first+second+third+third); 412dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 4]), firstStart); 413dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 4]), firstEnd); 414dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), secondStart); 415dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), thirdStart); 416dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 2]), thirdEnd); 417dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), thirdNextStart); 418dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 1]), thirdNextEnd); 419dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira moreChip = view.getMoreChip(); 420dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira assertEquals(mEditable.getSpanStart(moreChip), -1); 421dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira } 422dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira 42397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira public void testRemoveChip() { 424fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira // Create 3 chips to start and test removing chips in various postions. 42597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira populateMocks(3); 42697cb25912dab282cf732757f68b0405ed005f00bMindy Pereira MockRecipientEditTextView view = createViewForTesting(); 42797cb25912dab282cf732757f68b0405ed005f00bMindy Pereira view.setMoreItem(createTestMoreItem()); 42897cb25912dab282cf732757f68b0405ed005f00bMindy Pereira String first = (String) mTokenizer.terminateToken("FIRST"); 42997cb25912dab282cf732757f68b0405ed005f00bMindy Pereira String second = (String) mTokenizer.terminateToken("SECOND"); 43097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira String third = (String) mTokenizer.terminateToken("THIRD"); 43197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable = new SpannableStringBuilder(); 43297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.append(first + second + third); 43397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira 43497cb25912dab282cf732757f68b0405ed005f00bMindy Pereira int firstStart = mEditable.toString().indexOf(first); 43597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira int firstEnd = firstStart + first.length(); 43697cb25912dab282cf732757f68b0405ed005f00bMindy Pereira int secondStart = mEditable.toString().indexOf(second); 43797cb25912dab282cf732757f68b0405ed005f00bMindy Pereira int secondEnd = secondStart + second.length(); 43897cb25912dab282cf732757f68b0405ed005f00bMindy Pereira int thirdStart = mEditable.toString().indexOf(third); 43997cb25912dab282cf732757f68b0405ed005f00bMindy Pereira int thirdEnd = thirdStart + third.length(); 44097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0); 44197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0); 44297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0); 44397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.toString(), first + second + third); 444fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira // Test removing the middle chip. 44597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira view.removeChip(mMockRecips[mMockRecips.length - 2]); 44697cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.toString(), first + third); 44797cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), firstStart); 44897cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 3]), firstEnd); 44997cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), -1); 45097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 2]), -1); 45197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira int newThirdStart = mEditable.toString().indexOf(third); 45297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), newThirdStart); 45397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 1]), newThirdStart 45497cb25912dab282cf732757f68b0405ed005f00bMindy Pereira + third.length()); 45597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira 456fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira // Test removing the first chip. 45797cb25912dab282cf732757f68b0405ed005f00bMindy Pereira populateMocks(3); 45897cb25912dab282cf732757f68b0405ed005f00bMindy Pereira view = createViewForTesting(); 45997cb25912dab282cf732757f68b0405ed005f00bMindy Pereira view.setMoreItem(createTestMoreItem()); 46097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable = new SpannableStringBuilder(); 46197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.append(first + second + third); 46297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira 46397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira firstStart = mEditable.toString().indexOf(first); 46497cb25912dab282cf732757f68b0405ed005f00bMindy Pereira firstEnd = firstStart + first.length(); 46597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira secondStart = mEditable.toString().indexOf(second); 46697cb25912dab282cf732757f68b0405ed005f00bMindy Pereira secondEnd = secondStart + second.length(); 46797cb25912dab282cf732757f68b0405ed005f00bMindy Pereira thirdStart = mEditable.toString().indexOf(third); 46897cb25912dab282cf732757f68b0405ed005f00bMindy Pereira thirdEnd = thirdStart + third.length(); 46997cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0); 47097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0); 47197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0); 47297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.toString(), first + second + third); 47397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira view.removeChip(mMockRecips[mMockRecips.length - 3]); 47497cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.toString(), second + third); 47597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), -1); 47697cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 3]), -1); 47797cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), 0); 47897cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 2]), second.length()); 47997cb25912dab282cf732757f68b0405ed005f00bMindy Pereira newThirdStart = mEditable.toString().indexOf(third); 48097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), newThirdStart); 48197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 1]), newThirdStart 48297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira + third.length()); 48397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira 484fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira // Test removing the last chip. 48597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira populateMocks(3); 48697cb25912dab282cf732757f68b0405ed005f00bMindy Pereira view = createViewForTesting(); 48797cb25912dab282cf732757f68b0405ed005f00bMindy Pereira view.setMoreItem(createTestMoreItem()); 48897cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable = new SpannableStringBuilder(); 48997cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.append(first + second + third); 49097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira 49197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira firstStart = mEditable.toString().indexOf(first); 49297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira firstEnd = firstStart + first.length(); 49397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira secondStart = mEditable.toString().indexOf(second); 49497cb25912dab282cf732757f68b0405ed005f00bMindy Pereira secondEnd = secondStart + second.length(); 49597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira thirdStart = mEditable.toString().indexOf(third); 49697cb25912dab282cf732757f68b0405ed005f00bMindy Pereira thirdEnd = thirdStart + third.length(); 49797cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0); 49897cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0); 49997cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0); 50097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.toString(), first + second + third); 50197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira view.removeChip(mMockRecips[mMockRecips.length - 1]); 50297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.toString(), first + second); 50397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), firstStart); 50497cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 3]), firstEnd); 50597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), secondStart); 50697cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 2]), secondEnd); 50797cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), -1); 50897cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 1]), -1); 50997cb25912dab282cf732757f68b0405ed005f00bMindy Pereira } 51097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira 51197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira public void testReplaceChip() { 51297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira populateMocks(3); 51397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira MockRecipientEditTextView view = createViewForTesting(); 51497cb25912dab282cf732757f68b0405ed005f00bMindy Pereira view.setMoreItem(createTestMoreItem()); 51597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira view.setChipBackground(createChipBackground()); 51697cb25912dab282cf732757f68b0405ed005f00bMindy Pereira view.setChipHeight(48); 51797cb25912dab282cf732757f68b0405ed005f00bMindy Pereira String first = (String) mTokenizer.terminateToken("FIRST"); 51897cb25912dab282cf732757f68b0405ed005f00bMindy Pereira String second = (String) mTokenizer.terminateToken("SECOND"); 51997cb25912dab282cf732757f68b0405ed005f00bMindy Pereira String third = (String) mTokenizer.terminateToken("THIRD"); 52097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable = new SpannableStringBuilder(); 52197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.append(first + second + third); 52297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira 523fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira // Test replacing the first chip with a new chip. 52497cb25912dab282cf732757f68b0405ed005f00bMindy Pereira int firstStart = mEditable.toString().indexOf(first); 52562397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira int firstEnd = firstStart + first.trim().length(); 52697cb25912dab282cf732757f68b0405ed005f00bMindy Pereira int secondStart = mEditable.toString().indexOf(second); 52762397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira int secondEnd = secondStart + second.trim().length(); 52897cb25912dab282cf732757f68b0405ed005f00bMindy Pereira int thirdStart = mEditable.toString().indexOf(third); 52962397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira int thirdEnd = thirdStart + third.trim().length(); 53097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0); 53197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0); 53297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0); 53397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.toString(), first + second + third); 53497cb25912dab282cf732757f68b0405ed005f00bMindy Pereira view.replaceChip(mMockRecips[mMockRecips.length - 3], RecipientEntry 53597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira .constructGeneratedEntry("replacement", "replacement@replacement.com")); 53697cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.toString(), mTokenizer 53797cb25912dab282cf732757f68b0405ed005f00bMindy Pereira .terminateToken("replacement <replacement@replacement.com>") 53897cb25912dab282cf732757f68b0405ed005f00bMindy Pereira + second + third); 53997cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), -1); 54097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 3]), -1); 54197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), mEditable 54297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira .toString().indexOf(second)); 54397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 2]), mEditable 54497cb25912dab282cf732757f68b0405ed005f00bMindy Pereira .toString().indexOf(second) 54562397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira + second.trim().length()); 54697cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), mEditable 54797cb25912dab282cf732757f68b0405ed005f00bMindy Pereira .toString().indexOf(third)); 54897cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 1]), mEditable 54997cb25912dab282cf732757f68b0405ed005f00bMindy Pereira .toString().indexOf(third) 55062397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira + third.trim().length()); 55197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira RecipientChip[] spans = mEditable.getSpans(0, mEditable.length(), RecipientChip.class); 55297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(spans.length, 3); 55397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira spans = mEditable 55497cb25912dab282cf732757f68b0405ed005f00bMindy Pereira .getSpans(0, mEditable.toString().indexOf(second) - 1, RecipientChip.class); 55597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals((String) spans[0].getDisplay(), "replacement"); 556fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira 557fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira 558fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira // Test replacing the middle chip with a new chip. 559fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira mEditable = new SpannableStringBuilder(); 560fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira mEditable.append(first + second + third); 561fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira firstStart = mEditable.toString().indexOf(first); 56262397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira firstEnd = firstStart + first.trim().length(); 563fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira secondStart = mEditable.toString().indexOf(second); 56462397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira secondEnd = secondStart + second.trim().length(); 565fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira thirdStart = mEditable.toString().indexOf(third); 56662397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira thirdEnd = thirdStart + third.trim().length(); 567fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0); 568fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0); 569fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0); 570fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira assertEquals(mEditable.toString(), first + second + third); 571fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira view.replaceChip(mMockRecips[mMockRecips.length - 2], RecipientEntry 572fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira .constructGeneratedEntry("replacement", "replacement@replacement.com")); 57362397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira assertEquals(mEditable.toString(), first + mTokenizer 57462397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira .terminateToken("replacement <replacement@replacement.com>") + third); 575fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), firstStart); 576fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 3]), firstEnd); 577fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), -1); 578fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 2]), -1); 579fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), mEditable 580fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira .toString().indexOf(third)); 581fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 1]), mEditable 582fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira .toString().indexOf(third) 58362397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira + third.trim().length()); 584fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira spans = mEditable.getSpans(0, mEditable.length(), RecipientChip.class); 585fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira assertEquals(spans.length, 3); 586fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira spans = mEditable 587fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira .getSpans(firstEnd, mEditable.toString().indexOf(third) - 1, RecipientChip.class); 588fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira assertEquals((String) spans[0].getDisplay(), "replacement"); 589fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira 590fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira 591fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira // Test replacing the last chip with a new chip. 592fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira mEditable = new SpannableStringBuilder(); 593fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira mEditable.append(first + second + third); 594fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira firstStart = mEditable.toString().indexOf(first); 59562397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira firstEnd = firstStart + first.trim().length(); 596fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira secondStart = mEditable.toString().indexOf(second); 59762397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira secondEnd = secondStart + second.trim().length(); 598fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira thirdStart = mEditable.toString().indexOf(third); 59962397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira thirdEnd = thirdStart + third.trim().length(); 600fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0); 601fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0); 602fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0); 603fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira assertEquals(mEditable.toString(), first + second + third); 604fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira view.replaceChip(mMockRecips[mMockRecips.length - 1], RecipientEntry 605fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira .constructGeneratedEntry("replacement", "replacement@replacement.com")); 60662397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira assertEquals(mEditable.toString(), first + second + mTokenizer 60762397a5ac6b2df89ec4c2f8f23680add5850c17aMindy Pereira .terminateToken("replacement <replacement@replacement.com>")); 608fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), firstStart); 609fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 3]), firstEnd); 610fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), secondStart); 611fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 2]), secondEnd); 612fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), -1); 613fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 1]), -1); 614fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira spans = mEditable.getSpans(0, mEditable.length(), RecipientChip.class); 615fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira assertEquals(spans.length, 3); 616fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira spans = mEditable 617fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira .getSpans(secondEnd, mEditable.length(), RecipientChip.class); 618fecc6f882abd4287cdffafa947457e06b1db5112Mindy Pereira assertEquals((String) spans[0].getDisplay(), "replacement"); 61997cb25912dab282cf732757f68b0405ed005f00bMindy Pereira } 62097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira 62120c9d620e79ae28994856541761a951074551518Mindy Pereira public void testHandlePaste() { 62220c9d620e79ae28994856541761a951074551518Mindy Pereira // Start with an empty edit field. 62320c9d620e79ae28994856541761a951074551518Mindy Pereira // Add an address; the text should be left as is. 62420c9d620e79ae28994856541761a951074551518Mindy Pereira MockRecipientEditTextView view = createViewForTesting(); 62520c9d620e79ae28994856541761a951074551518Mindy Pereira view.setMoreItem(createTestMoreItem()); 62620c9d620e79ae28994856541761a951074551518Mindy Pereira view.setChipBackground(createChipBackground()); 62720c9d620e79ae28994856541761a951074551518Mindy Pereira view.setChipHeight(48); 62820c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable = new SpannableStringBuilder(); 62920c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable.append("user@user.com"); 63020c9d620e79ae28994856541761a951074551518Mindy Pereira view.setSelection(mEditable.length()); 63120c9d620e79ae28994856541761a951074551518Mindy Pereira view.handlePaste(); 63220c9d620e79ae28994856541761a951074551518Mindy Pereira assertEquals(mEditable.getSpans(0, mEditable.length(), RecipientChip.class).length, 0); 63320c9d620e79ae28994856541761a951074551518Mindy Pereira assertEquals(mEditable.toString(), "user@user.com"); 63420c9d620e79ae28994856541761a951074551518Mindy Pereira 63520c9d620e79ae28994856541761a951074551518Mindy Pereira // Test adding a single address to an empty chips field with a space at 63620c9d620e79ae28994856541761a951074551518Mindy Pereira // the end of it. The address should stay as text. 63720c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable = new SpannableStringBuilder(); 63820c9d620e79ae28994856541761a951074551518Mindy Pereira String tokenizedUser = "user@user.com" + " "; 63920c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable.append(tokenizedUser); 64020c9d620e79ae28994856541761a951074551518Mindy Pereira view.setSelection(mEditable.length()); 64120c9d620e79ae28994856541761a951074551518Mindy Pereira view.handlePaste(); 64220c9d620e79ae28994856541761a951074551518Mindy Pereira assertEquals(mEditable.getSpans(0, mEditable.length(), RecipientChip.class).length, 0); 64320c9d620e79ae28994856541761a951074551518Mindy Pereira assertEquals(mEditable.toString(), tokenizedUser); 64420c9d620e79ae28994856541761a951074551518Mindy Pereira 64520c9d620e79ae28994856541761a951074551518Mindy Pereira // Test adding a single address to an empty chips field with a semicolon at 64620c9d620e79ae28994856541761a951074551518Mindy Pereira // the end of it. The address should become a chip 64720c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable = new SpannableStringBuilder(); 64820c9d620e79ae28994856541761a951074551518Mindy Pereira tokenizedUser = "user@user.com;"; 64920c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable.append(tokenizedUser); 65020c9d620e79ae28994856541761a951074551518Mindy Pereira view.setSelection(mEditable.length()); 65120c9d620e79ae28994856541761a951074551518Mindy Pereira view.handlePaste(); 65220c9d620e79ae28994856541761a951074551518Mindy Pereira assertEquals(mEditable.getSpans(0, mEditable.length(), RecipientChip.class).length, 1); 65320c9d620e79ae28994856541761a951074551518Mindy Pereira 65420c9d620e79ae28994856541761a951074551518Mindy Pereira // Test adding 2 address to an empty chips field. The second to last 65520c9d620e79ae28994856541761a951074551518Mindy Pereira // address should become a chip and the last address should stay as 65620c9d620e79ae28994856541761a951074551518Mindy Pereira // text. 65720c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable = new SpannableStringBuilder(); 65820c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable.append("user1,user2@user.com"); 65920c9d620e79ae28994856541761a951074551518Mindy Pereira view.setSelection(mEditable.length()); 66020c9d620e79ae28994856541761a951074551518Mindy Pereira view.handlePaste(); 66120c9d620e79ae28994856541761a951074551518Mindy Pereira assertEquals(mEditable.getSpans(0, mEditable.length(), RecipientChip.class).length, 1); 66220c9d620e79ae28994856541761a951074551518Mindy Pereira assertEquals(mEditable.getSpans(0, mEditable.toString().indexOf("user2@user.com"), 66320c9d620e79ae28994856541761a951074551518Mindy Pereira RecipientChip.class).length, 1); 66420c9d620e79ae28994856541761a951074551518Mindy Pereira assertEquals(mEditable.toString(), "<user1>, user2@user.com"); 66520c9d620e79ae28994856541761a951074551518Mindy Pereira 66620c9d620e79ae28994856541761a951074551518Mindy Pereira // Test adding a single address to the end of existing chips. The existing 66720c9d620e79ae28994856541761a951074551518Mindy Pereira // chips should remain, and the last address should stay as text. 66820c9d620e79ae28994856541761a951074551518Mindy Pereira populateMocks(3); 66920c9d620e79ae28994856541761a951074551518Mindy Pereira String first = (String) mTokenizer.terminateToken("FIRST"); 67020c9d620e79ae28994856541761a951074551518Mindy Pereira String second = (String) mTokenizer.terminateToken("SECOND"); 67120c9d620e79ae28994856541761a951074551518Mindy Pereira String third = (String) mTokenizer.terminateToken("THIRD"); 67220c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable = new SpannableStringBuilder(); 67320c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable.append(first + second + third); 67420c9d620e79ae28994856541761a951074551518Mindy Pereira view.setSelection(mEditable.length()); 67520c9d620e79ae28994856541761a951074551518Mindy Pereira int firstStart = mEditable.toString().indexOf(first); 67620c9d620e79ae28994856541761a951074551518Mindy Pereira int firstEnd = firstStart + first.trim().length(); 67720c9d620e79ae28994856541761a951074551518Mindy Pereira int secondStart = mEditable.toString().indexOf(second); 67820c9d620e79ae28994856541761a951074551518Mindy Pereira int secondEnd = secondStart + second.trim().length(); 67920c9d620e79ae28994856541761a951074551518Mindy Pereira int thirdStart = mEditable.toString().indexOf(third); 68020c9d620e79ae28994856541761a951074551518Mindy Pereira int thirdEnd = thirdStart + third.trim().length(); 68120c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0); 68220c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0); 68320c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0); 68420c9d620e79ae28994856541761a951074551518Mindy Pereira 68520c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable.append("user@user.com"); 68620c9d620e79ae28994856541761a951074551518Mindy Pereira view.setSelection(mEditable.length()); 68720c9d620e79ae28994856541761a951074551518Mindy Pereira view.handlePaste(); 68820c9d620e79ae28994856541761a951074551518Mindy Pereira assertEquals(mEditable.getSpans(0, mEditable.length(), RecipientChip.class).length, 68920c9d620e79ae28994856541761a951074551518Mindy Pereira mMockRecips.length); 69020c9d620e79ae28994856541761a951074551518Mindy Pereira assertEquals(mEditable.toString(), first + second + third + "user@user.com"); 69120c9d620e79ae28994856541761a951074551518Mindy Pereira 69220c9d620e79ae28994856541761a951074551518Mindy Pereira // Paste 2 addresses after existing chips. We expect the first address to be turned into 69320c9d620e79ae28994856541761a951074551518Mindy Pereira // a chip and the second to be left as text. 69420c9d620e79ae28994856541761a951074551518Mindy Pereira populateMocks(3); 69520c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable = new SpannableStringBuilder(); 69620c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable.append(first + second + third); 69720c9d620e79ae28994856541761a951074551518Mindy Pereira 69820c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0); 69920c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0); 70020c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0); 70120c9d620e79ae28994856541761a951074551518Mindy Pereira 70220c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable.append("user1, user2@user.com"); 70320c9d620e79ae28994856541761a951074551518Mindy Pereira view.setSelection(mEditable.length()); 70420c9d620e79ae28994856541761a951074551518Mindy Pereira view.handlePaste(); 70520c9d620e79ae28994856541761a951074551518Mindy Pereira assertEquals(mEditable.getSpans(0, mEditable.length(), RecipientChip.class).length, 70620c9d620e79ae28994856541761a951074551518Mindy Pereira mMockRecips.length + 1); 70720c9d620e79ae28994856541761a951074551518Mindy Pereira assertEquals(mEditable.getSpans(mEditable.toString().indexOf("<user1>"), mEditable 70820c9d620e79ae28994856541761a951074551518Mindy Pereira .toString().indexOf("user2@user.com") - 1, RecipientChip.class).length, 1); 70920c9d620e79ae28994856541761a951074551518Mindy Pereira assertEquals(mEditable.getSpans(mEditable.toString().indexOf("user2@user.com"), mEditable 71020c9d620e79ae28994856541761a951074551518Mindy Pereira .length(), RecipientChip.class).length, 0); 71120c9d620e79ae28994856541761a951074551518Mindy Pereira assertEquals(mEditable.toString(), first + second + third + "<user1>, user2@user.com"); 71220c9d620e79ae28994856541761a951074551518Mindy Pereira 71320c9d620e79ae28994856541761a951074551518Mindy Pereira // Paste 2 addresses after existing chips. We expect the first address to be turned into 71420c9d620e79ae28994856541761a951074551518Mindy Pereira // a chip and the second to be left as text. This removes the space seperator char between 71520c9d620e79ae28994856541761a951074551518Mindy Pereira // addresses. 71620c9d620e79ae28994856541761a951074551518Mindy Pereira populateMocks(3); 71720c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable = new SpannableStringBuilder(); 71820c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable.append(first + second + third); 71920c9d620e79ae28994856541761a951074551518Mindy Pereira 72020c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0); 72120c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0); 72220c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0); 72320c9d620e79ae28994856541761a951074551518Mindy Pereira 72420c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable.append("user1,user2@user.com"); 72520c9d620e79ae28994856541761a951074551518Mindy Pereira view.setSelection(mEditable.length()); 72620c9d620e79ae28994856541761a951074551518Mindy Pereira view.handlePaste(); 72720c9d620e79ae28994856541761a951074551518Mindy Pereira assertEquals(mEditable.getSpans(0, mEditable.length(), RecipientChip.class).length, 72820c9d620e79ae28994856541761a951074551518Mindy Pereira mMockRecips.length + 1); 72920c9d620e79ae28994856541761a951074551518Mindy Pereira assertEquals(mEditable.getSpans(mEditable.toString().indexOf("<user1>"), mEditable 73020c9d620e79ae28994856541761a951074551518Mindy Pereira .toString().indexOf("user2@user.com") - 1, RecipientChip.class).length, 1); 73120c9d620e79ae28994856541761a951074551518Mindy Pereira assertEquals(mEditable.getSpans(mEditable.toString().indexOf("user2@user.com"), mEditable 73220c9d620e79ae28994856541761a951074551518Mindy Pereira .length(), RecipientChip.class).length, 0); 73320c9d620e79ae28994856541761a951074551518Mindy Pereira assertEquals(mEditable.toString(), first + second + third + "<user1>, user2@user.com"); 73420c9d620e79ae28994856541761a951074551518Mindy Pereira 73520c9d620e79ae28994856541761a951074551518Mindy Pereira // Test a complete token pasted in at the end. It should be turned into a chip. 73620c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable = new SpannableStringBuilder(); 73720c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable.append("user1, user2@user.com,"); 73820c9d620e79ae28994856541761a951074551518Mindy Pereira view.setSelection(mEditable.length()); 73920c9d620e79ae28994856541761a951074551518Mindy Pereira view.handlePaste(); 74020c9d620e79ae28994856541761a951074551518Mindy Pereira assertEquals(mEditable.getSpans(0, mEditable.length(), RecipientChip.class).length, 2); 74120c9d620e79ae28994856541761a951074551518Mindy Pereira assertEquals(mEditable.getSpans(mEditable.toString().indexOf("<user1>"), mEditable 74220c9d620e79ae28994856541761a951074551518Mindy Pereira .toString().indexOf("user2@user.com") - 1, RecipientChip.class).length, 1); 74320c9d620e79ae28994856541761a951074551518Mindy Pereira assertEquals(mEditable.getSpans(mEditable.toString().indexOf("user2@user.com"), mEditable 74420c9d620e79ae28994856541761a951074551518Mindy Pereira .length(), RecipientChip.class).length, 1); 74520c9d620e79ae28994856541761a951074551518Mindy Pereira assertEquals(mEditable.toString(), "<user1>, <user2@user.com>, "); 74620c9d620e79ae28994856541761a951074551518Mindy Pereira } 74720c9d620e79ae28994856541761a951074551518Mindy Pereira 74820c9d620e79ae28994856541761a951074551518Mindy Pereira public void testGetPastTerminators() { 74920c9d620e79ae28994856541761a951074551518Mindy Pereira MockRecipientEditTextView view = createViewForTesting(); 75020c9d620e79ae28994856541761a951074551518Mindy Pereira view.setMoreItem(createTestMoreItem()); 75120c9d620e79ae28994856541761a951074551518Mindy Pereira view.setChipBackground(createChipBackground()); 75220c9d620e79ae28994856541761a951074551518Mindy Pereira view.setChipHeight(48); 75320c9d620e79ae28994856541761a951074551518Mindy Pereira String test = "test"; 75420c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable = new SpannableStringBuilder(); 75520c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable.append(test); 75620c9d620e79ae28994856541761a951074551518Mindy Pereira assertEquals(view.movePastTerminators(mTokenizer.findTokenEnd(mEditable.toString(), 0)), 75720c9d620e79ae28994856541761a951074551518Mindy Pereira test.length()); 75820c9d620e79ae28994856541761a951074551518Mindy Pereira 75920c9d620e79ae28994856541761a951074551518Mindy Pereira test = "test,"; 76020c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable = new SpannableStringBuilder(); 76120c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable.append(test); 76220c9d620e79ae28994856541761a951074551518Mindy Pereira assertEquals(view.movePastTerminators(mTokenizer.findTokenEnd(mEditable.toString(), 0)), 76320c9d620e79ae28994856541761a951074551518Mindy Pereira test.length()); 76420c9d620e79ae28994856541761a951074551518Mindy Pereira 76520c9d620e79ae28994856541761a951074551518Mindy Pereira test = "test, "; 76620c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable = new SpannableStringBuilder(); 76720c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable.append(test); 76820c9d620e79ae28994856541761a951074551518Mindy Pereira assertEquals(view.movePastTerminators(mTokenizer.findTokenEnd(mEditable.toString(), 0)), 76920c9d620e79ae28994856541761a951074551518Mindy Pereira test.length()); 77020c9d620e79ae28994856541761a951074551518Mindy Pereira 77120c9d620e79ae28994856541761a951074551518Mindy Pereira test = "test;"; 77220c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable = new SpannableStringBuilder(); 77320c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable.append(test); 77420c9d620e79ae28994856541761a951074551518Mindy Pereira assertEquals(view.movePastTerminators(mTokenizer.findTokenEnd(mEditable.toString(), 0)), 77520c9d620e79ae28994856541761a951074551518Mindy Pereira test.length()); 77620c9d620e79ae28994856541761a951074551518Mindy Pereira 77720c9d620e79ae28994856541761a951074551518Mindy Pereira test = "test; "; 77820c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable = new SpannableStringBuilder(); 77920c9d620e79ae28994856541761a951074551518Mindy Pereira mEditable.append(test); 78020c9d620e79ae28994856541761a951074551518Mindy Pereira assertEquals(view.movePastTerminators(mTokenizer.findTokenEnd(mEditable.toString(), 0)), 78120c9d620e79ae28994856541761a951074551518Mindy Pereira test.length()); 78220c9d620e79ae28994856541761a951074551518Mindy Pereira } 78320c9d620e79ae28994856541761a951074551518Mindy Pereira 78420c9d620e79ae28994856541761a951074551518Mindy Pereira public void testIsCompletedToken() { 78520c9d620e79ae28994856541761a951074551518Mindy Pereira MockRecipientEditTextView view = createViewForTesting(); 78620c9d620e79ae28994856541761a951074551518Mindy Pereira view.setMoreItem(createTestMoreItem()); 78720c9d620e79ae28994856541761a951074551518Mindy Pereira view.setChipBackground(createChipBackground()); 78820c9d620e79ae28994856541761a951074551518Mindy Pereira view.setChipHeight(48); 78920c9d620e79ae28994856541761a951074551518Mindy Pereira assertTrue(view.isCompletedToken("test;")); 79020c9d620e79ae28994856541761a951074551518Mindy Pereira assertTrue(view.isCompletedToken("test,")); 79120c9d620e79ae28994856541761a951074551518Mindy Pereira assertFalse(view.isCompletedToken("test")); 79220c9d620e79ae28994856541761a951074551518Mindy Pereira assertFalse(view.isCompletedToken("test ")); 79320c9d620e79ae28994856541761a951074551518Mindy Pereira } 79420c9d620e79ae28994856541761a951074551518Mindy Pereira 795aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira public void testGetLastChip() { 796aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira populateMocks(3); 797aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira MockRecipientEditTextView view = createViewForTesting(); 798aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira view.setMoreItem(createTestMoreItem()); 799aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira view.setChipBackground(createChipBackground()); 800aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira view.setChipHeight(48); 801aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira String first = (String) mTokenizer.terminateToken("FIRST"); 802aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira String second = (String) mTokenizer.terminateToken("SECOND"); 803aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira String third = (String) mTokenizer.terminateToken("THIRD"); 804aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira mEditable = new SpannableStringBuilder(); 805aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira mEditable.append(first + second + third); 806aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira 807aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira // Test replacing the first chip with a new chip. 808aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira int firstStart = mEditable.toString().indexOf(first); 809aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira int firstEnd = firstStart + first.trim().length(); 810aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira int secondStart = mEditable.toString().indexOf(second); 811aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira int secondEnd = secondStart + second.trim().length(); 812aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira int thirdStart = mEditable.toString().indexOf(third); 813aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira int thirdEnd = thirdStart + third.trim().length(); 814aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0); 815aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0); 816aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0); 817aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira assertEquals(view.getLastChip(), mMockRecips[mMockRecips.length - 1]); 818aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira mEditable.append("extra"); 819aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira assertEquals(view.getLastChip(), mMockRecips[mMockRecips.length - 1]); 820aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira } 821aca23c4de8d85b04e6044c9a8f047c337cf427c9Mindy Pereira 82297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira private Drawable createChipBackground() { 82397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira Bitmap drawable = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888); 82497cb25912dab282cf732757f68b0405ed005f00bMindy Pereira return new BitmapDrawable(getContext().getResources(), drawable); 82597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira } 82697cb25912dab282cf732757f68b0405ed005f00bMindy Pereira 827d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira private TextView createTestMoreItem() { 828d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira TextView view = new TextView(getContext()); 829d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira view.setText("<xliff:g id='count'>%1$s</xliff:g> more..."); 830d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira return view; 831d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira } 832d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 8338eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira private void populateMocks(int size) { 8348eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira mMockEntries = new RecipientEntry[size]; 8358eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira for (int i = 0; i < size; i++) { 8368eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira mMockEntries[i] = RecipientEntry.constructGeneratedEntry("user", 8378eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira "user@username.com"); 8388eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira } 8398eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira mMockRecips = new RecipientChip[size]; 8408eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira for (int i = 0; i < size; i++) { 8418eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira mMockRecips[i] = new RecipientChip(null, mMockEntries[i], i); 8428eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira } 8437cb970b6d9b60b9b9828d40fea8cff395a40ecd9Mindy Pereira } 8447cb970b6d9b60b9b9828d40fea8cff395a40ecd9Mindy Pereira} 845