1f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev/* 2f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * Copyright (C) 2014 The Android Open Source Project 3f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * 4f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * Licensed under the Apache License, Version 2.0 (the "License"); 5f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * you may not use this file except in compliance with the License. 6f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * You may obtain a copy of the License at 7f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * 8f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * http://www.apache.org/licenses/LICENSE-2.0 9f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * 10f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * Unless required by applicable law or agreed to in writing, software 11f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * distributed under the License is distributed on an "AS IS" BASIS, 12f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * See the License for the specific language governing permissions and 14f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * limitations under the License. 15f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev */ 16f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev 17f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelevpackage com.google.android.apps.common.testing.ui.espresso; 18f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev 19f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelevimport static org.hamcrest.MatcherAssert.assertThat; 20f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelevimport static org.hamcrest.Matchers.allOf; 21f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelevimport static org.hamcrest.Matchers.containsString; 22f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev 23f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelevimport android.test.AndroidTestCase; 24f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelevimport android.view.View; 25f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelevimport android.widget.RelativeLayout; 26f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelevimport android.widget.TextView; 27f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev 28f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelevimport org.hamcrest.Matcher; 29f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelevimport org.hamcrest.Matchers; 30f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelevimport org.hamcrest.StringDescription; 31f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev 32f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev/** Unit tests for {@link AmbiguousViewMatcherException}. */ 33f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelevpublic class AmbiguousViewMatcherExceptionTest extends AndroidTestCase { 34f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev private Matcher<View> alwaysTrueMatcher; 35f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev 36f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev private RelativeLayout testView; 37f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev private View child1; 38f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev private View child2; 39f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev private View child3; 40f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev private View child4; 41f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev 42f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev @Override 43f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev public void setUp() throws Exception { 44f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev super.setUp(); 45f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev alwaysTrueMatcher = Matchers.<View>notNullValue(); 46f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev testView = new RelativeLayout(getContext()); 47f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev child1 = new TextView(getContext()); 48f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev child1.setId(1); 49f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev child2 = new TextView(getContext()); 50f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev child2.setId(2); 51f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev child3 = new TextView(getContext()); 52f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev child3.setId(3); 53f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev child4 = new TextView(getContext()); 54f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev child4.setId(4); 55f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev testView.addView(child1); 56f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev testView.addView(child2); 57f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev testView.addView(child3); 58f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev testView.addView(child4); 59f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev } 60f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev 61f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev public void testExceptionContainsMatcherDescription() { 62f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev StringBuilder matcherDescription = new StringBuilder(); 63f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev alwaysTrueMatcher.describeTo(new StringDescription(matcherDescription)); 64f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev assertThat(createException().getMessage(), containsString(matcherDescription.toString())); 65f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev } 66f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev 67f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev @SuppressWarnings("unchecked") 68f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev public void testExceptionContainsView() { 69f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev String exceptionMessage = createException().getMessage(); 70f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev 71f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev assertThat("missing elements", exceptionMessage, 72f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev allOf( 73f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev containsString("{id=1,"), // child1 74f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev containsString("{id=2,"), // child2 75f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev containsString("{id=3,"), // child3 76f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev containsString("{id=4,"), // child4 77f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev containsString("{id=-1,"))); // root 78f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev } 79f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev 80f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev private AmbiguousViewMatcherException createException() { 81f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev 82f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev return new AmbiguousViewMatcherException.Builder() 83f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev .withViewMatcher(alwaysTrueMatcher) 84f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev .withRootView(testView) 85f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev .withView1(testView) 86f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev .withView2(child1) 87f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev .withOtherAmbiguousViews(child2, child3, child4) 88f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev .build(); 89f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev } 90f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev} 91