Index: chrome/android/javatests/src/org/chromium/chrome/browser/history/HistoryActivityTest.java |
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/history/HistoryActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/history/HistoryActivityTest.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b555b60af6b2d9fcfad7a1e32dc5c33318c3c52e |
--- /dev/null |
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/history/HistoryActivityTest.java |
@@ -0,0 +1,171 @@ |
+// 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.history; |
+ |
+import android.os.Handler; |
+import android.os.Looper; |
+import android.support.test.filters.SmallTest; |
+import android.support.v7.widget.RecyclerView; |
+import android.support.v7.widget.RecyclerView.ViewHolder; |
+import android.view.View; |
+ |
+import org.chromium.base.ThreadUtils; |
+import org.chromium.base.test.BaseActivityInstrumentationTestCase; |
+import org.chromium.base.test.util.CallbackHelper; |
+import org.chromium.base.test.util.Restriction; |
+import org.chromium.chrome.R; |
+import org.chromium.chrome.browser.widget.TintedImageButton; |
+import org.chromium.chrome.browser.widget.selection.SelectableItemView; |
+import org.chromium.chrome.browser.widget.selection.SelectableItemViewHolder; |
+import org.chromium.chrome.browser.widget.selection.SelectionDelegate.SelectionObserver; |
+import org.chromium.chrome.test.util.ChromeRestriction; |
+ |
+import java.util.Date; |
+import java.util.List; |
+ |
+/** |
+ * Tests the {@link HistoryActivity}. |
+ */ |
+@Restriction(ChromeRestriction.RESTRICTION_TYPE_PHONE) |
+public class HistoryActivityTest extends BaseActivityInstrumentationTestCase<HistoryActivity> { |
+ private static class TestObserver extends RecyclerView.AdapterDataObserver |
+ implements SelectionObserver<HistoryItem> { |
+ public final CallbackHelper onChangedCallback = new CallbackHelper(); |
+ public final CallbackHelper onSelectionCallback = new CallbackHelper(); |
+ |
+ private Handler mHandler; |
+ |
+ public TestObserver() { |
+ mHandler = new Handler(Looper.getMainLooper()); |
+ } |
+ |
+ @Override |
+ public void onChanged() { |
+ // To guarantee that all real Observers have had a chance to react to the event, post |
+ // the CallbackHelper.notifyCalled() call. |
+ mHandler.post(new Runnable() { |
+ @Override |
+ public void run() { |
+ onChangedCallback.notifyCalled(); |
+ } |
+ }); |
+ } |
+ |
+ @Override |
+ public void onSelectionStateChange(List<HistoryItem> selectedItems) { |
+ mHandler.post(new Runnable() { |
+ @Override |
+ public void run() { |
+ onSelectionCallback.notifyCalled(); |
+ } |
+ }); |
+ } |
+ } |
+ |
+ private StubbedHistoryProvider mHistoryProvider; |
+ private HistoryAdapter mAdapter; |
+ private HistoryManager mHistoryManager; |
+ private RecyclerView mRecyclerView; |
+ private TestObserver mTestObserver; |
+ |
+ private HistoryItem mItem1; |
+ private HistoryItem mItem2; |
+ |
+ public HistoryActivityTest() { |
+ super(HistoryActivity.class); |
+ } |
+ |
+ @Override |
+ public void setUp() throws Exception { |
+ super.setUp(); |
+ |
+ mHistoryProvider = new StubbedHistoryProvider(); |
+ |
+ Date today = new Date(); |
+ long[] timestamps = {today.getTime()}; |
+ mItem1 = StubbedHistoryProvider.createHistoryItem(0, timestamps); |
+ mItem2 = StubbedHistoryProvider.createHistoryItem(1, timestamps); |
+ mHistoryProvider.addItem(mItem1); |
+ mHistoryProvider.addItem(mItem2); |
+ |
+ HistoryManager.setProviderForTests(mHistoryProvider); |
+ |
+ final HistoryActivity activity = getActivity(); |
+ mHistoryManager = activity.getHistoryManagerForTests(); |
+ mAdapter = mHistoryManager.getAdapterForTests(); |
+ mTestObserver = new TestObserver(); |
+ mHistoryManager.getSelectionDelegateForTests().addObserver(mTestObserver); |
+ mAdapter.registerAdapterDataObserver(mTestObserver); |
+ mRecyclerView = ((RecyclerView) activity.findViewById(R.id.recycler_view)); |
+ |
+ assertEquals(4, mAdapter.getItemCount()); |
+ } |
+ |
+ @SmallTest |
+ public void testRemove_SingleItem() throws Exception { |
+ int callCount = mTestObserver.onChangedCallback.getCallCount(); |
+ final SelectableItemView<HistoryItem> itemView = getItemView(2); |
+ |
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
+ @Override |
+ public void run() { |
+ ((TintedImageButton) itemView.findViewById(R.id.remove)).performClick(); |
+ } |
+ }); |
+ |
+ // Check that one item was removed. |
+ mTestObserver.onChangedCallback.waitForCallback(callCount, 1); |
+ assertEquals(1, mHistoryProvider.markItemForRemovalCallback.getCallCount()); |
+ assertEquals(1, mHistoryProvider.removeItemsCallback.getCallCount()); |
+ assertEquals(3, mAdapter.getItemCount()); |
+ assertEquals(View.VISIBLE, mRecyclerView.getVisibility()); |
+ assertEquals(View.GONE, mHistoryManager.getEmptyViewForTests().getVisibility()); |
+ } |
+ |
+ @SmallTest |
+ public void testRemove_AllItems() throws Exception { |
+ toggleItemSelection(2); |
+ toggleItemSelection(3); |
+ |
+ int callCount = mTestObserver.onChangedCallback.getCallCount(); |
+ |
+ ThreadUtils.runOnUiThread(new Runnable() { |
+ @Override |
+ public void run() { |
+ assertTrue(mHistoryManager.getToolbarForTests().getMenu() |
+ .performIdentifierAction(R.id.selection_mode_delete_menu_id, 0)); |
+ } |
+ }); |
+ |
+ // Check that all items were removed. The onChangedCallback should be called three times - |
+ // once for each item that is being removed and once for the removal of the header. |
+ mTestObserver.onChangedCallback.waitForCallback(callCount, 3); |
+ assertEquals(0, mAdapter.getItemCount()); |
+ assertEquals(2, mHistoryProvider.markItemForRemovalCallback.getCallCount()); |
+ assertEquals(1, mHistoryProvider.removeItemsCallback.getCallCount()); |
+ assertFalse(mHistoryManager.getSelectionDelegateForTests().isSelectionEnabled()); |
+ assertEquals(View.GONE, mRecyclerView.getVisibility()); |
+ assertEquals(View.VISIBLE, mHistoryManager.getEmptyViewForTests().getVisibility()); |
+ } |
+ |
+ private void toggleItemSelection(int position) throws Exception { |
+ int callCount = mTestObserver.onSelectionCallback.getCallCount(); |
+ final SelectableItemView<HistoryItem> itemView = getItemView(position); |
+ ThreadUtils.runOnUiThread(new Runnable() { |
+ @Override |
+ public void run() { |
+ itemView.performLongClick(); |
+ } |
+ }); |
+ mTestObserver.onSelectionCallback.waitForCallback(callCount, 1); |
+ } |
+ |
+ @SuppressWarnings("unchecked") |
+ private SelectableItemView<HistoryItem> getItemView(int position) { |
+ ViewHolder mostRecentHolder = mRecyclerView.findViewHolderForAdapterPosition(position); |
+ assertTrue(mostRecentHolder instanceof SelectableItemViewHolder); |
+ return ((SelectableItemViewHolder<HistoryItem>) mostRecentHolder).getItemView(); |
+ } |
+} |