OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |