001 package org.hamcrest.core;
002
003 import org.hamcrest.Description;
004 import org.hamcrest.TypeSafeMatcher;
005
006 public abstract class SubstringMatcher extends TypeSafeMatcher<String> {
007
008 // TODO: Replace String with CharSequence to allow for easy interopability between
009 // String, StringBuffer, StringBuilder, CharBuffer, etc (joe).
010
011 protected final String substring;
012
013 protected SubstringMatcher(final String substring) {
014 this.substring = substring;
015 }
016
017 @Override
018 public boolean matchesSafely(String item) {
019 return evalSubstringOf(item);
020 }
021 @Override
022 public void describeMismatchSafely(String item, Description mismatchDescription) {
023 mismatchDescription.appendText("was \"").appendText(item).appendText("\"");
024 }
025
026 @Override
027 public void describeTo(Description description) {
028 description.appendText("a string ")
029 .appendText(relationship())
030 .appendText(" ")
031 .appendValue(substring);
032 }
033
034 protected abstract boolean evalSubstringOf(String string);
035
036 protected abstract String relationship();
037 }