2013-01-16 02:34:54 -08:00
# filter substitution
package @ ANDROID_PACKAGE_NAME @ . tests ;
import @ ANDROID_PACKAGE_NAME @ . * ;
2013-06-26 10:57:52 -07:00
import java.util.Map ;
import java.util.Map.Entry ;
import java.util.HashMap ;
/ * * This patch tests the Sections present in the Settings Menu and the
2013-02-22 19:42:46 -08:00
* default values for them
* /
2013-01-16 02:34:54 -08:00
public class testSettingsMenuItems extends PixelTest {
2013-02-22 19:42:46 -08:00
int midWidth ;
int midHeight ;
2013-06-26 10:57:52 -07:00
String BRAND_NAME = " (Fennec|Nightly|Aurora|Firefox|Firefox Beta) " ;
// The following String[][] (arrays) match the menu hierarchy for each section.
// Each String[] (array) represents the menu items/choices in the following order:
//
// itemTitle { defaultValue [options] }
//
// where defaultValue is optional, and there can be multiple options.
//
// This test assumes menu items are in order (scrolling down for off-screen items).
String [ ] [ ] OPTIONS_CUSTOMIZE = {
2013-08-01 19:10:26 -07:00
{ " Search settings " , " " , " Show search suggestions " , " Installed search engines " } ,
2013-06-26 10:57:52 -07:00
{ " Import from Android " , " " , " Bookmarks " , " History " , " Import " } ,
2013-08-23 14:40:35 -07:00
{ " Tabs " , " Don't restore after quitting " + BRAND_NAME , " Always restore " , " Don't restore after quitting " + BRAND_NAME } ,
2013-06-26 10:57:52 -07:00
{ " Automatic updates " , " Only over Wi-Fi " , " Enabled " , " Only over Wi-Fi " , " Disabled " } ,
} ;
String [ ] [ ] OPTIONS_DISPLAY = {
{ " Text size " } ,
{ " Title bar " , " Show page title " , " Show page title " , " Show page address " } ,
2013-08-01 19:10:26 -07:00
{ " Advanced " } ,
{ " Text reflow " } ,
2013-06-26 10:57:52 -07:00
{ " Character encoding " , " Don't show menu " , " Show menu " , " Don't show menu " } ,
{ " Plugins " , " Tap to play " , " Enabled " , " Tap to play " , " Disabled " } ,
} ;
String [ ] [ ] OPTIONS_PRIVACY = {
{ " Tracking " , " Do not tell sites anything about my tracking preferences " , " Tell sites that I do not want to be tracked " , " Tell sites that I want to be tracked " , " Do not tell sites anything about my tracking preferences " } ,
{ " Cookies " , " Enabled " , " Enabled, excluding 3rd party " , " Disabled " } ,
{ " Remember passwords " } ,
{ " Use master password " } ,
{ " Clear private data " , " " , " Browsing & download history " , " Downloaded files " , " Form & search history " , " Cookies & active logins " , " Saved passwords " , " Cache " , " Offline website data " , " Site settings " , " Clear data " } ,
} ;
String [ ] [ ] OPTIONS_MOZILLA = {
{ " About " + BRAND_NAME } ,
{ " FAQs " } ,
{ " Give feedback " } ,
{ " Show product announcements " } ,
{ " Data choices " } ,
{ " Telemetry " , " Shares performance, usage, hardware and customization data about your browser with Mozilla to help us make " + BRAND_NAME + " better " } ,
{ " Crash Reporter " , BRAND_NAME + " submits crash reports to help Mozilla make your browser more stable and secure " } ,
{ " Mozilla location services " , " Help improve geolocation services for the Open Web by letting " + BRAND_NAME + " collect and send anonymous cellular tower data " } ,
{ BRAND_NAME + " Health Report " , " Shares data with Mozilla about your browser health and helps you understand your browser performance " } ,
{ " View my Health Report " } ,
} ;
2013-01-16 02:34:54 -08:00
@Override
protected int getTestType ( ) {
return TEST_MOCHITEST ;
}
public void testSettingsMenuItems ( ) {
blockForGeckoReady ( ) ;
2013-02-22 19:42:46 -08:00
midWidth = mDriver . getGeckoWidth ( ) / 2 ;
midHeight = mDriver . getGeckoHeight ( ) / 2 ;
2013-01-16 02:34:54 -08:00
2013-06-26 10:57:52 -07:00
/ *
* This settingsMenuItems Map provides the Settings hierarchy to test .
*
* The keys are the top - level settings categories , and the values are the
* array of menu items contained within each category .
*
* Each menu item is itself an array as follows :
* - item title
* - default string value of item ( optional )
* - string values of options that are displayed once clicked ( optional ) .
* /
Map < String , String [ ] [ ] > settingsMenuItems = new HashMap < String , String [ ] [ ] > ( ) ;
// Add items for each category.
settingsMenuItems . put ( " Customize " , OPTIONS_CUSTOMIZE ) ;
settingsMenuItems . put ( " Display " , OPTIONS_DISPLAY ) ;
settingsMenuItems . put ( " Privacy " , OPTIONS_PRIVACY ) ;
settingsMenuItems . put ( " Mozilla " , OPTIONS_MOZILLA ) ;
2013-01-16 02:34:54 -08:00
selectMenuItem ( " Settings " ) ;
2013-07-31 08:50:17 -07:00
waitForText ( " Settings " ) ;
2013-01-16 02:34:54 -08:00
2013-02-22 19:42:46 -08:00
// Dismiss the Settings screen and verify that the view is returned to about:home page
2013-01-16 02:34:54 -08:00
mActions . sendSpecialKey ( Actions . SpecialKey . BACK ) ;
2013-08-06 09:51:20 -07:00
// Waiting for page title to appear to be sure that is fully loaded before opening the menu
waitForText ( " Enter Search " ) ;
2013-02-22 19:42:46 -08:00
verifyUrl ( " about:home " ) ;
2013-01-16 02:34:54 -08:00
2013-02-22 19:42:46 -08:00
selectMenuItem ( " Settings " ) ;
2013-07-31 08:50:17 -07:00
waitForText ( " Settings " ) ;
2013-06-26 10:57:52 -07:00
checkForSync ( mDevice ) ;
2013-01-16 02:34:54 -08:00
2013-06-26 10:57:52 -07:00
checkMenuHierarchy ( settingsMenuItems ) ;
2013-01-16 02:34:54 -08:00
}
2013-02-22 19:42:46 -08:00
2013-06-26 10:57:52 -07:00
/ * *
* Check for Sync in settings .
*
* Sync location is a top level menu item on phones , but is under " Customize " on tablets .
*
* /
public void checkForSync ( Device device ) {
if ( device . type . equals ( " tablet " ) ) {
// Select "Customize" from settings.
String customizeString = " ^Customize$ " ;
waitForEnabledText ( customizeString ) ;
mSolo . clickOnText ( customizeString ) ;
2013-01-16 02:34:54 -08:00
}
2013-06-26 10:57:52 -07:00
mAsserter . ok ( mSolo . waitForText ( " Sync " ) , " Waiting for Sync option " , " The Sync option is present " ) ;
2013-01-16 02:34:54 -08:00
}
2013-06-26 10:57:52 -07:00
public void checkMenuHierarchy ( Map < String , String [ ] [ ] > settingsMap ) {
// Check the items within each category.
for ( Entry < String , String [ ] [ ] > e : settingsMap . entrySet ( ) ) {
String section = " ^ " + e . getKey ( ) + " $ " ;
String [ ] [ ] sectionItems = e . getValue ( ) ;
waitForEnabledText ( section ) ;
mSolo . clickOnText ( section ) ;
// Check each item of the section.
for ( String [ ] item : sectionItems ) {
int itemLen = item . length ;
// Each item must at least have a title.
mAsserter . ok ( item . length > 0 , " Section-item " , " Each item must at least have a title " ) ;
// Check item title.
String itemTitle = " ^ " + item [ 0 ] + " $ " ;
if ( ! waitForText ( itemTitle ) ) {
// If we don't see the item, scroll down once in case it's off-screen.
scrollDown ( ) ;
}
mAsserter . ok ( mSolo . waitForText ( itemTitle ) , " Waiting for settings item " + itemTitle + " in section " + section ,
" The " + itemTitle + " option is present in section " + section ) ;
// Check item default, if it exists.
if ( itemLen > 1 ) {
String itemDefault = " ^ " + item [ 1 ] + " $ " ;
mAsserter . ok ( mSolo . waitForText ( itemDefault ) , " Waiting for settings item default " + itemDefault
+ " in section " + section ,
" The " + itemDefault + " default is present in section " + section ) ;
2013-02-22 19:42:46 -08:00
}
2013-06-26 10:57:52 -07:00
// Check item choices, if they exist.
if ( itemLen > 2 ) {
waitForEnabledText ( itemTitle ) ;
mSolo . clickOnText ( itemTitle ) ;
for ( int i = 2 ; i < itemLen ; i + + ) {
String itemChoice = " ^ " + item [ i ] + " $ " ;
if ( ! waitForText ( itemChoice ) ) {
// If we don't see the item, scroll down once in case it's off-screen.
scrollDown ( ) ;
}
mAsserter . ok ( mSolo . waitForText ( itemChoice ) , " Waiting for settings item choice " + itemChoice
+ " in section " + section ,
" The " + itemChoice + " choice is present in section " + section ) ;
}
// Leave submenu after checking.
2013-07-16 18:44:42 -07:00
if ( waitForText ( " ^Cancel$ " ) ) {
mSolo . clickOnText ( " ^Cancel$ " ) ;
} else {
// Some submenus aren't dialogs, but are nested screens; exit using "back".
mActions . sendSpecialKey ( Actions . SpecialKey . BACK ) ;
}
2013-06-26 10:57:52 -07:00
}
}
// Navigate back a screen if on a phone.
if ( mDevice . type . equals ( " phone " ) ) {
// Click back to return to previous menu. Tablets shouldn't do this because they use headers and fragments.
mActions . sendSpecialKey ( Actions . SpecialKey . BACK ) ;
2013-02-22 19:42:46 -08:00
}
}
2013-01-16 02:34:54 -08:00
}
2013-06-26 10:57:52 -07:00
/ * *
* Hacky way to scroll down .
*
* solo . scroll * does not work in dialogs .
* /
private void scrollDown ( ) {
MotionEventHelper meh = new MotionEventHelper ( getInstrumentation ( ) , mDriver . getGeckoLeft ( ) , mDriver . getGeckoTop ( ) ) ;
meh . dragSync ( midWidth , midHeight + 100 , midWidth , midHeight - 100 ) ;
}
2013-01-16 02:34:54 -08:00
}