OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.chrome.browser.ntp.cards; | 5 package org.chromium.chrome.browser.ntp.cards; |
6 | 6 |
7 import static org.junit.Assert.assertEquals; | 7 import static org.junit.Assert.assertEquals; |
8 import static org.junit.Assert.assertFalse; | 8 import static org.junit.Assert.assertFalse; |
9 import static org.junit.Assert.assertThat; | 9 import static org.junit.Assert.assertThat; |
10 import static org.junit.Assert.assertTrue; | 10 import static org.junit.Assert.assertTrue; |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
100 */ | 100 */ |
101 private static class ItemsMatcher { // TODO(pke): Find better name. | 101 private static class ItemsMatcher { // TODO(pke): Find better name. |
102 private final NewTabPageAdapter mAdapter; | 102 private final NewTabPageAdapter mAdapter; |
103 private int mCurrentIndex; | 103 private int mCurrentIndex; |
104 | 104 |
105 public ItemsMatcher(NewTabPageAdapter adapter, int startingIndex) { | 105 public ItemsMatcher(NewTabPageAdapter adapter, int startingIndex) { |
106 mAdapter = adapter; | 106 mAdapter = adapter; |
107 mCurrentIndex = startingIndex; | 107 mCurrentIndex = startingIndex; |
108 } | 108 } |
109 | 109 |
110 public void expect(@NewTabPageItem.ViewType int expectedItemType) { | 110 public void expect(@ItemViewType int expectedItemType) { |
111 if (mCurrentIndex >= mAdapter.getItemCount()) { | 111 if (mCurrentIndex >= mAdapter.getItemCount()) { |
112 fail("Expected item of type " + expectedItemType + " but encount
ered end of list"); | 112 fail("Expected item of type " + expectedItemType + " but encount
ered end of list"); |
113 } | 113 } |
114 @NewTabPageItem.ViewType int itemType = mAdapter.getItemViewType(mCu
rrentIndex); | 114 @ItemViewType int itemType = mAdapter.getItemViewType(mCurrentIndex)
; |
115 assertEquals("Type mismatch at position " + mCurrentIndex, expectedI
temType, itemType); | 115 assertEquals("Type mismatch at position " + mCurrentIndex, expectedI
temType, itemType); |
116 mCurrentIndex++; | 116 mCurrentIndex++; |
117 } | 117 } |
118 | 118 |
119 public void expect(SectionDescriptor descriptor) { | 119 public void expect(SectionDescriptor descriptor) { |
120 expect(NewTabPageItem.VIEW_TYPE_HEADER); | 120 expect(ItemViewType.HEADER); |
121 if (descriptor.mStatusCard) { | 121 if (descriptor.mStatusCard) { |
122 expect(NewTabPageItem.VIEW_TYPE_STATUS); | 122 expect(ItemViewType.STATUS); |
123 expect(NewTabPageItem.VIEW_TYPE_ACTION); | 123 expect(ItemViewType.ACTION); |
124 expect(NewTabPageItem.VIEW_TYPE_PROGRESS); | 124 expect(ItemViewType.PROGRESS); |
125 } else { | 125 } else { |
126 for (int i = 1; i <= descriptor.mNumSuggestions; i++) { | 126 for (int i = 1; i <= descriptor.mNumSuggestions; i++) { |
127 expect(NewTabPageItem.VIEW_TYPE_SNIPPET); | 127 expect(ItemViewType.SNIPPET); |
128 } | 128 } |
129 if (descriptor.mMoreButton) { | 129 if (descriptor.mMoreButton) { |
130 expect(NewTabPageItem.VIEW_TYPE_ACTION); | 130 expect(ItemViewType.ACTION); |
131 } | 131 } |
132 } | 132 } |
133 } | 133 } |
134 | 134 |
135 public void expectPosition(int expectedPosition) { | 135 public void expectPosition(int expectedPosition) { |
136 assertEquals(expectedPosition, mCurrentIndex); | 136 assertEquals(expectedPosition, mCurrentIndex); |
137 } | 137 } |
138 } | 138 } |
139 | 139 |
140 /** | 140 /** |
141 * Asserts that the given itemGroup is a {@link SuggestionsSection} that mat
ches the given | 141 * Asserts that the given itemGroup is a {@link SuggestionsSection} that mat
ches the given |
142 * {@link SectionDescriptor}. | 142 * {@link SectionDescriptor}. |
143 * @param descriptor The section descriptor to match against. | 143 * @param descriptor The section descriptor to match against. |
144 * @param itemGroup The items from the adapter. | 144 * @param itemGroup The items from the adapter. |
145 */ | 145 */ |
146 private void assertMatches(SectionDescriptor descriptor, ItemGroup itemGroup
) { | 146 private void assertMatches(SectionDescriptor descriptor, TreeNode itemGroup)
{ |
147 int offset = mAdapter.getGroupPositionOffset(itemGroup); | 147 int offset = mAdapter.getGroupPositionOffset(itemGroup); |
148 ItemsMatcher matcher = new ItemsMatcher(mAdapter, offset); | 148 ItemsMatcher matcher = new ItemsMatcher(mAdapter, offset); |
149 matcher.expect(descriptor); | 149 matcher.expect(descriptor); |
150 matcher.expectPosition(offset + itemGroup.getItems().size()); | 150 matcher.expectPosition(offset + itemGroup.getItemCount()); |
151 } | 151 } |
152 | 152 |
153 /** | 153 /** |
154 * Asserts that {@link #mAdapter}.{@link NewTabPageAdapter#getItemCount()} c
orresponds to an | 154 * Asserts that {@link #mAdapter}.{@link NewTabPageAdapter#getItemCount()} c
orresponds to an |
155 * NTP with the given sections in it. | 155 * NTP with the given sections in it. |
156 * @param descriptors A list of descriptors, each describing a section that
should be present on | 156 * @param descriptors A list of descriptors, each describing a section that
should be present on |
157 * the UI. | 157 * the UI. |
158 */ | 158 */ |
159 private void assertItemsFor(SectionDescriptor... descriptors) { | 159 private void assertItemsFor(SectionDescriptor... descriptors) { |
160 ItemsMatcher matcher = new ItemsMatcher(mAdapter, 0); | 160 ItemsMatcher matcher = new ItemsMatcher(mAdapter, 0); |
161 matcher.expect(NewTabPageItem.VIEW_TYPE_ABOVE_THE_FOLD); | 161 matcher.expect(ItemViewType.ABOVE_THE_FOLD); |
162 for (SectionDescriptor descriptor : descriptors) matcher.expect(descript
or); | 162 for (SectionDescriptor descriptor : descriptors) matcher.expect(descript
or); |
163 if (descriptors.length == 0) { | 163 if (descriptors.length == 0) { |
164 matcher.expect(NewTabPageItem.VIEW_TYPE_ALL_DISMISSED); | 164 matcher.expect(ItemViewType.ALL_DISMISSED); |
165 } else { | 165 } else { |
166 matcher.expect(NewTabPageItem.VIEW_TYPE_FOOTER); | 166 matcher.expect(ItemViewType.FOOTER); |
167 } | 167 } |
168 matcher.expect(NewTabPageItem.VIEW_TYPE_SPACING); | 168 matcher.expect(ItemViewType.SPACING); |
169 matcher.expectPosition(mAdapter.getItemCount()); | 169 matcher.expectPosition(mAdapter.getItemCount()); |
170 } | 170 } |
171 | 171 |
172 /** | 172 /** |
173 * To be used with {@link #assertItemsFor(SectionDescriptor...)}, for a sect
ion with | 173 * To be used with {@link #assertItemsFor(SectionDescriptor...)}, for a sect
ion with |
174 * {@code numSuggestions} cards in it. | 174 * {@code numSuggestions} cards in it. |
175 * @param numSuggestions The number of suggestions in the section. If there
are zero, use either | 175 * @param numSuggestions The number of suggestions in the section. If there
are zero, use either |
176 * no section at all (if it is not displayed) or | 176 * no section at all (if it is not displayed) or |
177 * {@link #sectionWithStatusCard()}. | 177 * {@link #sectionWithStatusCard()}. |
178 * @return A descriptor for the section. | 178 * @return A descriptor for the section. |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
356 assertItemsFor(section(4)); | 356 assertItemsFor(section(4)); |
357 } | 357 } |
358 | 358 |
359 /** | 359 /** |
360 * Tests how the loading indicator reacts to status changes. | 360 * Tests how the loading indicator reacts to status changes. |
361 */ | 361 */ |
362 @Test | 362 @Test |
363 @Feature({"Ntp"}) | 363 @Feature({"Ntp"}) |
364 public void testProgressIndicatorDisplay() { | 364 public void testProgressIndicatorDisplay() { |
365 int progressPos = mAdapter.getFooterPosition() - 1; | 365 int progressPos = mAdapter.getFooterPosition() - 1; |
366 SuggestionsSection section = (SuggestionsSection) mAdapter.getGroup(prog
ressPos); | 366 SuggestionsSection section = mAdapter.getSuggestionsSection(progressPos)
; |
367 List<NewTabPageItem> items = section.getItems(); | 367 ProgressItem progress = section.getProgressItemForTesting(); |
368 ProgressItem progress = (ProgressItem) items.get(items.size() - 1); | |
369 | 368 |
370 mSource.setStatusForCategory(KnownCategories.ARTICLES, CategoryStatus.IN
ITIALIZING); | 369 mSource.setStatusForCategory(KnownCategories.ARTICLES, CategoryStatus.IN
ITIALIZING); |
371 assertTrue(progress.isVisible()); | 370 assertTrue(progress.isVisible()); |
372 | 371 |
373 mSource.setStatusForCategory(KnownCategories.ARTICLES, CategoryStatus.AV
AILABLE); | 372 mSource.setStatusForCategory(KnownCategories.ARTICLES, CategoryStatus.AV
AILABLE); |
374 assertFalse(progress.isVisible()); | 373 assertFalse(progress.isVisible()); |
375 | 374 |
376 mSource.setStatusForCategory(KnownCategories.ARTICLES, CategoryStatus.AV
AILABLE_LOADING); | 375 mSource.setStatusForCategory(KnownCategories.ARTICLES, CategoryStatus.AV
AILABLE_LOADING); |
377 assertTrue(progress.isVisible()); | 376 assertTrue(progress.isVisible()); |
378 | 377 |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
607 public void testCategoryOrder() { | 606 public void testCategoryOrder() { |
608 final int basicGroupCount = 4; // above-the-fold, sign in promo, footer,
spacer. | 607 final int basicGroupCount = 4; // above-the-fold, sign in promo, footer,
spacer. |
609 FakeSuggestionsSource suggestionsSource = new FakeSuggestionsSource(); | 608 FakeSuggestionsSource suggestionsSource = new FakeSuggestionsSource(); |
610 registerCategory(suggestionsSource, KnownCategories.ARTICLES, 0); | 609 registerCategory(suggestionsSource, KnownCategories.ARTICLES, 0); |
611 registerCategory(suggestionsSource, KnownCategories.BOOKMARKS, 0); | 610 registerCategory(suggestionsSource, KnownCategories.BOOKMARKS, 0); |
612 registerCategory(suggestionsSource, KnownCategories.PHYSICAL_WEB_PAGES,
0); | 611 registerCategory(suggestionsSource, KnownCategories.PHYSICAL_WEB_PAGES,
0); |
613 registerCategory(suggestionsSource, KnownCategories.DOWNLOADS, 0); | 612 registerCategory(suggestionsSource, KnownCategories.DOWNLOADS, 0); |
614 | 613 |
615 NewTabPageAdapter ntpAdapter = | 614 NewTabPageAdapter ntpAdapter = |
616 new NewTabPageAdapter(new MockNewTabPageManager(suggestionsSourc
e), null, null); | 615 new NewTabPageAdapter(new MockNewTabPageManager(suggestionsSourc
e), null, null); |
617 List<ItemGroup> groups = ntpAdapter.getGroups(); | 616 List<TreeNode> groups = ntpAdapter.getGroups(); |
618 | 617 |
619 assertEquals(basicGroupCount + 4, groups.size()); | 618 assertEquals(basicGroupCount + 4, groups.size()); |
620 assertEquals(AboveTheFoldItem.class, groups.get(0).getClass()); | 619 assertEquals(AboveTheFoldItem.class, groups.get(0).getClass()); |
621 assertEquals(SuggestionsSection.class, groups.get(1).getClass()); | 620 assertEquals(SuggestionsSection.class, groups.get(1).getClass()); |
622 assertEquals(KnownCategories.ARTICLES, getCategory(groups.get(1))); | 621 assertEquals(KnownCategories.ARTICLES, getCategory(groups.get(1))); |
623 assertEquals(SuggestionsSection.class, groups.get(2).getClass()); | 622 assertEquals(SuggestionsSection.class, groups.get(2).getClass()); |
624 assertEquals(KnownCategories.BOOKMARKS, getCategory(groups.get(2))); | 623 assertEquals(KnownCategories.BOOKMARKS, getCategory(groups.get(2))); |
625 assertEquals(SuggestionsSection.class, groups.get(3).getClass()); | 624 assertEquals(SuggestionsSection.class, groups.get(3).getClass()); |
626 assertEquals(KnownCategories.PHYSICAL_WEB_PAGES, getCategory(groups.get(
3))); | 625 assertEquals(KnownCategories.PHYSICAL_WEB_PAGES, getCategory(groups.get(
3))); |
627 assertEquals(SuggestionsSection.class, groups.get(4).getClass()); | 626 assertEquals(SuggestionsSection.class, groups.get(4).getClass()); |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
753 } | 752 } |
754 | 753 |
755 @Test | 754 @Test |
756 @Feature({"Ntp"}) | 755 @Feature({"Ntp"}) |
757 public void testSigninPromo() { | 756 public void testSigninPromo() { |
758 when(mMockSigninManager.isSignInAllowed()).thenReturn(true); | 757 when(mMockSigninManager.isSignInAllowed()).thenReturn(true); |
759 when(mMockSigninManager.isSignedInOnNative()).thenReturn(false); | 758 when(mMockSigninManager.isSignedInOnNative()).thenReturn(false); |
760 MockNewTabPageManager ntpManager = new MockNewTabPageManager(mSource); | 759 MockNewTabPageManager ntpManager = new MockNewTabPageManager(mSource); |
761 NewTabPageAdapter adapter = new NewTabPageAdapter(ntpManager, null, null
); | 760 NewTabPageAdapter adapter = new NewTabPageAdapter(ntpManager, null, null
); |
762 | 761 |
763 assertEquals(5, adapter.getGroups().size()); | 762 TreeNode signinPromoGroup = adapter.getGroups().get(2); |
764 ItemGroup signinPromoGroup = adapter.getGroup(5); | |
765 | 763 |
766 // Adapter content: | 764 // Adapter content: |
767 // Idx | Item | Group Index | 765 // Idx | Item | Group Index |
768 // ----|--------------------|------------- | 766 // ----|--------------------|------------- |
769 // 0 | Above-the-fold | 0 | 767 // 0 | Above-the-fold | 0 |
770 // 1 | Header | 1 | 768 // 1 | Header | 1 |
771 // 2 | Status | 1 | 769 // 2 | Status | 1 |
772 // 3 | Action | 1 | 770 // 3 | Action | 1 |
773 // 4 | Progress Indicator | 1 | 771 // 4 | Progress Indicator | 1 |
774 // 5 | Sign in promo | 2 | 772 // 5 | Sign in promo | 2 |
775 // 6 | Footer | 3 | 773 // 6 | Footer | 3 |
776 // 7 | Spacer | 4 | 774 // 7 | Spacer | 4 |
777 | 775 |
778 assertEquals(1, signinPromoGroup.getItems().size()); | 776 assertEquals(1, signinPromoGroup.getItemCount()); |
779 assertEquals(NewTabPageItem.VIEW_TYPE_PROMO, signinPromoGroup.getItems()
.get(0).getType()); | 777 assertEquals(ItemViewType.PROMO, signinPromoGroup.getItemViewType(0)); |
780 | 778 |
781 ntpManager.mSignInStateObserver.onSignedIn(); | 779 ntpManager.mSignInStateObserver.onSignedIn(); |
782 assertEquals(0, signinPromoGroup.getItems().size()); | 780 assertEquals(0, signinPromoGroup.getItemCount()); |
783 | 781 |
784 ntpManager.mSignInStateObserver.onSignedOut(); | 782 ntpManager.mSignInStateObserver.onSignedOut(); |
785 assertEquals(1, signinPromoGroup.getItems().size()); | 783 assertEquals(1, signinPromoGroup.getItemCount()); |
786 } | 784 } |
787 | 785 |
788 @Test | 786 @Test |
789 @Feature({"Ntp"}) | 787 @Feature({"Ntp"}) |
790 public void testSigninPromoDismissal() { | 788 public void testSigninPromoDismissal() { |
791 when(mMockSigninManager.isSignInAllowed()).thenReturn(true); | 789 when(mMockSigninManager.isSignInAllowed()).thenReturn(true); |
792 when(mMockSigninManager.isSignedInOnNative()).thenReturn(false); | 790 when(mMockSigninManager.isSignedInOnNative()).thenReturn(false); |
793 ChromePreferenceManager.getInstance(RuntimeEnvironment.application) | 791 ChromePreferenceManager.getInstance(RuntimeEnvironment.application) |
794 .setNewTabPageSigninPromoDismissed(false); | 792 .setNewTabPageSigninPromoDismissed(false); |
795 MockNewTabPageManager ntpManager = new MockNewTabPageManager(mSource); | 793 MockNewTabPageManager ntpManager = new MockNewTabPageManager(mSource); |
796 NewTabPageAdapter adapter = new NewTabPageAdapter(ntpManager, null, null
); | 794 NewTabPageAdapter adapter = new NewTabPageAdapter(ntpManager, null, null
); |
797 final int signInPromoIndex = 5; | 795 final int signInPromoIndex = 5; |
798 | 796 |
799 assertEquals(5, adapter.getGroups().size()); | 797 assertEquals(5, adapter.getGroups().size()); |
800 ItemGroup signinPromoGroup = adapter.getGroup(signInPromoIndex); | 798 TreeNode signinPromoGroup = adapter.getGroups().get(2); |
801 | 799 |
802 // Adapter content: | 800 // Adapter content: |
803 // Idx | Item | 801 // Idx | Item | Group Index |
804 // ----|---------------- | 802 // ----|--------------------|------------- |
805 // 0 | Above-the-fold | 803 // 0 | Above-the-fold | 0 |
806 // 1 | Header | 804 // 1 | Header | 1 |
807 // 2 | Status | 805 // 2 | Status | 1 |
808 // 3 | Action | 806 // 3 | Action | 1 |
809 // 4 | Progress Indicator | 807 // 4 | Progress Indicator | 1 |
810 // 5 | Sign in promo | 808 // 5 | Sign in promo | 2 |
811 // 6 | Footer | 809 // 6 | Footer | 3 |
812 // 7 | Spacer | 810 // 7 | Spacer | 4 |
813 | 811 |
814 assertEquals(NewTabPageItem.VIEW_TYPE_PROMO, signinPromoGroup.getItems()
.get(0).getType()); | 812 assertEquals(ItemViewType.PROMO, signinPromoGroup.getItemViewType(0)); |
815 | 813 |
816 adapter.dismissItem(signInPromoIndex); | 814 adapter.dismissItem(signInPromoIndex); |
817 assertTrue(signinPromoGroup.getItems().isEmpty()); | 815 assertEquals(0, signinPromoGroup.getItemCount()); |
818 assertTrue(ChromePreferenceManager.getInstance(RuntimeEnvironment.applic
ation) | 816 assertTrue(ChromePreferenceManager.getInstance(RuntimeEnvironment.applic
ation) |
819 .getNewTabPageSigninPromoDismissed()); | 817 .getNewTabPageSigninPromoDismissed()); |
820 | 818 |
821 adapter = new NewTabPageAdapter(ntpManager, null, null); | 819 adapter = new NewTabPageAdapter(ntpManager, null, null); |
822 assertEquals(5, adapter.getGroups().size()); | 820 assertEquals(5, adapter.getGroups().size()); |
823 // The items below the signin promo move up, footer is now at the positi
on of the promo. | 821 // The items below the signin promo move up, footer is now at the positi
on of the promo. |
824 assertEquals(NewTabPageItem.VIEW_TYPE_FOOTER, adapter.getItemViewType(si
gnInPromoIndex)); | 822 assertEquals(ItemViewType.FOOTER, adapter.getItemViewType(signInPromoInd
ex)); |
825 } | 823 } |
826 | 824 |
827 /** Registers the category with hasMoreButton=false and showIfEmpty=true*/ | 825 /** Registers the category with hasMoreButton=false and showIfEmpty=true*/ |
828 private void registerCategory(FakeSuggestionsSource suggestionsSource, | 826 private void registerCategory(FakeSuggestionsSource suggestionsSource, |
829 @CategoryInt int category, int suggestionCount) { | 827 @CategoryInt int category, int suggestionCount) { |
830 // FakeSuggestionSource does not provide suggestions if the category's s
tatus is not | 828 // FakeSuggestionSource does not provide suggestions if the category's s
tatus is not |
831 // AVAILABLE. | 829 // AVAILABLE. |
832 suggestionsSource.setStatusForCategory(category, CategoryStatus.AVAILABL
E); | 830 suggestionsSource.setStatusForCategory(category, CategoryStatus.AVAILABL
E); |
833 // Important: showIfEmpty flag to true. | 831 // Important: showIfEmpty flag to true. |
834 suggestionsSource.setInfoForCategory(category, createInfo(category, fals
e, true)); | 832 suggestionsSource.setInfoForCategory(category, createInfo(category, fals
e, true)); |
835 suggestionsSource.setSuggestionsForCategory( | 833 suggestionsSource.setSuggestionsForCategory( |
836 category, createDummySuggestions(suggestionCount)); | 834 category, createDummySuggestions(suggestionCount)); |
837 } | 835 } |
838 | 836 |
839 private int getCategory(ItemGroup itemGroup) { | 837 private int getCategory(TreeNode itemGroup) { |
840 return ((SuggestionsSection) itemGroup).getCategory(); | 838 return ((SuggestionsSection) itemGroup).getCategory(); |
841 } | 839 } |
842 | 840 |
843 private static class MockNewTabPageManager implements NewTabPageManager { | 841 private static class MockNewTabPageManager implements NewTabPageManager { |
844 SuggestionsSource mSuggestionsSource; | 842 SuggestionsSource mSuggestionsSource; |
845 SignInStateObserver mSignInStateObserver; | 843 SignInStateObserver mSignInStateObserver; |
846 | 844 |
847 public MockNewTabPageManager(SuggestionsSource suggestionsSource) { | 845 public MockNewTabPageManager(SuggestionsSource suggestionsSource) { |
848 mSuggestionsSource = suggestionsSource; | 846 mSuggestionsSource = suggestionsSource; |
849 } | 847 } |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1007 public void registerSignInStateObserver(SignInStateObserver signInStateO
bserver) { | 1005 public void registerSignInStateObserver(SignInStateObserver signInStateO
bserver) { |
1008 mSignInStateObserver = signInStateObserver; | 1006 mSignInStateObserver = signInStateObserver; |
1009 } | 1007 } |
1010 | 1008 |
1011 @Override | 1009 @Override |
1012 public boolean isCurrentPage() { | 1010 public boolean isCurrentPage() { |
1013 return true; | 1011 return true; |
1014 } | 1012 } |
1015 } | 1013 } |
1016 } | 1014 } |
OLD | NEW |