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