182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir/* 282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * Copyright (C) 2017 The Android Open Source Project 382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * 482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * Licensed under the Apache License, Version 2.0 (the "License"); 582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * you may not use this file except in compliance with the License. 682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * You may obtain a copy of the License at 782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * 882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * http://www.apache.org/licenses/LICENSE-2.0 982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * 1082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * Unless required by applicable law or agreed to in writing, software 1182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * distributed under the License is distributed on an "AS IS" BASIS, 1282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * See the License for the specific language governing permissions and 1482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * limitations under the License. 1582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir */ 1682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirpackage android.support.text.emoji; 1782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 1882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static android.support.text.emoji.util.Emoji.EMOJI_FLAG; 1982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static android.support.text.emoji.util.Emoji.EMOJI_WITH_ZWJ; 2082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static android.support.text.emoji.util.EmojiMatcher.hasEmoji; 2182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static android.support.text.emoji.util.EmojiMatcher.hasEmojiCount; 2282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 2382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static junit.framework.Assert.assertFalse; 2482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static junit.framework.TestCase.assertEquals; 2582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 2682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static org.hamcrest.MatcherAssert.assertThat; 2782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static org.hamcrest.core.IsNot.not; 2882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static org.junit.Assert.assertTrue; 2982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static org.mockito.Mockito.mock; 3082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 319546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinirimport android.annotation.SuppressLint; 329546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinirimport android.support.test.filters.SdkSuppress; 3382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.support.test.filters.SmallTest; 3482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.support.test.runner.AndroidJUnit4; 3582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.support.text.emoji.util.Emoji; 3682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.support.text.emoji.util.TestString; 3782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.text.Editable; 3882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.text.Selection; 3982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.text.SpannableStringBuilder; 4082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.view.inputmethod.InputConnection; 4182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 4282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport org.junit.Before; 4382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport org.junit.BeforeClass; 4482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport org.junit.Test; 4582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport org.junit.runner.RunWith; 4682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 4782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir@SmallTest 4882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir@RunWith(AndroidJUnit4.class) 499546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinir@SdkSuppress(minSdkVersion = 19) 5082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirpublic class SoftDeleteTest { 5182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir private InputConnection mInputConnection; 5282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir private TestString mTestString; 5382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir private Editable mEditable; 5482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 5582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @BeforeClass 5682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public static void setupEmojiCompat() { 5782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir EmojiCompat.reset(TestConfigBuilder.config()); 5882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 5982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 6082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Before 6182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void setup() { 6282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir mInputConnection = mock(InputConnection.class); 6382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir mTestString = new TestString(Emoji.EMOJI_WITH_ZWJ).withPrefix().withSuffix(); 6482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir mEditable = new SpannableStringBuilder(mTestString.toString()); 6582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir EmojiCompat.get().process(mEditable); 6682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, hasEmojiCount(1)); 6782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, hasEmoji(EMOJI_WITH_ZWJ)); 6882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 6982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 7082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 7182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testDelete_doesNotDelete_whenSelectionIsUndefined() { 7282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir // no selection is set on editable 7382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertFalse(EmojiCompat.handleDeleteSurroundingText(mInputConnection, mEditable, 1, 0, 7482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir false)); 7582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 7682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, hasEmoji(EMOJI_WITH_ZWJ)); 7782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(mTestString.toString(), mEditable.toString()); 7882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 7982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 8082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 8182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testDelete_doesNotDelete_whenThereIsSelectionLongerThanZero() { 8282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir Selection.setSelection(mEditable, mTestString.emojiStartIndex(), 8382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir mTestString.emojiEndIndex() + 1); 8482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 8582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertFalse(EmojiCompat.handleDeleteSurroundingText(mInputConnection, mEditable, 1, 0, 8682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir false)); 8782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 8882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, hasEmoji(EMOJI_WITH_ZWJ)); 8982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(mTestString.toString(), mEditable.toString()); 9082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 9182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 9282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 9382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testDelete_withNullEditable() { 9482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir Selection.setSelection(mEditable, mTestString.emojiEndIndex()); 9582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 9682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertFalse(EmojiCompat.handleDeleteSurroundingText(mInputConnection, null, 1, 0, false)); 9782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 9882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, hasEmoji(EMOJI_WITH_ZWJ)); 9982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(mTestString.toString(), mEditable.toString()); 10082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 10182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 10282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 10382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testDelete_withNullInputConnection() { 10482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir Selection.setSelection(mEditable, mTestString.emojiEndIndex()); 10582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 10682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertFalse(EmojiCompat.handleDeleteSurroundingText(null, mEditable, 1, 0, false)); 10782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 10882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, hasEmoji(EMOJI_WITH_ZWJ)); 10982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(mTestString.toString(), mEditable.toString()); 11082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 11182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 1129546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinir @SuppressLint("Range") 11382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 11482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testDelete_withInvalidLength() { 11582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir Selection.setSelection(mEditable, mTestString.emojiEndIndex()); 11682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 11782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertFalse(EmojiCompat.handleDeleteSurroundingText(mInputConnection, mEditable, -1, 0, 11882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir false)); 11982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 12082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, hasEmoji(EMOJI_WITH_ZWJ)); 12182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(mTestString.toString(), mEditable.toString()); 12282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 12382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 1249546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinir @SuppressLint("Range") 12582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 12682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testDelete_withInvalidAfterLength() { 12782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir Selection.setSelection(mEditable, mTestString.emojiEndIndex()); 12882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 12982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertFalse(EmojiCompat.handleDeleteSurroundingText(mInputConnection, mEditable, 0, -1, 13082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir false)); 13182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 13282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, hasEmoji(EMOJI_WITH_ZWJ)); 13382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(mTestString.toString(), mEditable.toString()); 13482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 13582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 13682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 13782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testDelete_backward() { 13882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir Selection.setSelection(mEditable, mTestString.emojiEndIndex()); 13982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 14082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir // backwards delete 1 character, it will delete the emoji 14182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertTrue(EmojiCompat.handleDeleteSurroundingText(mInputConnection, mEditable, 1, 0, 14282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir false)); 14382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 14482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, not(hasEmoji())); 14582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(new TestString().withPrefix().withSuffix().toString(), mEditable.toString()); 14682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 14782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 14882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 14982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testDelete_backward_inCodepoints() { 15082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir Selection.setSelection(mEditable, mTestString.emojiEndIndex()); 15182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 15282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir // backwards delete 1 character, it will delete the emoji 15382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertTrue(EmojiCompat.handleDeleteSurroundingText(mInputConnection, mEditable, 1, 0, 15482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir true)); 15582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 15682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, not(hasEmoji())); 15782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(new TestString().withPrefix().withSuffix().toString(), mEditable.toString()); 15882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 15982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 16082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 16182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testDelete_forward() { 16282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir Selection.setSelection(mEditable, mTestString.emojiStartIndex()); 16382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 16482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir // forward delete 1 character, it will dele the emoji. 16582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertTrue(EmojiCompat.handleDeleteSurroundingText(mInputConnection, mEditable, 0, 1, 16682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir false)); 16782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 16882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, not(hasEmoji())); 16982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(new TestString().withPrefix().withSuffix().toString(), mEditable.toString()); 17082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 17182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 17282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 17382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testDelete_forward_inCodepoints() { 17482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir Selection.setSelection(mEditable, mTestString.emojiStartIndex()); 17582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 17682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir // forward delete 1 codepoint, it will delete the emoji. 17782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertTrue(EmojiCompat.handleDeleteSurroundingText(mInputConnection, mEditable, 0, 1, 17882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir false)); 17982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 18082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, not(hasEmoji())); 18182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(new TestString().withPrefix().withSuffix().toString(), mEditable.toString()); 18282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 18382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 18482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 18582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testDelete_backward_doesNotDeleteWhenSelectionAtCharSequenceStart() { 18682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir // make sure selection at 0 does not do something weird for backward delete 18782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir Selection.setSelection(mEditable, 0); 18882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 18982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertFalse(EmojiCompat.handleDeleteSurroundingText(mInputConnection, mEditable, 1, 0, 19082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir false)); 19182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 19282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, hasEmoji()); 19382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(mTestString.toString(), mEditable.toString()); 19482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 19582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 19682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 19782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testDelete_forward_doesNotDeleteWhenSelectionAtCharSequenceEnd() { 19882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir // make sure selection at end does not do something weird for forward delete 19982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir Selection.setSelection(mEditable, mTestString.emojiEndIndex()); 20082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 20182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertFalse(EmojiCompat.handleDeleteSurroundingText(mInputConnection, mEditable, 0, 1, 20282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir false)); 20382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 20482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, hasEmoji()); 20582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(mTestString.toString(), mEditable.toString()); 20682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 20782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 20882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 20982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testDelete_withMultipleCharacters() { 21082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir // prepare string as abc[emoji]def 21182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir mTestString = new TestString(EMOJI_FLAG); 21282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir mEditable = new SpannableStringBuilder("abc" + mTestString.toString() + "def"); 21382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir EmojiCompat.get().process(mEditable); 21482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 21582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir // set the selection in the middle of emoji 21682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir Selection.setSelection(mEditable, "abc".length() + EMOJI_FLAG.charCount() / 2); 21782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 21882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir // delete 4 characters forward, 4 character backwards 21982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertTrue( 22082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir EmojiCompat.handleDeleteSurroundingText(mInputConnection, mEditable, 4, 4, false)); 22182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 22282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, not(hasEmoji())); 22382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals("af", mEditable.toString()); 22482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 22582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 22682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 22782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testDelete_withMultipleCodepoints() { 22882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir // prepare string as abc[emoji]def 22982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir mTestString = new TestString(EMOJI_FLAG); 23082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir mEditable = new SpannableStringBuilder("abc" + mTestString.toString() + "def"); 23182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir EmojiCompat.get().process(mEditable); 23282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 23382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir // set the selection in the middle of emoji 23482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir Selection.setSelection(mEditable, "abc".length() + EMOJI_FLAG.charCount() / 2); 23582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 23682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir // delete 3 codepoints forward, 3 codepoints backwards 23782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertTrue( 23882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir EmojiCompat.handleDeleteSurroundingText(mInputConnection, mEditable, 3, 3, true)); 23982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 24082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, not(hasEmoji())); 24182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals("af", mEditable.toString()); 24282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 24382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 24482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 24582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testDelete_withMultipleCharacters_withDeleteLengthLongerThanString() { 24682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir // prepare string as abc[emoji]def 24782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir mTestString = new TestString(EMOJI_FLAG); 24882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir mEditable = new SpannableStringBuilder("abc" + mTestString.toString() + "def"); 24982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir EmojiCompat.get().process(mEditable); 25082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 25182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir // set the selection in the middle of emoji 25282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir Selection.setSelection(mEditable, "abc".length() + EMOJI_FLAG.charCount() / 2); 25382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 25482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertTrue(EmojiCompat.handleDeleteSurroundingText(mInputConnection, mEditable, 100, 100, 25582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir false)); 25682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 25782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, not(hasEmoji())); 25882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals("", mEditable.toString()); 25982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 26082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 26182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 26282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testDelete_withMultipleCodepoints_withDeleteLengthLongerThanString() { 26382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir // prepare string as abc[emoji]def 26482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir mTestString = new TestString(EMOJI_FLAG); 26582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir mEditable = new SpannableStringBuilder("abc" + mTestString.toString() + "def"); 26682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir EmojiCompat.get().process(mEditable); 26782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 26882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir // set the selection in the middle of emoji 26982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir Selection.setSelection(mEditable, "abc".length() + EMOJI_FLAG.charCount() / 2); 27082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 27182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertTrue(EmojiCompat.handleDeleteSurroundingText(mInputConnection, mEditable, 100, 100, 27282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir true)); 27382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 27482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, not(hasEmoji())); 27582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals("", mEditable.toString()); 27682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 27782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir} 278