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

Commit 2cbfebd6 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add TextLayout.measure test cases"

parents dddd80b8 32afe26a
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);
    }
}