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.test.util.browser.suggestions; | 5 package org.chromium.chrome.test.util.browser.suggestions; |
6 | 6 |
7 import org.chromium.chrome.browser.ntp.cards.ItemViewType; | 7 import org.chromium.chrome.browser.ntp.cards.NodeVisitor; |
8 import org.chromium.chrome.browser.ntp.cards.SuggestionsCategoryInfo; | 8 import org.chromium.chrome.browser.ntp.cards.SuggestionsCategoryInfo; |
9 import org.chromium.chrome.browser.ntp.cards.TreeNode; | 9 import org.chromium.chrome.browser.ntp.cards.TreeNode; |
10 import org.chromium.chrome.browser.ntp.snippets.CategoryInt; | 10 import org.chromium.chrome.browser.ntp.snippets.CategoryInt; |
11 import org.chromium.chrome.browser.ntp.snippets.CategoryStatus; | 11 import org.chromium.chrome.browser.ntp.snippets.CategoryStatus; |
12 import org.chromium.chrome.browser.ntp.snippets.ContentSuggestionsCardLayout; | 12 import org.chromium.chrome.browser.ntp.snippets.ContentSuggestionsCardLayout; |
13 import org.chromium.chrome.browser.ntp.snippets.SnippetArticle; | 13 import org.chromium.chrome.browser.ntp.snippets.SnippetArticle; |
14 import org.chromium.chrome.browser.suggestions.ContentSuggestionsAdditionalActio n; | 14 import org.chromium.chrome.browser.suggestions.ContentSuggestionsAdditionalActio n; |
15 | 15 |
16 import java.util.ArrayList; | 16 import java.util.ArrayList; |
17 import java.util.List; | 17 import java.util.List; |
18 import java.util.Locale; | |
19 | 18 |
20 /** Utilities to make testing content suggestions code easier. */ | 19 /** Utilities to make testing content suggestions code easier. */ |
21 public final class ContentSuggestionsTestUtils { | 20 public final class ContentSuggestionsTestUtils { |
22 private ContentSuggestionsTestUtils() {} | 21 private ContentSuggestionsTestUtils() {} |
23 | 22 |
24 public static List<SnippetArticle> createDummySuggestions( | 23 public static List<SnippetArticle> createDummySuggestions( |
25 int count, @CategoryInt int category, String prefix) { | 24 int count, @CategoryInt int category, String prefix) { |
26 List<SnippetArticle> suggestions = new ArrayList<>(); | 25 List<SnippetArticle> suggestions = new ArrayList<>(); |
27 for (int index = 0; index < count; index++) { | 26 for (int index = 0; index < count; index++) { |
28 suggestions.add(new SnippetArticle(category, "https://site.com/url" + prefix + index, | 27 suggestions.add(new SnippetArticle(category, "https://site.com/url" + prefix + index, |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
63 suggestionsSource.setStatusForCategory( | 62 suggestionsSource.setStatusForCategory( |
64 categoryInfo.getCategory(), CategoryStatus.AVAILABLE); | 63 categoryInfo.getCategory(), CategoryStatus.AVAILABLE); |
65 suggestionsSource.setInfoForCategory(categoryInfo.getCategory(), categor yInfo); | 64 suggestionsSource.setInfoForCategory(categoryInfo.getCategory(), categor yInfo); |
66 | 65 |
67 List<SnippetArticle> suggestions = | 66 List<SnippetArticle> suggestions = |
68 createDummySuggestions(suggestionCount, categoryInfo.getCategory ()); | 67 createDummySuggestions(suggestionCount, categoryInfo.getCategory ()); |
69 suggestionsSource.setSuggestionsForCategory(categoryInfo.getCategory(), suggestions); | 68 suggestionsSource.setSuggestionsForCategory(categoryInfo.getCategory(), suggestions); |
70 return suggestions; | 69 return suggestions; |
71 } | 70 } |
72 | 71 |
73 public static String viewTypeToString(@ItemViewType int viewType) { | |
74 switch (viewType) { | |
75 case ItemViewType.ABOVE_THE_FOLD: | |
76 return "ABOVE_THE_FOLD"; | |
77 case ItemViewType.HEADER: | |
78 return "HEADER"; | |
79 case ItemViewType.SNIPPET: | |
80 return "SNIPPET"; | |
81 case ItemViewType.SPACING: | |
82 return "SPACING"; | |
83 case ItemViewType.STATUS: | |
84 return "STATUS"; | |
85 case ItemViewType.PROGRESS: | |
86 return "PROGRESS"; | |
87 case ItemViewType.ACTION: | |
88 return "ACTION"; | |
89 case ItemViewType.FOOTER: | |
90 return "FOOTER"; | |
91 case ItemViewType.PROMO: | |
92 return "PROMO"; | |
93 case ItemViewType.ALL_DISMISSED: | |
94 return "ALL_DISMISSED"; | |
95 } | |
96 throw new AssertionError(); | |
97 } | |
98 | |
99 /** | 72 /** |
100 * Uses the builder pattern to simplify constructing category info objects f or tests. | 73 * Uses the builder pattern to simplify constructing category info objects f or tests. |
101 */ | 74 */ |
102 public static class CategoryInfoBuilder { | 75 public static class CategoryInfoBuilder { |
103 @CategoryInt | 76 @CategoryInt |
104 private final int mCategory; | 77 private final int mCategory; |
105 private int mAdditionalAction; | 78 private int mAdditionalAction; |
106 private boolean mShowIfEmpty; | 79 private boolean mShowIfEmpty; |
107 private String mTitle = ""; | 80 private String mTitle = ""; |
108 private String mNoSuggestionsMessage = ""; | 81 private String mNoSuggestionsMessage = ""; |
(...skipping 29 matching lines...) Expand all Loading... | |
138 } | 111 } |
139 | 112 |
140 public SuggestionsCategoryInfo build() { | 113 public SuggestionsCategoryInfo build() { |
141 return new SuggestionsCategoryInfo(mCategory, mTitle, mCardLayout, m AdditionalAction, | 114 return new SuggestionsCategoryInfo(mCategory, mTitle, mCardLayout, m AdditionalAction, |
142 mShowIfEmpty, mNoSuggestionsMessage); | 115 mShowIfEmpty, mNoSuggestionsMessage); |
143 } | 116 } |
144 } | 117 } |
145 | 118 |
146 /** Helper method to print the current state of a node. */ | 119 /** Helper method to print the current state of a node. */ |
147 public static String stringify(TreeNode root) { | 120 public static String stringify(TreeNode root) { |
148 return explainFailedExpectation(root, -1, ItemViewType.ALL_DISMISSED); | 121 final StringBuilder stringBuilder = new StringBuilder(); |
149 } | |
150 | 122 |
151 /** | 123 root.visitItems(new NodeVisitor() { |
152 * Helper method to print the current state of a node, highlighting somethin g that went wrong. | 124 private int mPosition; |
153 * @param root node to print information about. | |
154 * @param errorIndex index where an unexpected item was found. | |
155 * @param expectedType item type that was expected at {@code errorIndex}. | |
156 */ | |
157 public static String explainFailedExpectation( | |
158 TreeNode root, int errorIndex, @ItemViewType int expectedType) { | |
159 StringBuilder stringBuilder = new StringBuilder(); | |
160 | 125 |
161 stringBuilder.append("explainFailedExpectation -- START -- \n"); | 126 @Override |
162 for (int i = 0; i < root.getItemCount(); ++i) { | 127 public void visitAboveTheFoldItem() { |
163 if (errorIndex == i) { | 128 describeItem("ABOVE_THE_FOLD"); |
164 addLine(stringBuilder, "%d - %s <= expected: %s", i, | |
165 viewTypeToString(root.getItemViewType(i)), viewTypeToStr ing(expectedType)); | |
166 } else { | |
167 addLine(stringBuilder, "%d - %s", i, viewTypeToString(root.getIt emViewType(i))); | |
168 } | 129 } |
169 } | 130 |
170 if (errorIndex >= root.getItemCount()) { | 131 @Override |
171 addLine(stringBuilder, "<end of list>"); | 132 public void visitActionItem(@ContentSuggestionsAdditionalAction int currentAction) { |
172 addLine(stringBuilder, "%d - <NONE> <= expected: %s", errorIndex, | 133 describeItem("ACTION(%d)", currentAction); |
173 viewTypeToString(expectedType)); | 134 } |
174 } | 135 |
175 addLine(stringBuilder, "explainFailedExpectation -- END --"); | 136 @Override |
137 public void visitAllDismissedItem() { | |
138 describeItem("ALL_DISMISSED"); | |
139 } | |
140 | |
141 @Override | |
142 public void visitFooter() { | |
143 describeItem("FOOTER"); | |
144 } | |
145 | |
146 @Override | |
147 public void visitProgressItem() { | |
148 describeItem("PROGRESS"); | |
149 } | |
150 | |
151 @Override | |
152 public void visitSignInPromo() { | |
153 describeItem("SIGN_IN_PROMO"); | |
154 } | |
155 | |
156 @Override | |
157 public void visitSpacingItem() { | |
158 describeItem("SPACING"); | |
159 } | |
160 | |
161 @Override | |
162 public void visitNoSuggestionsItem() { | |
163 describeItem("NO_SUGGESTIONS"); | |
164 } | |
165 | |
166 @Override | |
167 public void visitSuggestion(SnippetArticle suggestion) { | |
168 describeItem("SUGGESTION(%1.42s)", suggestion.mTitle); | |
169 } | |
170 | |
171 @Override | |
172 public void visitHeader() { | |
173 describeItem("HEADER"); | |
174 } | |
175 | |
176 @Override | |
177 public void visitTileGrid() { | |
178 describeItem("TILE_GRID"); | |
179 } | |
180 | |
181 private void describeItem(String description) { | |
182 stringBuilder.append(String.format("%s - %s%n", mPosition++, des cription)); | |
dgn
2017/05/22 13:47:03
Didn't know about %n, really cool :)
| |
183 } | |
184 | |
185 private void describeItem(String template, Object... args) { | |
186 describeItem(String.format(template, args)); | |
dgn
2017/05/22 13:47:03
Nit: I think using String.format raises a lint war
Bernhard Bauer
2017/05/23 16:40:27
I'm using Locale.US now, because the format string
dgn
2017/05/24 11:30:30
Acknowledged.
| |
187 } | |
188 }); | |
176 return stringBuilder.toString(); | 189 return stringBuilder.toString(); |
177 } | 190 } |
178 | |
179 private static void addLine(StringBuilder stringBuilder, String template, Ob ject... args) { | |
180 stringBuilder.append(String.format(Locale.US, template + "\n", args)); | |
181 } | |
182 } | 191 } |
OLD | NEW |