001package org.hamcrest.core;
002
003import org.hamcrest.Description;
004import org.hamcrest.TypeSafeMatcher;
005
006public 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}