package org.test4j.hamcrest.iassert.common.impl;
import java.util.ArrayList;
import java.util.List;
import org.test4j.hamcrest.iassert.common.intf.IAssert;
import org.test4j.hamcrest.iassert.common.intf.IListHasItemsAssert;
import org.test4j.hamcrest.matcher.array.ListEveryItemMatcher;
import org.test4j.hamcrest.matcher.modes.ItemsMode;
import org.test4j.hamcrest.matcher.modes.MatchMode;
import ext.test4j.hamcrest.Matcher;
import ext.test4j.hamcrest.collection.IsArrayContaining;
import ext.test4j.hamcrest.core.AllOf;
import ext.test4j.hamcrest.core.AnyOf;
import ext.test4j.hamcrest.core.IsCollectionContaining;
@SuppressWarnings({ "rawtypes" })
public class ListHasItemsAssert<T, E extends IAssert> extends BaseAssert<T, E> implements IListHasItemsAssert<E> {
public ListHasItemsAssert(Class<? extends IAssert> clazE) {
super(clazE);
}
public ListHasItemsAssert(T value, Class<? extends IAssert> clazE) {
super(value, clazE);
}
public E hasItems(Object item) {
assert valueClaz != null : "the value asserted must not be null";
if (this.valueClaz == Object[].class) {
return this.assertThat(IsArrayContaining.hasItemInArray(item));
} else {
return this.assertThat(IsCollectionContaining.hasItem(item));
}
}
public E hasItems(Object item, Object... items) {
return this.hasAllItems(item, items);
}
public E hasAllItems(Object item, Object... items) {
List<Matcher> list = this.getHasItemMatchers(item, items);
Matcher matcher = AllOf.allOf(list);
return this.assertThat(matcher);
}
public E hasAnyItems(Object item, Object... items) {
List<Matcher> list = this.getHasItemMatchers(item, items);
Matcher matcher = AnyOf.anyOf(list);
return this.assertThat(matcher);
}
private List<Matcher> getHasItemMatchers(Object item, Object... items) {
assert valueClaz != null : "the value asserted must not be null";
List<Matcher> list = new ArrayList<Matcher>();
if (this.valueClaz == Object[].class) {
list.add(IsArrayContaining.hasItemInArray(item));
} else {
list.add(IsCollectionContaining.hasItem(item));
}
if (items == null || items.length == 0) {
return list;
}
for (Object temp : items) {
if (this.valueClaz == Object[].class) {
list.add(IsArrayContaining.hasItemInArray(temp));
} else {
list.add(IsCollectionContaining.hasItem(temp));
}
}
return list;
}
public E match(ItemsMode itemsMode, MatchMode matchMode, Matcher matcher, Matcher... matchers) {
if (itemsMode == ItemsMode.AllItems && matchMode == MatchMode.MatchAll) {
return this.allItemsMatchAll(matcher, matchers);
} else if (itemsMode == ItemsMode.AllItems && matchMode == MatchMode.MatchAny) {
return this.allItemsMatchAny(matcher, matchers);
} else if (itemsMode == ItemsMode.AnyItems && matchMode == MatchMode.MatchAll) {
return this.anyItemsMatchAll(matcher, matchers);
} else if (itemsMode == ItemsMode.AnyItems && matchMode == MatchMode.MatchAny) {
return this.anyItemsMatchAny(matcher, matchers);
} else {
throw new RuntimeException("the arguments[ItmesMode and MatchMode] of items match API can't be null.");
}
}
private Matcher getAnyItemsMatchAll(Matcher matcher, Matcher... matchers) {
List<Matcher> list = new ArrayList<Matcher>();
list.add(matcher);
for (Matcher m : matchers) {
list.add(m);
}
Matcher allItems = AllOf.allOf(list);
return new ListEveryItemMatcher(allItems, ItemsMode.AnyItems);
}
private List<Matcher> getItemsMatchers(ItemsMode itemsMode, Matcher matcher, Matcher... matchers) {
List<Matcher> list = new ArrayList<Matcher>();
ListEveryItemMatcher m1 = new ListEveryItemMatcher(matcher, itemsMode);
list.add(m1);
if (matchers == null || matchers.length == 0) {
return list;
}
for (Matcher m : matchers) {
ListEveryItemMatcher m2 = new ListEveryItemMatcher(m, itemsMode);
list.add(m2);
}
return list;
}
public E allItemsMatchAll(Matcher matcher, Matcher... matchers) {
List<Matcher> list = this.getItemsMatchers(ItemsMode.AllItems, matcher, matchers);
return this.assertThat(AllOf.allOf(list));
}
public E allItemsMatchAny(Matcher matcher, Matcher... matchers) {
List<Matcher> list = this.getItemsMatchers(ItemsMode.AllItems, matcher, matchers);
return this.assertThat(AnyOf.anyOf(list));
}
public E anyItemsMatchAll(Matcher matcher, Matcher... matchers) {
Matcher m = this.getAnyItemsMatchAll(matcher, matchers);
return this.assertThat(m);
}
public E anyItemsMatchAny(Matcher matcher, Matcher... matchers) {
List<Matcher> list = this.getItemsMatchers(ItemsMode.AnyItems, matcher, matchers);
return this.assertThat(AnyOf.anyOf(list));
}
}