1c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffinpackage org.hamcrest.collection;
2c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin
3c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffinimport org.hamcrest.FeatureMatcher;
4c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffinimport org.hamcrest.Matcher;
5c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin
6c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffinimport static org.hamcrest.core.DescribedAs.describedAs;
7c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffinimport static org.hamcrest.core.IsEqual.equalTo;
8c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin
9c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin/**
10c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin * Matches if array size satisfies a nested matcher.
11c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin */
12c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffinpublic class IsArrayWithSize<E> extends FeatureMatcher<E[], Integer> {
13c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    public IsArrayWithSize(Matcher<? super Integer> sizeMatcher) {
14c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin        super(sizeMatcher, "an array with size","array size");
15c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    }
16c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin
17c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    @Override
18c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    protected Integer featureValueOf(E[] actual) {
19c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin      return actual.length;
20c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    }
21c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin
22c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    /**
23c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * Creates a matcher for arrays that matches when the <code>length</code> of the array
24c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * satisfies the specified matcher.
25c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * For example:
26c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * <pre>assertThat(new String[]{"foo", "bar"}, arrayWithSize(equalTo(2)))</pre>
27c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     *
28c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * @param sizeMatcher
29c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     *     a matcher for the length of an examined array
30c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     */
31c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    public static <E> Matcher<E[]> arrayWithSize(Matcher<? super Integer> sizeMatcher) {
32c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin        return new IsArrayWithSize<E>(sizeMatcher);
33c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    }
34c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin
35c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    /**
36c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * Creates a matcher for arrays that matches when the <code>length</code> of the array
37c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * equals the specified <code>size</code>.
38c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * For example:
39c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * <pre>assertThat(new String[]{"foo", "bar"}, arrayWithSize(2))</pre>
40c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     *
41c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * @param size
42c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     *     the length that an examined array must have for a positive match
43c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     */
44c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    public static <E> Matcher<E[]> arrayWithSize(int size) {
45c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin        return arrayWithSize(equalTo(size));
46c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    }
47c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin
48c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    /**
49c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * Creates a matcher for arrays that matches when the <code>length</code> of the array
50c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * is zero.
51c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * For example:
52c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     * <pre>assertThat(new String[0], emptyArray())</pre>
53c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     *
54c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin     */
55c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    public static <E> Matcher<E[]> emptyArray() {
56c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin        Matcher<E[]> isEmpty = arrayWithSize(0);
57c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin        return describedAs("an empty array", isEmpty);
58c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin    }
59c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin}
60