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    }