Index: chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java |
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java |
index 337ab26200333100dac9ddd7184904f94a8e00cb..810795772eecc28cc11a2db9090373fdabaa584c 100644 |
--- a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java |
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java |
@@ -7,6 +7,7 @@ package org.chromium.chrome.browser.ntp.cards; |
import static org.junit.Assert.assertEquals; |
import static org.junit.Assert.assertFalse; |
import static org.junit.Assert.assertTrue; |
+import static org.junit.Assert.fail; |
import org.chromium.base.metrics.RecordHistogram; |
import org.chromium.base.metrics.RecordUserAction; |
@@ -16,6 +17,7 @@ import org.chromium.chrome.browser.ntp.snippets.CategoryStatus; |
import org.chromium.chrome.browser.ntp.snippets.ContentSuggestionsCardLayout; |
import org.chromium.chrome.browser.ntp.snippets.FakeSuggestionsSource; |
import org.chromium.chrome.browser.ntp.snippets.KnownCategories; |
+import org.chromium.chrome.browser.ntp.snippets.SectionHeader; |
import org.chromium.chrome.browser.ntp.snippets.SnippetArticle; |
import org.chromium.testing.local.LocalRobolectricTestRunner; |
import org.junit.Before; |
@@ -43,64 +45,145 @@ public class NewTabPageAdapterTest { |
private NewTabPageAdapter mAdapter; |
/** |
+ * Stores information about a section that should be present in the adapter. |
+ */ |
+ private static class SectionDescriptor { |
+ public final boolean mMoreButton; |
+ public final boolean mStatusCard; |
+ public final int mNumSuggestions; |
+ |
+ public SectionDescriptor(boolean moreButton, boolean statusCard, int numSuggestions) { |
+ mMoreButton = moreButton; |
+ mStatusCard = statusCard; |
+ mNumSuggestions = numSuggestions; |
+ if (statusCard) { |
+ assertEquals(0, numSuggestions); |
+ } else { |
+ assertTrue(numSuggestions > 0); |
+ } |
+ } |
+ } |
+ |
+ /** |
+ * Checks the list of items from the adapter against a sequence of expectation, which is |
+ * expressed as a sequence of calls to the {@link #expect} methods. |
+ */ |
+ private static class ItemsMatcher { // TODO(pke): Find better name. |
+ private final List<NewTabPageItem> mItems; |
+ private int mCurrentIndex; |
+ |
+ public ItemsMatcher(List<NewTabPageItem> items) { |
+ mItems = items; |
+ } |
+ |
+ public void expect(Class<? extends NewTabPageItem> itemType) { |
+ if (mCurrentIndex >= mItems.size()) { |
+ fail("Expected another " + itemType.getSimpleName() + " after the following items: " |
+ + mItems); |
+ } |
+ NewTabPageItem item = mItems.get(mCurrentIndex); |
+ if (!itemType.isInstance(item)) { |
+ fail("Expected the element at position " + mCurrentIndex + " to be a " |
+ + itemType.getSimpleName() + " instead of a " |
+ + item.getClass().getSimpleName() + "; full list: " + mItems); |
+ } |
+ mCurrentIndex++; |
+ } |
+ |
+ public void expect(SectionDescriptor descriptor) { |
+ expect(SectionHeader.class); |
+ if (descriptor.mStatusCard) { |
+ expect(StatusItem.class); |
+ if (descriptor.mMoreButton) { |
+ expect(ActionItem.class); |
+ } |
+ expect(ProgressItem.class); |
+ } else { |
+ for (int i = 1; i <= descriptor.mNumSuggestions; i++) { |
+ expect(SnippetArticle.class); |
+ } |
+ if (descriptor.mMoreButton) { |
+ expect(ActionItem.class); |
+ } |
+ } |
+ } |
+ |
+ public void expectFinished() { |
+ assertEquals(mItems.size(), mCurrentIndex); |
+ } |
+ } |
+ |
+ /** |
+ * Asserts that the given itemGroup is a {@link SuggestionsSection} that matches the given |
+ * {@link SectionDescriptor}. |
+ * @param descriptor The section descriptor to match against. |
+ * @param itemGroup The items from the adapter. |
+ */ |
+ private void assertMatches(SectionDescriptor descriptor, ItemGroup itemGroup) { |
+ ItemsMatcher matcher = new ItemsMatcher(itemGroup.getItems()); |
+ matcher.expect(descriptor); |
+ matcher.expectFinished(); |
+ } |
+ |
+ /** |
* Asserts that {@link #mAdapter}.{@link NewTabPageAdapter#getItemCount()} corresponds to an |
* NTP with the given sections in it. |
- * @param sections A list of sections, each represented by the number of items that are required |
- * to represent it in the UI. For readability, these numbers should be generated |
- * with the methods below. |
+ * @param descriptors A list of descriptors, each describing a section that should be present on |
+ * the UI. |
*/ |
- private void assertItemsFor(int... sections) { |
- int expectedCount = 1; // above-the-fold. |
- for (int section : sections) expectedCount += section; |
- if (sections.length > 0) expectedCount += 2; // footer and bottom spacer. |
- int actualCount = mAdapter.getItemCount(); |
- assertEquals("Expected " + expectedCount + " items, but the following " + actualCount |
- + " were present: " + mAdapter.getItems(), |
- expectedCount, mAdapter.getItemCount()); |
+ private void assertItemsFor(SectionDescriptor... descriptors) { |
+ ItemsMatcher matcher = new ItemsMatcher(mAdapter.getItems()); |
+ matcher.expect(AboveTheFoldItem.class); |
+ for (SectionDescriptor descriptor : descriptors) matcher.expect(descriptor); |
+ if (descriptors.length > 0) { |
+ matcher.expect(Footer.class); |
+ matcher.expect(SpacingItem.class); |
+ } |
+ matcher.expectFinished(); |
} |
/** |
- * To be used with {@link #assertItemsFor(int...)}, for a section with {@code numSuggestions} |
- * cards in it. |
+ * To be used with {@link #assertItemsFor(SectionDescriptor...)}, for a section with |
+ * {@code numSuggestions} cards in it. |
* @param numSuggestions The number of suggestions in the section. If there are zero, use either |
* no section at all (if it is not displayed) or |
* {@link #sectionWithStatusCard()}. |
- * @return The number of items that should be used by the adapter to represent this section. |
+ * @return A descriptor for the section. |
*/ |
- private int section(int numSuggestions) { |
+ private SectionDescriptor section(int numSuggestions) { |
assert numSuggestions > 0; |
- return 1 + numSuggestions; // Header and the content. |
+ return new SectionDescriptor(false, false, numSuggestions); |
} |
/** |
- * To be used with {@link #assertItemsFor(int...)}, for a section with {@code numSuggestions} |
- * cards and a more-button. |
+ * To be used with {@link #assertItemsFor(SectionDescriptor...)}, for a section with |
+ * {@code numSuggestions} cards and a more-button. |
* @param numSuggestions The number of suggestions in the section. If this is zero, the |
* more-button is still shown. |
* TODO(pke): In the future, we additionally show an empty-card if |
* numSuggestions is zero. |
- * @return The number of items that should be used by the adapter to represent this section. |
+ * @return A descriptor for the section. |
*/ |
- private int sectionWithMoreButton(int numSuggestions) { |
- return 1 + numSuggestions + 1; // Header, the content and the more-button. |
+ private SectionDescriptor sectionWithMoreButton(int numSuggestions) { |
+ return new SectionDescriptor(true, false, numSuggestions); |
} |
/** |
- * To be used with {@link #assertItemsFor(int...)}, for a section that has no suggestions, but |
- * a status card to be displayed. |
- * @return The number of items that should be used by the adapter to represent this section. |
+ * To be used with {@link #assertItemsFor(SectionDescriptor...)}, for a section that has no |
+ * suggestions, but a status card to be displayed. |
+ * @return A descriptor for the section. |
*/ |
- private int sectionWithStatusCard() { |
- return 3; // Header, status card and progress indicator. |
+ private SectionDescriptor sectionWithStatusCard() { |
+ return new SectionDescriptor(false, true, 0); |
} |
/** |
- * To be used with {@link #assertItemsFor(int...)}, for a section with button that has no |
- * suggestions and instead displays a status card. |
- * @return The number of items that should be used by the adapter to represent this section. |
+ * To be used with {@link #assertItemsFor(SectionDescriptor...)}, for a section with button that |
+ * has no suggestions and instead displays a status card. |
+ * @return A descriptor for the section. |
*/ |
- private int sectionWithStatusCardAndMoreButton() { |
- return 4; // Header, status card, More button, progress indicator. |
+ private SectionDescriptor sectionWithStatusCardAndMoreButton() { |
+ return new SectionDescriptor(true, true, 0); |
} |
@Before |
@@ -343,7 +426,6 @@ public class NewTabPageAdapterTest { |
final List<SnippetArticle> articles = |
Collections.unmodifiableList(createDummySuggestions(3)); |
FakeSuggestionsSource suggestionsSource; |
- SuggestionsSection section; |
// Part 1: VisibleIfEmpty = true |
suggestionsSource = new FakeSuggestionsSource(); |
@@ -363,11 +445,11 @@ public class NewTabPageAdapterTest { |
// 1.3 - When all suggestions are dismissed |
assertEquals(SuggestionsSection.class, mAdapter.getGroups().get(sectionIdx).getClass()); |
- section = (SuggestionsSection) mAdapter.getGroups().get(sectionIdx); |
- assertEquals(section(3), section.getItems().size()); |
- section.removeSuggestion(articles.get(0)); |
- section.removeSuggestion(articles.get(1)); |
- section.removeSuggestion(articles.get(2)); |
+ SuggestionsSection section42 = (SuggestionsSection) mAdapter.getGroups().get(sectionIdx); |
+ assertMatches(section(3), section42); |
+ section42.removeSuggestion(articles.get(0)); |
+ section42.removeSuggestion(articles.get(1)); |
+ section42.removeSuggestion(articles.get(2)); |
assertItemsFor(sectionWithStatusCard()); |
// Part 2: VisibleIfEmpty = false |
@@ -400,7 +482,7 @@ public class NewTabPageAdapterTest { |
final List<SnippetArticle> articles = |
Collections.unmodifiableList(createDummySuggestions(3)); |
FakeSuggestionsSource suggestionsSource; |
- SuggestionsSection section; |
+ SuggestionsSection section42; |
// Part 1: ShowMoreButton = true |
suggestionsSource = new FakeSuggestionsSource(); |
@@ -420,11 +502,11 @@ public class NewTabPageAdapterTest { |
// 1.3 - When all suggestions are dismissed. |
assertEquals(SuggestionsSection.class, mAdapter.getGroups().get(sectionIdx).getClass()); |
- section = (SuggestionsSection) mAdapter.getGroups().get(sectionIdx); |
- assertEquals(sectionWithMoreButton(3), section.getItems().size()); |
- section.removeSuggestion(articles.get(0)); |
- section.removeSuggestion(articles.get(1)); |
- section.removeSuggestion(articles.get(2)); |
+ section42 = (SuggestionsSection) mAdapter.getGroups().get(sectionIdx); |
+ assertMatches(sectionWithMoreButton(3), section42); |
+ section42.removeSuggestion(articles.get(0)); |
+ section42.removeSuggestion(articles.get(1)); |
+ section42.removeSuggestion(articles.get(2)); |
assertItemsFor(sectionWithStatusCardAndMoreButton()); |
// Part 1: ShowMoreButton = false |
@@ -445,11 +527,11 @@ public class NewTabPageAdapterTest { |
// 2.3 - When all suggestions are dismissed. |
assertEquals(SuggestionsSection.class, mAdapter.getGroups().get(sectionIdx).getClass()); |
- section = (SuggestionsSection) mAdapter.getGroups().get(sectionIdx); |
- assertEquals(section(3), section.getItems().size()); |
- section.removeSuggestion(articles.get(0)); |
- section.removeSuggestion(articles.get(1)); |
- section.removeSuggestion(articles.get(2)); |
+ section42 = (SuggestionsSection) mAdapter.getGroups().get(sectionIdx); |
+ assertMatches(section(3), section42); |
+ section42.removeSuggestion(articles.get(0)); |
+ section42.removeSuggestion(articles.get(1)); |
+ section42.removeSuggestion(articles.get(2)); |
assertItemsFor(sectionWithStatusCard()); |
} |