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