PreferenceMatchers.java

/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package androidx.test.espresso.matcher;

import static org.hamcrest.Matchers.is;

import android.content.res.Resources;
import android.preference.Preference;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;

/** A collection of hamcrest matchers that match {@link Preference}s. */
public final class PreferenceMatchers {

  private PreferenceMatchers() {}

  public static Matcher<Preference> withSummary(final int resourceId) {
    return new TypeSafeMatcher<Preference>() {
      private String resourceName = null;
      private String expectedText = null;

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

      @Override
      public boolean matchesSafely(Preference preference) {
        if (null == expectedText) {
          try {
            expectedText = preference.getContext().getResources().getString(resourceId);
            resourceName = preference.getContext().getResources().getResourceEntryName(resourceId);
          } catch (Resources.NotFoundException ignored) {
            /* view could be from a context unaware of the resource id. */
          }
        }
        if (null != expectedText) {
          return expectedText.equals(preference.getSummary().toString());
        } else {
          return false;
        }
      }
    };
  }

  public static Matcher<Preference> withSummaryText(String summary) {
    return withSummaryText(is(summary));
  }

  public static Matcher<Preference> withSummaryText(final Matcher<String> summaryMatcher) {
    return new TypeSafeMatcher<Preference>() {
      @Override
      public void describeTo(Description description) {
        description.appendText(" a preference with summary matching: ");
        summaryMatcher.describeTo(description);
      }

      @Override
      public boolean matchesSafely(Preference pref) {
        String summary = pref.getSummary().toString();
        return summaryMatcher.matches(summary);
      }
    };
  }

  public static Matcher<Preference> withTitle(final int resourceId) {
    return new TypeSafeMatcher<Preference>() {
      private String resourceName = null;
      private String expectedText = null;

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

      @Override
      public boolean matchesSafely(Preference preference) {
        if (null == expectedText) {
          try {
            expectedText = preference.getContext().getResources().getString(resourceId);
            resourceName = preference.getContext().getResources().getResourceEntryName(resourceId);
          } catch (Resources.NotFoundException ignored) {
            /* view could be from a context unaware of the resource id. */
          }
        }
        if (null != expectedText && preference.getTitle() != null) {
          return expectedText.equals(preference.getTitle().toString());
        } else {
          return false;
        }
      }
    };
  }

  public static Matcher<Preference> withTitleText(String title) {
    return withTitleText(is(title));
  }

  public static Matcher<Preference> withTitleText(final Matcher<String> titleMatcher) {
    return new TypeSafeMatcher<Preference>() {
      @Override
      public void describeTo(Description description) {
        description.appendText(" a preference with title matching: ");
        titleMatcher.describeTo(description);
      }

      @Override
      public boolean matchesSafely(Preference pref) {
        if (pref.getTitle() == null) {
          return false;
        }
        String title = pref.getTitle().toString();
        return titleMatcher.matches(title);
      }
    };
  }

  public static Matcher<Preference> isEnabled() {
    return new TypeSafeMatcher<Preference>() {
      @Override
      public void describeTo(Description description) {
        description.appendText(" is an enabled preference");
      }

      @Override
      public boolean matchesSafely(Preference pref) {
        return pref.isEnabled();
      }
    };
  }

  public static Matcher<Preference> withKey(String key) {
    return withKey(is(key));
  }

  public static Matcher<Preference> withKey(final Matcher<String> keyMatcher) {
    return new TypeSafeMatcher<Preference>() {
      @Override
      public void describeTo(Description description) {
        description.appendText(" preference with key matching: ");
        keyMatcher.describeTo(description);
      }

      @Override
      public boolean matchesSafely(Preference pref) {
        return keyMatcher.matches(pref.getKey());
      }
    };
  }
}