1a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// found in the LICENSE file.
4a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "ash/shelf/scoped_observer_with_duplicated_sources.h"
6a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
7a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class TestObserver {
11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public:
12a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  TestObserver() {}
13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ~TestObserver() {}
14a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private:
16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestObserver);
17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class TestSource {
20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public:
21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  TestSource() : observer_count_(0) {}
22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ~TestSource() {}
23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void AddObserver(TestObserver* observer) {
25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    observer_count_++;
26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void RemoveObserver(TestObserver* observer) {
28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    observer_count_--;
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  int GetObserverCount() {
32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return observer_count_;
33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private:
36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  int observer_count_;
37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestSource);
39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST(ScopedObserverWithDuplicatedSourcesTest, DuplicatedSource) {
42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  TestObserver observer;
43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  TestSource source1;
44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  TestSource source2;
45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ScopedObserverWithDuplicatedSources<TestSource, TestObserver>
47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      observers(&observer);
48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(0, source1.GetObserverCount());
49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(observers.IsObserving(&source1));
50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(0, source2.GetObserverCount());
51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(observers.IsObserving(&source2));
52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Add |source1|.
54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  observers.Add(&source1);
55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(1, source1.GetObserverCount());
56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(observers.IsObserving(&source1));
57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // AddObserver of TestSource is called only once.
58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  observers.Add(&source1);
59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(1, source1.GetObserverCount());
60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(observers.IsObserving(&source1));
61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Add |source2|.
63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  observers.Add(&source2);
64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(1, source2.GetObserverCount());
65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(observers.IsObserving(&source2));
66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Remove |source1|.
68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  observers.Remove(&source1);
69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(1, source1.GetObserverCount());
70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(observers.IsObserving(&source1));
71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Remove |source2|.
73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  observers.Remove(&source2);
74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(0, source2.GetObserverCount());
75a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(observers.IsObserving(&source2));
76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Remove |source1| again.
78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  observers.Remove(&source1);
79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // In this time, |observer| is removed from |source1|.
80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(0, source1.GetObserverCount());
81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(observers.IsObserving(&source1));
82a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
83