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