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