Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(77)

Side by Side Diff: ui/v2/src/view_unittest.cc

Issue 25757007: V2: Implement reparenting, bounds and visibility change notifications, and write more tests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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 #include "ui/v2/public/view.h" 5 #include "ui/v2/public/view.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "testing/gtest/include/gtest/gtest.h" 8 #include "testing/gtest/include/gtest/gtest.h"
9 9
10 namespace v2 { 10 namespace v2 {
(...skipping 11 matching lines...) Expand all
22 22
23 TEST_F(ViewTest, RemoveChild) { 23 TEST_F(ViewTest, RemoveChild) {
24 View v1; 24 View v1;
25 View* v11 = new View; 25 View* v11 = new View;
26 v1.AddChild(v11); 26 v1.AddChild(v11);
27 EXPECT_EQ(1U, v1.children().size()); 27 EXPECT_EQ(1U, v1.children().size());
28 v1.RemoveChild(v11); 28 v1.RemoveChild(v11);
29 EXPECT_EQ(0U, v1.children().size()); 29 EXPECT_EQ(0U, v1.children().size());
30 } 30 }
31 31
32 TEST_F(ViewTest, Reparent) {
33 View v1;
34 View v2;
35 View* v11 = new View;
36 v1.AddChild(v11);
37 EXPECT_EQ(1U, v1.children().size());
38 v2.AddChild(v11);
39 EXPECT_EQ(1U, v2.children().size());
40 EXPECT_EQ(0U, v1.children().size());
41 }
42
32 TEST_F(ViewTest, Contains) { 43 TEST_F(ViewTest, Contains) {
33 View v1; 44 View v1;
34 45
35 // Direct descendant. 46 // Direct descendant.
36 View* v11 = new View; 47 View* v11 = new View;
37 v1.AddChild(v11); 48 v1.AddChild(v11);
38 EXPECT_TRUE(v1.Contains(v11)); 49 EXPECT_TRUE(v1.Contains(v11));
39 50
40 // Indirect descendant. 51 // Indirect descendant.
41 View* v111 = new View; 52 View* v111 = new View;
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 virtual void OnViewTreeChange(const TreeChangeParams& params) OVERRIDE { 126 virtual void OnViewTreeChange(const TreeChangeParams& params) OVERRIDE {
116 received_params_.push_back(params); 127 received_params_.push_back(params);
117 } 128 }
118 129
119 View* observee_; 130 View* observee_;
120 std::vector<TreeChangeParams> received_params_; 131 std::vector<TreeChangeParams> received_params_;
121 132
122 DISALLOW_COPY_AND_ASSIGN(TreeChangeObserver); 133 DISALLOW_COPY_AND_ASSIGN(TreeChangeObserver);
123 }; 134 };
124 135
136 // Adds/Removes v11 to v1.
125 TEST_F(ViewObserverTest, TreeChange_SimpleAddRemove) { 137 TEST_F(ViewObserverTest, TreeChange_SimpleAddRemove) {
126 View v1; 138 View v1;
127 TreeChangeObserver o1(&v1); 139 TreeChangeObserver o1(&v1);
128 EXPECT_TRUE(o1.received_params().empty()); 140 EXPECT_TRUE(o1.received_params().empty());
129 141
130 View v11; 142 View v11;
131 v11.set_owned_by_parent(false); 143 v11.set_owned_by_parent(false);
132 TreeChangeObserver o11(&v11); 144 TreeChangeObserver o11(&v11);
133 EXPECT_TRUE(o11.received_params().empty()); 145 EXPECT_TRUE(o11.received_params().empty());
134 146
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
171 EXPECT_TRUE(TreeChangeParamsMatch(p1, o1.received_params().back())); 183 EXPECT_TRUE(TreeChangeParamsMatch(p1, o1.received_params().back()));
172 184
173 EXPECT_EQ(2U, o11.received_params().size()); 185 EXPECT_EQ(2U, o11.received_params().size());
174 p11 = p1; 186 p11 = p1;
175 p11.receiver = &v11; 187 p11.receiver = &v11;
176 EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().front())); 188 EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().front()));
177 p11.phase = ViewObserver::DISPOSITION_CHANGED; 189 p11.phase = ViewObserver::DISPOSITION_CHANGED;
178 EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().back())); 190 EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().back()));
179 } 191 }
180 192
193 // Creates these two trees:
194 // v1
195 // +- v11
196 // v111
197 // +- v1111
198 // +- v1112
199 // Then adds/removes v111 from v11.
181 TEST_F(ViewObserverTest, TreeChange_NestedAddRemove) { 200 TEST_F(ViewObserverTest, TreeChange_NestedAddRemove) {
182 View v1, v11, v111, v1111, v1112; 201 View v1, v11, v111, v1111, v1112;
183 202
184 // Root tree. 203 // Root tree.
185 v11.set_owned_by_parent(false); 204 v11.set_owned_by_parent(false);
186 v1.AddChild(&v11); 205 v1.AddChild(&v11);
187 206
188 // Tree to be attached. 207 // Tree to be attached.
189 v111.set_owned_by_parent(false); 208 v111.set_owned_by_parent(false);
190 v1111.set_owned_by_parent(false); 209 v1111.set_owned_by_parent(false);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 250
232 EXPECT_EQ(2U, o1112.received_params().size()); 251 EXPECT_EQ(2U, o1112.received_params().size());
233 p1112 = p111; 252 p1112 = p111;
234 p1112.receiver = &v1112; 253 p1112.receiver = &v1112;
235 p1112.phase = ViewObserver::DISPOSITION_CHANGING; 254 p1112.phase = ViewObserver::DISPOSITION_CHANGING;
236 EXPECT_TRUE(TreeChangeParamsMatch(p1112, o1112.received_params().front())); 255 EXPECT_TRUE(TreeChangeParamsMatch(p1112, o1112.received_params().front()));
237 p1112.phase = ViewObserver::DISPOSITION_CHANGED; 256 p1112.phase = ViewObserver::DISPOSITION_CHANGED;
238 EXPECT_TRUE(TreeChangeParamsMatch(p1112, o1112.received_params().back())); 257 EXPECT_TRUE(TreeChangeParamsMatch(p1112, o1112.received_params().back()));
239 258
240 // Remove. 259 // Remove.
260 o1.Reset();
261 o11.Reset();
262 o111.Reset();
263 o1111.Reset();
264 o1112.Reset();
265 EXPECT_TRUE(o1.received_params().empty());
266 EXPECT_TRUE(o11.received_params().empty());
267 EXPECT_TRUE(o111.received_params().empty());
268 EXPECT_TRUE(o1111.received_params().empty());
269 EXPECT_TRUE(o1112.received_params().empty());
270
271 v11.RemoveChild(&v111);
272
273 EXPECT_EQ(1U, o1.received_params().size());
274 p1.target = &v111;
275 p1.receiver = &v1;
276 p1.old_parent = &v11;
277 p1.new_parent = NULL;
278 p1.phase = ViewObserver::DISPOSITION_CHANGING;
279 EXPECT_TRUE(TreeChangeParamsMatch(p1, o1.received_params().back()));
280
281 EXPECT_EQ(1U, o11.received_params().size());
282 p11 = p1;
283 p11.receiver = &v11;
284 EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().back()));
285
286 EXPECT_EQ(2U, o111.received_params().size());
287 p111 = p11;
288 p111.receiver = &v111;
289 p111.phase = ViewObserver::DISPOSITION_CHANGING;
290 EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().front()));
291 p111.phase = ViewObserver::DISPOSITION_CHANGED;
292 EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().back()));
293
294 EXPECT_EQ(2U, o1111.received_params().size());
295 p1111 = p111;
296 p1111.receiver = &v1111;
297 p1111.phase = ViewObserver::DISPOSITION_CHANGING;
298 EXPECT_TRUE(TreeChangeParamsMatch(p1111, o1111.received_params().front()));
299 p1111.phase = ViewObserver::DISPOSITION_CHANGED;
300 EXPECT_TRUE(TreeChangeParamsMatch(p1111, o1111.received_params().back()));
301
302 EXPECT_EQ(2U, o1112.received_params().size());
303 p1112 = p111;
304 p1112.receiver = &v1112;
305 p1112.phase = ViewObserver::DISPOSITION_CHANGING;
306 EXPECT_TRUE(TreeChangeParamsMatch(p1112, o1112.received_params().front()));
307 p1112.phase = ViewObserver::DISPOSITION_CHANGED;
308 EXPECT_TRUE(TreeChangeParamsMatch(p1112, o1112.received_params().back()));
309 }
310
311 TEST_F(ViewObserverTest, TreeChange_Reparent) {
312 View v1, v11, v12, v111;
313 v11.set_owned_by_parent(false);
314 v111.set_owned_by_parent(false);
315 v12.set_owned_by_parent(false);
316 v1.AddChild(&v11);
317 v1.AddChild(&v12);
318 v11.AddChild(&v111);
319
320 TreeChangeObserver o1(&v1), o11(&v11), o12(&v12), o111(&v111);
321
322 // Reparent.
323 v12.AddChild(&v111);
324
325 // v1 (root) should see both changing and changed notifications.
326 EXPECT_EQ(2U, o1.received_params().size());
327 ViewObserver::TreeChangeParams p1;
328 p1.target = &v111;
329 p1.receiver = &v1;
330 p1.old_parent = &v11;
331 p1.new_parent = &v12;
332 p1.phase = ViewObserver::DISPOSITION_CHANGING;
333 EXPECT_TRUE(TreeChangeParamsMatch(p1, o1.received_params().front()));
334 p1.phase = ViewObserver::DISPOSITION_CHANGED;
335 EXPECT_TRUE(TreeChangeParamsMatch(p1, o1.received_params().back()));
336
337 // v11 should see changing notifications.
338 EXPECT_EQ(1U, o11.received_params().size());
339 ViewObserver::TreeChangeParams p11;
340 p11 = p1;
341 p11.receiver = &v11;
342 p11.phase = ViewObserver::DISPOSITION_CHANGING;
343 EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().back()));
344
345 // v12 should see changed notifications.
346 EXPECT_EQ(1U, o12.received_params().size());
347 ViewObserver::TreeChangeParams p12;
348 p12 = p1;
349 p12.receiver = &v12;
350 p12.phase = ViewObserver::DISPOSITION_CHANGED;
351 EXPECT_TRUE(TreeChangeParamsMatch(p12, o12.received_params().back()));
352
353 // v111 should see both changing and changed notifications.
354 EXPECT_EQ(2U, o111.received_params().size());
355 ViewObserver::TreeChangeParams p111;
356 p111 = p1;
357 p111.receiver = &v111;
358 p111.phase = ViewObserver::DISPOSITION_CHANGING;
359 EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().front()));
360 p111.phase = ViewObserver::DISPOSITION_CHANGED;
361 EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().back()));
362 }
363
364 class VisibilityObserver : public ViewObserver {
365 public:
366 typedef std::pair<ViewObserver::DispositionChangePhase, bool> LogEntry;
367 typedef std::vector<LogEntry> LogEntries;
368
369 VisibilityObserver(View* view) : view_(view) {
370 view_->AddObserver(this);
371 }
372 virtual ~VisibilityObserver() {
373 view_->RemoveObserver(this);
374 }
375
376 const LogEntries& log_entries() const { return log_entries_; }
377
378 private:
379 // Overridden from ViewObserver:
380 virtual void OnViewVisibilityChange(
381 View* view,
382 ViewObserver::DispositionChangePhase phase) OVERRIDE {
383 DCHECK_EQ(view_, view);
384 log_entries_.push_back(std::make_pair(phase, view->visible()));
385 }
386
387 View* view_;
388 LogEntries log_entries_;
389
390 DISALLOW_COPY_AND_ASSIGN(VisibilityObserver);
391 };
392
393 TEST_F(ViewObserverTest, VisibilityChange) {
394 View v1; // Starts out visible.
395
396 VisibilityObserver o1(&v1);
397
398 v1.SetVisible(false);
399
400 EXPECT_EQ(2U, o1.log_entries().size());
401 EXPECT_EQ(ViewObserver::DISPOSITION_CHANGING, o1.log_entries().front().first);
402 EXPECT_EQ(o1.log_entries().front().second, true);
403 EXPECT_EQ(ViewObserver::DISPOSITION_CHANGED, o1.log_entries().back().first);
404 EXPECT_EQ(o1.log_entries().back().second, false);
405 }
406
407 class BoundsObserver : public ViewObserver {
408 public:
409 typedef std::pair<gfx::Rect, gfx::Rect> BoundsChange;
410 typedef std::vector<BoundsChange> BoundsChanges;
411
412 explicit BoundsObserver(View* view) : view_(view) {
413 view_->AddObserver(this);
414 }
415 virtual ~BoundsObserver() {
416 view_->RemoveObserver(this);
417 }
418
419 const BoundsChanges& bounds_changes() const { return bounds_changes_; }
420
421 private:
422 virtual void OnViewBoundsChanged(View* view,
423 const gfx::Rect& old_bounds,
424 const gfx::Rect& new_bounds) OVERRIDE {
425 DCHECK_EQ(view_, view);
426 bounds_changes_.push_back(std::make_pair(old_bounds, new_bounds));
427 }
428
429 View* view_;
430 BoundsChanges bounds_changes_;
431
432 DISALLOW_COPY_AND_ASSIGN(BoundsObserver);
433 };
434
435 TEST_F(ViewObserverTest, BoundsChanged) {
436 View v1;
437 BoundsObserver o1(&v1);
438
439 gfx::Rect new_bounds(0, 0, 10, 10);
440
441 v1.SetBounds(new_bounds);
442 EXPECT_EQ(1U, o1.bounds_changes().size());
443 EXPECT_EQ(gfx::Rect(), o1.bounds_changes().front().first);
444 EXPECT_EQ(new_bounds, o1.bounds_changes().front().second);
241 } 445 }
242 446
243 } // namespace v2 447 } // namespace v2
OLDNEW
« ui/v2/src/view_private.h ('K') | « ui/v2/src/view_private.cc ('k') | ui/v2/v2.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698