blob: 19242cbd767aedf8b6c7caa1aedfb2c63c883f2d [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.support.v4.widget;
import android.content.res.Resources;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.support.annotation.ColorInt;
import android.support.compat.test.R;
import android.support.v4.BaseInstrumentationTestCase;
import android.support.v4.testutils.TestUtils;
import android.support.v4.view.ViewCompat;
import android.test.suitebuilder.annotation.MediumTest;
import android.test.suitebuilder.annotation.SmallTest;
import android.widget.TextView;
import org.junit.Before;
import org.junit.Test;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.v4.testutils.LayoutDirectionActions.setLayoutDirection;
import static android.support.v4.testutils.TextViewActions.*;
import static org.junit.Assert.*;
public class TextViewCompatTest extends BaseInstrumentationTestCase<TextViewTestActivity> {
private static final String TAG = "TextViewCompatTest";
private TextView mTextView;
private class TestDrawable extends ColorDrawable {
private int mWidth;
private int mHeight;
public TestDrawable(@ColorInt int color, int width, int height) {
super(color);
mWidth = width;
mHeight = height;
}
@Override
public int getIntrinsicWidth() {
return mWidth;
}
@Override
public int getIntrinsicHeight() {
return mHeight;
}
}
public TextViewCompatTest() {
super(TextViewTestActivity.class);
}
@Before
public void setUp() {
mTextView = (TextView) mActivityTestRule.getActivity().findViewById(R.id.text_view);
}
@Test
@SmallTest
public void testMaxLines() throws Throwable {
final int maxLinesCount = 4;
onView(withId(R.id.text_view)).perform(setMaxLines(maxLinesCount));
assertEquals("Empty view: Max lines must match", TextViewCompat.getMaxLines(mTextView),
maxLinesCount);
onView(withId(R.id.text_view)).perform(setText(R.string.test_text_short));
assertEquals("Short text: Max lines must match", TextViewCompat.getMaxLines(mTextView),
maxLinesCount);
onView(withId(R.id.text_view)).perform(setText(R.string.test_text_medium));
assertEquals("Medium text: Max lines must match", TextViewCompat.getMaxLines(mTextView),
maxLinesCount);
onView(withId(R.id.text_view)).perform(setText(R.string.test_text_long));
assertEquals("Long text: Max lines must match", TextViewCompat.getMaxLines(mTextView),
maxLinesCount);
}
@Test
@SmallTest
public void testMinLines() throws Throwable {
final int minLinesCount = 3;
onView(withId(R.id.text_view)).perform(setMinLines(minLinesCount));
assertEquals("Empty view: Min lines must match", TextViewCompat.getMinLines(mTextView),
minLinesCount);
onView(withId(R.id.text_view)).perform(setText(R.string.test_text_short));
assertEquals("Short text: Min lines must match", TextViewCompat.getMinLines(mTextView),
minLinesCount);
onView(withId(R.id.text_view)).perform(setText(R.string.test_text_medium));
assertEquals("Medium text: Min lines must match", TextViewCompat.getMinLines(mTextView),
minLinesCount);
onView(withId(R.id.text_view)).perform(setText(R.string.test_text_long));
assertEquals("Long text: Min lines must match", TextViewCompat.getMinLines(mTextView),
minLinesCount);
}
@Test
@SmallTest
public void testStyle() throws Throwable {
onView(withId(R.id.text_view)).perform(setTextAppearance(R.style.TextMediumStyle));
final Resources res = mActivityTestRule.getActivity().getResources();
assertTrue("Styled text view: style",
mTextView.getTypeface().isItalic() || (mTextView.getPaint().getTextSkewX() < 0));
assertEquals("Styled text view: color", mTextView.getTextColors().getDefaultColor(),
res.getColor(R.color.text_color));
assertEquals("Styled text view: size", mTextView.getTextSize(),
(float) res.getDimensionPixelSize(R.dimen.text_medium_size), 1.0f);
}
@Test
@SmallTest
public void testCompoundDrawablesRelative() throws Throwable {
final Drawable drawableStart = new ColorDrawable(0xFFFF0000);
drawableStart.setBounds(0, 0, 20, 20);
final Drawable drawableTop = new ColorDrawable(0xFF00FF00);
drawableTop.setBounds(0, 0, 30, 25);
final Drawable drawableEnd = new ColorDrawable(0xFF0000FF);
drawableEnd.setBounds(0, 0, 25, 20);
onView(withId(R.id.text_view)).perform(setText(R.string.test_text_medium));
onView(withId(R.id.text_view)).perform(setCompoundDrawablesRelative(drawableStart,
drawableTop, drawableEnd, null));
final Drawable[] drawablesAbsolute = mTextView.getCompoundDrawables();
assertEquals("Compound drawable: left", drawablesAbsolute[0], drawableStart);
assertEquals("Compound drawable: left width",
drawablesAbsolute[0].getBounds().width(), 20);
assertEquals("Compound drawable: left height",
drawablesAbsolute[0].getBounds().height(), 20);
assertEquals("Compound drawable: top", drawablesAbsolute[1], drawableTop);
assertEquals("Compound drawable: top width",
drawablesAbsolute[1].getBounds().width(), 30);
assertEquals("Compound drawable: top height",
drawablesAbsolute[1].getBounds().height(), 25);
assertEquals("Compound drawable: right", drawablesAbsolute[2], drawableEnd);
assertEquals("Compound drawable: right width",
drawablesAbsolute[2].getBounds().width(), 25);
assertEquals("Compound drawable: right height",
drawablesAbsolute[2].getBounds().height(), 20);
assertNull("Compound drawable: bottom", drawablesAbsolute[3]);
}
@Test
@SmallTest
public void testCompoundDrawablesRelativeRtl() throws Throwable {
onView(withId(R.id.text_view)).perform(setLayoutDirection(ViewCompat.LAYOUT_DIRECTION_RTL));
final Drawable drawableStart = new ColorDrawable(0xFFFF0000);
drawableStart.setBounds(0, 0, 20, 20);
final Drawable drawableTop = new ColorDrawable(0xFF00FF00);
drawableTop.setBounds(0, 0, 30, 25);
final Drawable drawableEnd = new ColorDrawable(0xFF0000FF);
drawableEnd.setBounds(0, 0, 25, 20);
onView(withId(R.id.text_view)).perform(setText(R.string.test_text_medium));
onView(withId(R.id.text_view)).perform(setCompoundDrawablesRelative(drawableStart,
drawableTop, drawableEnd, null));
// Check to see whether our text view is under RTL mode
if (ViewCompat.getLayoutDirection(mTextView) != ViewCompat.LAYOUT_DIRECTION_RTL) {
// This will happen on v17- devices
return;
}
final Drawable[] drawablesAbsolute = mTextView.getCompoundDrawables();
// End drawable should be returned as left
assertEquals("Compound drawable: left", drawablesAbsolute[0], drawableEnd);
assertEquals("Compound drawable: left width",
drawablesAbsolute[0].getBounds().width(), 25);
assertEquals("Compound drawable: left height",
drawablesAbsolute[0].getBounds().height(), 20);
assertEquals("Compound drawable: top", drawablesAbsolute[1], drawableTop);
assertEquals("Compound drawable: left width",
drawablesAbsolute[1].getBounds().width(), 30);
assertEquals("Compound drawable: left height",
drawablesAbsolute[1].getBounds().height(), 25);
// Start drawable should be returned as right
assertEquals("Compound drawable: right", drawablesAbsolute[2], drawableStart);
assertEquals("Compound drawable: left width",
drawablesAbsolute[2].getBounds().width(), 20);
assertEquals("Compound drawable: left height",
drawablesAbsolute[2].getBounds().height(), 20);
assertNull("Compound drawable: bottom", drawablesAbsolute[3]);
}
@Test
@SmallTest
public void testCompoundDrawablesRelativeWithIntrinsicBounds() throws Throwable {
final Drawable drawableStart = new TestDrawable(0xFFFF0000, 30, 20);
final Drawable drawableEnd = new TestDrawable(0xFF0000FF, 25, 45);
final Drawable drawableBottom = new TestDrawable(0xFF00FF00, 15, 35);
onView(withId(R.id.text_view)).perform(setText(R.string.test_text_long));
onView(withId(R.id.text_view)).perform(setCompoundDrawablesRelativeWithIntrinsicBounds(
drawableStart, null, drawableEnd, drawableBottom));
final Drawable[] drawablesAbsolute = mTextView.getCompoundDrawables();
assertEquals("Compound drawable: left", drawablesAbsolute[0], drawableStart);
assertEquals("Compound drawable: left width",
drawablesAbsolute[0].getBounds().width(), 30);
assertEquals("Compound drawable: left height",
drawablesAbsolute[0].getBounds().height(), 20);
assertNull("Compound drawable: top", drawablesAbsolute[1]);
assertEquals("Compound drawable: right", drawablesAbsolute[2], drawableEnd);
assertEquals("Compound drawable: right width",
drawablesAbsolute[2].getBounds().width(), 25);
assertEquals("Compound drawable: right height",
drawablesAbsolute[2].getBounds().height(), 45);
assertEquals("Compound drawable: bottom", drawablesAbsolute[3], drawableBottom);
assertEquals("Compound drawable: bottom width",
drawablesAbsolute[3].getBounds().width(), 15);
assertEquals("Compound drawable: bottom height",
drawablesAbsolute[3].getBounds().height(), 35);
}
@Test
@SmallTest
public void testCompoundDrawablesRelativeWithIntrinsicBoundsRtl() throws Throwable {
onView(withId(R.id.text_view)).perform(setLayoutDirection(ViewCompat.LAYOUT_DIRECTION_RTL));
final Drawable drawableStart = new TestDrawable(0xFFFF0000, 30, 20);
final Drawable drawableEnd = new TestDrawable(0xFF0000FF, 25, 45);
final Drawable drawableBottom = new TestDrawable(0xFF00FF00, 15, 35);
onView(withId(R.id.text_view)).perform(setText(R.string.test_text_long));
onView(withId(R.id.text_view)).perform(setCompoundDrawablesRelativeWithIntrinsicBounds(
drawableStart, null, drawableEnd, drawableBottom));
// Check to see whether our text view is under RTL mode
if (ViewCompat.getLayoutDirection(mTextView) != ViewCompat.LAYOUT_DIRECTION_RTL) {
// This will happen on v17- devices
return;
}
final Drawable[] drawablesAbsolute = mTextView.getCompoundDrawables();
// End drawable should be returned as left
assertEquals("Compound drawable: left", drawablesAbsolute[0], drawableEnd);
assertEquals("Compound drawable: left width",
drawablesAbsolute[0].getBounds().width(), 25);
assertEquals("Compound drawable: left height",
drawablesAbsolute[0].getBounds().height(), 45);
assertNull("Compound drawable: top", drawablesAbsolute[1]);
// Start drawable should be returned as right
assertEquals("Compound drawable: right", drawablesAbsolute[2], drawableStart);
assertEquals("Compound drawable: right width",
drawablesAbsolute[2].getBounds().width(), 30);
assertEquals("Compound drawable: right height",
drawablesAbsolute[2].getBounds().height(), 20);
assertEquals("Compound drawable: bottom", drawablesAbsolute[3], drawableBottom);
assertEquals("Compound drawable: bottom width",
drawablesAbsolute[3].getBounds().width(), 15);
assertEquals("Compound drawable: bottom height",
drawablesAbsolute[3].getBounds().height(), 35);
}
@Test
@MediumTest
public void testCompoundDrawablesRelativeWithIntrinsicBoundsById() throws Throwable {
onView(withId(R.id.text_view)).perform(setText(R.string.test_text_long));
onView(withId(R.id.text_view)).perform(setCompoundDrawablesRelativeWithIntrinsicBounds(
R.drawable.test_drawable_red, 0,
R.drawable.test_drawable_green, R.drawable.test_drawable_blue));
final Drawable[] drawablesAbsolute = mTextView.getCompoundDrawables();
final Resources res = mActivityTestRule.getActivity().getResources();
// The entire left drawable should be the specific red color
TestUtils.assertAllPixelsOfColor("Compound drawable: left color",
drawablesAbsolute[0], res.getColor(R.color.test_red));
assertEquals("Compound drawable: left width",
drawablesAbsolute[0].getBounds().width(),
res.getDimensionPixelSize(R.dimen.drawable_small_size));
assertEquals("Compound drawable: left height",
drawablesAbsolute[0].getBounds().height(),
res.getDimensionPixelSize(R.dimen.drawable_medium_size));
assertNull("Compound drawable: top", drawablesAbsolute[1]);
// The entire right drawable should be the specific green color
TestUtils.assertAllPixelsOfColor("Compound drawable: right color",
drawablesAbsolute[2], res.getColor(R.color.test_green));
assertEquals("Compound drawable: right width",
drawablesAbsolute[2].getBounds().width(),
res.getDimensionPixelSize(R.dimen.drawable_medium_size));
assertEquals("Compound drawable: right height",
drawablesAbsolute[2].getBounds().height(),
res.getDimensionPixelSize(R.dimen.drawable_large_size));
// The entire bottom drawable should be the specific blue color
TestUtils.assertAllPixelsOfColor("Compound drawable: bottom color",
drawablesAbsolute[3], res.getColor(R.color.test_blue));
assertEquals("Compound drawable: bottom width",
drawablesAbsolute[3].getBounds().width(),
res.getDimensionPixelSize(R.dimen.drawable_large_size));
assertEquals("Compound drawable: bottom height",
drawablesAbsolute[3].getBounds().height(),
res.getDimensionPixelSize(R.dimen.drawable_small_size));
}
@Test
@MediumTest
public void testCompoundDrawablesRelativeWithIntrinsicBoundsByIdRtl() throws Throwable {
onView(withId(R.id.text_view)).perform(setLayoutDirection(ViewCompat.LAYOUT_DIRECTION_RTL));
onView(withId(R.id.text_view)).perform(setText(R.string.test_text_long));
onView(withId(R.id.text_view)).perform(setCompoundDrawablesRelativeWithIntrinsicBounds(
R.drawable.test_drawable_red, 0,
R.drawable.test_drawable_green, R.drawable.test_drawable_blue));
// Check to see whether our text view is under RTL mode
if (ViewCompat.getLayoutDirection(mTextView) != ViewCompat.LAYOUT_DIRECTION_RTL) {
// This will happen on v17- devices
return;
}
final Drawable[] drawablesAbsolute = mTextView.getCompoundDrawables();
final Resources res = mActivityTestRule.getActivity().getResources();
// The entire left / end drawable should be the specific green color
TestUtils.assertAllPixelsOfColor("Compound drawable: left color",
drawablesAbsolute[0], res.getColor(R.color.test_green));
assertEquals("Compound drawable: left width",
drawablesAbsolute[0].getBounds().width(),
res.getDimensionPixelSize(R.dimen.drawable_medium_size));
assertEquals("Compound drawable: left height",
drawablesAbsolute[0].getBounds().height(),
res.getDimensionPixelSize(R.dimen.drawable_large_size));
assertNull("Compound drawable: top", drawablesAbsolute[1]);
// The entire right drawable should be the specific red color
TestUtils.assertAllPixelsOfColor("Compound drawable: right color",
drawablesAbsolute[2], res.getColor(R.color.test_red));
assertEquals("Compound drawable: right width",
drawablesAbsolute[2].getBounds().width(),
res.getDimensionPixelSize(R.dimen.drawable_small_size));
assertEquals("Compound drawable: right height",
drawablesAbsolute[2].getBounds().height(),
res.getDimensionPixelSize(R.dimen.drawable_medium_size));
// The entire bottom drawable should be the specific blue color
TestUtils.assertAllPixelsOfColor("Compound drawable: bottom color",
drawablesAbsolute[3], res.getColor(R.color.test_blue));
assertEquals("Compound drawable: bottom width",
drawablesAbsolute[3].getBounds().width(),
res.getDimensionPixelSize(R.dimen.drawable_large_size));
assertEquals("Compound drawable: bottom height",
drawablesAbsolute[3].getBounds().height(),
res.getDimensionPixelSize(R.dimen.drawable_small_size));
}
@Test
@SmallTest
public void testCompoundDrawablesRelativeGetterAndSetter() {
final Drawable drawableStart = new TestDrawable(0xFFFF0000, 20, 20);
final Drawable drawableTop = new TestDrawable(0xFFFFFF00, 20, 20);
final Drawable drawableEnd = new TestDrawable(0xFF0000FF, 20, 20);
final Drawable drawableBottom = new TestDrawable(0xFF00FF00, 20, 20);
onView(withId(R.id.text_view)).perform(setLayoutDirection(ViewCompat.LAYOUT_DIRECTION_RTL));
onView(withId(R.id.text_view)).perform(setCompoundDrawablesRelative(drawableStart,
drawableTop, drawableEnd, drawableBottom));
// Check to see whether our text view is under RTL mode
if (ViewCompat.getLayoutDirection(mTextView) != ViewCompat.LAYOUT_DIRECTION_RTL) {
// This will happen on v17- devices
return;
}
final Drawable[] drawablesRelative = TextViewCompat.getCompoundDrawablesRelative(mTextView);
assertEquals(drawableStart, drawablesRelative[0]);
assertEquals(drawableTop, drawablesRelative[1]);
assertEquals(drawableEnd, drawablesRelative[2]);
assertEquals(drawableBottom, drawablesRelative[3]);
}
}