| package org.hamcrest.core; |
| |
| import org.hamcrest.Description; |
| import org.hamcrest.TypeSafeMatcher; |
| |
| public abstract class SubstringMatcher extends TypeSafeMatcher<String> { |
| |
| // TODO: Replace String with CharSequence to allow for easy interoperability between |
| // String, StringBuffer, StringBuilder, CharBuffer, etc (joe). |
| |
| private final String relationship; |
| private final boolean ignoringCase; |
| protected final String substring; |
| |
| protected SubstringMatcher(String relationship, boolean ignoringCase, String substring) { |
| this.relationship = relationship; |
| this.ignoringCase = ignoringCase; |
| this.substring = substring; |
| } |
| |
| @Override |
| public boolean matchesSafely(String item) { |
| return evalSubstringOf(ignoringCase ? item.toLowerCase() :item); |
| } |
| @Override |
| public void describeMismatchSafely(String item, Description mismatchDescription) { |
| mismatchDescription.appendText("was \"").appendText(item).appendText("\""); |
| } |
| |
| @Override |
| public void describeTo(Description description) { |
| description.appendText("a string ") |
| .appendText(relationship) |
| .appendText(" ") |
| .appendValue(substring); |
| if (ignoringCase) { |
| description.appendText(" ignoring case"); |
| } |
| } |
| |
| protected String converted(String arg) { return ignoringCase ? arg.toLowerCase() : arg; } |
| protected abstract boolean evalSubstringOf(String string); |
| |
| } |