182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir/* 2ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas * Copyright 2018 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 */ 16ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.emoji.text; 1782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 18ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport static androidx.emoji.util.Emoji.EMOJI_FLAG; 19ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport static androidx.emoji.util.Emoji.EMOJI_GENDER; 20ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport static androidx.emoji.util.Emoji.EMOJI_WITH_ZWJ; 21ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport static androidx.emoji.util.EmojiMatcher.hasEmoji; 22ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport static androidx.emoji.util.EmojiMatcher.hasEmojiCount; 23ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport static androidx.emoji.util.KeyboardUtil.altDel; 24ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport static androidx.emoji.util.KeyboardUtil.ctrlDel; 25ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport static androidx.emoji.util.KeyboardUtil.del; 26ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport static androidx.emoji.util.KeyboardUtil.fnDel; 27ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport static androidx.emoji.util.KeyboardUtil.forwardDel; 28ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport static androidx.emoji.util.KeyboardUtil.shiftDel; 29ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport static androidx.emoji.util.KeyboardUtil.zero; 3082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 3182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static org.hamcrest.MatcherAssert.assertThat; 3282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static org.hamcrest.core.IsNot.not; 33fa39e2bca1b284ad7c931d9194287770b7b507faAurimas Liutikasimport static org.junit.Assert.assertEquals; 34fa39e2bca1b284ad7c931d9194287770b7b507faAurimas Liutikasimport static org.junit.Assert.assertFalse; 3582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static org.junit.Assert.assertTrue; 3682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 379546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinirimport android.support.test.filters.SdkSuppress; 3882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.support.test.filters.SmallTest; 3982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.support.test.runner.AndroidJUnit4; 4082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.text.Editable; 4182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.text.Selection; 4282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.text.SpannableStringBuilder; 4382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.view.KeyEvent; 4482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 4538746a682208c764867ffe4415d0b62fb22b5b9aAurimas Liutikasimport androidx.emoji.util.TestString; 4638746a682208c764867ffe4415d0b62fb22b5b9aAurimas Liutikas 4782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport org.junit.Before; 4882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport org.junit.BeforeClass; 4982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport org.junit.Test; 5082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport org.junit.runner.RunWith; 5182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 5282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir@SmallTest 5382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir@RunWith(AndroidJUnit4.class) 549546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinir@SdkSuppress(minSdkVersion = 19) 5582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirpublic class HardDeleteTest { 5682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 5782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir private TestString mTestString; 5882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir private Editable mEditable; 5982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 6082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @BeforeClass 6182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public static void setupEmojiCompat() { 6282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir EmojiCompat.reset(TestConfigBuilder.config()); 6382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 6482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 6582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Before 6682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void setup() { 6782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir mTestString = new TestString(EMOJI_WITH_ZWJ).withPrefix().withSuffix(); 6882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir mEditable = new SpannableStringBuilder(mTestString.toString()); 6982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir EmojiCompat.get().process(mEditable); 7082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, hasEmojiCount(1)); 7182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, hasEmoji(EMOJI_WITH_ZWJ)); 7282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 7382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 7482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 7582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testOnKeyDown_doesNotDelete_whenKeyCodeIsNotDelOrForwardDel() { 7682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir Selection.setSelection(mEditable, mTestString.emojiEndIndex()); 7782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final KeyEvent event = zero(); 7882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertFalse(EmojiCompat.handleOnKeyDown(mEditable, event.getKeyCode(), event)); 7982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, hasEmoji()); 8082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(mTestString.toString(), mEditable.toString()); 8182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 8282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 8382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 8482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testOnKeyDown_doesNotDelete_withOtherModifiers() { 8582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir Selection.setSelection(mEditable, mTestString.emojiEndIndex()); 8682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final KeyEvent event = fnDel(); 8782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertFalse(EmojiCompat.handleOnKeyDown(mEditable, event.getKeyCode(), event)); 8882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, hasEmoji()); 8982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(mTestString.toString(), mEditable.toString()); 9082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 9182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 9282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 9382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testOnKeyDown_doesNotDelete_withAltModifier() { 9482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir Selection.setSelection(mEditable, mTestString.emojiEndIndex()); 9582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final KeyEvent event = altDel(); 9682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertFalse(EmojiCompat.handleOnKeyDown(mEditable, event.getKeyCode(), event)); 9782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, hasEmoji()); 9882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(mTestString.toString(), mEditable.toString()); 9982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 10082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 10182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 10282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testOnKeyDown_doesNotDelete_withCtrlModifier() { 10382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir Selection.setSelection(mEditable, mTestString.emojiEndIndex()); 10482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final KeyEvent event = ctrlDel(); 10582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertFalse(EmojiCompat.handleOnKeyDown(mEditable, event.getKeyCode(), event)); 10682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, hasEmoji()); 10782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(mTestString.toString(), mEditable.toString()); 10882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 10982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 11082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 11182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testOnKeyDown_doesNotDelete_withShiftModifier() { 11282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir Selection.setSelection(mEditable, mTestString.emojiEndIndex()); 11382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final KeyEvent event = shiftDel(); 11482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertFalse(EmojiCompat.handleOnKeyDown(mEditable, event.getKeyCode(), event)); 11582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, hasEmoji()); 11682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(mTestString.toString(), mEditable.toString()); 11782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 11882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 11982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 12082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testOnKeyDown_doesNotDelete_withSelectionLongerThanZeroLength() { 12182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir // when there is a selection which is longer than 0, it should not delete. 12282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir Selection.setSelection(mEditable, 0, mEditable.length()); 12382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final KeyEvent event = del(); 12482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertFalse(EmojiCompat.handleOnKeyDown(mEditable, event.getKeyCode(), event)); 12582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, hasEmoji()); 12682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(mTestString.toString(), mEditable.toString()); 12782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 12882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 12982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 13082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testOnKeyDown_doesNotDelete_withoutEmojiSpans() { 13182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final Editable editable = new SpannableStringBuilder("abc"); 13282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir Selection.setSelection(editable, 1); 13382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final KeyEvent event = del(); 13482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertFalse(EmojiCompat.handleOnKeyDown(mEditable, event.getKeyCode(), event)); 13582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, hasEmoji()); 13682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(mTestString.toString(), mEditable.toString()); 13782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 13882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 13982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 14082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testOnKeyDown_doesNotDelete_whenNoSpansBefore() { 14182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir Selection.setSelection(mEditable, mTestString.emojiStartIndex()); 14282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final KeyEvent event = del(); 14382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertFalse(EmojiCompat.handleOnKeyDown(mEditable, event.getKeyCode(), event)); 14482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, hasEmoji()); 14582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(mTestString.toString(), mEditable.toString()); 14682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 14782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 14882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 14982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testOnKeyDown_deletesEmoji() { 15082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir Selection.setSelection(mEditable, mTestString.emojiEndIndex()); 15182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final KeyEvent event = del(); 15282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertTrue(EmojiCompat.handleOnKeyDown(mEditable, event.getKeyCode(), event)); 15382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, not(hasEmoji())); 15482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(new TestString().withPrefix().withSuffix().toString(), mEditable.toString()); 15582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 15682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 15782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 15882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testOnKeyDown_doesNotForwardDeleteEmoji_withNoSpansAfter() { 15982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir Selection.setSelection(mEditable, mTestString.emojiEndIndex()); 16082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final KeyEvent event = forwardDel(); 16182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertFalse(EmojiCompat.handleOnKeyDown(mEditable, event.getKeyCode(), event)); 16282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, hasEmoji()); 16382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(mTestString.toString(), mEditable.toString()); 16482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 16582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 16682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 16782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testOnKeyDown_forwardDeletesEmoji() { 16882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir Selection.setSelection(mEditable, mTestString.emojiStartIndex()); 16982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final KeyEvent event = forwardDel(); 17082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertTrue(EmojiCompat.handleOnKeyDown(mEditable, event.getKeyCode(), event)); 17182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, not(hasEmoji())); 17282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(new TestString().withPrefix().withSuffix().toString(), mEditable.toString()); 17382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 17482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 17582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 17682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testOnKeyDown_deletesEmoji_ifSelectionIsInSpanBoundaries() { 17782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir Selection.setSelection(mEditable, mTestString.emojiStartIndex() + 1); 17882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final KeyEvent delEvent = del(); 17982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertTrue(EmojiCompat.handleOnKeyDown(mEditable, delEvent.getKeyCode(), delEvent)); 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 testOnKeyDown_deletesEmoji_ifSelectionIsInSpanBoundaries_withForwardDel() { 18682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir Selection.setSelection(mEditable, mTestString.emojiStartIndex() + 1); 18782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final KeyEvent forwardDelEvent = forwardDel(); 18882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertTrue(EmojiCompat.handleOnKeyDown(mEditable, forwardDelEvent.getKeyCode(), 18982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir forwardDelEvent)); 19082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, not(hasEmoji())); 19182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(new TestString().withPrefix().withSuffix().toString(), mEditable.toString()); 19282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 19382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 19482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 19582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testOnKeyDown_deletesOnlyEmojiBeforeTheCursor() { 19682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir // contains three emojis 19782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir mTestString = new TestString(EMOJI_FLAG) 19882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir .append(EMOJI_WITH_ZWJ) 19982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir .append(EMOJI_GENDER) 20082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir .withPrefix().withSuffix(); 20182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir mEditable = new SpannableStringBuilder(mTestString.toString()); 20282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir EmojiCompat.get().process(mEditable); 20382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 20482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir // put the cursor after the second emoji 20582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir Selection.setSelection(mEditable, mTestString.emojiStartIndex() 20682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir + EMOJI_FLAG.charCount() 20782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir + EMOJI_WITH_ZWJ.charCount()); 20882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 20982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir // delete 21082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final KeyEvent forwardDelEvent = del(); 21182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertTrue(EmojiCompat.handleOnKeyDown(mEditable, forwardDelEvent.getKeyCode(), 21282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir forwardDelEvent)); 21382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 21482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, hasEmojiCount(2)); 21582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, hasEmoji(EMOJI_FLAG)); 21682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertThat(mEditable, hasEmoji(EMOJI_GENDER)); 21782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 21882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir assertEquals(new TestString(EMOJI_FLAG).append(EMOJI_GENDER) 21982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir .withPrefix().withSuffix().toString(), mEditable.toString()); 22082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 22182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 22282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir} 223