From 5f575a66c9b78cc821639f86911198e523c271cf Mon Sep 17 00:00:00 2001 From: finnur Date: Wed, 16 Sep 2015 13:27:06 -0700 Subject: [PATCH] Add test for the ItemChooserDialog class. BUG=498016 Review URL: https://codereview.chromium.org/1311963008 Cr-Commit-Position: refs/heads/master@{#349210} --- .../java/res/layout/item_chooser_dialog.xml | 2 +- .../chrome/browser/BluetoothChooserDialog.java | 1 - .../chromium/chrome/browser/ItemChooserDialog.java | 12 +- .../chrome/browser/ItemChooserDialogTest.java | 181 +++++++++++++++++++++ 4 files changed, 192 insertions(+), 4 deletions(-) create mode 100644 chrome/android/javatests/src/org/chromium/chrome/browser/ItemChooserDialogTest.java diff --git a/chrome/android/java/res/layout/item_chooser_dialog.xml b/chrome/android/java/res/layout/item_chooser_dialog.xml index ae7c2db15ac0..cf73fd4ea592 100644 --- a/chrome/android/java/res/layout/item_chooser_dialog.xml +++ b/chrome/android/java/res/layout/item_chooser_dialog.xml @@ -49,7 +49,7 @@ android:id="@+id/items" android:layout_width="fill_parent" android:layout_height="wrap_content" - android:layout_gravity="center" + android:layout_gravity="top" android:fadeScrollbars="false" android:visibility="gone" /> diff --git a/chrome/android/java/src/org/chromium/chrome/browser/BluetoothChooserDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/BluetoothChooserDialog.java index 4d48a13eabd9..d09f59bf43f4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/BluetoothChooserDialog.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/BluetoothChooserDialog.java @@ -128,7 +128,6 @@ public class BluetoothChooserDialog implements ItemChooserDialog.ItemSelectedCal // The type of link this span represents. private LinkType mLinkType; - // TODO(finnur): Remove this variable when toasts have been eliminated. private Context mContext; NoUnderlineClickableSpan(LinkType linkType, Context context) { diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java index da2eaddb2482..e920b4caa60b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java @@ -28,6 +28,7 @@ import android.widget.ProgressBar; import android.widget.TextView; import org.chromium.base.ApiCompatibilityUtils; +import org.chromium.base.VisibleForTesting; import org.chromium.chrome.R; import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.widget.TextViewWithClickableSpans; @@ -288,8 +289,7 @@ public class ItemChooserDialog { mConfirmButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - mItemSelectedCallback.onItemSelected( - mItemAdapter.getSelectedItemKey()); + mItemSelectedCallback.onItemSelected(mItemAdapter.getSelectedItemKey()); mDialog.setOnDismissListener(null); mDialog.dismiss(); } @@ -415,4 +415,12 @@ public class ItemChooserDialog { break; } } + + /** + * Returns the dialog associated with this class. For use with tests only. + */ + @VisibleForTesting + public Dialog getDialogForTesting() { + return mDialog; + } } diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ItemChooserDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ItemChooserDialogTest.java new file mode 100644 index 000000000000..f931c6518477 --- /dev/null +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ItemChooserDialogTest.java @@ -0,0 +1,181 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser; + +import android.app.Dialog; +import android.test.suitebuilder.annotation.SmallTest; +import android.text.SpannableString; +import android.view.View; +import android.widget.Button; +import android.widget.ListView; + +import org.chromium.base.ThreadUtils; +import org.chromium.chrome.R; +import org.chromium.chrome.test.ChromeActivityTestCaseBase; +import org.chromium.content.browser.test.util.Criteria; +import org.chromium.content.browser.test.util.CriteriaHelper; +import org.chromium.content.browser.test.util.TouchCommon; +import org.chromium.ui.widget.TextViewWithClickableSpans; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Callable; + +/** + * Tests for the ItemChooserDialog class. + */ +public class ItemChooserDialogTest extends ChromeActivityTestCaseBase + implements ItemChooserDialog.ItemSelectedCallback { + + ItemChooserDialog mChooserDialog; + + String mLastSelectedId = "None"; + + public ItemChooserDialogTest() { + super(ChromeActivity.class); + } + + // ChromeActivityTestCaseBase: + + @Override + protected void setUp() throws Exception { + super.setUp(); + mChooserDialog = createDialog(); + } + + @Override + public void startMainActivity() throws InterruptedException { + startMainActivityOnBlankPage(); + } + + // ItemChooserDialog.ItemSelectedCallback: + + @Override + public void onItemSelected(String id) { + mLastSelectedId = id; + } + + private ItemChooserDialog createDialog() { + SpannableString title = new SpannableString("title"); + String searching = new String("searching"); + SpannableString noneFound = new SpannableString("noneFound"); + SpannableString status = new SpannableString("status"); + SpannableString errorMessage = new SpannableString("errorMessage"); + SpannableString errorStatus = new SpannableString("errorStatus"); + String positiveButton = new String("positiveButton"); + final ItemChooserDialog.ItemChooserLabels labels = + new ItemChooserDialog.ItemChooserLabels(title, searching, noneFound, status, + errorMessage, errorStatus, positiveButton); + ItemChooserDialog dialog = ThreadUtils.runOnUiThreadBlockingNoException( + new Callable() { + @Override + public ItemChooserDialog call() { + ItemChooserDialog dialog = new ItemChooserDialog( + getActivity(), ItemChooserDialogTest.this, labels); + return dialog; + } + }); + return dialog; + } + + private void selectItem(Dialog dialog, int position, final String expectedItemId) + throws InterruptedException { + final ListView items = (ListView) dialog.findViewById(R.id.items); + final Button button = (Button) dialog.findViewById(R.id.positive); + + CriteriaHelper.pollForUIThreadCriteria(new Criteria() { + @Override + public boolean isSatisfied() { + return items.getChildAt(0) != null; + } + }); + + // Verify first item selected gets selected. + // TODO(finnur): Stop using coordinates 10, 10 when crbug.com/532237 is fixed. + TouchCommon.singleClickView(items.getChildAt(position - 1), 10, 10); + + CriteriaHelper.pollForUIThreadCriteria(new Criteria() { + @Override + public boolean isSatisfied() { + return button.isEnabled(); + } + }); + + // TODO(finnur): Stop using coordinates 10, 10 when crbug.com/532237 is fixed. + TouchCommon.singleClickView(button, 10, 10); + + CriteriaHelper.pollForUIThreadCriteria(new Criteria() { + @Override + public boolean isSatisfied() { + return mLastSelectedId.equals(expectedItemId); + } + }); + } + + @SmallTest + public void testSimpleItemSelection() throws InterruptedException { + Dialog dialog = mChooserDialog.getDialogForTesting(); + assertTrue(dialog.isShowing()); + + TextViewWithClickableSpans statusView = (TextViewWithClickableSpans) + dialog.findViewById(R.id.status); + final ListView items = (ListView) dialog.findViewById(R.id.items); + final Button button = (Button) dialog.findViewById(R.id.positive); + + // Before we add items to the dialog, the 'searching' message should be + // showing, the Commit button should be disabled and the list view hidden. + assertEquals("searching", statusView.getText().toString()); + assertFalse(button.isEnabled()); + assertEquals(View.GONE, items.getVisibility()); + + List devices = + new ArrayList(); + mChooserDialog.showList(devices); + + // Listview should now be showing empty, with an empty view visible to + // drive home the point and a status message at the bottom. + assertEquals(View.VISIBLE, items.getVisibility()); + assertEquals(View.VISIBLE, items.getEmptyView().getVisibility()); + assertEquals("status", statusView.getText().toString()); + assertFalse(button.isEnabled()); + + devices = new ArrayList(); + devices.add(new ItemChooserDialog.ItemChooserRow("key", "key")); + devices.add(new ItemChooserDialog.ItemChooserRow("key2", "key2")); + mChooserDialog.showList(devices); + + // Two items showing, the emty view should be no more and the button + // should now be enabled. + assertEquals(View.VISIBLE, items.getVisibility()); + assertEquals(View.GONE, items.getEmptyView().getVisibility()); + assertEquals("status", statusView.getText().toString()); + assertFalse(button.isEnabled()); + + // Select the first item and verify it got selected. + selectItem(dialog, 1, "key"); + + mChooserDialog.dismiss(); + } + + @SmallTest + public void testDisabledSelection() throws InterruptedException { + Dialog dialog = mChooserDialog.getDialogForTesting(); + assertTrue(dialog.isShowing()); + + List devices = + new ArrayList(); + devices.add(new ItemChooserDialog.ItemChooserRow("key", "key")); + devices.add(new ItemChooserDialog.ItemChooserRow("key2", "key2")); + mChooserDialog.showList(devices); + + // Disable one item and try to select it. + mChooserDialog.setEnabled("key", false); + selectItem(dialog, 1, "None"); + // The other is still selectable. + selectItem(dialog, 2, "key2"); + + mChooserDialog.dismiss(); + } +} -- 2.11.4.GIT