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