package test.utils; import com.google.common.collect.Iterables; import java.lang.reflect.Array; import java.lang.Class; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder; import static org.hamcrest.MatcherAssert.assertThat; public class AssertExtensions { public static void assertItemsEqual(Iterable expected, Iterable actual, EqualityComparer comparer) { assertItemsEqual(expected, actual, comparer, (String)null); } public static void assertItemsEqual(Iterable expected, Iterable actual, EqualityComparer comparer, String message) { List> expectedSet = new ArrayList>(); for(T item: expected) expectedSet.add(new EquatableWrapper(item, comparer)); List> actualSet = new ArrayList>(); for(T item: actual) actualSet.add(new EquatableWrapper(item, comparer)); assertItemsEqual(expectedSet, actualSet, message); } public static void assertItemsEqual(Iterable expected, Iterable actual) { assertItemsEqual(expected, actual, (String)null); } public static void assertItemsEqual(Iterable expected, Iterable actual, String message) { List list = new ArrayList(); T[] expectedArray = getArray(expected); assertThat(message, actual, containsInAnyOrder(expectedArray)); } private static T[] getArray(Iterable iterable) { // XXX: What a horrific way to create an array from an iterable. // Isn't there a better solution? List list = new ArrayList(); for(T item : iterable) list.add(item); @SuppressWarnings("unchecked") T[] result = (T[])new Object[list.size()]; for(int i = 0; i < list.size(); i++) result[i] = list.get(i); return result; } }