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.Collection;
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 <T> void assertItemsEqual(Collection<T> expected, Iterable<T> actual, EqualityComparer<T> comparer) {
		assertItemsEqual(expected, actual, comparer, (String)null);
	}
	
	public static <T> void assertItemsEqual(Collection<T> expected, Iterable<T> actual, EqualityComparer<T> comparer, String message) {
		List<EquatableWrapper<T>> expectedSet = new ArrayList<EquatableWrapper<T>>();
		for(T item: expected)
			expectedSet.add(new EquatableWrapper<T>(item, comparer));

		List<EquatableWrapper<T>> actualSet = new ArrayList<EquatableWrapper<T>>();
		for(T item: actual)
			actualSet.add(new EquatableWrapper<T>(item, comparer));

		assertItemsEqual(expectedSet, actualSet, message);
	}	
	
	public static <T> void assertItemsEqual(Collection<T> expected, Iterable<T> actual) {
		assertItemsEqual(expected, actual, (String)null);
	}
	
	public static <T> void assertItemsEqual(Collection<T> expected, Iterable<T> actual, String message) {
		List<T> list = new ArrayList<T>();
		T[] expectedArray = (T[])expected.toArray();
		assertThat(message, actual, containsInAnyOrder(expectedArray));
	}	
}