From: Seigo Nonaka Date: Thu, 17 May 2018 05:05:27 +0000 (-0700) Subject: Add TextLayout.measure test cases X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=32afe26a00ff8a6b04f86d000be3f4a1f033a9e6;p=android-x86%2Fframeworks-base.git Add TextLayout.measure test cases Bug: 78464361 Test: atest android.text.TextLineTest Change-Id: I62e05d4fe18c115060da918a2c9105f0e94fe4b0 --- diff --git a/core/java/android/text/Layout.java b/core/java/android/text/Layout.java index aa97b2aba749..320a2352503d 100644 --- a/core/java/android/text/Layout.java +++ b/core/java/android/text/Layout.java @@ -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); } diff --git a/core/java/android/text/TextLine.java b/core/java/android/text/TextLine.java index fcb7d620f395..64365fa5d0ff 100644 --- a/core/java/android/text/TextLine.java +++ b/core/java/android/text/TextLine.java @@ -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; diff --git a/core/tests/coretests/assets/fonts/StaticLayoutLineBreakingTestFont.ttf b/core/tests/coretests/assets/fonts/StaticLayoutLineBreakingTestFont.ttf index 1bad6fe75090..36ed024d10a3 100644 Binary files a/core/tests/coretests/assets/fonts/StaticLayoutLineBreakingTestFont.ttf and b/core/tests/coretests/assets/fonts/StaticLayoutLineBreakingTestFont.ttf differ diff --git a/core/tests/coretests/assets/fonts/StaticLayoutLineBreakingTestFont.ttx b/core/tests/coretests/assets/fonts/StaticLayoutLineBreakingTestFont.ttx index 0cf0f7914931..feefed384c49 100644 --- a/core/tests/coretests/assets/fonts/StaticLayoutLineBreakingTestFont.ttx +++ b/core/tests/coretests/assets/fonts/StaticLayoutLineBreakingTestFont.ttx @@ -144,6 +144,8 @@ + + diff --git a/core/tests/coretests/src/android/text/TextLineTest.java b/core/tests/coretests/src/android/text/TextLineTest.java index d9c09c8b03bf..b2fa2cfff1df 100644 --- a/core/tests/coretests/src/android/text/TextLineTest.java +++ b/core/tests/coretests/src/android/text/TextLineTest.java @@ -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); + } }