1package org.hamcrest.collection; 2 3import static org.hamcrest.core.AllOf.allOf; 4import org.hamcrest.Description; 5import org.hamcrest.Matcher; 6import org.hamcrest.Factory; 7import org.hamcrest.TypeSafeMatcher; 8import static org.hamcrest.core.IsEqual.equalTo; 9 10import java.util.Collection; 11import java.util.ArrayList; 12 13public class IsCollectionContaining<T> extends TypeSafeMatcher<Iterable<T>> { 14 private final Matcher<? extends T> elementMatcher; 15 16 public IsCollectionContaining(Matcher<? extends T> elementMatcher) { 17 this.elementMatcher = elementMatcher; 18 } 19 20 public boolean matchesSafely(Iterable<T> collection) { 21 for (T item : collection) { 22 if (elementMatcher.matches(item)){ 23 return true; 24 } 25 } 26 return false; 27 } 28 29 public void describeTo(Description description) { 30 description 31 .appendText("a collection containing ") 32 .appendDescriptionOf(elementMatcher); 33 } 34 35 @Factory 36 public static <T> Matcher<Iterable<T>> hasItem(Matcher<? extends T> elementMatcher) { 37 return new IsCollectionContaining<T>(elementMatcher); 38 } 39 40 @Factory 41 public static <T> Matcher<Iterable<T>> hasItem(T element) { 42 return hasItem(equalTo(element)); 43 } 44 45 @Factory 46 public static <T> Matcher<Iterable<T>> hasItems(Matcher<? extends T>... elementMatchers) { 47 Collection<Matcher<? extends Iterable<T>>> all 48 = new ArrayList<Matcher<? extends Iterable<T>>>(elementMatchers.length); 49 for (Matcher<? extends T> elementMatcher : elementMatchers) { 50 all.add(hasItem(elementMatcher)); 51 } 52 return allOf(all); 53 } 54 55 @Factory 56 public static <T> Matcher<Iterable<T>> hasItems(T... elements) { 57 Collection<Matcher<? extends Iterable<T>>> all 58 = new ArrayList<Matcher<? extends Iterable<T>>>(elements.length); 59 for (T element : elements) { 60 all.add(hasItem(element)); 61 } 62 return allOf(all); 63 } 64 65} 66