diff -r 000000000000 -r 6474c204b198 mobile/android/base/tests/components/AboutHomeComponent.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mobile/android/base/tests/components/AboutHomeComponent.java Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,195 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.gecko.tests.components; + +import static org.mozilla.gecko.tests.helpers.AssertionHelper.fAssertEquals; +import static org.mozilla.gecko.tests.helpers.AssertionHelper.fAssertTrue; + +import org.mozilla.gecko.R; +import org.mozilla.gecko.tests.UITestContext; +import org.mozilla.gecko.tests.helpers.DeviceHelper; +import org.mozilla.gecko.tests.helpers.WaitHelper; + +import android.support.v4.view.ViewPager; +import android.view.View; +import android.widget.TextView; + +import com.jayway.android.robotium.solo.Condition; +import com.jayway.android.robotium.solo.Solo; + +/** + * A class representing any interactions that take place on the Awesomescreen. + */ +public class AboutHomeComponent extends BaseComponent { + private static final String LOGTAG = AboutHomeComponent.class.getSimpleName(); + + // The different types of panels that can be present on about:home + public enum PanelType { + HISTORY, + TOP_SITES, + BOOKMARKS, + READING_LIST + } + + // TODO: Having a specific ordering of panels is prone to fail and thus temporary. + // Hopefully the work in bug 940565 will alleviate the need for these enums. + // Explicit ordering of HomePager panels on a phone. + private enum PhonePanel { + HISTORY, + TOP_SITES, + BOOKMARKS, + READING_LIST + } + + // Explicit ordering of HomePager panels on a tablet. + private enum TabletPanel { + TOP_SITES, + BOOKMARKS, + READING_LIST, + HISTORY + } + + // The percentage of the panel to swipe between 0 and 1. This value was set through + // testing: 0.55f was tested on try and fails on armv6 devices. + private static final float SWIPE_PERCENTAGE = 0.70f; + + public AboutHomeComponent(final UITestContext testContext) { + super(testContext); + } + + private View getHomePagerContainer() { + return mSolo.getView(R.id.home_pager_container); + } + + private ViewPager getHomePagerView() { + return (ViewPager) mSolo.getView(R.id.home_pager); + } + + private View getHomeBannerView() { + return mSolo.getView(R.id.home_banner); + } + + public AboutHomeComponent assertCurrentPanel(final PanelType expectedPanel) { + assertVisible(); + + final int expectedPanelIndex = getPanelIndexForDevice(expectedPanel.ordinal()); + fAssertEquals("The current HomePager panel is " + expectedPanel, + expectedPanelIndex, getHomePagerView().getCurrentItem()); + return this; + } + + public AboutHomeComponent assertNotVisible() { + fAssertTrue("The HomePager is not visible", + getHomePagerContainer().getVisibility() != View.VISIBLE || + getHomePagerView().getVisibility() != View.VISIBLE); + return this; + } + + public AboutHomeComponent assertVisible() { + fAssertTrue("The HomePager is visible", + getHomePagerContainer().getVisibility() == View.VISIBLE && + getHomePagerView().getVisibility() == View.VISIBLE); + return this; + } + + public AboutHomeComponent assertBannerNotVisible() { + View banner = getHomeBannerView(); + fAssertTrue("The HomeBanner is not visible", + getHomePagerContainer().getVisibility() != View.VISIBLE || + banner.getVisibility() != View.VISIBLE || + banner.getTranslationY() == banner.getHeight()); + return this; + } + + public AboutHomeComponent assertBannerVisible() { + fAssertTrue("The HomeBanner is visible", + getHomePagerContainer().getVisibility() == View.VISIBLE && + getHomeBannerView().getVisibility() == View.VISIBLE); + return this; + } + + public AboutHomeComponent assertBannerText(String text) { + assertBannerVisible(); + + final TextView textView = (TextView) getHomeBannerView().findViewById(R.id.text); + fAssertEquals("The correct HomeBanner text is shown", + text, textView.getText().toString()); + return this; + } + + public AboutHomeComponent clickOnBanner() { + assertBannerVisible(); + + mTestContext.dumpLog(LOGTAG, "Clicking on HomeBanner."); + mSolo.clickOnView(getHomeBannerView()); + return this; + } + + public AboutHomeComponent dismissBanner() { + assertBannerVisible(); + + mTestContext.dumpLog(LOGTAG, "Clicking on HomeBanner close button."); + mSolo.clickOnView(getHomeBannerView().findViewById(R.id.close)); + return this; + } + + public AboutHomeComponent swipeToPanelOnRight() { + mTestContext.dumpLog(LOGTAG, "Swiping to the panel on the right."); + swipeToPanel(Solo.RIGHT); + return this; + } + + public AboutHomeComponent swipeToPanelOnLeft() { + mTestContext.dumpLog(LOGTAG, "Swiping to the panel on the left."); + swipeToPanel(Solo.LEFT); + return this; + } + + private void swipeToPanel(final int panelDirection) { + fAssertTrue("Swiping in a valid direction", + panelDirection == Solo.LEFT || panelDirection == Solo.RIGHT); + assertVisible(); + + final int panelIndex = getHomePagerView().getCurrentItem(); + + mSolo.scrollViewToSide(getHomePagerView(), panelDirection, SWIPE_PERCENTAGE); + + // The panel on the left is a lower index and vice versa. + final int unboundedPanelIndex = panelIndex + (panelDirection == Solo.LEFT ? -1 : 1); + final int panelCount = DeviceHelper.isTablet() ? + TabletPanel.values().length : PhonePanel.values().length; + final int maxPanelIndex = panelCount - 1; + final int expectedPanelIndex = Math.min(Math.max(0, unboundedPanelIndex), maxPanelIndex); + + waitForPanelIndex(expectedPanelIndex); + } + + private void waitForPanelIndex(final int expectedIndex) { + final String panelName; + if (DeviceHelper.isTablet()) { + panelName = TabletPanel.values()[expectedIndex].name(); + } else { + panelName = PhonePanel.values()[expectedIndex].name(); + } + + WaitHelper.waitFor("HomePager " + panelName + " panel", new Condition() { + @Override + public boolean isSatisfied() { + return (getHomePagerView().getCurrentItem() == expectedIndex); + } + }); + } + + /** + * Gets the panel index in the device specific Panel enum for the given index in the + * PanelType enum. + */ + private int getPanelIndexForDevice(final int panelIndex) { + final String panelName = PanelType.values()[panelIndex].name(); + final Class devicePanelEnum = + DeviceHelper.isTablet() ? TabletPanel.class : PhonePanel.class; + return Enum.valueOf(devicePanelEnum, panelName).ordinal(); + } +}