All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.assertj.android.api.widget.AbstractTextViewAssert Maven / Gradle / Ivy

There is a newer version: 1.2.0
Show newest version
package org.assertj.android.api.widget;

import android.annotation.TargetApi;
import android.graphics.Typeface;
import android.text.TextUtils;
import android.widget.TextView;
import java.util.regex.Pattern;
import org.assertj.android.api.view.AbstractViewAssert;

import static android.os.Build.VERSION_CODES.HONEYCOMB;
import static android.os.Build.VERSION_CODES.JELLY_BEAN;
import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR1;
import static android.view.Gravity.BOTTOM;
import static android.view.Gravity.CENTER;
import static android.view.Gravity.CENTER_HORIZONTAL;
import static android.view.Gravity.CENTER_VERTICAL;
import static android.view.Gravity.CLIP_HORIZONTAL;
import static android.view.Gravity.CLIP_VERTICAL;
import static android.view.Gravity.END;
import static android.view.Gravity.FILL;
import static android.view.Gravity.FILL_HORIZONTAL;
import static android.view.Gravity.FILL_VERTICAL;
import static android.view.Gravity.LEFT;
import static android.view.Gravity.NO_GRAVITY;
import static android.view.Gravity.RIGHT;
import static android.view.Gravity.START;
import static android.view.Gravity.TOP;
import static android.view.inputmethod.EditorInfo.IME_ACTION_DONE;
import static android.view.inputmethod.EditorInfo.IME_ACTION_GO;
import static android.view.inputmethod.EditorInfo.IME_ACTION_NEXT;
import static android.view.inputmethod.EditorInfo.IME_ACTION_NONE;
import static android.view.inputmethod.EditorInfo.IME_ACTION_PREVIOUS;
import static android.view.inputmethod.EditorInfo.IME_ACTION_SEARCH;
import static android.view.inputmethod.EditorInfo.IME_ACTION_SEND;
import static android.view.inputmethod.EditorInfo.IME_ACTION_UNSPECIFIED;
import static android.view.inputmethod.EditorInfo.IME_FLAG_FORCE_ASCII;
import static android.view.inputmethod.EditorInfo.IME_FLAG_NAVIGATE_NEXT;
import static android.view.inputmethod.EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS;
import static android.view.inputmethod.EditorInfo.IME_FLAG_NO_ACCESSORY_ACTION;
import static android.view.inputmethod.EditorInfo.IME_FLAG_NO_ENTER_ACTION;
import static android.view.inputmethod.EditorInfo.IME_FLAG_NO_EXTRACT_UI;
import static android.view.inputmethod.EditorInfo.IME_FLAG_NO_FULLSCREEN;
import static android.view.inputmethod.EditorInfo.IME_NULL;
import static org.assertj.android.internal.IntegerUtils.buildBitMaskString;
import static org.assertj.core.api.Assertions.assertThat;

public abstract class AbstractTextViewAssert, A extends TextView>
    extends AbstractViewAssert {
  protected AbstractTextViewAssert(A actual, Class selfType) {
    super(actual, selfType);
  }

  public S hasAutoLinkMask(int mask) {
    isNotNull();
    int actualMask = actual.getAutoLinkMask();
    assertThat(actualMask) //
        .overridingErrorMessage("Expected auto-link mask <%s> but was <%s>.", mask, actualMask) //
        .isEqualTo(mask);
    return myself;
  }

  public S hasCompoundDrawablePadding(int padding) {
    isNotNull();
    int actualPadding = actual.getCompoundDrawablePadding();
    assertThat(actualPadding) //
        .overridingErrorMessage("Expected compound drawable padding <%s> but was <%s>.", padding,
            actualPadding) //
        .isEqualTo(padding);
    return myself;
  }

  public S hasCompoundPaddingBottom(int padding) {
    isNotNull();
    int actualPadding = actual.getCompoundPaddingBottom();
    assertThat(actualPadding) //
        .overridingErrorMessage("Expected compound drawable bottom padding <%s> but was <%s>.",
            padding, actualPadding) //
        .isEqualTo(padding);
    return myself;
  }

  @TargetApi(JELLY_BEAN_MR1)
  public S hasCompoundPaddingEnd(int padding) {
    isNotNull();
    int actualPadding = actual.getCompoundPaddingEnd();
    assertThat(actualPadding) //
        .overridingErrorMessage("Expected compound drawable end padding <%s> but was <%s>.",
            padding, actualPadding) //
        .isEqualTo(padding);
    return myself;
  }

  public S hasCompoundPaddingLeft(int padding) {
    isNotNull();
    int actualPadding = actual.getCompoundPaddingLeft();
    assertThat(actualPadding) //
        .overridingErrorMessage("Expected compound drawable left padding <%s> but was <%s>.",
            padding, actualPadding) //
        .isEqualTo(padding);
    return myself;
  }

  public S hasCompoundPaddingRight(int padding) {
    isNotNull();
    int actualPadding = actual.getCompoundPaddingRight();
    assertThat(actualPadding) //
        .overridingErrorMessage("Expected compound drawable right padding <%s> but was <%s>.",
            padding, actualPadding) //
        .isEqualTo(padding);
    return myself;
  }

  @TargetApi(JELLY_BEAN_MR1)
  public S hasCompoundPaddingStart(int padding) {
    isNotNull();
    int actualPadding = actual.getCompoundPaddingStart();
    assertThat(actualPadding) //
        .overridingErrorMessage("Expected compound drawable start padding <%s> but was <%s>.",
            padding, actualPadding) //
        .isEqualTo(padding);
    return myself;
  }

  public S hasCompoundPaddingTop(int padding) {
    isNotNull();
    int actualPadding = actual.getCompoundPaddingTop();
    assertThat(actualPadding) //
        .overridingErrorMessage("Expected compound drawable top padding <%s> but was <%s>.",
            padding, actualPadding) //
        .isEqualTo(padding);
    return myself;
  }

  public S hasCurrentHintTextColor(int color) {
    isNotNull();
    int actualColor = actual.getCurrentHintTextColor();
    assertThat(actualColor) //
        .overridingErrorMessage("Expected current hint text color <%s> but was <%s>.",
            Integer.toHexString(color), Integer.toHexString(actualColor)) //
        .isEqualTo(color);
    return myself;
  }

  public S hasCurrentTextColor(int color) {
    isNotNull();
    int actualColor = actual.getCurrentTextColor();
    assertThat(actualColor) //
        .overridingErrorMessage("Expected current text color <%s> but was <%s>.",
            Integer.toHexString(color), Integer.toHexString(actualColor)) //
        .isEqualTo(color);
    return myself;
  }

  public S hasEllipsize(TextUtils.TruncateAt truncation) {
    isNotNull();
    TextUtils.TruncateAt actualTruncation = actual.getEllipsize();
    assertThat(actualTruncation) //
        .overridingErrorMessage("Expected ellipsize <%s> but was <%s>.", truncation,
            actualTruncation) //
        .isEqualTo(truncation);
    return myself;
  }

  public S hasError() {
    isNotNull();
    assertThat(actual.getError()) //
        .overridingErrorMessage("Expected error but had none.") //
        .isNotNull();
    return myself;
  }

  public S hasNoError() {
    isNotNull();
    assertThat(actual.getError()) //
        .overridingErrorMessage("Expected no error but had one.") //
        .isNull();
    return myself;
  }

  public S hasError(CharSequence error) {
    isNotNull();
    CharSequence actualError = actual.getError();
    assertThat(actualError) //
        .overridingErrorMessage("Expected error <%s> but was <%s>.", error, actualError) //
        .isEqualTo(error);
    return myself;
  }

  public S hasError(int resId) {
    isNotNull();
    return hasError(actual.getContext().getString(resId));
  }

  public S hasExtendedPaddingBottom(int padding) {
    isNotNull();
    int actualPadding = actual.getExtendedPaddingBottom();
    assertThat(actualPadding) //
        .overridingErrorMessage("Expected extended bottom padding <%s> but was <%s>.", padding,
            actualPadding) //
        .isEqualTo(padding);
    return myself;
  }

  public S hasExtendedPaddingTop(int padding) {
    isNotNull();
    int actualPadding = actual.getExtendedPaddingTop();
    assertThat(actualPadding) //
        .overridingErrorMessage("Expected extended top padding <%s> but was <%s>.", padding,
            actualPadding) //
        .isEqualTo(padding);
    return myself;
  }

  public S hasFreezesText(boolean freezes) {
    isNotNull();
    boolean actualFreezes = actual.getFreezesText();
    assertThat(actualFreezes) //
        .overridingErrorMessage("Expected freezes text <%s> but was <%s>.", freezes,
            actualFreezes) //
        .isEqualTo(freezes);
    return myself;
  }

  public S hasGravity(@TextViewGravity int gravity) {
    isNotNull();
    int actualGravity = actual.getGravity();
    //noinspection ResourceType
    assertThat(actualGravity) //
        .overridingErrorMessage("Expected gravity <%s> but was <%s>.", gravityToString(gravity),
            gravityToString(actualGravity)) //
        .isEqualTo(gravity);
    return myself;
  }

  @TargetApi(JELLY_BEAN)
  public S hasHighlightColor(int color) {
    isNotNull();
    int actualColor = actual.getHighlightColor();
    assertThat(actualColor) //
        .overridingErrorMessage("Expected highlight color <%s> but was <%s>.",
            Integer.toHexString(color), Integer.toHexString(actualColor)) //
        .isEqualTo(color);
    return myself;
  }

  public S hasHint(CharSequence hint) {
    isNotNull();
    CharSequence actualHint = actual.getHint();
    assertThat(actualHint) //
        .overridingErrorMessage("Expected hint <%s> but was <%s>.", hint, actualHint) //
        .isEqualTo(hint);
    return myself;
  }

  public S hasHint(int resId) {
    isNotNull();
    return hasHint(actual.getContext().getString(resId));
  }

  public S hasImeActionId(int id) {
    isNotNull();
    int actualId = actual.getImeActionId();
    assertThat(actualId) //
        .overridingErrorMessage("Expected IME action ID <%s> but was <%s>.", id, actualId) //
        .isEqualTo(id);
    return myself;
  }

  public S hasImeActionLabel(CharSequence label) {
    isNotNull();
    CharSequence actualLabel = actual.getImeActionLabel();
    assertThat(actualLabel) //
        .overridingErrorMessage("Expected IME action label <%s> but was <%s>.", label,
            actualLabel) //
        .isEqualTo(label);
    return myself;
  }

  public S hasImeActionLabel(int resId) {
    isNotNull();
    return hasImeActionLabel(actual.getContext().getString(resId));
  }

  public S hasImeOptions(@TextViewImeOptions int options) {
    isNotNull();
    int actualOptions = actual.getImeOptions();
    //noinspection ResourceType
    assertThat(actualOptions) //
        .overridingErrorMessage("Expected IME options <%s> but was <%s>.",
            imeOptionsToString(options), imeOptionsToString(actualOptions)) //
        .isEqualTo(options);
    return myself;
  }

  @TargetApi(JELLY_BEAN)
  public S isIncludingFontPadding() {
    isNotNull();
    assertThat(actual.getIncludeFontPadding()) //
        .overridingErrorMessage("Expected to be including font padding but was not.") //
        .isTrue();
    return myself;
  }

  @TargetApi(JELLY_BEAN)
  public S isNotIncludingFontPadding() {
    isNotNull();
    assertThat(actual.getIncludeFontPadding()) //
        .overridingErrorMessage("Expected to not be including font padding but was.") //
        .isFalse();
    return myself;
  }

  public S hasInputType(int type) {
    isNotNull();
    int actualType = actual.getInputType();
    assertThat(actualType) //
        .overridingErrorMessage("Expected input type <%s> but was <%s>.", type, actualType) //
        .isEqualTo(type);
    return myself;
  }

  public S hasLineCount(int count) {
    isNotNull();
    int actualCount = actual.getLineCount();
    assertThat(actualCount) //
        .overridingErrorMessage("Expected line count <%s> but was <%s>.", count, actualCount) //
        .isEqualTo(count);
    return myself;
  }

  public S hasLineHeight(int height) {
    isNotNull();
    int actualHeight = actual.getLineHeight();
    assertThat(actualHeight) //
        .overridingErrorMessage("Expected line height <%s> but was <%s>.", height, actualHeight) //
        .isEqualTo(height);
    return myself;
  }

  @TargetApi(JELLY_BEAN)
  public S hasLineSpacingExtra(float extra) {
    isNotNull();
    float actualExtra = actual.getLineSpacingExtra();
    assertThat(actualExtra) //
        .overridingErrorMessage("Expected line spacing extra <%s> but was <%s>.", extra,
            actualExtra) //
        .isEqualTo(extra);
    return myself;
  }

  @TargetApi(JELLY_BEAN)
  public S hasLineSpacingMultiplier(float multiplier) {
    isNotNull();
    float actualMultiplier = actual.getLineSpacingMultiplier();
    assertThat(actualMultiplier) //
        .overridingErrorMessage("Expected line spacing multiplier <%s> but was <%s>.", multiplier,
            actualMultiplier) //
        .isEqualTo(multiplier);
    return myself;
  }

  @TargetApi(JELLY_BEAN)
  public S hasMarqueeRepeatLimit(int limit) {
    isNotNull();
    int actualLimit = actual.getMarqueeRepeatLimit();
    assertThat(actualLimit) //
        .overridingErrorMessage("Expected marquee repeat limit <%s> but was <%s>.", limit,
            actualLimit) //
        .isEqualTo(limit);
    return myself;
  }

  @TargetApi(JELLY_BEAN)
  public S hasMaxEms(int ems) {
    isNotNull();
    int actualEms = actual.getMaxEms();
    assertThat(actualEms) //
        .overridingErrorMessage("Expected maximum EMs <%s> but was <%s>.", ems, actualEms) //
        .isEqualTo(ems);
    return myself;
  }

  @TargetApi(JELLY_BEAN)
  public S hasMaxHeight(int height) {
    isNotNull();
    int actualHeight = actual.getMaxHeight();
    assertThat(actualHeight) //
        .overridingErrorMessage("Expected maximum height <%s> but was <%s>.", height,
            actualHeight) //
        .isEqualTo(height);
    return myself;
  }

  @TargetApi(JELLY_BEAN)
  public S hasMaxLines(int lines) {
    isNotNull();
    int actualLines = actual.getMaxLines();
    assertThat(actualLines) //
        .overridingErrorMessage("Expected maximum lines <%s> but was <%s>.", lines, actualLines) //
        .isEqualTo(lines);
    return myself;
  }

  @TargetApi(JELLY_BEAN)
  public S hasMaxWidth(int ems) {
    isNotNull();
    int actualWidth = actual.getMaxWidth();
    assertThat(actualWidth) //
        .overridingErrorMessage("Expected maximum width <%s> but was <%s>.", ems, actualWidth) //
        .isEqualTo(ems);
    return myself;
  }

  @TargetApi(JELLY_BEAN)
  public S hasMinEms(int ems) {
    isNotNull();
    int actualEms = actual.getMinEms();
    assertThat(actualEms) //
        .overridingErrorMessage("Expected minimum EMs <%s> but was <%s>.", ems, actualEms) //
        .isEqualTo(ems);
    return myself;
  }

  @TargetApi(JELLY_BEAN)
  public S hasMinHeight(int height) {
    isNotNull();
    int actualHeight = actual.getMinHeight();
    assertThat(actualHeight) //
        .overridingErrorMessage("Expected minimum height <%s> but was <%s>.", height,
            actualHeight) //
        .isEqualTo(height);
    return myself;
  }

  @TargetApi(JELLY_BEAN)
  public S hasMinLines(int lines) {
    isNotNull();
    int actualLines = actual.getMinLines();
    assertThat(actualLines) //
        .overridingErrorMessage("Expected minimum lines <%s> but was <%s>.", lines, actualLines) //
        .isEqualTo(lines);
    return myself;
  }

  @TargetApi(JELLY_BEAN)
  public S hasMinWidth(int ems) {
    isNotNull();
    int actualWidth = actual.getMinWidth();
    assertThat(actualWidth) //
        .overridingErrorMessage("Expected minimum width <%s> but was <%s>.", ems, actualWidth) //
        .isEqualTo(ems);
    return myself;
  }

  public S hasPaintFlags(int flags) {
    isNotNull();
    int actualFlags = actual.getPaintFlags();
    assertThat(actualFlags) //
        .overridingErrorMessage("Expected paint flags <%s> but was <%s>.", flags, actualFlags) //
        .isEqualTo(flags);
    return myself;
  }

  public S hasSelectionEnd(int position) {
    isNotNull();
    int actualPosition = actual.getSelectionEnd();
    assertThat(actualPosition) //
        .overridingErrorMessage("Expected selection end <%s> but was <%s>.", position,
            actualPosition) //
        .isEqualTo(position);
    return myself;
  }

  public S hasSelectionStart(int position) {
    isNotNull();
    int actualPosition = actual.getSelectionStart();
    assertThat(actualPosition) //
        .overridingErrorMessage("Expected selection start <%s> but was <%s>.", position,
            actualPosition) //
        .isEqualTo(position);
    return myself;
  }

  @TargetApi(JELLY_BEAN)
  public S hasShadowColor(int color) {
    isNotNull();
    int actualColor = actual.getShadowColor();
    assertThat(actualColor) //
        .overridingErrorMessage("Expected shadow color <%s> but was <%s>.",
            Integer.toHexString(color), Integer.toHexString(actualColor)) //
        .isEqualTo(color);
    return myself;
  }

  @TargetApi(JELLY_BEAN)
  public S hasShadowDx(float dx) {
    isNotNull();
    float actualDx = actual.getShadowDx();
    assertThat(actualDx) //
        .overridingErrorMessage("Expected shadow DX <%s> but was <%s>.", dx, actualDx) //
        .isEqualTo(dx);
    return myself;
  }

  @TargetApi(JELLY_BEAN)
  public S hasShadowDy(float dy) {
    isNotNull();
    float actualDy = actual.getShadowDy();
    assertThat(actualDy) //
        .overridingErrorMessage("Expected shadow DY <%s> but was <%s>.", dy, actualDy) //
        .isEqualTo(dy);
    return myself;
  }

  @TargetApi(JELLY_BEAN)
  public S hasShadowRadius(float radius) {
    isNotNull();
    float actualRadius = actual.getShadowRadius();
    assertThat(actualRadius) //
        .overridingErrorMessage("Expected shadow radius <%s> but was <%s>.", radius,
            actualRadius) //
        .isEqualTo(radius);
    return myself;
  }

  public S hasText(CharSequence text) {
    isNotNull();
    CharSequence actualText = actual.getText();
    assertThat(actualText) //
        .overridingErrorMessage("Expected text <%s> but was <%s>.", text, actualText) //
        .isEqualTo(text);
    return myself;
  }

  public S hasText(int resId) {
    isNotNull();
    return hasText(actual.getContext().getString(resId));
  }

  public S hasTextString(String text) {
    isNotNull();
    String actualText = actual.getText().toString();
    assertThat(actualText) //
        .overridingErrorMessage("Expected text string <%s> but was <%s>.", text, actualText) //
        .isEqualTo(text);
    return myself;
  }

  public S hasTextString(int resId) {
    isNotNull();
    return hasTextString(actual.getContext().getString(resId));
  }

  public S isEmpty() {
    isNotNull();
    return hasTextString("");
  }

  public S isNotEmpty() {
    isNotNull();
    CharSequence text = actual.getText();
    assertThat(text) //
        .overridingErrorMessage("Expected empty text but was <%s>.", text) //
        .isNotEqualTo("");
    return myself;
  }

  public S matches(Pattern pattern) {
    isNotNull();
    String text = actual.getText().toString();
    assertThat(pattern.matcher(text).matches())
        .overridingErrorMessage("Expected text <%s> to match <%s>, but did not.", text,
            pattern.pattern())
        .isTrue();
    return myself;
  }

  public S doesNotMatch(Pattern pattern) {
    isNotNull();
    String text = actual.getText().toString();
    assertThat(pattern.matcher(text).matches())
        .overridingErrorMessage("Expected text <%s> to not match <%s>, but did.", text,
            pattern.pattern())
        .isFalse();
    return myself;
  }

  public S containsText(String sequence) {
    isNotNull();
    assertThat(actual.getText().toString()).contains(sequence);
    return myself;
  }

  public S containsText(int resId) {
    isNotNull();
    return containsText(actual.getContext().getString(resId));
  }

  public S doesNotContainText(String sequence) {
    isNotNull();
    assertThat(actual.getText().toString()).doesNotContain(sequence);
    return myself;
  }

  public S doesNotContainText(int resId) {
    isNotNull();
    return doesNotContainText(actual.getContext().getString(resId));
  }

  public S startsWithText(String sequence) {
    isNotNull();
    String text = actual.getText().toString();
    assertThat(text.startsWith(sequence)) //
        .overridingErrorMessage("Expected text <%s> to start with <%s> but did not.", text,
            sequence) //
        .isTrue();
    return myself;
  }

  public S startsWithText(int resId) {
    isNotNull();
    return startsWithText(actual.getContext().getString(resId));
  }

  public S doesNotStartWithText(String sequence) {
    isNotNull();
    String text = actual.getText().toString();
    assertThat(text.startsWith(sequence)) //
        .overridingErrorMessage("Expected text <%s> to not start with <%s> but did.", text,
            sequence) //
        .isFalse();
    return myself;
  }

  public S doesNotStartWithText(int resId) {
    isNotNull();
    return doesNotStartWithText(actual.getContext().getString(resId));
  }

  public S endsWithText(String sequence) {
    isNotNull();
    String text = actual.getText().toString();
    assertThat(text.endsWith(sequence)) //
        .overridingErrorMessage("Expected text <%s> to end with <%s> but did not.", text,
            sequence) //
        .isTrue();
    return myself;
  }

  public S endsWithText(int resId) {
    isNotNull();
    return endsWithText(actual.getContext().getString(resId));
  }

  public S doesNotEndWithText(String sequence) {
    isNotNull();
    String text = actual.getText().toString();
    assertThat(text.endsWith(sequence)) //
        .overridingErrorMessage("Expected text <%s> to not end with <%s> but did.", text,
            sequence) //
        .isFalse();
    return myself;
  }

  public S doesNotEndWithText(int resId) {
    isNotNull();
    return doesNotEndWithText(actual.getContext().getString(resId));
  }

  // TODO API 17
  //public S hasTextLocale(Locale locale) {
  //  isNotNull();
  //  Locale actualLocale = actual.getTextLocale();
  //  assertThat(actualLocale) //
  //      .overridingErrorMessage("Expected text locale <%s> but was <%s>.", locale, actualLocale) //
  //      .isEqualTo(locale);
  //  return myself;
  //}

  public S hasTextScaleX(float scale) {
    isNotNull();
    float actualScale = actual.getTextScaleX();
    assertThat(actualScale) //
        .overridingErrorMessage("Expected text X scale <%s> but was <%s>.", scale, actualScale) //
        .isEqualTo(scale);
    return myself;
  }

  public S hasTextSize(float size) {
    isNotNull();
    float actualSize = actual.getTextSize();
    assertThat(actualSize) //
        .overridingErrorMessage("Expected text size <%s> but was <%s>.", size, actualSize) //
        .isEqualTo(size);
    return myself;
  }

  public S hasTotalPaddingBottom(int padding) {
    isNotNull();
    int actualPadding = actual.getTotalPaddingBottom();
    assertThat(actualPadding) //
        .overridingErrorMessage("Expected total bottom padding <%s> but was <%s>.", padding,
            actualPadding) //
        .isEqualTo(padding);
    return myself;
  }

  @TargetApi(JELLY_BEAN_MR1)
  public S hasTotalPaddingEnd(int padding) {
    isNotNull();
    int actualPadding = actual.getTotalPaddingEnd();
    assertThat(actualPadding) //
        .overridingErrorMessage("Expected total end padding <%s> but was <%s>.", padding,
            actualPadding) //
        .isEqualTo(padding);
    return myself;
  }

  public S hasTotalPaddingLeft(int padding) {
    isNotNull();
    int actualPadding = actual.getTotalPaddingLeft();
    assertThat(actualPadding) //
        .overridingErrorMessage("Expected total left padding <%s> but was <%s>.", padding,
            actualPadding) //
        .isEqualTo(padding);
    return myself;
  }

  public S hasTotalPaddingRight(int padding) {
    isNotNull();
    int actualPadding = actual.getTotalPaddingRight();
    assertThat(actualPadding) //
        .overridingErrorMessage("Expected total right padding <%s> but was <%s>.", padding,
            actualPadding) //
        .isEqualTo(padding);
    return myself;
  }

  @TargetApi(JELLY_BEAN_MR1)
  public S hasTotalPaddingStart(int padding) {
    isNotNull();
    int actualPadding = actual.getTotalPaddingStart();
    assertThat(actualPadding) //
        .overridingErrorMessage("Expected total start padding <%s> but was <%s>.", padding,
            actualPadding) //
        .isEqualTo(padding);
    return myself;
  }

  public S hasTotalPaddingTop(int padding) {
    isNotNull();
    int actualPadding = actual.getTotalPaddingTop();
    assertThat(actualPadding) //
        .overridingErrorMessage("Expected total top padding <%s> but was <%s>.", padding,
            actualPadding) //
        .isEqualTo(padding);
    return myself;
  }

  public S hasTypeface(Typeface typeface) {
    isNotNull();
    Typeface actualTypeface = actual.getTypeface();
    assertThat(actualTypeface) //
        .overridingErrorMessage("Expected typeface <%s> but was <%s>.", typeface, actualTypeface) //
        .isSameAs(typeface);
    return myself;
  }

  @TargetApi(JELLY_BEAN)
  public S isCursorVisible() {
    isNotNull();
    assertThat(actual.isCursorVisible()) //
        .overridingErrorMessage("Expected cursor to be visible but was not visible.") //
        .isTrue();
    return myself;
  }

  @TargetApi(JELLY_BEAN)
  public S isCursorNotVisible() {
    isNotNull();
    assertThat(actual.isCursorVisible()) //
        .overridingErrorMessage("Expected cursor to not be visible but was visible.") //
        .isFalse();
    return myself;
  }

  @TargetApi(HONEYCOMB)
  public S hasSelectableText() {
    isNotNull();
    assertThat(actual.isTextSelectable()) //
        .overridingErrorMessage("Expected text to be selectable but was not.") //
        .isTrue();
    return myself;
  }

  @TargetApi(HONEYCOMB)
  public S hasUnselectableText() {
    isNotNull();
    assertThat(actual.isTextSelectable()) //
        .overridingErrorMessage("Expected text to not be selectable but was.") //
        .isFalse();
    return myself;
  }

  public S hasLength(int length) {
    isNotNull();
    int actualLength = actual.length();
    assertThat(actualLength) //
        .overridingErrorMessage("Expected length <%s> but was <%s>.", length, actualLength) //
        .isEqualTo(length);
    return myself;
  }

  public S isInputMethodTarget() {
    isNotNull();
    assertThat(actual.isInputMethodTarget()) //
        .overridingErrorMessage("Expected to be the input method target but was not.") //
        .isTrue();
    return myself;
  }

  public S isNotInputMethodTarget() {
    isNotNull();
    assertThat(actual.isInputMethodTarget()) //
        .overridingErrorMessage("Expected to not be the input method target but was.") //
        .isFalse();
    return myself;
  }

  public static String gravityToString(@TextViewGravity int gravity) {
    return buildBitMaskString(gravity)
        .flag(NO_GRAVITY, "no_gravity")
        .flag(TOP, "top")
        .flag(BOTTOM, "bottom")
        .flag(LEFT, "left")
        .flag(RIGHT, "right")
        .flag(CENTER_VERTICAL, "center_vertical")
        .flag(FILL_VERTICAL, "fill_vertical")
        .flag(CENTER_HORIZONTAL, "center_horizontal")
        .flag(FILL_HORIZONTAL, "fill_horizontal")
        .flag(CENTER, "center")
        .flag(FILL, "fill")
        .flag(CLIP_VERTICAL, "clip_vertical")
        .flag(CLIP_HORIZONTAL, "clip_horizontal")
        .flag(START, "start")
        .flag(END, "end")
        .get();
  }

  public static String imeOptionsToString(@TextViewImeOptions int options) {
    return buildBitMaskString(options)
        .flag(IME_ACTION_UNSPECIFIED, "action_unspecified")
        .flag(IME_ACTION_NONE, "action_none")
        .flag(IME_ACTION_GO, "action_go")
        .flag(IME_ACTION_SEARCH, "action_search")
        .flag(IME_ACTION_SEND, "action_send")
        .flag(IME_ACTION_NEXT, "action_next")
        .flag(IME_ACTION_DONE, "action_done")
        .flag(IME_ACTION_PREVIOUS, "action_previous")
        .flag(IME_FLAG_NO_FULLSCREEN, "flag_no_fullscreen")
        .flag(IME_FLAG_NAVIGATE_PREVIOUS, "flag_navigate_previous")
        .flag(IME_FLAG_NAVIGATE_NEXT, "flag_navigate_next")
        .flag(IME_FLAG_NO_EXTRACT_UI, "flag_no_extract_ui")
        .flag(IME_FLAG_NO_ACCESSORY_ACTION, "flag_no_accessory_action")
        .flag(IME_FLAG_NO_ENTER_ACTION, "flag_no_enter_action")
        .flag(IME_FLAG_FORCE_ASCII, "flag_force_ascii")
        .flag(IME_NULL, "null")
        .get();
  }
}