/* * Copyright (C) 2016 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 android.support.percent; import android.support.annotation.LayoutRes; import android.support.percent.test.R; import android.support.test.InstrumentationRegistry; import android.support.test.espresso.UiController; import android.support.test.espresso.ViewAction; import android.test.suitebuilder.annotation.SmallTest; import android.view.View; import android.view.ViewStub; import org.hamcrest.Description; import org.hamcrest.Matcher; import org.hamcrest.TypeSafeMatcher; import org.junit.After; import org.junit.Test; import static android.support.test.espresso.Espresso.onView; import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist; import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom; import static android.support.test.espresso.matcher.ViewMatchers.withId; import static org.hamcrest.core.AllOf.allOf; /** * Test cases to verify that percent layouts properly account for their own paddings. */ @SmallTest public class PercentDynamicLayoutTest extends BaseInstrumentationTestCase { public PercentDynamicLayoutTest() { super(PercentDynamicLayoutActivity.class); } @After public void tearDown() throws Exception { // Now that the test is done, replace the activity content view with ViewStub so // that it's ready to be replaced for the next test. InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() { @Override public void run() { final PercentDynamicLayoutActivity activity = mActivityTestRule.getActivity(); activity.setContentView(R.layout.percent_dynamic_layout); } }); } /** * Matches views that have parents. */ private Matcher hasParent() { return new TypeSafeMatcher() { @Override public void describeTo(Description description) { description.appendText("has parent"); } @Override public boolean matchesSafely(View view) { return view.getParent() != null; } }; } /** * Inflates the ViewStub with the passed layout resource. */ private ViewAction inflateViewStub(final @LayoutRes int layoutResId) { return new ViewAction() { @Override public Matcher getConstraints() { return allOf(isAssignableFrom(ViewStub.class), hasParent()); } @Override public String getDescription() { return "Inflates view stub"; } @Override public void perform(UiController uiController, View view) { uiController.loopMainThreadUntilIdle(); ViewStub viewStub = (ViewStub) view; viewStub.setLayoutResource(layoutResId); viewStub.inflate(); uiController.loopMainThreadUntilIdle(); } }; } @Test public void testPercentFrameWithHorizontalPaddings() { onView(withId(R.id.percent_layout)).check(doesNotExist()); onView(withId(R.id.percent_stub)).perform( inflateViewStub(R.layout.percent_frame_layout_hpaddings)); final PercentFrameLayout percentFrameLayout = (PercentFrameLayout) mActivityTestRule.getActivity().findViewById( R.id.percent_layout); final int containerWidth = percentFrameLayout.getWidth(); final int containerHeight = percentFrameLayout.getHeight(); final int availableWidth = containerWidth - percentFrameLayout.getPaddingLeft() - percentFrameLayout.getPaddingRight(); final int availableHeight = containerHeight - percentFrameLayout.getPaddingTop() - percentFrameLayout.getPaddingBottom(); final View child1 = percentFrameLayout.findViewById(R.id.child1); final View child2 = percentFrameLayout.findViewById(R.id.child2); assertFuzzyEquals("Child 1 width as 50% of the container's available width", 0.5f * availableWidth, child1.getWidth()); assertFuzzyEquals("Child 1 height as 100% of the container's available height", availableHeight, child1.getHeight()); assertFuzzyEquals("Child 2 width as 50% of the container's available width", 0.5f * availableWidth, child2.getWidth()); assertFuzzyEquals("Child 2 height as 100% of the container's available height", availableHeight, child2.getHeight()); } @Test public void testPercentFrameWithVerticalPaddings() { onView(withId(R.id.percent_layout)).check(doesNotExist()); onView(withId(R.id.percent_stub)).perform( inflateViewStub(R.layout.percent_frame_layout_vpaddings)); final PercentFrameLayout percentFrameLayout = (PercentFrameLayout) mActivityTestRule.getActivity().findViewById( R.id.percent_layout); final int containerWidth = percentFrameLayout.getWidth(); final int containerHeight = percentFrameLayout.getHeight(); final int availableWidth = containerWidth - percentFrameLayout.getPaddingLeft() - percentFrameLayout.getPaddingRight(); final int availableHeight = containerHeight - percentFrameLayout.getPaddingTop() - percentFrameLayout.getPaddingBottom(); final View child1 = percentFrameLayout.findViewById(R.id.child1); final View child2 = percentFrameLayout.findViewById(R.id.child2); assertFuzzyEquals("Child 1 width as 100% of the container's available width", availableWidth, child1.getWidth()); assertFuzzyEquals("Child 1 height as 50% of the container's available height", 0.5f * availableHeight, child1.getHeight()); assertFuzzyEquals("Child 2 width as 100% of the container's available width", availableWidth, child2.getWidth()); assertFuzzyEquals("Child 2 height as 50% of the container's available height", 0.5f* availableHeight, child2.getHeight()); } @Test public void testPercentRelativeWithHorizontalPaddings() { onView(withId(R.id.percent_layout)).check(doesNotExist()); onView(withId(R.id.percent_stub)).perform( inflateViewStub(R.layout.percent_relative_layout_hpaddings)); final PercentRelativeLayout percentRelativeLayout = (PercentRelativeLayout) mActivityTestRule.getActivity().findViewById( R.id.percent_layout); final int containerWidth = percentRelativeLayout.getWidth(); final int containerHeight = percentRelativeLayout.getHeight(); final int availableWidth = containerWidth - percentRelativeLayout.getPaddingLeft() - percentRelativeLayout.getPaddingRight(); final int availableHeight = containerHeight - percentRelativeLayout.getPaddingTop() - percentRelativeLayout.getPaddingBottom(); final View child1 = percentRelativeLayout.findViewById(R.id.child1); final View child2 = percentRelativeLayout.findViewById(R.id.child2); assertFuzzyEquals("Child 1 width as 50% of the container's available width", 0.5f * availableWidth, child1.getWidth()); assertFuzzyEquals("Child 1 height as 100% of the container's available height", availableHeight, child1.getHeight()); assertFuzzyEquals("Child 2 width as 50% of the container's available width", 0.5f * availableWidth, child2.getWidth()); assertFuzzyEquals("Child 2 height as 100% of the container's available height", availableHeight, child2.getHeight()); } @Test public void testPercentRelaticeWithVerticalPaddings() { onView(withId(R.id.percent_layout)).check(doesNotExist()); onView(withId(R.id.percent_stub)).perform( inflateViewStub(R.layout.percent_relative_layout_vpaddings)); final PercentRelativeLayout percentRelativeLayout = (PercentRelativeLayout) mActivityTestRule.getActivity().findViewById( R.id.percent_layout); final int containerWidth = percentRelativeLayout.getWidth(); final int containerHeight = percentRelativeLayout.getHeight(); final int availableWidth = containerWidth - percentRelativeLayout.getPaddingLeft() - percentRelativeLayout.getPaddingRight(); final int availableHeight = containerHeight - percentRelativeLayout.getPaddingTop() - percentRelativeLayout.getPaddingBottom(); final View child1 = percentRelativeLayout.findViewById(R.id.child1); final View child2 = percentRelativeLayout.findViewById(R.id.child2); assertFuzzyEquals("Child 1 width as 100% of the container's available width", availableWidth, child1.getWidth()); assertFuzzyEquals("Child 1 height as 50% of the container's available height", 0.5f * availableHeight, child1.getHeight()); assertFuzzyEquals("Child 2 width as 100% of the container's available width", availableWidth, child2.getWidth()); assertFuzzyEquals("Child 2 height as 50% of the container's available height", 0.5f* availableHeight, child2.getHeight()); } }