package org.test4j.hamcrest.matcher; import java.util.ArrayList; import java.util.List; import ext.test4j.hamcrest.BaseMatcher; import ext.test4j.hamcrest.Description; import ext.test4j.hamcrest.Matcher; import org.test4j.tools.commons.StringHelper; @SuppressWarnings("rawtypes") public class LinkMatcher<T> extends BaseMatcher<T> { private final List<MessageMatcher> matchers = new ArrayList<MessageMatcher>(); public void add(Matcher<?> matcher) { this.add(null, matcher); } public void add(String message, Matcher<?> matcher) { if (matcher instanceof MessageMatcher) { this.matchers.add((MessageMatcher) matcher); } else { this.matchers.add(new MessageMatcher(message, matcher)); } } public boolean matches(Object obj) { for (Matcher<?> matcher : matchers) { if (!matcher.matches(obj)) { return false; } } return true; } public void describeTo(Description description) { description.appendList("(", " and ", ")", matchers); } private static class MessageMatcher extends BaseMatcher { private Matcher<?> matcher; private String message; private Object actual; public MessageMatcher(String message, Matcher<?> matcher) { this.matcher = matcher; this.message = message; } public boolean matches(Object item) { this.actual = item; return this.matcher.matches(item); } public void describeTo(Description description) { if (StringHelper.isBlankOrNull(message)) { this.matcher.describeTo(description); } else { description.appendText(message) /** <br> */ .appendText("\nExpected: ")/** <br> */ .appendDescriptionOf(matcher)/** <br> */ .appendText("\n got: ")/** <br> */ .appendValue(this.actual)/** <br> */ .appendText("\n"); } } } }