1c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffinpackage org.hamcrest.collection; 2c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin 3c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffinimport org.hamcrest.AbstractMatcherTest; 4c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffinimport org.hamcrest.FeatureMatcher; 5c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffinimport org.hamcrest.Matcher; 6c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin 7c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffinimport java.util.ArrayList; 8c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffinimport java.util.List; 9c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin 10c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffinimport static java.util.Arrays.asList; 11c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffinimport static org.hamcrest.collection.IsIterableContainingInOrder.contains; 12c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffinimport static org.hamcrest.core.IsEqual.equalTo; 13c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin 14c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin@SuppressWarnings("unchecked") 15c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffinpublic class IsIterableContainingInOrderTest extends AbstractMatcherTest { 16c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin // temporary hack until the Java type system works 17c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin private final Matcher<Iterable<? extends WithValue>> contains123 = contains(value(1), value(2), value(3)); 18c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin 19c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin @Override 20c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin protected Matcher<?> createMatcher() { 21c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin return contains(1, 2); 22c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin } 23c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin 24c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin public void testMatchingSingleItemIterable() throws Exception { 25c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin assertMatches("Single item iterable", contains(1), asList(1)); 26c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin } 27c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin 28c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin public void testMatchingMultipleItemIterable() throws Exception { 29c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin assertMatches("Multiple item iterable", contains(1, 2, 3), asList(1, 2, 3)); 30c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin } 31c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin 32c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin public void testDoesNotMatchWithMoreElementsThanExpected() throws Exception { 33c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin assertMismatchDescription("not matched: <4>", contains(1, 2, 3), asList(1, 2, 3, 4)); 34c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin } 35c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin 36c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin public void testDoesNotMatchWithFewerElementsThanExpected() throws Exception { 37c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin List<WithValue> valueList = asList(make(1), make(2)); 38c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin assertMismatchDescription("no item was value with <3>", contains123, valueList); 39c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin } 40c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin 41c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin public void testDoesNotMatchIfSingleItemMismatches() throws Exception { 42c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin assertMismatchDescription("item 0: value was <3>", contains(value(4)), asList(make(3))); 43c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin } 44c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin 45c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin public void testDoesNotMatchIfOneOfMultipleItemsMismatch() throws Exception { 46c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin assertMismatchDescription("item 2: value was <4>", contains123, asList(make(1), make(2), make(4))); 47c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin } 48c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin 49c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin public void testDoesNotMatchEmptyIterable() throws Exception { 50c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin assertMismatchDescription("no item was value with <4>", contains(value(4)), new ArrayList<WithValue>()); 51c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin } 52c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin 53c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin public void testHasAReadableDescription() { 54c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin assertDescription("iterable containing [<1>, <2>]", contains(1, 2)); 55c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin } 56c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin 57c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin public void testCanHandleNullMatchers() { 58c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin assertMatches(contains(null, null), asList(null, null)); 59c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin } 60c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin 61c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin public static class WithValue { 62c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin private final int value; 63c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin public WithValue(int value) { this.value = value; } 64c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin public int getValue() { return value; } 65c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin @Override public String toString() { return "WithValue " + value; } 66c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin } 67c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin 68c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin public static WithValue make(int value) { 69c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin return new WithValue(value); 70c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin } 71c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin 72c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin public static Matcher<WithValue> value(int value) { 73c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin return new FeatureMatcher<WithValue, Integer>(equalTo(value), "value with", "value") { 74c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin @Override protected Integer featureValueOf(WithValue actual) { return actual.getValue(); } 75c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin }; 76c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin } 77c1dbb44e71e47410ad5685aba3ef3fccb095a2b4Paul Duffin} 78