package com.badoo.chateau.example; import android.content.Intent; import android.support.annotation.IdRes; import android.support.annotation.NonNull; import android.support.test.espresso.IdlingResource; import android.support.test.rule.ActivityTestRule; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import com.badoo.chateau.example.ui.BaseActivity; import org.junit.Rule; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; public abstract class BaseTestCase<A extends BaseActivity> { @Rule public ActivityTestRule<A> mActivityRule = new ActivityTestRule<A>( getActivityClass()) { @Override protected void beforeActivityLaunched() { super.beforeActivityLaunched(); BaseTestCase.this.beforeActivityLaunched(); } @Override protected Intent getActivityIntent() { return BaseTestCase.this.getActivityIntent(); } }; protected Intent getActivityIntent() { return null; } protected abstract Class<A> getActivityClass(); protected abstract void beforeActivityLaunched(); protected void runOnUiThread(@NonNull Runnable runnable) { mActivityRule.getActivity().runOnUiThread(runnable); } @SuppressWarnings("unused") public abstract static class SimpleAnswer implements Answer { @Override public final Object answer(InvocationOnMock invocation) throws Throwable { answer(); return null; } protected abstract void answer(); } @SuppressWarnings("unused") public static class WaitForViewIdlingResource<A extends BaseActivity> implements IdlingResource { private final View mView; private final int mVisibility; private final String mName; private ResourceCallback mCallback; public WaitForViewIdlingResource(@IdRes int viewId, int visibility, @NonNull ActivityTestRule<A> rule) { mName = "waitForView-" + viewId; mView = rule.getActivity().findViewById(viewId); mVisibility = visibility; } @Override public String getName() { return mName; } @Override public boolean isIdleNow() { if (mView.getVisibility() == mVisibility) { if (mCallback != null) { mCallback.onTransitionToIdle(); } return true; } return false; } @Override public void registerIdleTransitionCallback(ResourceCallback callback) { mCallback = callback; } } public static class WaitForRecycleViewScrollIdlingResource<A extends BaseActivity> implements IdlingResource { private final RecyclerView mView; private final int mPosition; private final String mName; private ResourceCallback mCallback; public WaitForRecycleViewScrollIdlingResource(@IdRes int viewId, int position, @NonNull ActivityTestRule<A> rule) { mName = "waitForView-" + viewId; mView = (RecyclerView) rule.getActivity().findViewById(viewId); mPosition = position; } @Override public String getName() { return mName; } @Override public boolean isIdleNow() { if (((LinearLayoutManager)mView.getLayoutManager()).findFirstCompletelyVisibleItemPosition() == mPosition) { if (mCallback != null) { mCallback.onTransitionToIdle(); } return true; } return false; } @Override public void registerIdleTransitionCallback(ResourceCallback callback) { mCallback = callback; } } }