package com.github.paolorotolo.appintroexample;
import android.support.test.espresso.Espresso;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.support.v4.view.ViewPager;
import android.view.View;
import com.amqtech.opensource.appintroexample.util.ViewPagerIdlingResource;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.action.ViewActions.swipeLeft;
import static android.support.test.espresso.action.ViewActions.swipeRight;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.Visibility;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.isRoot;
import static android.support.test.espresso.matcher.ViewMatchers.withEffectiveVisibility;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
import static com.amqtech.opensource.appintroexample.util.OrientationChangeAction.orientationLandscape;
import static com.amqtech.opensource.appintroexample.util.OrientationChangeAction.orientationPortrait;
import static org.hamcrest.CoreMatchers.allOf;
@RunWith(AndroidJUnit4.class)
public class SwipeLockTest {
private ViewPagerIdlingResource viewPagerIdlingResource;
private int viewPagerResId;
private int btnSkipResId;
private int btnNextResId;
private int btnDoneResId;
@Rule
public ActivityTestRule<DisableSwipeIntro1> mActivityRule = new ActivityTestRule(DisableSwipeIntro1.class);
@Before
public void registerIntentServiceIdlingResource() {
viewPagerResId = R.id.view_pager;
btnSkipResId = R.id.skip;
btnNextResId = R.id.next;
btnDoneResId = R.id.done;
View testRootView = mActivityRule.getActivity().findViewById(android.R.id.content);
ViewPager testViewPager = (ViewPager) testRootView.findViewById(viewPagerResId);
viewPagerIdlingResource = new ViewPagerIdlingResource(testViewPager, "ViewPager");
Espresso.registerIdlingResources(viewPagerIdlingResource);
}
@After
public void unregisterIntentServiceIdlingResource() {
if (viewPagerIdlingResource != null) {
Espresso.unregisterIdlingResources(viewPagerIdlingResource);
}
}
@Test
public void skipButtonHiding() {
// hide button
onView(allOf(withId(btnSkipResId), isDisplayed())).check(matches(withEffectiveVisibility(Visibility.VISIBLE)));
onView(allOf(withId(R.id.button_disable_skip), isDisplayed())).perform(click());
checkButtonVisibility(btnSkipResId, Visibility.INVISIBLE);
checkButtonVisibilityOnPageSwipe(viewPagerResId, btnSkipResId, Visibility.INVISIBLE);
checkButtonVisibilityOnRotation(btnSkipResId, Visibility.INVISIBLE);
// show button
onView(allOf(withId(R.id.button_disable_skip), isDisplayed())).perform(click());
checkButtonVisibilityOnPageSwipe(viewPagerResId, btnSkipResId, Visibility.VISIBLE);
}
@Test
public void nextButtonHiding() {
// hide button
onView(allOf(withId(btnNextResId), isDisplayed())).check(matches(withEffectiveVisibility(Visibility.VISIBLE)));
onView(allOf(withId(R.id.button_disable_progress), isDisplayed())).perform(click());
checkButtonVisibility(btnNextResId, Visibility.INVISIBLE);
checkButtonVisibilityOnPageSwipe(viewPagerResId, btnNextResId, Visibility.INVISIBLE);
checkButtonVisibilityOnRotation(btnNextResId, Visibility.INVISIBLE);
// check that prior progress button visibility state is maintained when toggling swipe locking
onView(allOf(withId(R.id.button_disable_swipe), isDisplayed())).perform(click());
onView(allOf(withId(R.id.button_disable_swipe), isDisplayed())).perform(click());
checkButtonVisibility(btnNextResId, Visibility.INVISIBLE);
onView(allOf(withId(R.id.button_disable_next_swipe), isDisplayed())).perform(click());
onView(allOf(withId(R.id.button_disable_next_swipe), isDisplayed())).perform(click());
checkButtonVisibility(btnNextResId, Visibility.INVISIBLE);
// show button
onView(allOf(withId(R.id.button_disable_progress), isDisplayed())).perform(click());
checkButtonVisibilityOnPageSwipe(viewPagerResId, btnNextResId, Visibility.VISIBLE);
}
@Test
public void doneButtonHiding() {
onView(withId(viewPagerResId)).perform(swipeLeft());
onView(withId(viewPagerResId)).perform(swipeLeft());
// hide button
onView(allOf(withId(btnDoneResId), isDisplayed())).check(matches(withEffectiveVisibility(Visibility.VISIBLE)));
onView(allOf(withId(R.id.button_disable_progress), isDisplayed())).perform(click());
checkButtonVisibility(btnDoneResId, Visibility.INVISIBLE);
checkButtonVisibilityOnPageSwipe(viewPagerResId, btnDoneResId, Visibility.INVISIBLE);
checkButtonVisibilityOnRotation(btnDoneResId, Visibility.INVISIBLE);
// show button
onView(allOf(withId(R.id.button_disable_progress), isDisplayed())).perform(click());
onView(allOf(withId(btnDoneResId), isDisplayed())).check(matches(withEffectiveVisibility(Visibility.VISIBLE)));
}
@Test
public void swipeLock() {
onView(withId(viewPagerResId)).perform(swipeLeft());
// lock, test button hidden
onView(allOf(withId(btnNextResId), isDisplayed())).check(matches(withEffectiveVisibility(Visibility.VISIBLE)));
onView(allOf(withId(R.id.button_disable_swipe), isDisplayed())).perform(click());
oneShotSwipeLock();
onView(withId(viewPagerResId)).perform(swipeRight());
onView(allOf(withId(R.id.button_disable_swipe), isDisplayed())).perform(click());
onView(isRoot()).perform(orientationLandscape());
oneShotSwipeLock();
}
private void oneShotSwipeLock() {
checkButtonVisibility(btnNextResId, Visibility.INVISIBLE);
// test swiping is locked and buttons are hidden
checkButtonVisibilityOnPageSwipeLeft(viewPagerResId, btnNextResId, Visibility.INVISIBLE);
onView(withText("Slide 2 title")).check(matches(isDisplayed()));
checkButtonVisibilityOnPageSwipeRight(viewPagerResId, btnNextResId, Visibility.INVISIBLE);
onView(withText("Slide 2 title")).check(matches(isDisplayed()));
checkButtonVisibility(btnNextResId, Visibility.INVISIBLE);
// test swiping is unlocked and buttons are shown
onView(allOf(withId(R.id.button_disable_swipe), isDisplayed())).perform(click());
checkButtonVisibility(btnNextResId, Visibility.VISIBLE);
checkButtonVisibilityOnPageSwipeRight(viewPagerResId, btnNextResId, Visibility.VISIBLE);
onView(withText("Slide 1 title")).check(matches(isDisplayed()));
checkButtonVisibilityOnPageSwipeLeft(viewPagerResId, btnNextResId, Visibility.VISIBLE);
checkButtonVisibilityOnPageSwipeLeft(viewPagerResId, btnDoneResId, Visibility.VISIBLE);
onView(withText("Slide 3 title")).check(matches(isDisplayed()));
}
@Test
public void nextPageSwipeLock() {
onView(withId(viewPagerResId)).perform(swipeLeft());
// lock, test button hidden
onView(allOf(withId(btnNextResId), isDisplayed())).check(matches(withEffectiveVisibility(Visibility.VISIBLE)));
onView(allOf(withId(R.id.button_disable_next_swipe), isDisplayed())).perform(click());
oneShotNextPageSwipeLock();
onView(allOf(withId(R.id.button_disable_next_swipe), isDisplayed())).perform(click());
onView(isRoot()).perform(orientationLandscape());
oneShotNextPageSwipeLock();
}
private void oneShotNextPageSwipeLock() {
checkButtonVisibility(btnNextResId, Visibility.INVISIBLE);
// test swiping left is locked and buttons are hidden, restored on swipe right
checkButtonVisibilityOnPageSwipeLeft(viewPagerResId, btnNextResId, Visibility.INVISIBLE);
onView(withText("Slide 2 title")).check(matches(isDisplayed()));
checkButtonVisibilityOnPageSwipeRight(viewPagerResId, btnNextResId, Visibility.VISIBLE);
checkButtonVisibilityOnPageSwipeLeft(viewPagerResId, btnNextResId, Visibility.VISIBLE);
onView(withText("Slide 2 title")).check(matches(isDisplayed()));
}
private void checkButtonVisibilityOnPageSwipe(int viewPagerResId, int btnResId, Visibility btnVisibility) {
// check visibility state maintained between pages, assumes > 1 pages
if (mActivityRule.getActivity().getPager().getCurrentItem() == mActivityRule.getActivity().getPager().getChildCount()) {
checkButtonVisibilityOnPageSwipeRight(viewPagerResId, btnResId, btnVisibility);
checkButtonVisibilityOnPageSwipeLeft(viewPagerResId, btnResId, btnVisibility);
} else {
checkButtonVisibilityOnPageSwipeLeft(viewPagerResId, btnResId, btnVisibility);
checkButtonVisibilityOnPageSwipeRight(viewPagerResId, btnResId, btnVisibility);
}
}
private void checkButtonVisibilityOnPageSwipeLeft(int viewPagerResId, int btnResId, Visibility btnVisibility) {
onView(withId(viewPagerResId)).perform(swipeLeft());
checkButtonVisibility(btnResId, btnVisibility);
}
private void checkButtonVisibilityOnPageSwipeRight(int viewPagerResId, int btnResId, Visibility btnVisibility) {
onView(withId(viewPagerResId)).perform(swipeRight());
checkButtonVisibility(btnResId, btnVisibility);
}
private void checkButtonVisibilityOnRotation(int btnResId, Visibility btnVisibility) {
checkButtonVisibility(btnResId, btnVisibility);
// check visibility state maintained between rotation
onView(isRoot()).perform(orientationLandscape());
checkButtonVisibility(btnResId, btnVisibility);
onView(isRoot()).perform(orientationPortrait());
checkButtonVisibility(btnResId, btnVisibility);
}
private void checkButtonVisibility(int btnResId, Visibility btnVisibility) {
onView(withId(btnResId)).check(matches(withEffectiveVisibility(btnVisibility)));
}
}