package com.schibsted.spain.barista;
import android.support.annotation.IdRes;
import android.support.test.espresso.NoMatchingViewException;
import android.widget.AdapterView;
import com.schibsted.spain.barista.exception.BaristaException;
import static android.support.test.espresso.Espresso.onData;
import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
import static android.support.test.espresso.matcher.ViewMatchers.isDescendantOfA;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static com.schibsted.spain.barista.custom.PerformClickAction.clickUsingPerformClick;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.anything;
import static org.hamcrest.Matchers.instanceOf;
import static org.hamcrest.Matchers.is;
public class BaristaListViewActions {
public static void clickListViewItem(@IdRes int listViewId, int... positions) {
if (positions.length == 0) {
throw new BaristaException("positions cannot be empty");
}
for (int p : positions) {
performClick(listViewId, p);
}
}
public static void clickListViewItem(@IdRes int listViewId, Class<?> modelClass, int... positions) {
if (positions.length == 0) {
throw new BaristaException("positions cannot be empty");
}
for (int p : positions) {
performClick(listViewId, p, modelClass);
}
}
private static void performClick(@IdRes int listViewId, int position) {
try {
clickListItemForMultipleListsOnScreen(listViewId, position);
} catch (NoMatchingViewException e) {
clickListItemForSingleListOnScreen(position);
}
}
private static void performClick(@IdRes int listViewId, int position, Class<?> modelClass) {
try {
clickListItemForMultipleListsOnScreen(listViewId, position, modelClass);
} catch (NoMatchingViewException e) {
clickListItemForSingleListOnScreen(position, modelClass);
}
}
private static void clickListItemForMultipleListsOnScreen(@IdRes int listViewId, int position) {
// This method only seems to work when there are multiple ListViews in the same activity
onData(anything()).inAdapterView(
allOf(
isAssignableFrom(AdapterView.class),
isDescendantOfA(withId(listViewId)),
isDisplayed()))
.atPosition(position)
.perform(clickUsingPerformClick());
}
private static void clickListItemForMultipleListsOnScreen(@IdRes int listViewId, int position, Class<?> modelClass) {
// This method only seems to work when there are multiple ListViews in the same activity
onData(is(instanceOf(modelClass))).inAdapterView(
allOf(
isAssignableFrom(AdapterView.class),
isDescendantOfA(withId(listViewId)),
isDisplayed()))
.atPosition(position)
.perform(clickUsingPerformClick());
}
private static void clickListItemForSingleListOnScreen(int position) {
// This method only seems to work when there is just one ListView in the same activity
onData(anything())
.atPosition(position)
.perform(clickUsingPerformClick());
}
private static void clickListItemForSingleListOnScreen(int position, Class<?> modelClass) {
// This method only seems to work when there is just one ListView in the same activity
onData(is(instanceOf(modelClass)))
.atPosition(position)
.perform(clickUsingPerformClick());
}
}