aboutsummaryrefslogtreecommitdiff
path: root/hamcrest-core/src/main/java/org/hamcrest/FeatureMatcher.java
diff options
context:
space:
mode:
Diffstat (limited to 'hamcrest-core/src/main/java/org/hamcrest/FeatureMatcher.java')
-rw-r--r--hamcrest-core/src/main/java/org/hamcrest/FeatureMatcher.java54
1 files changed, 54 insertions, 0 deletions
diff --git a/hamcrest-core/src/main/java/org/hamcrest/FeatureMatcher.java b/hamcrest-core/src/main/java/org/hamcrest/FeatureMatcher.java
new file mode 100644
index 0000000..385cf99
--- /dev/null
+++ b/hamcrest-core/src/main/java/org/hamcrest/FeatureMatcher.java
@@ -0,0 +1,54 @@
+package org.hamcrest;
+
+import org.hamcrest.internal.ReflectiveTypeFinder;
+
+/**
+ * Supporting class for matching a feature of an object. Implement <code>featureValueOf()</code>
+ * in a subclass to pull out the feature to be matched against.
+ *
+ * @param <T> The type of the object to be matched
+ * @param <U> The type of the feature to be matched
+ */
+public abstract class FeatureMatcher<T, U> extends TypeSafeDiagnosingMatcher<T> {
+ private static final ReflectiveTypeFinder TYPE_FINDER = new ReflectiveTypeFinder("featureValueOf", 1, 0);
+ private final Matcher<? super U> subMatcher;
+ private final String featureDescription;
+ private final String featureName;
+
+ /**
+ * Constructor
+ * @param subMatcher The matcher to apply to the feature
+ * @param featureDescription Descriptive text to use in describeTo
+ * @param featureName Identifying text for mismatch message
+ */
+ public FeatureMatcher(Matcher<? super U> subMatcher, String featureDescription, String featureName) {
+ super(TYPE_FINDER);
+ this.subMatcher = subMatcher;
+ this.featureDescription = featureDescription;
+ this.featureName = featureName;
+ }
+
+ /**
+ * Implement this to extract the interesting feature.
+ * @param actual the target object
+ * @return the feature to be matched
+ */
+ protected abstract U featureValueOf(T actual);
+
+ @Override
+ protected boolean matchesSafely(T actual, Description mismatch) {
+ final U featureValue = featureValueOf(actual);
+ if (!subMatcher.matches(featureValue)) {
+ mismatch.appendText(featureName).appendText(" ");
+ subMatcher.describeMismatch(featureValue, mismatch);
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public final void describeTo(Description description) {
+ description.appendText(featureDescription).appendText(" ")
+ .appendDescriptionOf(subMatcher);
+ }
+}