ChipsTest.java revision 97cb25912dab282cf732757f68b0405ed005f00b
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; 2401162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereiraimport android.text.Editable; 2501162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereiraimport android.text.SpannableStringBuilder; 26d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereiraimport android.text.style.ImageSpan; 2701162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereiraimport android.text.util.Rfc822Tokenizer; 28d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereiraimport android.widget.TextView; 2901162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 3001162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereiraimport com.android.ex.chips.RecipientEditTextView; 3101162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereiraimport com.android.ex.chips.RecipientEntry; 3201162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 337cb970b6d9b60b9b9828d40fea8cff395a40ecd9Mindy Pereira 347cb970b6d9b60b9b9828d40fea8cff395a40ecd9Mindy Pereirapublic class ChipsTest extends AndroidTestCase { 358eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira private RecipientChip[] mMockRecips; 3601162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 378eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira private RecipientEntry[] mMockEntries; 3801162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 3901162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira private Rfc822Tokenizer mTokenizer; 4001162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 4101162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira private Editable mEditable; 4201162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 4301162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira class MockRecipientEditTextView extends RecipientEditTextView { 4401162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 4501162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira public MockRecipientEditTextView(Context context) { 4601162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira super(context, null); 4701162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira mTokenizer = new Rfc822Tokenizer(); 4801162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira setTokenizer(mTokenizer); 4901162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira } 5001162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 5101162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira @Override 5201162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira public RecipientChip[] getSortedRecipients() { 5301162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira return mMockRecips; 5401162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira } 5501162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 5601162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira @Override 5701162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira public Editable getText() { 5801162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira return mEditable; 5901162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira } 6001162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 6101162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira @Override 6201162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira public Editable getSpannable() { 6301162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira return mEditable; 6401162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira } 65d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 66d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira @Override 67d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira public int getLineHeight() { 68d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira return 48; 69d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira } 7097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira 7197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira public Drawable getChipBackground(RecipientEntry contact) { 7297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira return createChipBackground(); 7397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira } 7401162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira } 7501162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 7601162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira private MockRecipientEditTextView createViewForTesting() { 7701162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira mEditable = new SpannableStringBuilder(); 7801162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira MockRecipientEditTextView view = new MockRecipientEditTextView(getContext()); 7901162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira return view; 8001162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira } 8101162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 8201162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira public void testCreateDisplayText() { 8301162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira RecipientEditTextView view = createViewForTesting(); 8401162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira RecipientEntry entry = RecipientEntry.constructGeneratedEntry("User Name, Jr", 8501162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira "user@username.com"); 8601162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira String test = view.createDisplayText(entry); 8701162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira assertEquals("Expected a properly formatted RFC email address", 8801162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira "\"User Name, Jr\" <user@username.com>, ", test); 8901162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 9001162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira RecipientEntry alreadyFormatted = RecipientEntry.constructFakeEntry("user@username.com, "); 9101162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira test = view.createDisplayText(alreadyFormatted); 9201162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira assertEquals("Expected a properly formatted RFC email address", "<user@username.com>, ", 9301162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira test); 9401162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 9501162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira RecipientEntry alreadyFormattedNoSpace = RecipientEntry 9601162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira .constructFakeEntry("user@username.com,"); 9701162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira test = view.createDisplayText(alreadyFormattedNoSpace); 9801162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira assertEquals("Expected a properly formatted RFC email address", "<user@username.com>, ", 9901162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira test); 10001162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira 10101162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira RecipientEntry alreadyNamed = RecipientEntry.constructGeneratedEntry("User Name", 10201162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira "\"User Name, Jr\" <user@username.com>"); 10301162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira test = view.createDisplayText(alreadyNamed); 10401162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira assertEquals( 10501162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira "Expected address that used the name not the excess address name", 10601162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira "User Name <user@username.com>, ", test); 10701162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira } 1087cb970b6d9b60b9b9828d40fea8cff395a40ecd9Mindy Pereira 10901162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira public void testSanitizeBetween() { 1108eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira populateMocks(2); 11101162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira MockRecipientEditTextView view = createViewForTesting(); 11201162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira String first = (String) mTokenizer.terminateToken("FIRST"); 11301162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira String second = (String) mTokenizer.terminateToken("SECOND"); 11401162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira String extra = "EXTRA"; 115d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable = new SpannableStringBuilder(); 11601162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira mEditable.append(first + extra + second); 11701162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira int firstStart = mEditable.toString().indexOf(first); 118dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int firstEnd = firstStart + first.length(); 11901162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira int secondStart = mEditable.toString().indexOf(second); 120dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int secondEnd = secondStart + second.length(); 12101162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 2], firstStart, firstEnd, 0); 12201162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 1], secondStart, secondEnd, 0); 12301162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira view.sanitizeBetween(); 12401162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira String editableString = mEditable.toString(); 12501162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira assertEquals(editableString.indexOf(extra), -1); 12601162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira assertEquals(editableString.indexOf(first), firstStart); 12701162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira assertEquals(editableString.indexOf(second), secondStart - extra.length()); 12801162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira assertEquals(editableString, (first + second)); 129399bda87ad1a4d003609d6d27afc50c8359846b9Mindy Pereira 13001162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira mEditable = new SpannableStringBuilder(); 1318eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira populateMocks(1); 1328eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira mEditable.append(extra); 13301162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira mEditable.append(first); 13401162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira firstStart = mEditable.toString().indexOf(first); 13501162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira firstEnd = firstStart + first.length(); 13601162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 1], firstStart, firstEnd, 0); 13701162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira view.sanitizeBetween(); 13801162ce6739af1c9d9870f8e7e489f805c7e6794Mindy Pereira assertEquals(mEditable.toString(), first); 1398eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), firstStart 1408eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira - extra.length()); 1418eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira } 1428eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira 143d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira public void testMoreChip() { 144d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira populateMocks(3); 145d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira MockRecipientEditTextView view = createViewForTesting(); 146d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira view.setMoreItem(createTestMoreItem()); 147d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String first = (String) mTokenizer.terminateToken("FIRST"); 148d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String second = (String) mTokenizer.terminateToken("SECOND"); 149d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String third = (String) mTokenizer.terminateToken("THIRD"); 150d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable = new SpannableStringBuilder(); 151d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.append(first+second+third); 152d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 153d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int firstStart = mEditable.toString().indexOf(first); 154dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int firstEnd = firstStart + first.length(); 155d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int secondStart = mEditable.toString().indexOf(second); 156dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int secondEnd = secondStart + second.length(); 157d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int thirdStart = mEditable.toString().indexOf(third); 158dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int thirdEnd = thirdStart + third.length(); 159d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0); 160d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0); 161d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0); 162d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 163d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira view.createMoreChip(); 164d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.toString(), first+second+third); 165d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), firstStart); 166d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), secondStart); 167d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira // Find the more chip. 168d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira ImageSpan moreChip = view.getMoreChip(); 169d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(moreChip), thirdStart); 170d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanEnd(moreChip), thirdEnd); 171d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 172d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira view.removeMoreChip(); 173d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.toString(), first+second+third); 174d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), firstStart); 175d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 3]), firstEnd); 176d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), secondStart); 177d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), thirdStart); 178d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 1]), thirdEnd); 179d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira moreChip = view.getMoreChip(); 180d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(moreChip), -1); 181d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 182d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira // Rinse and repeat, just in case! 183d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira view.createMoreChip(); 184d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.toString(), first+second+third); 185d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), firstStart); 186d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), secondStart); 187d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira // Find the more chip. 188d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira moreChip = view.getMoreChip(); 189d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(moreChip), thirdStart); 190d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanEnd(moreChip), thirdEnd); 191d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 192d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira view.removeMoreChip(); 193d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.toString(), first+second+third); 194d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), firstStart); 195d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 3]), firstEnd); 196d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), secondStart); 197d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), thirdStart); 198d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 1]), thirdEnd); 199d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira moreChip = view.getMoreChip(); 200d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(moreChip), -1); 201d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira } 202d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 203d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira public void testMoreChipLotsOfUsers() { 204d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira populateMocks(10); 205d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira MockRecipientEditTextView view = createViewForTesting(); 206d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira view.setMoreItem(createTestMoreItem()); 207d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String first = (String) mTokenizer.terminateToken("FIRST"); 208d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String second = (String) mTokenizer.terminateToken("SECOND"); 209d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String third = (String) mTokenizer.terminateToken("THIRD"); 210d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String fourth = (String) mTokenizer.terminateToken("FOURTH"); 211d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String fifth = (String) mTokenizer.terminateToken("FIFTH"); 212d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String sixth = (String) mTokenizer.terminateToken("SIXTH"); 213d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String seventh = (String) mTokenizer.terminateToken("SEVENTH"); 214d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String eigth = (String) mTokenizer.terminateToken("EIGHTH"); 215d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String ninth = (String) mTokenizer.terminateToken("NINTH"); 216d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String tenth = (String) mTokenizer.terminateToken("TENTH"); 217d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable = new SpannableStringBuilder(); 218d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.append(first+second+third+fourth+fifth+sixth+seventh+eigth+ninth+tenth); 219d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 220d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int firstStart = mEditable.toString().indexOf(first); 221dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int firstEnd = firstStart + first.length(); 222d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int secondStart = mEditable.toString().indexOf(second); 223dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int secondEnd = secondStart + second.length(); 224d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int thirdStart = mEditable.toString().indexOf(third); 225dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int thirdEnd = thirdStart + third.length(); 226d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int fourthStart = mEditable.toString().indexOf(fourth); 227dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int fourthEnd = fourthStart + fourth.length(); 228d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int fifthStart = mEditable.toString().indexOf(fifth); 229dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int fifthEnd = fifthStart + fifth.length(); 230d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int sixthStart = mEditable.toString().indexOf(sixth); 231dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int sixthEnd = sixthStart + sixth.length(); 232d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int seventhStart = mEditable.toString().indexOf(seventh); 233dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int seventhEnd = seventhStart + seventh.length(); 234d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int eighthStart = mEditable.toString().indexOf(eigth); 235dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int eighthEnd = eighthStart + eigth.length(); 236d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int ninthStart = mEditable.toString().indexOf(ninth); 237dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int ninthEnd = ninthStart + ninth.length(); 238d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int tenthStart = mEditable.toString().indexOf(tenth); 239dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int tenthEnd = tenthStart + tenth.length(); 240d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 10], firstStart, firstEnd, 0); 241d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 9], secondStart, secondEnd, 0); 242d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 8], thirdStart, thirdEnd, 0); 243d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 7], fourthStart, fourthEnd, 0); 244d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 6], fifthStart, fifthEnd, 0); 245d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 5], sixthStart, sixthEnd, 0); 246d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 4], seventhStart, seventhEnd, 0); 247d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 3], eighthStart, eighthEnd, 0); 248d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 2], ninthStart, ninthEnd, 0); 249d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 1], tenthStart, tenthEnd, 0); 250d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 251d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira view.createMoreChip(); 252d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.toString(), first + second + third + fourth + fifth + sixth 253d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira + seventh + eigth + ninth + tenth); 254d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 10]), firstStart); 255d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 9]), secondStart); 256d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira // Find the more chip. 257d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira ImageSpan moreChip = view.getMoreChip(); 258d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(moreChip), thirdStart); 259d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanEnd(moreChip), tenthEnd); 260d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 261d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira view.removeMoreChip(); 262d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.toString(), first + second + third + fourth + fifth + sixth 263d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira + seventh + eigth + ninth + tenth); 264d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 10]), firstStart); 265d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 9]), secondStart); 266d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 267d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 8]), thirdStart); 268d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 7]), fourthStart); 269d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 6]), fifthStart); 270d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 5]), sixthStart); 271d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 4]), seventhStart); 272d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), eighthStart); 273d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), ninthStart); 274d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), tenthStart); 275d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira moreChip = view.getMoreChip(); 276d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(moreChip), -1); 277d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 278d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira } 279d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 280d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira public void testMoreChipSpecialChars() { 281d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira populateMocks(3); 282d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira MockRecipientEditTextView view = createViewForTesting(); 283d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira view.setMoreItem(createTestMoreItem()); 284d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String first = (String) mTokenizer.terminateToken("FI,RST"); 285d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String second = (String) mTokenizer.terminateToken("SE,COND"); 286d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira String third = (String) mTokenizer.terminateToken("THI,RD"); 287d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable = new SpannableStringBuilder(); 288d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.append(first+second+third); 289d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 290d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int firstStart = mEditable.toString().indexOf(first); 291dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int firstEnd = firstStart + first.length(); 292d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int secondStart = mEditable.toString().indexOf(second); 293dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int secondEnd = secondStart + second.length(); 294d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira int thirdStart = mEditable.toString().indexOf(third); 295dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int thirdEnd = thirdStart + third.length(); 296d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0); 297d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0); 298d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0); 299d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 300d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira view.createMoreChip(); 301d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.toString(), first+second+third); 302d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), firstStart); 303d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), secondStart); 304d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira // Find the more chip. 305d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira ImageSpan moreChip = view.getMoreChip(); 306d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(moreChip), thirdStart); 307d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanEnd(moreChip), thirdEnd); 308d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 309d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira view.removeMoreChip(); 310d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.toString(), first+second+third); 311d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), firstStart); 312d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 3]), firstEnd); 313d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), secondStart); 314d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), thirdStart); 315d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 1]), thirdEnd); 316d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira moreChip = view.getMoreChip(); 317d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira assertEquals(mEditable.getSpanStart(moreChip), -1); 318d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira } 319d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 320dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira public void testMoreChipDupes() { 321dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira populateMocks(4); 322dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira MockRecipientEditTextView view = createViewForTesting(); 323dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira view.setMoreItem(createTestMoreItem()); 324dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira String first = (String) mTokenizer.terminateToken("FIRST"); 325dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira String second = (String) mTokenizer.terminateToken("SECOND"); 326dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira String third = (String) mTokenizer.terminateToken("THIRD"); 327dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira mEditable = new SpannableStringBuilder(); 328dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira mEditable.append(first+second+third+third); 329dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira 330dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int firstStart = mEditable.toString().indexOf(first); 331dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int firstEnd = firstStart + first.length(); 332dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int secondStart = mEditable.toString().indexOf(second); 333dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int secondEnd = secondStart + second.length(); 334dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int thirdStart = mEditable.toString().indexOf(third); 335dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int thirdEnd = thirdStart + third.length(); 336dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int thirdNextStart = mEditable.toString().indexOf(third, thirdEnd); 337dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira int thirdNextEnd = thirdNextStart + third.length(); 338dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 4], firstStart, firstEnd, 0); 339dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 3], secondStart, secondEnd, 0); 340dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 2], thirdStart, thirdEnd, 0); 341dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdNextStart, thirdNextEnd, 0); 342dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira 343dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira view.createMoreChip(); 344dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira assertEquals(mEditable.toString(), first+second+third+third); 345dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 4]), firstStart); 346dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), secondStart); 347dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira // Find the more chip. 348dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira ImageSpan moreChip = view.getMoreChip(); 349dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira assertEquals(mEditable.getSpanStart(moreChip), thirdStart); 350dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira assertEquals(mEditable.getSpanEnd(moreChip), thirdNextEnd); 351dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira 352dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira view.removeMoreChip(); 353dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira assertEquals(mEditable.toString(), first+second+third+third); 354dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 4]), firstStart); 355dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 4]), firstEnd); 356dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), secondStart); 357dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), thirdStart); 358dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 2]), thirdEnd); 359dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), thirdNextStart); 360dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 1]), thirdNextEnd); 361dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira moreChip = view.getMoreChip(); 362dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira assertEquals(mEditable.getSpanStart(moreChip), -1); 363dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira } 364dfeb97f6b18cdeff9872f8d32cd7a33baa1f8825Mindy Pereira 36597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira public void testMatchesChip() { 36697cb25912dab282cf732757f68b0405ed005f00bMindy Pereira populateMocks(3); 36797cb25912dab282cf732757f68b0405ed005f00bMindy Pereira MockRecipientEditTextView view = createViewForTesting(); 36897cb25912dab282cf732757f68b0405ed005f00bMindy Pereira view.setMoreItem(createTestMoreItem()); 36997cb25912dab282cf732757f68b0405ed005f00bMindy Pereira String first = (String) mTokenizer.terminateToken("FIRST"); 37097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira String second = (String) mTokenizer.terminateToken("SECOND"); 37197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira String third = (String) mTokenizer.terminateToken("THIRD"); 37297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable = new SpannableStringBuilder(); 37397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.append(first+second+third); 37497cb25912dab282cf732757f68b0405ed005f00bMindy Pereira 37597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira int firstStart = mEditable.toString().indexOf(first); 37697cb25912dab282cf732757f68b0405ed005f00bMindy Pereira int firstEnd = firstStart + first.length(); 37797cb25912dab282cf732757f68b0405ed005f00bMindy Pereira int secondStart = mEditable.toString().indexOf(second); 37897cb25912dab282cf732757f68b0405ed005f00bMindy Pereira int secondEnd = secondStart + second.length(); 37997cb25912dab282cf732757f68b0405ed005f00bMindy Pereira int thirdStart = mEditable.toString().indexOf(third); 38097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira int thirdEnd = thirdStart + third.length(); 38197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0); 38297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0); 38397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0); 38497cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertFalse(view.matchesChip(mMockRecips[mMockRecips.length - 3], -1)); 38597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertFalse(view.matchesChip(mMockRecips[mMockRecips.length - 1], mEditable.length() + 1)); 38697cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertTrue(view.matchesChip(mMockRecips[mMockRecips.length - 3], firstStart)); 38797cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertTrue(view.matchesChip(mMockRecips[mMockRecips.length - 3], firstEnd)); 38897cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertTrue(view.matchesChip(mMockRecips[mMockRecips.length - 3], firstEnd - 1)); 38997cb25912dab282cf732757f68b0405ed005f00bMindy Pereira } 39097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira 39197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira public void testRemoveChip() { 39297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira populateMocks(3); 39397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira MockRecipientEditTextView view = createViewForTesting(); 39497cb25912dab282cf732757f68b0405ed005f00bMindy Pereira view.setMoreItem(createTestMoreItem()); 39597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira String first = (String) mTokenizer.terminateToken("FIRST"); 39697cb25912dab282cf732757f68b0405ed005f00bMindy Pereira String second = (String) mTokenizer.terminateToken("SECOND"); 39797cb25912dab282cf732757f68b0405ed005f00bMindy Pereira String third = (String) mTokenizer.terminateToken("THIRD"); 39897cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable = new SpannableStringBuilder(); 39997cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.append(first + second + third); 40097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira 40197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira int firstStart = mEditable.toString().indexOf(first); 40297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira int firstEnd = firstStart + first.length(); 40397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira int secondStart = mEditable.toString().indexOf(second); 40497cb25912dab282cf732757f68b0405ed005f00bMindy Pereira int secondEnd = secondStart + second.length(); 40597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira int thirdStart = mEditable.toString().indexOf(third); 40697cb25912dab282cf732757f68b0405ed005f00bMindy Pereira int thirdEnd = thirdStart + third.length(); 40797cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0); 40897cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0); 40997cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0); 41097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.toString(), first + second + third); 41197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira view.removeChip(mMockRecips[mMockRecips.length - 2]); 41297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.toString(), first + third); 41397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), firstStart); 41497cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 3]), firstEnd); 41597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), -1); 41697cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 2]), -1); 41797cb25912dab282cf732757f68b0405ed005f00bMindy Pereira int newThirdStart = mEditable.toString().indexOf(third); 41897cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), newThirdStart); 41997cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 1]), newThirdStart 42097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira + third.length()); 42197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira 42297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira populateMocks(3); 42397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira view = createViewForTesting(); 42497cb25912dab282cf732757f68b0405ed005f00bMindy Pereira view.setMoreItem(createTestMoreItem()); 42597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable = new SpannableStringBuilder(); 42697cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.append(first + second + third); 42797cb25912dab282cf732757f68b0405ed005f00bMindy Pereira 42897cb25912dab282cf732757f68b0405ed005f00bMindy Pereira firstStart = mEditable.toString().indexOf(first); 42997cb25912dab282cf732757f68b0405ed005f00bMindy Pereira firstEnd = firstStart + first.length(); 43097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira secondStart = mEditable.toString().indexOf(second); 43197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira secondEnd = secondStart + second.length(); 43297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira thirdStart = mEditable.toString().indexOf(third); 43397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira thirdEnd = thirdStart + third.length(); 43497cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0); 43597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0); 43697cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0); 43797cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.toString(), first + second + third); 43897cb25912dab282cf732757f68b0405ed005f00bMindy Pereira view.removeChip(mMockRecips[mMockRecips.length - 3]); 43997cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.toString(), second + third); 44097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), -1); 44197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 3]), -1); 44297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), 0); 44397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 2]), second.length()); 44497cb25912dab282cf732757f68b0405ed005f00bMindy Pereira newThirdStart = mEditable.toString().indexOf(third); 44597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), newThirdStart); 44697cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 1]), newThirdStart 44797cb25912dab282cf732757f68b0405ed005f00bMindy Pereira + third.length()); 44897cb25912dab282cf732757f68b0405ed005f00bMindy Pereira 44997cb25912dab282cf732757f68b0405ed005f00bMindy Pereira populateMocks(3); 45097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira view = createViewForTesting(); 45197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira view.setMoreItem(createTestMoreItem()); 45297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable = new SpannableStringBuilder(); 45397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.append(first + second + third); 45497cb25912dab282cf732757f68b0405ed005f00bMindy Pereira 45597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira firstStart = mEditable.toString().indexOf(first); 45697cb25912dab282cf732757f68b0405ed005f00bMindy Pereira firstEnd = firstStart + first.length(); 45797cb25912dab282cf732757f68b0405ed005f00bMindy Pereira secondStart = mEditable.toString().indexOf(second); 45897cb25912dab282cf732757f68b0405ed005f00bMindy Pereira secondEnd = secondStart + second.length(); 45997cb25912dab282cf732757f68b0405ed005f00bMindy Pereira thirdStart = mEditable.toString().indexOf(third); 46097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira thirdEnd = thirdStart + third.length(); 46197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0); 46297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0); 46397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0); 46497cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.toString(), first + second + third); 46597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira view.removeChip(mMockRecips[mMockRecips.length - 1]); 46697cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.toString(), first + second); 46797cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), firstStart); 46897cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 3]), firstEnd); 46997cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), secondStart); 47097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 2]), secondEnd); 47197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), -1); 47297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 1]), -1); 47397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira } 47497cb25912dab282cf732757f68b0405ed005f00bMindy Pereira 47597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira public void testReplaceChip() { 47697cb25912dab282cf732757f68b0405ed005f00bMindy Pereira populateMocks(3); 47797cb25912dab282cf732757f68b0405ed005f00bMindy Pereira MockRecipientEditTextView view = createViewForTesting(); 47897cb25912dab282cf732757f68b0405ed005f00bMindy Pereira view.setMoreItem(createTestMoreItem()); 47997cb25912dab282cf732757f68b0405ed005f00bMindy Pereira view.setChipBackground(createChipBackground()); 48097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira view.setChipHeight(48); 48197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira String first = (String) mTokenizer.terminateToken("FIRST"); 48297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira String second = (String) mTokenizer.terminateToken("SECOND"); 48397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira String third = (String) mTokenizer.terminateToken("THIRD"); 48497cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable = new SpannableStringBuilder(); 48597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.append(first + second + third); 48697cb25912dab282cf732757f68b0405ed005f00bMindy Pereira 48797cb25912dab282cf732757f68b0405ed005f00bMindy Pereira int firstStart = mEditable.toString().indexOf(first); 48897cb25912dab282cf732757f68b0405ed005f00bMindy Pereira int firstEnd = firstStart + first.length(); 48997cb25912dab282cf732757f68b0405ed005f00bMindy Pereira int secondStart = mEditable.toString().indexOf(second); 49097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira int secondEnd = secondStart + second.length(); 49197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira int thirdStart = mEditable.toString().indexOf(third); 49297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira int thirdEnd = thirdStart + third.length(); 49397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0); 49497cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0); 49597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0); 49697cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.toString(), first + second + third); 49797cb25912dab282cf732757f68b0405ed005f00bMindy Pereira view.replaceChip(mMockRecips[mMockRecips.length - 3], RecipientEntry 49897cb25912dab282cf732757f68b0405ed005f00bMindy Pereira .constructGeneratedEntry("replacement", "replacement@replacement.com")); 49997cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.toString(), mTokenizer 50097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira .terminateToken("replacement <replacement@replacement.com>") 50197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira + second + third); 50297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), -1); 50397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 3]), -1); 50497cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), mEditable 50597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira .toString().indexOf(second)); 50697cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 2]), mEditable 50797cb25912dab282cf732757f68b0405ed005f00bMindy Pereira .toString().indexOf(second) 50897cb25912dab282cf732757f68b0405ed005f00bMindy Pereira + second.length()); 50997cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), mEditable 51097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira .toString().indexOf(third)); 51197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 1]), mEditable 51297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira .toString().indexOf(third) 51397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira + third.length()); 51497cb25912dab282cf732757f68b0405ed005f00bMindy Pereira RecipientChip[] spans = mEditable.getSpans(0, mEditable.length(), RecipientChip.class); 51597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals(spans.length, 3); 51697cb25912dab282cf732757f68b0405ed005f00bMindy Pereira spans = mEditable 51797cb25912dab282cf732757f68b0405ed005f00bMindy Pereira .getSpans(0, mEditable.toString().indexOf(second) - 1, RecipientChip.class); 51897cb25912dab282cf732757f68b0405ed005f00bMindy Pereira assertEquals((String) spans[0].getDisplay(), "replacement"); 51997cb25912dab282cf732757f68b0405ed005f00bMindy Pereira } 52097cb25912dab282cf732757f68b0405ed005f00bMindy Pereira 52197cb25912dab282cf732757f68b0405ed005f00bMindy Pereira private Drawable createChipBackground() { 52297cb25912dab282cf732757f68b0405ed005f00bMindy Pereira Bitmap drawable = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888); 52397cb25912dab282cf732757f68b0405ed005f00bMindy Pereira return new BitmapDrawable(getContext().getResources(), drawable); 52497cb25912dab282cf732757f68b0405ed005f00bMindy Pereira } 52597cb25912dab282cf732757f68b0405ed005f00bMindy Pereira 526d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira private TextView createTestMoreItem() { 527d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira TextView view = new TextView(getContext()); 528d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira view.setText("<xliff:g id='count'>%1$s</xliff:g> more..."); 529d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira return view; 530d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira } 531d71925073f008dccd8c4b65d5d66534e6451e64dMindy Pereira 5328eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira private void populateMocks(int size) { 5338eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira mMockEntries = new RecipientEntry[size]; 5348eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira for (int i = 0; i < size; i++) { 5358eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira mMockEntries[i] = RecipientEntry.constructGeneratedEntry("user", 5368eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira "user@username.com"); 5378eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira } 5388eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira mMockRecips = new RecipientChip[size]; 5398eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira for (int i = 0; i < size; i++) { 5408eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira mMockRecips[i] = new RecipientChip(null, mMockEntries[i], i); 5418eb031e6de46e477412d92ab0c5ef20b431f1804Mindy Pereira } 5427cb970b6d9b60b9b9828d40fea8cff395a40ecd9Mindy Pereira } 5437cb970b6d9b60b9b9828d40fea8cff395a40ecd9Mindy Pereira} 544