Include all dupe types (event when value is zero) in scan stats.
[chromium-blink-merge.git] / components / view_manager / test_change_tracker.cc
blob0b607b2ca5bd37a21588fd2df885e1c1f65a0567
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "components/view_manager/test_change_tracker.h"
7 #include "base/strings/string_util.h"
8 #include "base/strings/stringprintf.h"
9 #include "components/view_manager/public/cpp/util.h"
10 #include "mojo/common/common_type_converters.h"
12 using mojo::Array;
13 using mojo::Id;
14 using mojo::ViewDataPtr;
15 using mojo::String;
17 namespace view_manager {
19 std::string ViewIdToString(Id id) {
20 return (id == 0) ? "null" : base::StringPrintf("%d,%d", mojo::HiWord(id),
21 mojo::LoWord(id));
24 namespace {
26 std::string RectToString(const mojo::Rect& rect) {
27 return base::StringPrintf("%d,%d %dx%d", rect.x, rect.y, rect.width,
28 rect.height);
31 std::string DirectionToString(mojo::OrderDirection direction) {
32 return direction == mojo::ORDER_DIRECTION_ABOVE ? "above" : "below";
35 std::string ChangeToDescription1(const Change& change) {
36 switch (change.type) {
37 case CHANGE_TYPE_EMBED:
38 return base::StringPrintf("OnEmbed creator=%s",
39 change.creator_url.data());
41 case CHANGE_TYPE_EMBEDDED_APP_DISCONNECTED:
42 return base::StringPrintf("OnEmbeddedAppDisconnected view=%s",
43 ViewIdToString(change.view_id).c_str());
45 case CHANGE_TYPE_WILL_EMBED:
46 return base::StringPrintf("OnWillEmbed view=%s",
47 ViewIdToString(change.view_id).c_str());
49 case CHANGE_TYPE_NODE_BOUNDS_CHANGED:
50 return base::StringPrintf(
51 "BoundsChanged view=%s old_bounds=%s new_bounds=%s",
52 ViewIdToString(change.view_id).c_str(),
53 RectToString(change.bounds).c_str(),
54 RectToString(change.bounds2).c_str());
56 case CHANGE_TYPE_NODE_VIEWPORT_METRICS_CHANGED:
57 // TODO(sky): Not implemented.
58 return "ViewportMetricsChanged";
60 case CHANGE_TYPE_NODE_HIERARCHY_CHANGED:
61 return base::StringPrintf(
62 "HierarchyChanged view=%s new_parent=%s old_parent=%s",
63 ViewIdToString(change.view_id).c_str(),
64 ViewIdToString(change.view_id2).c_str(),
65 ViewIdToString(change.view_id3).c_str());
67 case CHANGE_TYPE_NODE_REORDERED:
68 return base::StringPrintf("Reordered view=%s relative=%s direction=%s",
69 ViewIdToString(change.view_id).c_str(),
70 ViewIdToString(change.view_id2).c_str(),
71 DirectionToString(change.direction).c_str());
73 case CHANGE_TYPE_NODE_DELETED:
74 return base::StringPrintf("ViewDeleted view=%s",
75 ViewIdToString(change.view_id).c_str());
77 case CHANGE_TYPE_NODE_VISIBILITY_CHANGED:
78 return base::StringPrintf("VisibilityChanged view=%s visible=%s",
79 ViewIdToString(change.view_id).c_str(),
80 change.bool_value ? "true" : "false");
82 case CHANGE_TYPE_NODE_DRAWN_STATE_CHANGED:
83 return base::StringPrintf("DrawnStateChanged view=%s drawn=%s",
84 ViewIdToString(change.view_id).c_str(),
85 change.bool_value ? "true" : "false");
87 case CHANGE_TYPE_INPUT_EVENT:
88 return base::StringPrintf("InputEvent view=%s event_action=%d",
89 ViewIdToString(change.view_id).c_str(),
90 change.event_action);
92 case CHANGE_TYPE_PROPERTY_CHANGED:
93 return base::StringPrintf("PropertyChanged view=%s key=%s value=%s",
94 ViewIdToString(change.view_id).c_str(),
95 change.property_key.c_str(),
96 change.property_value.c_str());
98 case CHANGE_TYPE_DELEGATE_EMBED:
99 return base::StringPrintf("DelegateEmbed url=%s",
100 change.embed_url.data());
102 case CHANGE_TYPE_FOCUSED:
103 return base::StringPrintf("Focused id=%s",
104 ViewIdToString(change.view_id).c_str());
106 return std::string();
109 } // namespace
111 std::vector<std::string> ChangesToDescription1(
112 const std::vector<Change>& changes) {
113 std::vector<std::string> strings(changes.size());
114 for (size_t i = 0; i < changes.size(); ++i)
115 strings[i] = ChangeToDescription1(changes[i]);
116 return strings;
119 std::string SingleChangeToDescription(const std::vector<Change>& changes) {
120 if (changes.size() != 1u)
121 return std::string();
122 return ChangeToDescription1(changes[0]);
125 std::string SingleViewDescription(const std::vector<TestView>& views) {
126 if (views.size() != 1u)
127 return "more than one changes and expected only one";
128 return views[0].ToString();
131 std::string ChangeViewDescription(const std::vector<Change>& changes) {
132 if (changes.size() != 1)
133 return std::string();
134 std::vector<std::string> view_strings(changes[0].views.size());
135 for (size_t i = 0; i < changes[0].views.size(); ++i)
136 view_strings[i] = "[" + changes[0].views[i].ToString() + "]";
137 return JoinString(view_strings, ',');
140 TestView ViewDataToTestView(const ViewDataPtr& data) {
141 TestView view;
142 view.parent_id = data->parent_id;
143 view.view_id = data->view_id;
144 view.visible = data->visible;
145 view.drawn = data->drawn;
146 view.properties =
147 data->properties.To<std::map<std::string, std::vector<uint8_t>>>();
148 return view;
151 void ViewDatasToTestViews(const Array<ViewDataPtr>& data,
152 std::vector<TestView>* test_views) {
153 for (size_t i = 0; i < data.size(); ++i)
154 test_views->push_back(ViewDataToTestView(data[i]));
157 Change::Change()
158 : type(CHANGE_TYPE_EMBED),
159 connection_id(0),
160 view_id(0),
161 view_id2(0),
162 view_id3(0),
163 event_action(0),
164 direction(mojo::ORDER_DIRECTION_ABOVE),
165 bool_value(false) {
168 Change::~Change() {
171 TestChangeTracker::TestChangeTracker()
172 : delegate_(NULL) {
175 TestChangeTracker::~TestChangeTracker() {
178 void TestChangeTracker::OnEmbed(mojo::ConnectionSpecificId connection_id,
179 const String& creator_url,
180 ViewDataPtr root) {
181 Change change;
182 change.type = CHANGE_TYPE_EMBED;
183 change.connection_id = connection_id;
184 change.creator_url = creator_url;
185 change.views.push_back(ViewDataToTestView(root));
186 AddChange(change);
189 void TestChangeTracker::OnWillEmbed(mojo::Id view_id) {
190 Change change;
191 change.type = CHANGE_TYPE_WILL_EMBED;
192 change.view_id = view_id;
193 AddChange(change);
196 void TestChangeTracker::OnEmbeddedAppDisconnected(Id view_id) {
197 Change change;
198 change.type = CHANGE_TYPE_EMBEDDED_APP_DISCONNECTED;
199 change.view_id = view_id;
200 AddChange(change);
203 void TestChangeTracker::OnViewBoundsChanged(Id view_id,
204 mojo::RectPtr old_bounds,
205 mojo::RectPtr new_bounds) {
206 Change change;
207 change.type = CHANGE_TYPE_NODE_BOUNDS_CHANGED;
208 change.view_id = view_id;
209 change.bounds.x = old_bounds->x;
210 change.bounds.y = old_bounds->y;
211 change.bounds.width = old_bounds->width;
212 change.bounds.height = old_bounds->height;
213 change.bounds2.x = new_bounds->x;
214 change.bounds2.y = new_bounds->y;
215 change.bounds2.width = new_bounds->width;
216 change.bounds2.height = new_bounds->height;
217 AddChange(change);
220 void TestChangeTracker::OnViewViewportMetricsChanged(
221 mojo::ViewportMetricsPtr old_metrics,
222 mojo::ViewportMetricsPtr new_metrics) {
223 Change change;
224 change.type = CHANGE_TYPE_NODE_VIEWPORT_METRICS_CHANGED;
225 // NOT IMPLEMENTED
226 AddChange(change);
229 void TestChangeTracker::OnViewHierarchyChanged(Id view_id,
230 Id new_parent_id,
231 Id old_parent_id,
232 Array<ViewDataPtr> views) {
233 Change change;
234 change.type = CHANGE_TYPE_NODE_HIERARCHY_CHANGED;
235 change.view_id = view_id;
236 change.view_id2 = new_parent_id;
237 change.view_id3 = old_parent_id;
238 ViewDatasToTestViews(views, &change.views);
239 AddChange(change);
242 void TestChangeTracker::OnViewReordered(Id view_id,
243 Id relative_view_id,
244 mojo::OrderDirection direction) {
245 Change change;
246 change.type = CHANGE_TYPE_NODE_REORDERED;
247 change.view_id = view_id;
248 change.view_id2 = relative_view_id;
249 change.direction = direction;
250 AddChange(change);
253 void TestChangeTracker::OnViewDeleted(Id view_id) {
254 Change change;
255 change.type = CHANGE_TYPE_NODE_DELETED;
256 change.view_id = view_id;
257 AddChange(change);
260 void TestChangeTracker::OnViewVisibilityChanged(Id view_id, bool visible) {
261 Change change;
262 change.type = CHANGE_TYPE_NODE_VISIBILITY_CHANGED;
263 change.view_id = view_id;
264 change.bool_value = visible;
265 AddChange(change);
268 void TestChangeTracker::OnViewDrawnStateChanged(Id view_id, bool drawn) {
269 Change change;
270 change.type = CHANGE_TYPE_NODE_DRAWN_STATE_CHANGED;
271 change.view_id = view_id;
272 change.bool_value = drawn;
273 AddChange(change);
276 void TestChangeTracker::OnViewInputEvent(Id view_id, mojo::EventPtr event) {
277 Change change;
278 change.type = CHANGE_TYPE_INPUT_EVENT;
279 change.view_id = view_id;
280 change.event_action = event->action;
281 AddChange(change);
284 void TestChangeTracker::OnViewSharedPropertyChanged(Id view_id,
285 String name,
286 Array<uint8_t> data) {
287 Change change;
288 change.type = CHANGE_TYPE_PROPERTY_CHANGED;
289 change.view_id = view_id;
290 change.property_key = name;
291 if (data.is_null())
292 change.property_value = "NULL";
293 else
294 change.property_value = data.To<std::string>();
295 AddChange(change);
298 void TestChangeTracker::OnViewFocused(mojo::Id view_id) {
299 Change change;
300 change.type = CHANGE_TYPE_FOCUSED;
301 change.view_id = view_id;
302 AddChange(change);
305 void TestChangeTracker::DelegateEmbed(const String& url) {
306 Change change;
307 change.type = CHANGE_TYPE_DELEGATE_EMBED;
308 change.embed_url = url;
309 AddChange(change);
312 void TestChangeTracker::AddChange(const Change& change) {
313 changes_.push_back(change);
314 if (delegate_)
315 delegate_->OnChangeAdded();
318 TestView::TestView() {}
320 TestView::~TestView() {}
322 std::string TestView::ToString() const {
323 return base::StringPrintf("view=%s parent=%s",
324 ViewIdToString(view_id).c_str(),
325 ViewIdToString(parent_id).c_str());
328 std::string TestView::ToString2() const {
329 return base::StringPrintf("view=%s parent=%s visible=%s drawn=%s",
330 ViewIdToString(view_id).c_str(),
331 ViewIdToString(parent_id).c_str(),
332 visible ? "true" : "false",
333 drawn ? "true" : "false");
336 } // namespace view_manager