package com.basgeekball.awesomevalidation.demo;

import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.espresso.ViewInteraction;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.view.View;

import org.hamcrest.Matcher;
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.closeSoftKeyboard;
import static android.support.test.espresso.action.ViewActions.swipeUp;
import static android.support.test.espresso.action.ViewActions.typeText;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withClassName;
import static android.support.test.espresso.matcher.ViewMatchers.withContentDescription;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
import static com.basgeekball.awesomevalidation.demo.ViewMatcher.hasAncestorAndSelfMatcher;
import static org.hamcrest.CoreMatchers.containsString;

@RunWith(AndroidJUnit4.class)
public class DemoActivityTest {

    @Rule
    public ActivityTestRule<DemoActivity> mActivityRule = new ActivityTestRule<>(DemoActivity.class);

    @Test
    public void testValidatePass() {
        enterText(R.id.edt_userid, "Flash");
        enterText(R.id.edt_password, "FatherPrime#3");
        enterText(R.id.edt_password_confirmation, "FatherPrime#3");
        enterText(R.id.edt_firstname, "Dwyane");
        enterText(R.id.edt_lastname, "Wade");
        enterText(R.id.edt_email, "D-Wade@nba.com");
        enterText(R.id.edt_ip, "184.154.83.119");
        enterText(R.id.edt_tel, "312-455-4000");
        enterText(R.id.edt_zipcode, "53201");
        enterText(R.id.edt_year, "1982");
        enterText(R.id.edt_height, "1.93");
        clickButton(R.id.btn_done);
        scrollToTheBottom();
        assertViewIsDisplayed(R.id.container_success);
    }

    @Test
    public void testValidateTextInputLayoutPass() {
        navigateToMenuItem(3);
        enterTextToTextInputLayout(R.id.til_email, "jean_claude_van_damme@jcvdworld.com");
        enterTextToTextInputLayout(R.id.til_password, "Muscles4Brussels!");
        enterTextToTextInputLayout(R.id.til_password_confirmation, "Muscles4Brussels!");
        enterTextToTextInputLayout(R.id.til_year, "1960");
        clickButton(R.id.btn_done);
        scrollToTheBottom();
        assertViewIsDisplayed(R.id.container_success);
    }

    private ViewInteraction findView(int viewId) {
        return onView(withId(viewId));
    }

    private void enterText(int viewId, String text) {
        findView(viewId).perform(typeText(text), closeSoftKeyboard());
    }

    private void enterTextToTextInputLayout(int viewIdOfTextInputLayout, String text) {
        Matcher<View> ancestorMatcher = withId(viewIdOfTextInputLayout);
        Matcher<View> selfMatcher = withClassName(containsString("TextInputEditText"));
        onView(hasAncestorAndSelfMatcher(ancestorMatcher, selfMatcher)).perform(typeText(text));
    }

    private void clickButton(int viewId) {
        findView(viewId).perform(click());
    }

    private void assertViewIsDisplayed(int viewId) {
        findView(viewId).check(matches(isDisplayed()));
    }

    private void scrollToTheBottom() {
        findView(R.id.scroll_view).perform(swipeUp());
    }

    private void navigateToMenuItem(int menuItemIdx) {
        onView(withContentDescription(R.string.app_name)).perform(click());
        Context context = InstrumentationRegistry.getTargetContext();
        if (context != null) {
            String menuItem = context.getResources().getStringArray(R.array.styles)[menuItemIdx];
            onView(withText(menuItem)).perform(click());
        }
    }

}

@@ -631,16 +631,89 @@
 yboard;%0A
+import static android.support.test.espresso.action.ViewActions.scrollTo;%0A
 import s
@@ -3079,32 +3079,44 @@
 viewId).perform(
+scrollTo(), 
 typeText(text), 
@@ -3473,16 +3473,28 @@
 perform(
+scrollTo(), 
 typeText
@@ -3499,16 +3499,37 @@
 xt(text)
+, closeSoftKeyboard()
 );%0A    %7D

Fix UI test (for small screen emulator)