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