How to check if collection contains items in given order using Hamcrest How to check if collection contains items in given order using Hamcrest java java

How to check if collection contains items in given order using Hamcrest


You can use contains matcher instead, but you probably need to use latest version of Hamcrest. That method checks the order.

assertThat(list, contains("foo", "boo"));

You can also try using containsInAnyOrder if order does not matter to you.

That's the code for contains matcher:

  public static <E> Matcher<Iterable<? extends E>> contains(List<Matcher<? super E>> itemMatchers)  {    return IsIterableContainingInOrder.contains(itemMatchers);  }


To check tha collection contains items in expected (given) order you can use Hamcrest's containsInRelativeOrder method.

From javadoc:

Creates a matcher for Iterable's that matches when a single pass over the examined Iterable yields a series of items, that contains items logically equal to the corresponding item in the specified items, in the same relative order For example: assertThat(Arrays.asList("a", "b", "c", "d", "e"), containsInRelativeOrder("b", "d")).

Actual for Java Hamcrest 2.0.0.0.

Hope this helps.


You need to implement a custom Matcher, something like this

class ListMatcher extends BaseMatcher {    String[] items;    ListMatcher(String... items) {        this.items = items;    }    @Override    public boolean matches(Object item) {        List list = (List) (item);        int l = -1;        for (String s : items) {            int i = list.indexOf(s);            if (i == -1 || i < l) {                return false;            }            l = i;        }        return true;    }    @Override    public void describeTo(Description description) {        // not implemented    }}@Testpublic void test1() {    List<String> list = Arrays.asList("foo", "bar", "boo");    Assert.assertThat(list, new ListMatcher("foo", "boo"));    Assert.assertThat(list, new ListMatcher("boo", "foo"));}