TestUtilsMatchers.java revision 244abf1fee3fe4fab72a1d8925407e29219940be
1244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov/*
2244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov * Copyright (C) 2015 The Android Open Source Project
3244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov *
4244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov * Licensed under the Apache License, Version 2.0 (the "License");
5244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov * you may not use this file except in compliance with the License.
6244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov * You may obtain a copy of the License at
7244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov *
8244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov *      http://www.apache.org/licenses/LICENSE-2.0
9244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov *
10244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov * Unless required by applicable law or agreed to in writing, software
11244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov * distributed under the License is distributed on an "AS IS" BASIS,
12244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov * See the License for the specific language governing permissions and
14244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov * limitations under the License.
15244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov */
16244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov
17244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikovpackage android.support.v7.testutils;
18244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov
19244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikovimport android.graphics.drawable.Drawable;
20244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikovimport android.support.annotation.ColorInt;
21244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikovimport android.support.test.espresso.matcher.BoundedMatcher;
22244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikovimport android.view.View;
23244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikovimport android.widget.ImageView;
24244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikovimport org.hamcrest.Description;
25244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikovimport org.hamcrest.Matcher;
26244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov
27244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikovpublic class TestUtilsMatchers {
28244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov    /**
29244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov     * Returns a matcher that matches <code>ImageView</code>s which have drawable flat-filled
30244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov     * with the specific color.
31244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov     */
32244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov    public static Matcher drawable(@ColorInt final int color) {
33244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov        return new BoundedMatcher<View, ImageView>(ImageView.class) {
34244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov            private String failedComparisonDescription;
35244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov
36244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov            @Override
37244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov            public void describeTo(final Description description) {
38244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                description.appendText("with drawable of color: ");
39244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov
40244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                description.appendText(failedComparisonDescription);
41244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov            }
42244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov
43244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov            @Override
44244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov            public boolean matchesSafely(final ImageView view) {
45244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                Drawable drawable = view.getDrawable();
46244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                if (drawable == null) {
47244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                    return false;
48244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                }
49244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov
50244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                // One option is to check if we have a ColorDrawable and then call getColor
51244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                // but that API is v11+. Instead, we call our helper method that checks whether
52244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                // all pixels in a Drawable are of the same specified color.
53244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                try {
54244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                    TestUtils.assertAllPixelsOfColor("", drawable, view.getWidth(),
55244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                            view.getHeight(), color, true);
56244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                    // If we are here, the color comparison has passed.
57244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                    failedComparisonDescription = null;
58244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                    return true;
59244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                } catch (Throwable t) {
60244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                    // If we are here, the color comparison has failed.
61244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                    failedComparisonDescription = t.getMessage();
62244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                    return false;
63244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov                }
64244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov            }
65244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov        };
66244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov    }
67244abf1fee3fe4fab72a1d8925407e29219940beKirill Grouchnikov}
68