| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "base/observer_list.h" | 5 #include "base/observer_list.h" |
| 6 #include "base/observer_list_threadsafe.h" | 6 #include "base/observer_list_threadsafe.h" |
| 7 | 7 |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 ObserverList<Foo> observer_list; | 194 ObserverList<Foo> observer_list; |
| 195 Adder a(1), b(-1), c(1), d(-1), e(-1); | 195 Adder a(1), b(-1), c(1), d(-1), e(-1); |
| 196 Disrupter evil(&observer_list, &c); | 196 Disrupter evil(&observer_list, &c); |
| 197 | 197 |
| 198 observer_list.AddObserver(&a); | 198 observer_list.AddObserver(&a); |
| 199 observer_list.AddObserver(&b); | 199 observer_list.AddObserver(&b); |
| 200 | 200 |
| 201 EXPECT_TRUE(observer_list.HasObserver(&a)); | 201 EXPECT_TRUE(observer_list.HasObserver(&a)); |
| 202 EXPECT_FALSE(observer_list.HasObserver(&c)); | 202 EXPECT_FALSE(observer_list.HasObserver(&c)); |
| 203 | 203 |
| 204 FOR_EACH_OBSERVER(Foo, observer_list, Observe(10)); | 204 for (auto& observer : observer_list) |
| 205 observer.Observe(10); |
| 205 | 206 |
| 206 observer_list.AddObserver(&evil); | 207 observer_list.AddObserver(&evil); |
| 207 observer_list.AddObserver(&c); | 208 observer_list.AddObserver(&c); |
| 208 observer_list.AddObserver(&d); | 209 observer_list.AddObserver(&d); |
| 209 | 210 |
| 210 // Removing an observer not in the list should do nothing. | 211 // Removing an observer not in the list should do nothing. |
| 211 observer_list.RemoveObserver(&e); | 212 observer_list.RemoveObserver(&e); |
| 212 | 213 |
| 213 FOR_EACH_OBSERVER(Foo, observer_list, Observe(10)); | 214 for (auto& observer : observer_list) |
| 215 observer.Observe(10); |
| 214 | 216 |
| 215 EXPECT_EQ(20, a.total); | 217 EXPECT_EQ(20, a.total); |
| 216 EXPECT_EQ(-20, b.total); | 218 EXPECT_EQ(-20, b.total); |
| 217 EXPECT_EQ(0, c.total); | 219 EXPECT_EQ(0, c.total); |
| 218 EXPECT_EQ(-10, d.total); | 220 EXPECT_EQ(-10, d.total); |
| 219 EXPECT_EQ(0, e.total); | 221 EXPECT_EQ(0, e.total); |
| 220 } | 222 } |
| 221 | 223 |
| 222 TEST(ObserverListTest, DisruptSelf) { | 224 TEST(ObserverListTest, DisruptSelf) { |
| 223 ObserverList<Foo> observer_list; | 225 ObserverList<Foo> observer_list; |
| 224 Adder a(1), b(-1), c(1), d(-1); | 226 Adder a(1), b(-1), c(1), d(-1); |
| 225 Disrupter evil(&observer_list, true); | 227 Disrupter evil(&observer_list, true); |
| 226 | 228 |
| 227 observer_list.AddObserver(&a); | 229 observer_list.AddObserver(&a); |
| 228 observer_list.AddObserver(&b); | 230 observer_list.AddObserver(&b); |
| 229 | 231 |
| 230 FOR_EACH_OBSERVER(Foo, observer_list, Observe(10)); | 232 for (auto& observer : observer_list) |
| 233 observer.Observe(10); |
| 231 | 234 |
| 232 observer_list.AddObserver(&evil); | 235 observer_list.AddObserver(&evil); |
| 233 observer_list.AddObserver(&c); | 236 observer_list.AddObserver(&c); |
| 234 observer_list.AddObserver(&d); | 237 observer_list.AddObserver(&d); |
| 235 | 238 |
| 236 FOR_EACH_OBSERVER(Foo, observer_list, Observe(10)); | 239 for (auto& observer : observer_list) |
| 240 observer.Observe(10); |
| 237 | 241 |
| 238 EXPECT_EQ(20, a.total); | 242 EXPECT_EQ(20, a.total); |
| 239 EXPECT_EQ(-20, b.total); | 243 EXPECT_EQ(-20, b.total); |
| 240 EXPECT_EQ(10, c.total); | 244 EXPECT_EQ(10, c.total); |
| 241 EXPECT_EQ(-10, d.total); | 245 EXPECT_EQ(-10, d.total); |
| 242 } | 246 } |
| 243 | 247 |
| 244 TEST(ObserverListTest, DisruptBefore) { | 248 TEST(ObserverListTest, DisruptBefore) { |
| 245 ObserverList<Foo> observer_list; | 249 ObserverList<Foo> observer_list; |
| 246 Adder a(1), b(-1), c(1), d(-1); | 250 Adder a(1), b(-1), c(1), d(-1); |
| 247 Disrupter evil(&observer_list, &b); | 251 Disrupter evil(&observer_list, &b); |
| 248 | 252 |
| 249 observer_list.AddObserver(&a); | 253 observer_list.AddObserver(&a); |
| 250 observer_list.AddObserver(&b); | 254 observer_list.AddObserver(&b); |
| 251 observer_list.AddObserver(&evil); | 255 observer_list.AddObserver(&evil); |
| 252 observer_list.AddObserver(&c); | 256 observer_list.AddObserver(&c); |
| 253 observer_list.AddObserver(&d); | 257 observer_list.AddObserver(&d); |
| 254 | 258 |
| 255 FOR_EACH_OBSERVER(Foo, observer_list, Observe(10)); | 259 for (auto& observer : observer_list) |
| 256 FOR_EACH_OBSERVER(Foo, observer_list, Observe(10)); | 260 observer.Observe(10); |
| 261 for (auto& observer : observer_list) |
| 262 observer.Observe(10); |
| 257 | 263 |
| 258 EXPECT_EQ(20, a.total); | 264 EXPECT_EQ(20, a.total); |
| 259 EXPECT_EQ(-10, b.total); | 265 EXPECT_EQ(-10, b.total); |
| 260 EXPECT_EQ(20, c.total); | 266 EXPECT_EQ(20, c.total); |
| 261 EXPECT_EQ(-20, d.total); | 267 EXPECT_EQ(-20, d.total); |
| 262 } | 268 } |
| 263 | 269 |
| 264 TEST(ObserverListThreadSafeTest, BasicTest) { | 270 TEST(ObserverListThreadSafeTest, BasicTest) { |
| 265 MessageLoop loop; | 271 MessageLoop loop; |
| 266 | 272 |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 488 TEST(ObserverListTest, Existing) { | 494 TEST(ObserverListTest, Existing) { |
| 489 ObserverList<Foo> observer_list(ObserverList<Foo>::NOTIFY_EXISTING_ONLY); | 495 ObserverList<Foo> observer_list(ObserverList<Foo>::NOTIFY_EXISTING_ONLY); |
| 490 Adder a(1); | 496 Adder a(1); |
| 491 AddInObserve<ObserverList<Foo> > b(&observer_list); | 497 AddInObserve<ObserverList<Foo> > b(&observer_list); |
| 492 Adder c(1); | 498 Adder c(1); |
| 493 b.SetToAdd(&c); | 499 b.SetToAdd(&c); |
| 494 | 500 |
| 495 observer_list.AddObserver(&a); | 501 observer_list.AddObserver(&a); |
| 496 observer_list.AddObserver(&b); | 502 observer_list.AddObserver(&b); |
| 497 | 503 |
| 498 FOR_EACH_OBSERVER(Foo, observer_list, Observe(1)); | 504 for (auto& observer : observer_list) |
| 505 observer.Observe(1); |
| 499 | 506 |
| 500 EXPECT_FALSE(b.to_add_); | 507 EXPECT_FALSE(b.to_add_); |
| 501 // B's adder should not have been notified because it was added during | 508 // B's adder should not have been notified because it was added during |
| 502 // notification. | 509 // notification. |
| 503 EXPECT_EQ(0, c.total); | 510 EXPECT_EQ(0, c.total); |
| 504 | 511 |
| 505 // Notify again to make sure b's adder is notified. | 512 // Notify again to make sure b's adder is notified. |
| 506 FOR_EACH_OBSERVER(Foo, observer_list, Observe(1)); | 513 for (auto& observer : observer_list) |
| 514 observer.Observe(1); |
| 507 EXPECT_EQ(1, c.total); | 515 EXPECT_EQ(1, c.total); |
| 508 } | 516 } |
| 509 | 517 |
| 510 // Same as above, but for ObserverListThreadSafe | 518 // Same as above, but for ObserverListThreadSafe |
| 511 TEST(ObserverListThreadSafeTest, Existing) { | 519 TEST(ObserverListThreadSafeTest, Existing) { |
| 512 MessageLoop loop; | 520 MessageLoop loop; |
| 513 scoped_refptr<ObserverListThreadSafe<Foo> > observer_list( | 521 scoped_refptr<ObserverListThreadSafe<Foo> > observer_list( |
| 514 new ObserverListThreadSafe<Foo>(ObserverList<Foo>::NOTIFY_EXISTING_ONLY)); | 522 new ObserverListThreadSafe<Foo>(ObserverList<Foo>::NOTIFY_EXISTING_ONLY)); |
| 515 Adder a(1); | 523 Adder a(1); |
| 516 AddInObserve<ObserverListThreadSafe<Foo> > b(observer_list.get()); | 524 AddInObserve<ObserverListThreadSafe<Foo> > b(observer_list.get()); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 554 bool added_; | 562 bool added_; |
| 555 Adder adder_; | 563 Adder adder_; |
| 556 }; | 564 }; |
| 557 | 565 |
| 558 TEST(ObserverListTest, ClearNotifyAll) { | 566 TEST(ObserverListTest, ClearNotifyAll) { |
| 559 ObserverList<Foo> observer_list; | 567 ObserverList<Foo> observer_list; |
| 560 AddInClearObserve a(&observer_list); | 568 AddInClearObserve a(&observer_list); |
| 561 | 569 |
| 562 observer_list.AddObserver(&a); | 570 observer_list.AddObserver(&a); |
| 563 | 571 |
| 564 FOR_EACH_OBSERVER(Foo, observer_list, Observe(1)); | 572 for (auto& observer : observer_list) |
| 573 observer.Observe(1); |
| 565 EXPECT_TRUE(a.added()); | 574 EXPECT_TRUE(a.added()); |
| 566 EXPECT_EQ(1, a.adder().total) | 575 EXPECT_EQ(1, a.adder().total) |
| 567 << "Adder should observe once and have sum of 1."; | 576 << "Adder should observe once and have sum of 1."; |
| 568 } | 577 } |
| 569 | 578 |
| 570 TEST(ObserverListTest, ClearNotifyExistingOnly) { | 579 TEST(ObserverListTest, ClearNotifyExistingOnly) { |
| 571 ObserverList<Foo> observer_list(ObserverList<Foo>::NOTIFY_EXISTING_ONLY); | 580 ObserverList<Foo> observer_list(ObserverList<Foo>::NOTIFY_EXISTING_ONLY); |
| 572 AddInClearObserve a(&observer_list); | 581 AddInClearObserve a(&observer_list); |
| 573 | 582 |
| 574 observer_list.AddObserver(&a); | 583 observer_list.AddObserver(&a); |
| 575 | 584 |
| 576 FOR_EACH_OBSERVER(Foo, observer_list, Observe(1)); | 585 for (auto& observer : observer_list) |
| 586 observer.Observe(1); |
| 577 EXPECT_TRUE(a.added()); | 587 EXPECT_TRUE(a.added()); |
| 578 EXPECT_EQ(0, a.adder().total) | 588 EXPECT_EQ(0, a.adder().total) |
| 579 << "Adder should not observe, so sum should still be 0."; | 589 << "Adder should not observe, so sum should still be 0."; |
| 580 } | 590 } |
| 581 | 591 |
| 582 class ListDestructor : public Foo { | 592 class ListDestructor : public Foo { |
| 583 public: | 593 public: |
| 584 explicit ListDestructor(ObserverList<Foo>* list) : list_(list) {} | 594 explicit ListDestructor(ObserverList<Foo>* list) : list_(list) {} |
| 585 ~ListDestructor() override {} | 595 ~ListDestructor() override {} |
| 586 | 596 |
| (...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 915 // However, the first Observe() call will add a second observer: at this | 925 // However, the first Observe() call will add a second observer: at this |
| 916 // point, it != observer_list.end() should be true, and Observe() should be | 926 // point, it != observer_list.end() should be true, and Observe() should be |
| 917 // called on the newly added observer on the next iteration of the loop. | 927 // called on the newly added observer on the next iteration of the loop. |
| 918 observer.Observe(10); | 928 observer.Observe(10); |
| 919 } | 929 } |
| 920 | 930 |
| 921 EXPECT_EQ(-10, b.total); | 931 EXPECT_EQ(-10, b.total); |
| 922 } | 932 } |
| 923 | 933 |
| 924 } // namespace base | 934 } // namespace base |
| OLD | NEW |