Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7010)

Unified Diff: chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/PhotoPickerDialogTest.java

Issue 2894523004: Photo Picker dialog: Add a test. (Closed)
Patch Set: Address feedback from Ted Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/PhotoPickerDialogTest.java
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/PhotoPickerDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/PhotoPickerDialogTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..83cc376f38c36dc6a8a38cb951a4111f92662cdd
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/PhotoPickerDialogTest.java
@@ -0,0 +1,224 @@
+// Copyright 2017 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.photo_picker;
+
+import android.support.test.filters.LargeTest;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+import android.widget.Button;
+
+import org.chromium.base.ThreadUtils;
+import org.chromium.base.test.util.CallbackHelper;
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.widget.selection.SelectionDelegate;
+import org.chromium.chrome.browser.widget.selection.SelectionDelegate.SelectionObserver;
+import org.chromium.chrome.test.ChromeActivityTestCaseBase;
+import org.chromium.chrome.test.util.browser.RecyclerViewTestUtils;
+import org.chromium.content.browser.test.util.TouchCommon;
+import org.chromium.ui.PhotoPickerListener;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.Callable;
+
+/**
+ * Tests for the PhotoPickerDialog class.
+ */
+public class PhotoPickerDialogTest extends ChromeActivityTestCaseBase<ChromeActivity>
+ implements PhotoPickerListener, SelectionObserver<PickerBitmap> {
+ // The dialog we are testing.
+ private PhotoPickerDialog mDialog;
+
+ // The data to show in the dialog (A map of filepath to last-modified time).
+ // Map<String, Long> mTestFiles;
+ private List<PickerBitmap> mTestFiles;
+
+ // The selection delegate for the dialog.
+ private SelectionDelegate<PickerBitmap> mSelectionDelegate;
+
+ // The last action recorded in the dialog (e.g. photo selected).
+ private Action mLastActionRecorded;
+
+ // The final set of photos picked by the dialog. Can be an empty array, if
+ // nothing was selected.
+ private String[] mLastSelectedPhotos;
+
+ // The list of currently selected photos (built piecemeal).
+ private List<PickerBitmap> mCurrentPhotoSelection;
+
+ // A callback that fires when something is selected in the dialog.
+ public final CallbackHelper onSelectionCallback = new CallbackHelper();
+
+ // A callback that fires when an action is taken in the dialog (cancel/done etc).
+ public final CallbackHelper onActionCallback = new CallbackHelper();
+
+ public PhotoPickerDialogTest() {
+ super(ChromeActivity.class);
+ }
+
+ // ChromeActivityTestCaseBase:
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ mTestFiles = new ArrayList<>();
+ mTestFiles.add(new PickerBitmap("a", 5L, PickerBitmap.PICTURE));
+ mTestFiles.add(new PickerBitmap("b", 4L, PickerBitmap.PICTURE));
+ mTestFiles.add(new PickerBitmap("c", 3L, PickerBitmap.PICTURE));
+ mTestFiles.add(new PickerBitmap("d", 2L, PickerBitmap.PICTURE));
+ mTestFiles.add(new PickerBitmap("e", 1L, PickerBitmap.PICTURE));
+ mTestFiles.add(new PickerBitmap("f", 0L, PickerBitmap.PICTURE));
+ PickerCategoryView.setTestFiles(mTestFiles);
+ }
+
+ @Override
+ public void startMainActivity() throws InterruptedException {
+ startMainActivityOnBlankPage();
+ }
+
+ // PhotoPickerDialog.PhotoPickerListener:
+
+ @Override
+ public void onPickerUserAction(Action action, String[] photos) {
+ mLastActionRecorded = action;
+ mLastSelectedPhotos = photos != null ? photos.clone() : null;
+ if (mLastSelectedPhotos != null) Arrays.sort(mLastSelectedPhotos);
+ onActionCallback.notifyCalled();
+ }
+
+ // SelectionObserver:
+
+ @Override
+ public void onSelectionStateChange(List<PickerBitmap> photosSelected) {
+ mCurrentPhotoSelection = new ArrayList<>(photosSelected);
+ onSelectionCallback.notifyCalled();
+ }
+
+ private RecyclerView getRecyclerView() {
+ return (RecyclerView) mDialog.findViewById(R.id.recycler_view);
+ }
+
+ private PhotoPickerDialog createDialog(final boolean multiselect) throws Exception {
+ final PhotoPickerDialog dialog =
+ ThreadUtils.runOnUiThreadBlocking(new Callable<PhotoPickerDialog>() {
+ @Override
+ public PhotoPickerDialog call() {
+ final PhotoPickerDialog dialog = new PhotoPickerDialog(
+ getActivity(), PhotoPickerDialogTest.this, multiselect);
+ dialog.show();
+ return dialog;
+ }
+ });
+
+ mSelectionDelegate = dialog.getCategoryViewForTesting().getSelectionDelegateForTesting();
+ if (!multiselect) mSelectionDelegate.setSingleSelectionMode();
+ mSelectionDelegate.addObserver(this);
+ mDialog = dialog;
+
+ return dialog;
+ }
+
+ private void clickView(final int position, final int expectedSelectionCount) throws Exception {
+ RecyclerView recyclerView = getRecyclerView();
+ RecyclerViewTestUtils.waitForView(recyclerView, position);
+
+ int callCount = onSelectionCallback.getCallCount();
+ TouchCommon.singleClickView(
+ recyclerView.findViewHolderForAdapterPosition(position).itemView);
+ onSelectionCallback.waitForCallback(callCount, 1);
+
+ // Validate the correct selection took place.
+ assertEquals(expectedSelectionCount, mCurrentPhotoSelection.size());
+ assertTrue(mSelectionDelegate.isItemSelected(mTestFiles.get(position)));
+ }
+
+ private void clickDone() throws Exception {
+ mLastActionRecorded = null;
+
+ PhotoPickerToolbar toolbar = (PhotoPickerToolbar) mDialog.findViewById(R.id.action_bar);
+ Button done = (Button) toolbar.findViewById(R.id.done);
+ int callCount = onActionCallback.getCallCount();
+ TouchCommon.singleClickView(done);
+ onActionCallback.waitForCallback(callCount, 1);
+ assertEquals(PhotoPickerListener.Action.PHOTOS_SELECTED, mLastActionRecorded);
+ }
+
+ public void clickCancel() throws Exception {
+ mLastActionRecorded = null;
+
+ PickerCategoryView categoryView = mDialog.getCategoryViewForTesting();
+ View cancel = new View(getActivity());
+ int callCount = onActionCallback.getCallCount();
+ categoryView.onClick(cancel);
+ onActionCallback.waitForCallback(callCount, 1);
+ assertEquals(PhotoPickerListener.Action.CANCEL, mLastActionRecorded);
+ }
+
+ private void dismissDialog() {
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+ @Override
+ public void run() {
+ mDialog.dismiss();
+ }
+ });
+ }
+
+ @LargeTest
+ public void testNoSelection() throws Throwable {
+ createDialog(false); // Multi-select = false.
+ assertTrue(mDialog.isShowing());
+
+ int expectedSelectionCount = 1;
+ clickView(0, expectedSelectionCount);
+ clickCancel();
+
+ assertEquals(null, mLastSelectedPhotos);
+ assertEquals(PhotoPickerListener.Action.CANCEL, mLastActionRecorded);
+
+ dismissDialog();
+ }
+
+ @LargeTest
+ public void testSingleSelectionPhoto() throws Throwable {
+ createDialog(false); // Multi-select = false.
+ assertTrue(mDialog.isShowing());
+
+ // Expected selection count is 1 because clicking on a new view unselects other.
+ int expectedSelectionCount = 1;
+ clickView(0, expectedSelectionCount);
+ clickView(1, expectedSelectionCount);
+ clickDone();
+
+ assertEquals(1, mLastSelectedPhotos.length);
+ assertEquals(PhotoPickerListener.Action.PHOTOS_SELECTED, mLastActionRecorded);
+ assertEquals(mTestFiles.get(1).getFilePath(), mLastSelectedPhotos[0]);
+
+ dismissDialog();
+ }
+
+ @LargeTest
+ public void testMultiSelectionPhoto() throws Throwable {
+ createDialog(true); // Multi-select = true.
+ assertTrue(mDialog.isShowing());
+
+ // Multi-selection is enabled, so each click is counted.
+ int expectedSelectionCount = 1;
+ clickView(0, expectedSelectionCount++);
+ clickView(2, expectedSelectionCount++);
+ clickView(4, expectedSelectionCount++);
+ clickDone();
+
+ assertEquals(3, mLastSelectedPhotos.length);
+ assertEquals(PhotoPickerListener.Action.PHOTOS_SELECTED, mLastActionRecorded);
+ assertEquals(mTestFiles.get(0).getFilePath(), mLastSelectedPhotos[0]);
+ assertEquals(mTestFiles.get(2).getFilePath(), mLastSelectedPhotos[1]);
+ assertEquals(mTestFiles.get(4).getFilePath(), mLastSelectedPhotos[2]);
+
+ dismissDialog();
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698