3

I have a vector drawable which I want to test using espresso.

  <TextView
                android:id="@+id/text_video_call"
                style="@style/UserDetails.TextView.Actions"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="24dp"
                android:drawableTop="@drawable/ic_video_24dp"
                android:text="@string/msg_video_call"
                android:visibility="gone"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toEndOf="@+id/text_message"
                app:layout_constraintTop_toBottomOf="@+id/text_username"
                tools:visibility="visible" />

Vector drawable: ic_video_24dp

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="20"
    android:viewportHeight="20">

    <path
        android:fillColor="#1d74f5"
        android:fillType="evenOdd"
        android:pathData="M16.538,13.564l-3.388,-1.09v-2.07l3.394,-1.085 -0.006,4.245zM11.696,14.56L3.454,14.56L3.454,8.32h8.242v6.24zM17.428,8.107c0.362,0.261 0.57,0.69 0.57,1.176v4.312c0,0.487 -0.209,0.914 -0.57,1.175a1.37,1.37 0,0 1,-0.808 0.254c-0.164,0 -0.331,-0.026 -0.498,-0.08l-2.972,-0.956L13.15,16L2,16L2,6.88h11.15v2.01l2.973,-0.956c0.468,-0.15 0.943,-0.087 1.305,0.173zM4.424,5.44L4.424,4h6.302v1.44L4.424,5.44z" />
</vector>

Is there any way I can UI test a vector drawable using espresso? Any help will be appreciated.

GOVIND DIXIT
  • 1,748
  • 10
  • 27

1 Answers1

0

It is preferred not to compare bitmaps and instead follow this answer's advice: https://stackoverflow.com/a/14474954/1396068

When setting the image view's drawable, also store the drawable ID in its tag with setTag(R.drawable.your_drawable). Then use Espresso's withTagValue(equalTo(R.drawable.your_drawable)) matchers to check for the correct tag.

please check this tutorial too that I found. Seems to work pretty good https://medium.com/@dbottillo/android-ui-test-espresso-matcher-for-imageview-1a28c832626f#.4snjg8frw

Here is the summary for copy paste ;-)

public class DrawableMatcher extends TypeSafeMatcher<View> {

    private final int expectedId;
    String resourceName;

    public DrawableMatcher(int expectedId) {
        super(View.class);
        this.expectedId = expectedId;
    }

    @Override
    protected boolean matchesSafely(View target) {
        if (!(target instanceof ImageView)){
            return false;
        }
        ImageView imageView = (ImageView) target;
        if (expectedId < 0){
            return imageView.getDrawable() == null;
        }
        Resources resources = target.getContext().getResources();
        Drawable expectedDrawable = resources.getDrawable(expectedId);
        resourceName = resources.getResourceEntryName(expectedId);

        if (expectedDrawable == null) {
            return false;
        }

        Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
        Bitmap otherBitmap = ((BitmapDrawable) expectedDrawable).getBitmap();
        return bitmap.sameAs(otherBitmap);
    }


    @Override
    public void describeTo(Description description) {
        description.appendText("with drawable from resource id: ");
        description.appendValue(expectedId);
        if (resourceName != null) {
            description.appendText("[");
            description.appendText(resourceName);
            description.appendText("]");
        }
    }
}

Please be aware that this only works when your Drawable is a BitmapDrawable. If you also have VectorDrawable or other Drawable you have to check for this (imageView.getDrawable() instanceOf XXXDrawable) and get the bitmap out of it. Except you have some kind of simple Drawable where you just have one color or so you can compare.

In order to get the Bitmap of a VectorDrawable, i.e. you have to draw the VectorDrawable to a canvas and save it to a bitmap. If you have a StateListDrawable you can get the Drawable of the selected state and repeat your if instance Of cascade.

marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
Aqib Farid
  • 128
  • 1
  • 4
  • 14
  • Thanks Aqib, but I have to test more than 50 drawable and setting tag is not an option. Is there any other way else this. – GOVIND DIXIT Jun 17 '19 at 20:01
  • Since I am working with VectorDrawable, what to be used in place of XXXDrawable, I had tried using VectorDrawable. – GOVIND DIXIT Jun 17 '19 at 20:26
  • you need to convert your vectorDrawable to BitmapDrawable, this is how you do that | [Vector to bitmap](https://stackoverflow.com/questions/33696488/getting-bitmap-from-vector-drawable) – Aqib Farid Jun 17 '19 at 21:07