blob: 3aea01e79b19d98bb1bc48cc0bdbcb024155189a [file] [log] [blame]
package com.google.android.apps.common.testing.ui.espresso.sample;
import static com.google.android.apps.common.testing.ui.espresso.Espresso.onData;
import static com.google.android.apps.common.testing.ui.espresso.Espresso.onView;
import static com.google.android.apps.common.testing.ui.espresso.action.ViewActions.click;
import static com.google.android.apps.common.testing.ui.espresso.assertion.ViewAssertions.matches;
import static com.google.android.apps.common.testing.ui.espresso.matcher.ViewMatchers.withId;
import static com.google.android.apps.common.testing.ui.espresso.matcher.ViewMatchers.withText;
import static com.google.android.apps.common.testing.ui.espresso.sample.LongListMatchers.isFooter;
import static com.google.android.apps.common.testing.ui.espresso.sample.LongListMatchers.withItemContent;
import static com.google.android.apps.common.testing.ui.espresso.sample.LongListMatchers.withItemSize;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import com.google.android.apps.common.testing.ui.testapp.LongListActivity;
import com.google.android.apps.common.testing.ui.testapp.R;
import android.test.ActivityInstrumentationTestCase2;
import android.test.suitebuilder.annotation.LargeTest;
import android.view.View;
import android.widget.Adapter;
import android.widget.AdapterView;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
/**
* Demonstrates the usage of
* {@link com.google.android.apps.common.testing.ui.espresso.Espresso#onData(org.hamcrest.Matcher)}
* to match data within list views.
*/
@LargeTest
public class AdapterViewTest extends ActivityInstrumentationTestCase2<LongListActivity> {
@SuppressWarnings("deprecation")
public AdapterViewTest() {
// This constructor was deprecated - but we want to support lower API levels.
super("com.google.android.apps.common.testing.ui.testapp", LongListActivity.class);
}
@Override
public void setUp() throws Exception {
super.setUp();
getActivity();
}
public void testClickOnItem50() {
// The text view "item: 50" may not exist if we haven't scrolled to it.
// By using onData api we tell Espresso to look into the Adapter for an item matching
// the matcher we provide it. Espresso will then bring that item into the view hierarchy
// and we can click on it.
onData(withItemContent("item: 50"))
.perform(click());
onView(withId(R.id.selection_row_value))
.check(matches(withText("50")));
}
public void testClickOnSpecificChildOfRow60() {
onData(withItemContent("item: 60"))
.onChildView(withId(R.id.item_size)) // resource id of second column from xml layout
.perform(click());
onView(withId(R.id.selection_row_value))
.check(matches(withText("60")));
onView(withId(R.id.selection_column_value))
.check(matches(withText("2")));
}
public void testClickOnFirstAndFifthItemOfLength8() {
onData(is(withItemSize(8)))
.atPosition(0)
.perform(click());
onView(withId(R.id.selection_row_value))
.check(matches(withText("10")));
onData(is(withItemSize(8)))
.atPosition(4)
.perform(click());
onView(withId(R.id.selection_row_value))
.check(matches(withText("14")));
}
@SuppressWarnings("unchecked")
public void testClickFooter() {
onData(isFooter())
.perform(click());
onView(withId(R.id.selection_row_value))
.check(matches(withText("100")));
}
@SuppressWarnings("unchecked")
public void testDataItemNotInAdapter(){
onView(withId(R.id.list))
.check(matches(not(withAdaptedData(withItemContent("item: 168")))));
}
private static Matcher<View> withAdaptedData(final Matcher<Object> dataMatcher) {
return new TypeSafeMatcher<View>() {
@Override
public void describeTo(Description description) {
description.appendText("with class name: ");
dataMatcher.describeTo(description);
}
@Override
public boolean matchesSafely(View view) {
if (!(view instanceof AdapterView)) {
return false;
}
@SuppressWarnings("rawtypes")
Adapter adapter = ((AdapterView) view).getAdapter();
for (int i = 0; i < adapter.getCount(); i++) {
if (dataMatcher.matches(adapter.getItem(i))) {
return true;
}
}
return false;
}
};
}
}