ViewHasTextMatcher.java revision 99fafb79bf98b7aa1946bbda1f0a225cefa2d35d
1package com.xtremelabs.robolectric.matchers;
2
3import android.view.View;
4import org.hamcrest.Description;
5import org.hamcrest.Factory;
6import org.hamcrest.Matcher;
7import org.junit.internal.matchers.TypeSafeMatcher;
8
9import static com.xtremelabs.robolectric.Robolectric.shadowOf;
10
11public class ViewHasTextMatcher<T extends View> extends TypeSafeMatcher<T> {
12    private String expected;
13    private int expectedResourceId;
14    private String actualText;
15
16    public ViewHasTextMatcher(String expected) {
17        this.expected = expected;
18        expectedResourceId = -1;
19    }
20
21    public ViewHasTextMatcher(int expectedResourceId) {
22        this.expected = null;
23        this.expectedResourceId = expectedResourceId;
24    }
25
26    @Override
27    public boolean matchesSafely(View actual) {
28        if (actual == null) {
29            return false;
30        }
31
32        if (expectedResourceId != -1) {
33            expected = actual.getContext().getResources().getString(expectedResourceId);
34        }
35
36        final CharSequence charSequence = shadowOf(actual).innerText();
37        if (charSequence == null || charSequence.toString() == null) {
38            return false;
39        }
40        actualText = charSequence.toString();
41
42        return actualText.equals(expected);
43    }
44
45    @Override
46    public void describeTo(Description description) {
47        description.appendText("[" + actualText + "]");
48        description.appendText(" to equal ");
49        description.appendText("[" + expected + "]");
50    }
51
52
53    @Factory
54    public static <T extends View> Matcher<T> hasText(String expectedTextViewText) {
55        return new ViewHasTextMatcher<T>(expectedTextViewText);
56    }
57
58    @Factory
59    public static <T extends View> Matcher<T> hasText(int expectedTextViewResourceId) {
60        return new ViewHasTextMatcher<T>(expectedTextViewResourceId);
61    }
62}
63