OSDN Git Service

Add TextLayout.measure test cases
authorSeigo Nonaka <nona@google.com>
Thu, 17 May 2018 05:05:27 +0000 (22:05 -0700)
committerSeigo Nonaka <nona@google.com>
Thu, 17 May 2018 05:20:57 +0000 (22:20 -0700)
Bug: 78464361
Test: atest android.text.TextLineTest
Change-Id: I62e05d4fe18c115060da918a2c9105f0e94fe4b0

core/java/android/text/Layout.java
core/java/android/text/TextLine.java
core/tests/coretests/assets/fonts/StaticLayoutLineBreakingTestFont.ttf
core/tests/coretests/assets/fonts/StaticLayoutLineBreakingTestFont.ttx
core/tests/coretests/src/android/text/TextLineTest.java

index aa97b2a..320a235 100644 (file)
@@ -1966,12 +1966,13 @@ public abstract class Layout {
     /**
      * @hide
      */
-    /* package */ static class TabStops {
+    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+    public static class TabStops {
         private int[] mStops;
         private int mNumStops;
         private int mIncrement;
 
-        TabStops(int increment, Object[] spans) {
+        public TabStops(int increment, Object[] spans) {
             reset(increment, spans);
         }
 
index fcb7d62..64365fa 100644 (file)
@@ -313,7 +313,7 @@ public class TextLine {
      * @return the signed offset from the leading margin to the requested
      * character edge.
      */
-    float measure(int offset, boolean trailing, FontMetricsInt fmi) {
+    public float measure(int offset, boolean trailing, FontMetricsInt fmi) {
         int target = trailing ? offset - 1 : offset;
         if (target < 0) {
             return 0;
index 1bad6fe..36ed024 100644 (file)
Binary files a/core/tests/coretests/assets/fonts/StaticLayoutLineBreakingTestFont.ttf and b/core/tests/coretests/assets/fonts/StaticLayoutLineBreakingTestFont.ttf differ
index 0cf0f79..feefed3 100644 (file)
       <map code="0x0056" name="5em" />  <!-- V -->
       <map code="0x0058" name="10em" />  <!-- X -->
       <map code="0x005f" name="0em" /> <!-- _ -->
+      <map code="0x05D0" name="1em" /> <!-- HEBREW LETTER ALEF -->
+      <map code="0x05D1" name="5em" /> <!-- HEBREW LETTER BET -->
       <map code="0xfffd" name="7em" /> <!-- REPLACEMENT CHAR -->
       <map code="0x10331" name="10em" />
     </cmap_format_12>
index d9c09c8..b2fa2cf 100644 (file)
 
 package android.text;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
+import android.graphics.Typeface;
 import android.platform.test.annotations.Presubmit;
+import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.SmallTest;
 import android.support.test.filters.Suppress;
 import android.support.test.runner.AndroidJUnit4;
+import android.text.Layout.TabStops;
+import android.text.style.TabStopSpan;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -66,4 +71,255 @@ public class TextLineTest {
         final char combining_acute = '\u0301';
         assertFalse(stretchesToFullWidth("combining" + nbsp + combining_acute + "acute"));
     }
+
+    // The test font has following coverage and width.
+    // U+0020: 10em
+    // U+002E (.): 10em
+    // U+0043 (C): 100em
+    // U+0049 (I): 1em
+    // U+004C (L): 50em
+    // U+0056 (V): 5em
+    // U+0058 (X): 10em
+    // U+005F (_): 0em
+    // U+05D0    : 1em  // HEBREW LETTER ALEF
+    // U+05D1    : 5em  // HEBREW LETTER BET
+    // U+FFFD (invalid surrogate will be replaced to this): 7em
+    // U+10331 (\uD800\uDF31): 10em
+    private static final Typeface TYPEFACE = Typeface.createFromAsset(
+            InstrumentationRegistry.getInstrumentation().getTargetContext().getAssets(),
+            "fonts/StaticLayoutLineBreakingTestFont.ttf");
+
+    private TextLine getTextLine(String str, TextPaint paint, TabStops tabStops) {
+        Layout layout = StaticLayout.Builder.obtain(str, 0, str.length(), paint, Integer.MAX_VALUE)
+                .build();
+        TextLine tl = TextLine.obtain();
+        tl.set(paint, str, 0, str.length(),
+                TextDirectionHeuristics.FIRSTSTRONG_LTR.isRtl(str, 0, str.length()) ? -1 : 1,
+                layout.getLineDirections(0), tabStops != null, tabStops);
+        return tl;
+    }
+
+    private TextLine getTextLine(String str, TextPaint paint) {
+        return getTextLine(str, paint, null);
+    }
+
+    @Test
+    public void testMeasure_LTR() {
+        final TextPaint paint = new TextPaint();
+        paint.setTypeface(TYPEFACE);
+        paint.setTextSize(10.0f);  // make 1em = 10px
+
+        TextLine tl = getTextLine("IIIIIV", paint);
+        assertEquals(0.0f, tl.measure(0, false, null), 0.0f);
+        assertEquals(10.0f, tl.measure(1, false, null), 0.0f);
+        assertEquals(20.0f, tl.measure(2, false, null), 0.0f);
+        assertEquals(30.0f, tl.measure(3, false, null), 0.0f);
+        assertEquals(40.0f, tl.measure(4, false, null), 0.0f);
+        assertEquals(50.0f, tl.measure(5, false, null), 0.0f);
+        assertEquals(100.0f, tl.measure(6, false, null), 0.0f);
+
+        assertEquals(0.0f, tl.measure(0, true, null), 0.0f);
+        assertEquals(10.0f, tl.measure(1, true, null), 0.0f);
+        assertEquals(20.0f, tl.measure(2, true, null), 0.0f);
+        assertEquals(30.0f, tl.measure(3, true, null), 0.0f);
+        assertEquals(40.0f, tl.measure(4, true, null), 0.0f);
+        assertEquals(50.0f, tl.measure(5, true, null), 0.0f);
+        assertEquals(100.0f, tl.measure(6, true, null), 0.0f);
+    }
+
+    @Test
+    public void testMeasure_RTL() {
+        final TextPaint paint = new TextPaint();
+        paint.setTypeface(TYPEFACE);
+        paint.setTextSize(10.0f);  // make 1em = 10px
+
+        TextLine tl = getTextLine("\u05D0\u05D0\u05D0\u05D0\u05D0\u05D1", paint);
+        assertEquals(0.0f, tl.measure(0, false, null), 0.0f);
+        assertEquals(-10.0f, tl.measure(1, false, null), 0.0f);
+        assertEquals(-20.0f, tl.measure(2, false, null), 0.0f);
+        assertEquals(-30.0f, tl.measure(3, false, null), 0.0f);
+        assertEquals(-40.0f, tl.measure(4, false, null), 0.0f);
+        assertEquals(-50.0f, tl.measure(5, false, null), 0.0f);
+        assertEquals(-100.0f, tl.measure(6, false, null), 0.0f);
+
+        assertEquals(0.0f, tl.measure(0, true, null), 0.0f);
+        assertEquals(-10.0f, tl.measure(1, true, null), 0.0f);
+        assertEquals(-20.0f, tl.measure(2, true, null), 0.0f);
+        assertEquals(-30.0f, tl.measure(3, true, null), 0.0f);
+        assertEquals(-40.0f, tl.measure(4, true, null), 0.0f);
+        assertEquals(-50.0f, tl.measure(5, true, null), 0.0f);
+        assertEquals(-100.0f, tl.measure(6, true, null), 0.0f);
+    }
+
+    @Test
+    public void testMeasure_BiDi() {
+        final TextPaint paint = new TextPaint();
+        paint.setTypeface(TYPEFACE);
+        paint.setTextSize(10.0f);  // make 1em = 10px
+
+        TextLine tl = getTextLine("II\u05D0\u05D0II", paint);
+        assertEquals(0.0f, tl.measure(0, false, null), 0.0f);
+        assertEquals(10.0f, tl.measure(1, false, null), 0.0f);
+        assertEquals(40.0f, tl.measure(2, false, null), 0.0f);
+        assertEquals(30.0f, tl.measure(3, false, null), 0.0f);
+        assertEquals(40.0f, tl.measure(4, false, null), 0.0f);
+        assertEquals(50.0f, tl.measure(5, false, null), 0.0f);
+        assertEquals(60.0f, tl.measure(6, false, null), 0.0f);
+
+        assertEquals(0.0f, tl.measure(0, true, null), 0.0f);
+        assertEquals(10.0f, tl.measure(1, true, null), 0.0f);
+        assertEquals(20.0f, tl.measure(2, true, null), 0.0f);
+        assertEquals(30.0f, tl.measure(3, true, null), 0.0f);
+        assertEquals(20.0f, tl.measure(4, true, null), 0.0f);
+        assertEquals(50.0f, tl.measure(5, true, null), 0.0f);
+        assertEquals(60.0f, tl.measure(6, true, null), 0.0f);
+    }
+
+    private static final String LRI = "\u2066";  // LEFT-TO-RIGHT ISOLATE
+    private static final String RLI = "\u2067";  // RIGHT-TO-LEFT ISOLATE
+    private static final String PDI = "\u2069";  // POP DIRECTIONAL ISOLATE
+
+    @Test
+    public void testMeasure_BiDi2() {
+        final TextPaint paint = new TextPaint();
+        paint.setTypeface(TYPEFACE);
+        paint.setTextSize(10.0f);  // make 1em = 10px
+
+        TextLine tl = getTextLine("I" + RLI + "I\u05D0\u05D0" + PDI + "I", paint);
+        assertEquals(0.0f, tl.measure(0, false, null), 0.0f);
+        assertEquals(10.0f, tl.measure(1, false, null), 0.0f);
+        assertEquals(30.0f, tl.measure(2, false, null), 0.0f);
+        assertEquals(30.0f, tl.measure(3, false, null), 0.0f);
+        assertEquals(20.0f, tl.measure(4, false, null), 0.0f);
+        assertEquals(40.0f, tl.measure(5, false, null), 0.0f);
+        assertEquals(40.0f, tl.measure(6, false, null), 0.0f);
+        assertEquals(50.0f, tl.measure(7, false, null), 0.0f);
+
+        assertEquals(0.0f, tl.measure(0, true, null), 0.0f);
+        assertEquals(10.0f, tl.measure(1, true, null), 0.0f);
+        assertEquals(10.0f, tl.measure(2, true, null), 0.0f);
+        assertEquals(40.0f, tl.measure(3, true, null), 0.0f);
+        assertEquals(20.0f, tl.measure(4, true, null), 0.0f);
+        assertEquals(10.0f, tl.measure(5, true, null), 0.0f);
+        assertEquals(40.0f, tl.measure(6, true, null), 0.0f);
+        assertEquals(50.0f, tl.measure(7, true, null), 0.0f);
+    }
+
+    @Test
+    public void testMeasure_BiDi3() {
+        final TextPaint paint = new TextPaint();
+        paint.setTypeface(TYPEFACE);
+        paint.setTextSize(10.0f);  // make 1em = 10px
+
+        TextLine tl = getTextLine("\u05D0" + LRI + "\u05D0II" + PDI + "\u05D0", paint);
+        assertEquals(0.0f, tl.measure(0, false, null), 0.0f);
+        assertEquals(-10.0f, tl.measure(1, false, null), 0.0f);
+        assertEquals(-30.0f, tl.measure(2, false, null), 0.0f);
+        assertEquals(-30.0f, tl.measure(3, false, null), 0.0f);
+        assertEquals(-20.0f, tl.measure(4, false, null), 0.0f);
+        assertEquals(-40.0f, tl.measure(5, false, null), 0.0f);
+        assertEquals(-40.0f, tl.measure(6, false, null), 0.0f);
+        assertEquals(-50.0f, tl.measure(7, false, null), 0.0f);
+
+        assertEquals(0.0f, tl.measure(0, true, null), 0.0f);
+        assertEquals(-10.0f, tl.measure(1, true, null), 0.0f);
+        assertEquals(-10.0f, tl.measure(2, true, null), 0.0f);
+        assertEquals(-40.0f, tl.measure(3, true, null), 0.0f);
+        assertEquals(-20.0f, tl.measure(4, true, null), 0.0f);
+        assertEquals(-10.0f, tl.measure(5, true, null), 0.0f);
+        assertEquals(-40.0f, tl.measure(6, true, null), 0.0f);
+        assertEquals(-50.0f, tl.measure(7, true, null), 0.0f);
+    }
+
+    @Test
+    public void testMeasure_Tab_LTR() {
+        final Object[] spans = { new TabStopSpan.Standard(100) };
+        final TabStops stops = new TabStops(100, spans);
+        final TextPaint paint = new TextPaint();
+        paint.setTypeface(TYPEFACE);
+        paint.setTextSize(10.0f);  // make 1em = 10px
+
+        TextLine tl = getTextLine("II\tII", paint, stops);
+        assertEquals(0.0f, tl.measure(0, false, null), 0.0f);
+        assertEquals(10.0f, tl.measure(1, false, null), 0.0f);
+        assertEquals(20.0f, tl.measure(2, false, null), 0.0f);
+        assertEquals(100.0f, tl.measure(3, false, null), 0.0f);
+        assertEquals(110.0f, tl.measure(4, false, null), 0.0f);
+
+        assertEquals(0.0f, tl.measure(0, true, null), 0.0f);
+        assertEquals(10.0f, tl.measure(1, true, null), 0.0f);
+        assertEquals(20.0f, tl.measure(2, true, null), 0.0f);
+        assertEquals(100.0f, tl.measure(3, true, null), 0.0f);
+        assertEquals(110.0f, tl.measure(4, true, null), 0.0f);
+    }
+
+    @Test
+    public void testMeasure_Tab_RTL() {
+        final Object[] spans = { new TabStopSpan.Standard(100) };
+        final TabStops stops = new TabStops(100, spans);
+        final TextPaint paint = new TextPaint();
+        paint.setTypeface(TYPEFACE);
+        paint.setTextSize(10.0f);  // make 1em = 10px
+
+        TextLine tl = getTextLine("\u05D0\u05D0\t\u05D0\u05D0", paint, stops);
+        assertEquals(0.0f, tl.measure(0, false, null), 0.0f);
+        assertEquals(-10.0f, tl.measure(1, false, null), 0.0f);
+        assertEquals(-20.0f, tl.measure(2, false, null), 0.0f);
+        assertEquals(-100.0f, tl.measure(3, false, null), 0.0f);
+        assertEquals(-110.0f, tl.measure(4, false, null), 0.0f);
+
+        assertEquals(0.0f, tl.measure(0, true, null), 0.0f);
+        assertEquals(-10.0f, tl.measure(1, true, null), 0.0f);
+        assertEquals(-20.0f, tl.measure(2, true, null), 0.0f);
+        assertEquals(-100.0f, tl.measure(3, true, null), 0.0f);
+        assertEquals(-110.0f, tl.measure(4, true, null), 0.0f);
+    }
+
+    @Test
+    public void testMeasure_Tab_BiDi() {
+        final Object[] spans = { new TabStopSpan.Standard(100) };
+        final TabStops stops = new TabStops(100, spans);
+        final TextPaint paint = new TextPaint();
+        paint.setTypeface(TYPEFACE);
+        paint.setTextSize(10.0f);  // make 1em = 10px
+
+        TextLine tl = getTextLine("I\u05D0\tI\u05D0", paint, stops);
+        assertEquals(0.0f, tl.measure(0, false, null), 0.0f);
+        assertEquals(20.0f, tl.measure(1, false, null), 0.0f);
+        assertEquals(20.0f, tl.measure(2, false, null), 0.0f);
+        assertEquals(100.0f, tl.measure(3, false, null), 0.0f);
+        assertEquals(120.0f, tl.measure(4, false, null), 0.0f);
+        assertEquals(120.0f, tl.measure(5, false, null), 0.0f);
+
+        assertEquals(0.0f, tl.measure(0, true, null), 0.0f);
+        assertEquals(10.0f, tl.measure(1, true, null), 0.0f);
+        assertEquals(10.0f, tl.measure(2, true, null), 0.0f);
+        assertEquals(100.0f, tl.measure(3, true, null), 0.0f);
+        assertEquals(110.0f, tl.measure(4, true, null), 0.0f);
+        assertEquals(110.0f, tl.measure(5, true, null), 0.0f);
+    }
+
+    @Test
+    public void testMeasure_Tab_BiDi2() {
+        final Object[] spans = { new TabStopSpan.Standard(100) };
+        final TabStops stops = new TabStops(100, spans);
+        final TextPaint paint = new TextPaint();
+        paint.setTypeface(TYPEFACE);
+        paint.setTextSize(10.0f);  // make 1em = 10px
+
+        TextLine tl = getTextLine("\u05D0I\t\u05D0I", paint, stops);
+        assertEquals(0.0f, tl.measure(0, false, null), 0.0f);
+        assertEquals(-20.0f, tl.measure(1, false, null), 0.0f);
+        assertEquals(-20.0f, tl.measure(2, false, null), 0.0f);
+        assertEquals(-100.0f, tl.measure(3, false, null), 0.0f);
+        assertEquals(-120.0f, tl.measure(4, false, null), 0.0f);
+        assertEquals(-120.0f, tl.measure(5, false, null), 0.0f);
+
+        assertEquals(-0.0f, tl.measure(0, true, null), 0.0f);
+        assertEquals(-10.0f, tl.measure(1, true, null), 0.0f);
+        assertEquals(-10.0f, tl.measure(2, true, null), 0.0f);
+        assertEquals(-100.0f, tl.measure(3, true, null), 0.0f);
+        assertEquals(-110.0f, tl.measure(4, true, null), 0.0f);
+        assertEquals(-110.0f, tl.measure(5, true, null), 0.0f);
+    }
 }