Как проверить, равны ли два StateListDrawable(s)?

Я пытаюсь написать тест, чтобы проверить, имеет ли моя ViewGroup правильный фон. Я использую Espresso и Hamcrest для теста.

Это XML-файл, который я использовал для фона моей ViewGroup(RelativeLayout).

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <corners android:radius="4dp" />
            <solid android:color="@color/gray" />
        </shape>
    </item>
    <item>
        <shape android:shape="rectangle">
            <corners android:radius="4dp" />
            <solid android:color="@color/white" />
            <stroke
                android:width="1dp"
                android:color="@color/colorPrimaryDark" />
        </shape>
    </item>
</selector>

Попытка 1

Я следовал коду от programcreek.com и получаю GradientDrawable после getCurrent называется на обоих expectedDrawable а также actualDrawable, поскольку GradientDrawable в примере не рассматривается, я попытался добавить несколько кодов, надеясь, что это сработает.

public static Matcher<View> withBgDrawable(final int expectedResourceId) {

    return new TypeSafeMatcher<View>() {
        @Override
        public boolean matchesSafely(View view) {

            Drawable actualDrawable = view.getBackground();

            if (expectedResourceId < 0) return actualDrawable == null;

            Drawable expectedDrawable = ContextCompat.getDrawable(view.getContext(), expectedResourceId);
            if (expectedDrawable == null) return false;

            if (actualDrawable instanceof StateListDrawable) {
                actualDrawable = actualDrawable.getCurrent();
            }
            if (expectedDrawable instanceof StateListDrawable) {
                expectedDrawable = expectedDrawable.getCurrent();
            }

            if (expectedDrawable instanceof GradientDrawable) {
                return actualDrawable instanceof GradientDrawable && gradientToBitmap((GradientDrawable) expectedDrawable)
                        .sameAs(gradientToBitmap((GradientDrawable) actualDrawable));
            }

            throw new IllegalArgumentException("Unsupported drawable: " + actualDrawable);

        }

        @Override
        public void describeTo(Description description) {
            description.appendText("with drawable ");
        }

    };

}

private static Bitmap gradientToBitmap(GradientDrawable gradientDrawable) {
    Bitmap bitmap = Bitmap.createBitmap(gradientDrawable.getIntrinsicWidth(), gradientDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    gradientDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    gradientDrawable.draw(canvas);
    return bitmap;
}

это ошибка, которую я получаю.

java.lang.IllegalArgumentException: ширина и высота должны быть> 0

Итак, я записал значение gradientDrawable.getIntrinsicWidth() чтобы увидеть, что происходит, и обнаружил, что это было -1,

Попытка 2

Затем я попытался изменить те StateListDrawable(s) прямо в Bitmap(Ы). Я получаю ту же ошибку, что и попытка 1.

public static Matcher<View> withBgDrawable(final int expectedResourceId) {

    return new TypeSafeMatcher<View>() {
        @Override
        public boolean matchesSafely(View view) {

            Drawable actualDrawable = view.getBackground();

            if (expectedResourceId < 0) return actualDrawable == null;

            Drawable expectedDrawable = ContextCompat.getDrawable(view.getContext(), expectedResourceId);
            if (expectedDrawable == null) return false;

            if (expectedDrawable instanceof StateListDrawable) {
                return actualDrawable instanceof StateListDrawable && stateListToBitmap((StateListDrawable) expectedDrawable)
                        .sameAs(stateListToBitmap((StateListDrawable) actualDrawable));
            }

            throw new IllegalArgumentException("Unsupported drawable: " + actualDrawable);

        }

        @Override
        public void describeTo(Description description) {
            description.appendText("with drawable ");
        }

    };

}

private static Bitmap stateListToBitmap(StateListDrawable stateListDrawable) {
    Bitmap bitmap = Bitmap.createBitmap(stateListDrawable.getIntrinsicWidth(), stateListDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    stateListDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    stateListDrawable.draw(canvas);
    return bitmap;
}

Попытка 3

Если я просто использую equals или же == либо на StateListDrawable или же GradientDrawableDrawables из того же XML-файла не совпадают.

android.support.test.espresso.base.DefaultFailureHandler $ AssertionFailedWithCauseError: "with drawable" не соответствует выбранному представлению.

0 ответов

Другие вопросы по тегам