1c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffinpackage org.hamcrest.collection;
2c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin
3c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffinimport org.hamcrest.Description;
4c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffinimport org.hamcrest.Matcher;
5c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffinimport org.hamcrest.TypeSafeMatcher;
6c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffinimport org.hamcrest.internal.NullSafety;
7c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin
8c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffinimport java.util.ArrayList;
9c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffinimport java.util.Collection;
10c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffinimport java.util.List;
11c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin
12c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffinimport static java.util.Arrays.asList;
13c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffinimport static org.hamcrest.core.IsEqual.equalTo;
14c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin
15c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffinpublic class IsArrayContainingInOrder<E> extends TypeSafeMatcher<E[]> {
16c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    private final Collection<Matcher<? super E>> matchers;
17c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    private final IsIterableContainingInOrder<E> iterableMatcher;
18c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin
19c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    public IsArrayContainingInOrder(List<Matcher<? super E>> matchers) {
20c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin        this.iterableMatcher = new IsIterableContainingInOrder<E>(matchers);
21c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin        this.matchers = matchers;
22c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    }
23c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin
24c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    @Override
25c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    public boolean matchesSafely(E[] item) {
26c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin        return iterableMatcher.matches(asList(item));
27c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    }
28c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin
29c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    @Override
30c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    public void describeMismatchSafely(E[] item, Description mismatchDescription) {
31c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin      iterableMatcher.describeMismatch(asList(item), mismatchDescription);
32c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    }
33c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin
34c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    @Override
35c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    public void describeTo(Description description) {
36c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin        description.appendList("[", ", ", "]", matchers);
37c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    }
38c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin
39c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    /**
40c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * Creates a matcher for arrays that matches when each item in the examined array is
41c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * logically equal to the corresponding item in the specified items.  For a positive match,
42c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * the examined array must be of the same length as the number of specified items.
43c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * For example:
44c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * <pre>assertThat(new String[]{"foo", "bar"}, contains("foo", "bar"))</pre>
45c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     *
46c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * @param items
47c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     *     the items that must equal the items within an examined array
48c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     */
49c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    public static <E> Matcher<E[]> arrayContaining(E... items) {
50c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin        List<Matcher<? super E>> matchers = new ArrayList<Matcher<? super E>>();
51c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin        for (E item : items) {
52c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin            matchers.add(equalTo(item));
53c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin        }
54c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin        return arrayContaining(matchers);
55c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    }
56c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin
57c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    /**
58c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * Creates a matcher for arrays that matches when each item in the examined array satisfies the
59c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * corresponding matcher in the specified matchers.  For a positive match, the examined array
60c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * must be of the same length as the number of specified matchers.
61c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * For example:
62c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * <pre>assertThat(new String[]{"foo", "bar"}, contains(equalTo("foo"), equalTo("bar")))</pre>
63c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     *
64c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * @param itemMatchers
65c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     *     the matchers that must be satisfied by the items in the examined array
66c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     */
67c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    public static <E> Matcher<E[]> arrayContaining(Matcher<? super E>... itemMatchers) {
68c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin        //required for JDK 1.6
69c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin        //noinspection RedundantTypeArguments
70c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin        final List<Matcher<? super E>> nullSafeWithExplicitTypeMatchers = NullSafety.<E>nullSafe(itemMatchers);
71c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin
72c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin        return arrayContaining(nullSafeWithExplicitTypeMatchers);
73c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    }
74c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin
75c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    /**
76c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * Creates a matcher for arrays that matches when each item in the examined array satisfies the
77c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * corresponding matcher in the specified list of matchers.  For a positive match, the examined array
78c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * must be of the same length as the specified list of matchers.
79c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * For example:
80c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * <pre>assertThat(new String[]{"foo", "bar"}, contains(Arrays.asList(equalTo("foo"), equalTo("bar"))))</pre>
81c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     *
82c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * @param itemMatchers
83c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     *     a list of matchers, each of which must be satisfied by the corresponding item in an examined array
84c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     */
85c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    public static <E> Matcher<E[]> arrayContaining(List<Matcher<? super E>> itemMatchers) {
86c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin        return new IsArrayContainingInOrder<E>(itemMatchers);
87c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    }
88c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin
89c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin}
90