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