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