package de.mxro.thrd.hamcrest.core; import java.util.ArrayList; import java.util.List; import java.util.Vector; import de.mxro.thrd.hamcrest.BaseMatcher; import de.mxro.thrd.hamcrest.CompositeMatcher; import de.mxro.thrd.hamcrest.Description; import de.mxro.thrd.hamcrest.Factory; import de.mxro.thrd.hamcrest.Matcher; public class CombinableMatcher<T> extends BaseMatcher<T> implements CompositeMatcher { /** * */ private static final long serialVersionUID = 1L; private final Matcher<? super T> matcher; public CombinableMatcher(Matcher<? super T> matcher) { this.matcher= matcher; } @Override public boolean matches(Object item) { return matcher.matches(item); } @Override public void describeTo(Description description) { description.appendDescriptionOf(matcher); } public CombinableMatcher<T> and(Matcher<? super T> other) { return new CombinableMatcher<T>(new AllOf<T>(templatedListWith(other))); } public CombinableMatcher<T> or(Matcher<? super T> other) { return new CombinableMatcher<T>(new AnyOf<T>(templatedListWith(other))); } private ArrayList<Matcher<? super T>> templatedListWith(Matcher<? super T> other) { ArrayList<Matcher<? super T>> matchers = new ArrayList<Matcher<? super T>>(); matchers.add(matcher); matchers.add(other); return matchers; } /** * This is useful for fluently combining matchers that must both pass. For example: * <pre> * assertThat(string, both(containsString("a")).and(containsString("b"))); * </pre> */ @Factory public static <LHS> CombinableMatcher<LHS> both(Matcher<? super LHS> matcher) { return new CombinableMatcher<LHS>(matcher); } /** * This is useful for fluently combining matchers where either may pass, for example: * <pre> * assertThat(string, both(containsString("a")).and(containsString("b"))); * </pre> */ @Factory public static <LHS> CombinableMatcher<LHS> either(Matcher<? super LHS> matcher) { return new CombinableMatcher<LHS>(matcher); } @Override public List<Matcher<?>> getMatcher() { List<Matcher<?>> matchers = new Vector<Matcher<?>>(); matchers.add(this.matcher); return matchers; } }