001 package org.hamcrest.core;
002
003 import org.hamcrest.Description;
004 import org.hamcrest.Factory;
005 import org.hamcrest.Matcher;
006 import org.hamcrest.TypeSafeDiagnosingMatcher;
007
008 public class Every<T> extends TypeSafeDiagnosingMatcher<Iterable<T>> {
009 private final Matcher<? super T> matcher;
010
011 public Every(Matcher<? super T> matcher) {
012 this.matcher= matcher;
013 }
014
015 @Override
016 public boolean matchesSafely(Iterable<T> collection, Description mismatchDescription) {
017 for (T t : collection) {
018 if (!matcher.matches(t)) {
019 mismatchDescription.appendText("an item ");
020 matcher.describeMismatch(t, mismatchDescription);
021 return false;
022 }
023 }
024 return true;
025 }
026
027 @Override
028 public void describeTo(Description description) {
029 description.appendText("every item is ").appendDescriptionOf(matcher);
030 }
031
032 /**
033 * Creates a matcher for {@link Iterable}s that only matches when a single pass over the
034 * examined {@link Iterable} yields items that are all matched by the specified
035 * <code>itemMatcher</code>.
036 * <p/>
037 * For example:
038 * <pre>assertThat(Arrays.asList("bar", "baz"), everyItem(startsWith("ba")))</pre>
039 *
040 * @param itemMatcher
041 * the matcher to apply to every item provided by the examined {@link Iterable}
042 */
043 @Factory
044 public static <U> Matcher<Iterable<U>> everyItem(final Matcher<U> itemMatcher) {
045 return new Every<U>(itemMatcher);
046 }
047 }