Tests for ellipsized & non-ellipsized TextView height

Asserts that ellipsized and non-ellipsized versions of TextView has the
same height.

Bug: 28988744
Bug: 18864800
Change-Id: I6aa0ac098c03a76c6a524d05e26b74272a069c9b
diff --git a/tests/tests/widget/src/android/widget/cts/TextViewTest.java b/tests/tests/widget/src/android/widget/cts/TextViewTest.java
index 66a0faa..e4dbe83 100644
--- a/tests/tests/widget/src/android/widget/cts/TextViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TextViewTest.java
@@ -2824,78 +2824,149 @@
     }
 
     @Test
-    public void testEllipsizeEndAndNoEllipsizeHasSameBaselineForSingleLine() throws Throwable {
-        mActivityRule.runOnUiThread(() -> {
-            mTextView = new TextView(mActivity);
-            mTextView.setEllipsize(TruncateAt.END);
-            mTextView.setMaxLines(1);
-            mTextView.setText(LONG_TEXT);
+    public void testEllipsizeAndMaxLinesForSingleLine() throws Throwable {
+        // no maxline or ellipsize set, single line text
+        final TextView tvNoMaxLine = new TextView(mActivity);
+        tvNoMaxLine.setLineSpacing(0, 1.5f);
+        tvNoMaxLine.setText("a");
 
-            mSecondTextView = new TextView(mActivity);
-            mSecondTextView.setText("a");
-        });
-        mInstrumentation.waitForIdleSync();
+        // maxline set, no ellipsize, text with two lines
+        final TextView tvEllipsizeNone = new TextView(mActivity);
+        tvEllipsizeNone.setMaxLines(1);
+        tvEllipsizeNone.setLineSpacing(0, 1.5f);
+        tvEllipsizeNone.setText("a\na");
 
-        final int textWidth = (int) mTextView.getPaint().measureText(LONG_TEXT) / 4;
-        mTextView.setWidth(textWidth);
-        mSecondTextView.setWidth(textWidth);
+        // maxline set, ellipsize end, text with two lines
+        final TextView tvEllipsizeEnd = new TextView(mActivity);
+        tvEllipsizeEnd.setEllipsize(TruncateAt.END);
+        tvEllipsizeEnd.setMaxLines(1);
+        tvEllipsizeEnd.setLineSpacing(0, 1.5f);
+        tvEllipsizeEnd.setText("a\na");
 
         final FrameLayout layout = new FrameLayout(mActivity);
         ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(
-                ViewGroup.LayoutParams.MATCH_PARENT,
-                ViewGroup.LayoutParams.MATCH_PARENT);
-        layout.addView(mTextView, layoutParams);
-        layout.addView(mSecondTextView, layoutParams);
-        layout.setLayoutParams(layoutParams);
+                ViewGroup.LayoutParams.WRAP_CONTENT,
+                ViewGroup.LayoutParams.WRAP_CONTENT);
+        layout.addView(tvEllipsizeEnd, layoutParams);
+        layout.addView(tvEllipsizeNone, layoutParams);
+        layout.addView(tvNoMaxLine, layoutParams);
 
-        mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout));
+        mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout,
+                new ViewGroup.LayoutParams(
+                        ViewGroup.LayoutParams.MATCH_PARENT,
+                        ViewGroup.LayoutParams.MATCH_PARENT)));
         mInstrumentation.waitForIdleSync();
 
-        assertEquals("Ellipsized and non ellipsized single line texts should have the same " +
-                        "baseline",
-                mTextView.getLayout().getLineBaseline(0),
-                mSecondTextView.getLayout().getLineBaseline(0));
+        assertEquals(tvEllipsizeEnd.getHeight(), tvEllipsizeNone.getHeight());
+
+        assertEquals(tvEllipsizeEnd.getHeight(), tvNoMaxLine.getHeight());
+
+        assertEquals(tvEllipsizeEnd.getLayout().getLineBaseline(0),
+                tvEllipsizeNone.getLayout().getLineBaseline(0));
+
+        assertEquals(tvEllipsizeEnd.getLayout().getLineBaseline(0),
+                tvNoMaxLine.getLayout().getLineBaseline(0));
     }
 
     @Test
-    public void testEllipsizeEndAndNoEllipsizeHasSameBaselineForMultiLine() throws Throwable {
-        mActivityRule.runOnUiThread(() -> {
-            mTextView = new TextView(mActivity);
-            mTextView.setEllipsize(TruncateAt.END);
-            mTextView.setMaxLines(2);
-            mTextView.setText(LONG_TEXT);
+    public void testEllipsizeAndMaxLinesForMultiLine() throws Throwable {
+        // no maxline, no ellipsize, text with two lines
+        final TextView tvNoMaxLine = new TextView(mActivity);
+        tvNoMaxLine.setLineSpacing(0, 1.5f);
+        tvNoMaxLine.setText("a\na");
 
-            mSecondTextView = new TextView(mActivity);
-            mSecondTextView.setMaxLines(2);
-            mSecondTextView.setText(LONG_TEXT);
-        });
-        mInstrumentation.waitForIdleSync();
+        // maxline set, no ellipsize, text with three lines
+        final TextView tvEllipsizeNone = new TextView(mActivity);
+        tvEllipsizeNone.setMaxLines(2);
+        tvEllipsizeNone.setLineSpacing(0, 1.5f);
+        tvEllipsizeNone.setText("a\na\na");
 
-        final int textWidth = (int) mTextView.getPaint().measureText(LONG_TEXT) / 2;
-        mTextView.setWidth(textWidth);
-        mSecondTextView.setWidth(textWidth);
+        // maxline set, ellipsize end, text with three lines
+        final TextView tvEllipsizeEnd = new TextView(mActivity);
+        tvEllipsizeEnd.setEllipsize(TruncateAt.END);
+        tvEllipsizeEnd.setMaxLines(2);
+        tvEllipsizeEnd.setLineSpacing(0, 1.5f);
+        tvEllipsizeEnd.setText("a\na\na");
 
         final FrameLayout layout = new FrameLayout(mActivity);
         ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(
-                ViewGroup.LayoutParams.MATCH_PARENT,
-                ViewGroup.LayoutParams.MATCH_PARENT);
+                ViewGroup.LayoutParams.WRAP_CONTENT,
+                ViewGroup.LayoutParams.WRAP_CONTENT);
 
-        layout.addView(mTextView, layoutParams);
-        layout.addView(mSecondTextView, layoutParams);
-        layout.setLayoutParams(layoutParams);
+        layout.addView(tvNoMaxLine, layoutParams);
+        layout.addView(tvEllipsizeEnd, layoutParams);
+        layout.addView(tvEllipsizeNone, layoutParams);
 
-        mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout));
+        mActivityRule.runOnUiThread(() ->  mActivity.setContentView(layout,
+                new ViewGroup.LayoutParams(
+                        ViewGroup.LayoutParams.MATCH_PARENT,
+                        ViewGroup.LayoutParams.MATCH_PARENT)));
         mInstrumentation.waitForIdleSync();
 
-        for (int i = 0; i < mTextView.getLineCount(); i++) {
-            assertEquals("Ellipsized and non ellipsized multi line texts should have the same " +
-                            "baseline for line " + i,
-                    mTextView.getLayout().getLineBaseline(i),
-                    mSecondTextView.getLayout().getLineBaseline(i));
+        assertEquals(tvEllipsizeEnd.getHeight(), tvEllipsizeNone.getHeight());
+
+        assertEquals(tvEllipsizeEnd.getHeight(), tvNoMaxLine.getHeight());
+
+        for (int i = 0; i < tvEllipsizeEnd.getLineCount(); i++) {
+            assertEquals("Should have the same baseline for line " + i,
+                    tvEllipsizeEnd.getLayout().getLineBaseline(i),
+                    tvEllipsizeNone.getLayout().getLineBaseline(i));
+
+            assertEquals("Should have the same baseline for line " + i,
+                    tvEllipsizeEnd.getLayout().getLineBaseline(i),
+                    tvNoMaxLine.getLayout().getLineBaseline(i));
         }
     }
 
     @Test
+    public void testEllipsizeAndMaxLinesForHint() throws Throwable {
+        // no maxline, no ellipsize, hint with two lines
+        final TextView tvTwoLines = new TextView(mActivity);
+        tvTwoLines.setLineSpacing(0, 1.5f);
+        tvTwoLines.setHint("a\na");
+
+        // no maxline, no ellipsize, hint with three lines
+        final TextView tvThreeLines = new TextView(mActivity);
+        tvThreeLines.setLineSpacing(0, 1.5f);
+        tvThreeLines.setHint("a\na\na");
+
+        // maxline set, ellipsize end, hint with three lines
+        final TextView tvEllipsizeEnd = new TextView(mActivity);
+        tvEllipsizeEnd.setEllipsize(TruncateAt.END);
+        tvEllipsizeEnd.setMaxLines(2);
+        tvEllipsizeEnd.setLineSpacing(0, 1.5f);
+        tvEllipsizeEnd.setHint("a\na\na");
+
+        // maxline set, no ellipsize, hint with three lines
+        final TextView tvEllipsizeNone = new TextView(mActivity);
+        tvEllipsizeNone.setMaxLines(2);
+        tvEllipsizeNone.setLineSpacing(0, 1.5f);
+        tvEllipsizeNone.setHint("a\na\na");
+
+        final FrameLayout layout = new FrameLayout(mActivity);
+        ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(
+                ViewGroup.LayoutParams.WRAP_CONTENT,
+                ViewGroup.LayoutParams.WRAP_CONTENT);
+
+        layout.addView(tvTwoLines, layoutParams);
+        layout.addView(tvEllipsizeEnd, layoutParams);
+        layout.addView(tvEllipsizeNone, layoutParams);
+        layout.addView(tvThreeLines, layoutParams);
+
+        mActivityRule.runOnUiThread(() ->  mActivity.setContentView(layout,
+                new ViewGroup.LayoutParams(
+                        ViewGroup.LayoutParams.MATCH_PARENT,
+                        ViewGroup.LayoutParams.MATCH_PARENT)));
+        mInstrumentation.waitForIdleSync();
+
+        assertEquals("Non-ellipsized hint should not crop text at maxLines",
+                tvThreeLines.getHeight(), tvEllipsizeNone.getHeight());
+
+        assertEquals("Ellipsized hint should crop text at maxLines",
+                tvTwoLines.getHeight(), tvEllipsizeEnd.getHeight());
+    }
+
+    @Test
     public void testTextViewInWeigthenedLayoutChangesWidthAfterSetText() throws Throwable {
         mActivityRule.runOnUiThread(() -> {
             mTextView = new TextView(mActivity);
@@ -2937,6 +3008,7 @@
                 mTextView.getWidth() > oldWidth);
     }
 
+
     @UiThreadTest
     @Test
     public void testAccessCursorVisible() {