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 }