blob: b49a822e6f7eb2d0b8223bb042a71e47837b3b31 [file] [log] [blame]
/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.android.apps.common.testing.ui.espresso.assertion;
import static com.google.android.apps.common.testing.ui.espresso.assertion.ViewAssertions.matches;
import static com.google.android.apps.common.testing.ui.espresso.assertion.ViewAssertions.selectedDescendantsMatch;
import static com.google.android.apps.common.testing.ui.espresso.matcher.ViewMatchers.hasContentDescription;
import static com.google.android.apps.common.testing.ui.espresso.matcher.ViewMatchers.isAssignableFrom;
import static com.google.android.apps.common.testing.ui.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.nullValue;
import com.google.android.apps.common.testing.ui.espresso.NoMatchingViewException;
import android.test.InstrumentationTestCase;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import junit.framework.AssertionFailedError;
import org.hamcrest.Matcher;
/**
* Unit tests for {@link ViewAssertions}.
*/
public class ViewAssertionsTest extends InstrumentationTestCase {
private View presentView;
private View absentView;
private NoMatchingViewException absentException;
private NoMatchingViewException presentException;
private Matcher<View> alwaysAccepts;
private Matcher<View> alwaysFails;
private Matcher<View> nullViewMatcher;
@Override
public void setUp() throws Exception {
super.setUp();
presentView = new View(getInstrumentation().getTargetContext());
absentView = null;
absentException = null;
alwaysAccepts = is(presentView);
alwaysFails = not(is(presentView));
nullViewMatcher = nullValue();
presentException = new NoMatchingViewException.Builder()
.withViewMatcher(alwaysFails)
.withRootView(new View(getInstrumentation().getTargetContext()))
.build();
}
public void testViewPresent_MatcherFail() {
try {
matches(alwaysFails).check(presentView, absentException);
} catch (AssertionFailedError expected) {
return;
}
// cannot place inside try block, would be caught.
fail("Should not accept.");
}
public void testViewPresent_MatcherPass() {
try {
matches(alwaysAccepts).check(presentView, absentException);
} catch (AssertionError error) {
throw new RuntimeException("Should not die!!!", error);
}
}
public void testViewAbsent_Unexpectedly() {
try {
matches(alwaysAccepts).check(absentView, presentException);
} catch (NoMatchingViewException expected) {
return;
}
fail("should not accept, view not present.");
}
public void testViewAbsent_AndThatsWhatIWant() {
try {
matches(nullViewMatcher).check(absentView, presentException);
} catch (NoMatchingViewException expected) {
return;
}
fail("should not accept, view not present.");
}
public void testSelectedDescendantsMatch_ThereAreNone() {
View grany = setUpViewHierarchy();
try {
selectedDescendantsMatch(withText("welfjkw"), hasContentDescription())
.check(grany, absentException);
} catch (AssertionError error) {
throw new RuntimeException("Should not die!!!", error);
}
}
public void testSelectedDescendantsMatch_SelectedDescendantsMatch() {
View grany = setUpViewHierarchy();
try {
selectedDescendantsMatch(withText("has content description"), hasContentDescription())
.check(grany, absentException);
} catch (AssertionError error) {
throw new RuntimeException("Should not die!!!", error);
}
}
public void testSelectedDescendantsMatch_SelectedDescendantsDoNotMatch() {
View grany = setUpViewHierarchy();
try {
selectedDescendantsMatch(withText("no content description"), hasContentDescription())
.check(grany, absentException);
} catch (AssertionFailedError expected) {
return;
}
fail("should fail because descendants do not match.");
}
public void testSelectedDescendantsMatch_SelectedDescendantsMatchAndDoNotMatch() {
View grany = setUpViewHierarchy();
try {
selectedDescendantsMatch(isAssignableFrom(TextView.class), hasContentDescription())
.check(grany, absentException);
} catch (AssertionFailedError expected) {
return;
}
fail("should fail because not all descendants match.");
}
private View setUpViewHierarchy() {
TextView v1 = new TextView(getInstrumentation().getTargetContext());
v1.setText("no content description");
TextView v2 = new TextView(getInstrumentation().getTargetContext());
v2.setText("has content description");
v2.setContentDescription("content description");
ViewGroup parent = new RelativeLayout(getInstrumentation().getTargetContext());
View grany = new ScrollView(getInstrumentation().getTargetContext());
((ViewGroup) grany).addView(parent);
parent.addView(v1);
parent.addView(v2);
return grany;
}
}