001 package org.hamcrest; 002 003 004 /** 005 * Utility class for writing one off matchers. 006 * For example: 007 * <pre> 008 * Matcher<String> aNonEmptyString = new CustomTypeSafeMatcher<String>("a non empty string") { 009 * public boolean matchesSafely(String string) { 010 * return !string.isEmpty(); 011 * } 012 * public void describeMismatchSafely(String string, Description mismatchDescription) { 013 * mismatchDescription.appendText("was empty"); 014 * } 015 * }; 016 * </pre> 017 * This is a variant of {@link CustomMatcher} that first type checks 018 * the argument being matched. By the time {@link TypeSafeMatcher#matchesSafely} is 019 * is called the argument is guaranteed to be non-null and of the correct 020 * type. 021 * 022 * @author Neil Dunn 023 * @param <T> The type of object being matched 024 */ 025 public abstract class CustomTypeSafeMatcher<T> extends TypeSafeMatcher<T> { 026 private final String fixedDescription; 027 028 public CustomTypeSafeMatcher(String description) { 029 if (description == null) { 030 throw new IllegalArgumentException("Description must be non null!"); 031 } 032 this.fixedDescription = description; 033 } 034 035 @Override 036 public final void describeTo(Description description) { 037 description.appendText(fixedDescription); 038 } 039 }