1 // Copyright 2020 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/scoped_observation.h"
7 #include "base/containers/contains.h"
8 #include "base/ranges/algorithm.h"
9 #include "base/test/gtest_util.h"
10 #include "testing/gtest/include/gtest/gtest.h"
15 class TestSourceObserver {};
19 void AddObserver(TestSourceObserver* observer);
20 void RemoveObserver(TestSourceObserver* observer);
22 bool HasObserver(TestSourceObserver* observer) const;
23 size_t num_observers() const { return observers_.size(); }
26 std::vector<TestSourceObserver*> observers_;
29 void TestSource::AddObserver(TestSourceObserver* observer) {
30 observers_.push_back(observer);
33 void TestSource::RemoveObserver(TestSourceObserver* observer) {
34 auto it = base::ranges::find(observers_, observer);
35 EXPECT_TRUE(it != observers_.end());
39 bool TestSource::HasObserver(TestSourceObserver* observer) const {
40 return base::Contains(observers_, observer);
43 using TestScopedObservation = ScopedObservation<TestSource, TestSourceObserver>;
47 TEST(ScopedObservationTest, RemovesObservationOnDestruction) {
51 TestSourceObserver o1;
52 TestScopedObservation obs(&o1);
53 EXPECT_EQ(0u, s1.num_observers());
54 EXPECT_FALSE(s1.HasObserver(&o1));
57 EXPECT_EQ(1u, s1.num_observers());
58 EXPECT_TRUE(s1.HasObserver(&o1));
61 // Test that the observation is removed when it goes out of scope.
62 EXPECT_EQ(0u, s1.num_observers());
65 TEST(ScopedObservationTest, Reset) {
67 TestSourceObserver o1;
68 TestScopedObservation obs(&o1);
69 EXPECT_EQ(0u, s1.num_observers());
73 EXPECT_EQ(1u, s1.num_observers());
74 EXPECT_TRUE(s1.HasObserver(&o1));
77 EXPECT_EQ(0u, s1.num_observers());
79 // Safe to call with no observation.
81 EXPECT_EQ(0u, s1.num_observers());
84 TEST(ScopedObservationTest, IsObserving) {
86 TestSourceObserver o1;
87 TestScopedObservation obs(&o1);
88 EXPECT_FALSE(obs.IsObserving());
91 EXPECT_TRUE(obs.IsObserving());
94 EXPECT_FALSE(obs.IsObserving());
97 TEST(ScopedObservationTest, IsObservingSource) {
100 TestSourceObserver o1;
101 TestScopedObservation obs(&o1);
102 EXPECT_FALSE(obs.IsObservingSource(&s1));
103 EXPECT_FALSE(obs.IsObservingSource(&s2));
106 EXPECT_TRUE(obs.IsObservingSource(&s1));
107 EXPECT_FALSE(obs.IsObservingSource(&s2));
110 EXPECT_FALSE(obs.IsObservingSource(&s1));
111 EXPECT_FALSE(obs.IsObservingSource(&s2));
116 // A test source with oddly named Add/Remove functions.
117 class TestSourceWithNonDefaultNames {
119 void AddFoo(TestSourceObserver* observer) { impl_.AddObserver(observer); }
120 void RemoveFoo(TestSourceObserver* observer) {
121 impl_.RemoveObserver(observer);
124 const TestSource& impl() const { return impl_; }
130 using TestScopedObservationWithNonDefaultNames =
131 ScopedObservation<TestSourceWithNonDefaultNames,
133 &TestSourceWithNonDefaultNames::AddFoo,
134 &TestSourceWithNonDefaultNames::RemoveFoo>;
138 TEST(ScopedObservationTest, NonDefaultNames) {
139 TestSourceWithNonDefaultNames s1;
140 TestSourceObserver o1;
142 EXPECT_EQ(0u, s1.impl().num_observers());
144 TestScopedObservationWithNonDefaultNames obs(&o1);
146 EXPECT_EQ(1u, s1.impl().num_observers());
147 EXPECT_TRUE(s1.impl().HasObserver(&o1));