1/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package androidx.emoji.widget;
17
18import static org.hamcrest.Matchers.arrayWithSize;
19import static org.hamcrest.Matchers.instanceOf;
20import static org.junit.Assert.assertEquals;
21import static org.junit.Assert.assertNotNull;
22import static org.junit.Assert.assertSame;
23import static org.junit.Assert.assertThat;
24import static org.mockito.Mockito.mock;
25
26import android.annotation.SuppressLint;
27import android.support.test.filters.SmallTest;
28import android.support.test.runner.AndroidJUnit4;
29import android.text.Editable;
30import android.text.SpannableString;
31import android.text.Spanned;
32
33import androidx.emoji.text.EmojiMetadata;
34import androidx.emoji.text.EmojiSpan;
35import androidx.emoji.text.TypefaceEmojiSpan;
36
37import org.junit.Test;
38import org.junit.runner.RunWith;
39
40@SmallTest
41@RunWith(AndroidJUnit4.class)
42public class EmojiEditableFactoryTest {
43
44    @Test
45    public void testGetInstance() {
46        final Editable.Factory instance = EmojiEditableFactory.getInstance();
47        assertNotNull(instance);
48
49        final Editable.Factory instance2 = EmojiEditableFactory.getInstance();
50        assertSame(instance, instance2);
51    }
52
53    @Test
54    public void testNewEditable_returnsEditable() {
55        final Editable editable = EmojiEditableFactory.getInstance().newEditable("abc");
56        assertNotNull(editable);
57        assertThat(editable, instanceOf(Editable.class));
58    }
59
60    @Test
61    public void testNewEditable_preservesCharSequenceData() {
62        final String string = "abc";
63        final SpannableString str = new SpannableString(string);
64        final EmojiMetadata metadata = mock(EmojiMetadata.class);
65        final EmojiSpan span = new TypefaceEmojiSpan(metadata);
66        str.setSpan(span, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
67
68        final Editable editable = EmojiEditableFactory.getInstance().newEditable(str);
69        assertNotNull(editable);
70        assertEquals(string, editable.toString());
71        final EmojiSpan[] spans = editable.getSpans(0, 1, EmojiSpan.class);
72        assertThat(spans, arrayWithSize(1));
73        assertSame(spans[0], span);
74    }
75
76    @SuppressLint("PrivateApi")
77    @Test
78    public void testNewEditable_returnsEmojiSpannableIfWatcherClassExists() {
79        Class clazz = null;
80        try {
81            String className = "android.text.DynamicLayout$ChangeWatcher";
82            clazz = getClass().getClassLoader().loadClass(className);
83        } catch (Throwable t) {
84            // ignore
85        }
86
87        if (clazz == null) {
88            final Editable editable = EmojiEditableFactory.getInstance().newEditable("");
89            assertThat(editable, instanceOf(Editable.class));
90        } else {
91            final Editable editable = EmojiEditableFactory.getInstance().newEditable("");
92            assertThat(editable, instanceOf(SpannableBuilder.class));
93        }
94    }
95}
96