• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2018 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  */
16 package androidx.emoji.text;
17 
18 import static org.junit.Assert.assertEquals;
19 import static org.mockito.Matchers.any;
20 import static org.mockito.Matchers.eq;
21 import static org.mockito.Mockito.mock;
22 import static org.mockito.Mockito.reset;
23 import static org.mockito.Mockito.times;
24 import static org.mockito.Mockito.verify;
25 import static org.mockito.Mockito.when;
26 
27 import android.graphics.Canvas;
28 import android.graphics.Paint;
29 import android.graphics.Paint.FontMetricsInt;
30 import android.support.test.filters.SdkSuppress;
31 import android.support.test.filters.SmallTest;
32 import android.support.test.runner.AndroidJUnit4;
33 import android.text.TextPaint;
34 
35 import org.junit.Before;
36 import org.junit.Test;
37 import org.junit.runner.RunWith;
38 import org.mockito.invocation.InvocationOnMock;
39 import org.mockito.stubbing.Answer;
40 
41 @SmallTest
42 @RunWith(AndroidJUnit4.class)
43 @SdkSuppress(minSdkVersion = 19)
44 public class EmojiSpanTest {
45 
46     @Before
setup()47     public void setup() {
48         EmojiCompat.reset(TestConfigBuilder.config());
49     }
50 
51     @Test
testGetSize()52     public void testGetSize() {
53         final short dimensionX = 18;
54         final short dimensionY = 20;
55         final int fontHeight = 10;
56         final float expectedRatio = fontHeight * 1.0f / dimensionY;
57         final TextPaint paint = mock(TextPaint.class);
58 
59         // mock TextPaint to return test font metrics
60         when(paint.getFontMetricsInt(any(FontMetricsInt.class))).thenAnswer(new Answer<Object>() {
61             @Override
62             public Object answer(InvocationOnMock invocation) throws Throwable {
63                 final FontMetricsInt fontMetrics = (FontMetricsInt) invocation.getArguments()[0];
64                 fontMetrics.ascent = 0;
65                 fontMetrics.descent = -fontHeight;
66                 return null;
67             }
68         });
69 
70         final EmojiMetadata metadata = mock(EmojiMetadata.class);
71         when(metadata.getWidth()).thenReturn(dimensionX);
72         when(metadata.getHeight()).thenReturn(dimensionY);
73         final EmojiSpan span = new TypefaceEmojiSpan(metadata);
74 
75         final int resultSize = span.getSize(paint, "", 0, 0, null);
76         assertEquals((int) (dimensionX * expectedRatio), resultSize);
77         assertEquals(expectedRatio, span.getRatio(), 0.01f);
78         assertEquals((int) (dimensionX * expectedRatio), span.getWidth());
79         assertEquals((int) (dimensionY * expectedRatio), span.getHeight());
80     }
81 
82     @Test
testBackgroundIndicator()83     public void testBackgroundIndicator() {
84         // control the size of the emoji span
85         final EmojiMetadata metadata = mock(EmojiMetadata.class);
86         when(metadata.getWidth()).thenReturn((short) 10);
87         when(metadata.getHeight()).thenReturn((short) 10);
88 
89         final EmojiSpan span = new TypefaceEmojiSpan(metadata);
90         final int spanWidth = span.getSize(mock(Paint.class), "", 0, 0, null);
91         // prepare parameters for draw() call
92         final Canvas canvas = mock(Canvas.class);
93         final float x = 10;
94         final int top = 15;
95         final int y = 20;
96         final int bottom = 30;
97 
98         // verify the case where indicators are disabled
99         EmojiCompat.reset(TestConfigBuilder.config().setEmojiSpanIndicatorEnabled(false));
100         span.draw(canvas, "a", 0 /*start*/, 1 /*end*/, x, top, y, bottom, mock(Paint.class));
101 
102         verify(canvas, times(0)).drawRect(eq(x), eq((float) top), eq(x + spanWidth),
103                 eq((float) bottom), any(Paint.class));
104 
105         // verify the case where indicators are enabled
106         EmojiCompat.reset(TestConfigBuilder.config().setEmojiSpanIndicatorEnabled(true));
107         reset(canvas);
108         span.draw(canvas, "a", 0 /*start*/, 1 /*end*/, x, top, y, bottom, mock(Paint.class));
109 
110         verify(canvas, times(1)).drawRect(eq(x), eq((float) top), eq(x + spanWidth),
111                 eq((float) bottom), any(Paint.class));
112     }
113 }
114