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