fest-assert-2.x icon indicating copy to clipboard operation
fest-assert-2.x copied to clipboard

containsExactly() throws ArrayIndexOutOfBoundsException (2.0M8)

Open wjtk opened this issue 12 years ago • 3 comments

For code:

List<String> z = new ArrayList<>(Arrays.asList("a","a","a"));       
assertThat(z).containsExactly("a","a");

Stacktrace:

java.lang.ArrayIndexOutOfBoundsException: 2
    at org.fest.assertions.internal.Iterables.assertContainsExactly(Iterables.java:995)
    at org.fest.assertions.api.AbstractIterableAssert.containsExactly(AbstractIterableAssert.java:99)

Regards, Wojtek

wjtk avatar Jan 16 '13 14:01 wjtk

Definitely a bug ! Thanks for reporting this.

Having said that, this assertion javadoc is misleading ... What we wanted to do with containsExactly is to assert that the actual Iterable contained all the given objects in the same order, it entails that the actual size must match the varargs size.

It means your assertion will fail (but not with an exception !), as described below :

// should fail because z has 3 elements 
assertThat(z).containsExactly("a","a");

// succeeds as given varargs is composed of 3 elements matching exactly z elements 
assertThat(z).containsExactly("a","a", "a");

You probably know that but you can use containsOnly to test z content only :

assertThat(z).containsOnly("a");

joel-costigliola avatar Jan 16 '13 15:01 joel-costigliola

I know and understand :-)
Element values were not important, it could be a,b,c. I choose only "a" accidentally.

wjtk avatar Jan 16 '13 16:01 wjtk

fixed in 2.0M9 branch. I'm not closing this issue because it must be merged in master branch where a major rework for 2.0 is being done, merge will happen after the rework.

joel-costigliola avatar Feb 24 '13 10:02 joel-costigliola