Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 32afe26a authored by Seigo Nonaka's avatar Seigo Nonaka
Browse files

Add TextLayout.measure test cases

Bug: 78464361
Test: atest android.text.TextLineTest
Change-Id: I62e05d4fe18c115060da918a2c9105f0e94fe4b0
parent 8ee93af8
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -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);
        }

+1 −1
Original line number Diff line number Diff line
@@ -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;
+2 −0
Original line number Diff line number Diff line
@@ -144,6 +144,8 @@
      <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>
+256 −0
Original line number Diff line number Diff line
@@ -16,13 +16,18 @@

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);
    }
}