1// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "base/memory/scoped_ptr.h" 6#include "base/message_loop/message_loop.h" 7#include "chrome/browser/ui/panels/panel_mouse_watcher.h" 8#include "chrome/browser/ui/panels/panel_mouse_watcher_observer.h" 9#include "testing/gtest/include/gtest/gtest.h" 10#include "ui/gfx/point.h" 11 12class TestMouseObserver : public PanelMouseWatcherObserver { 13 public: 14 TestMouseObserver() : mouse_movements_(0) {} 15 // Overridden from PanelMouseWatcherObserver: 16 virtual void OnMouseMove(const gfx::Point& mouse_position) OVERRIDE { 17 ++mouse_movements_; 18 } 19 int mouse_movements_; 20}; 21 22class PanelMouseWatcherTest : public testing::Test { 23}; 24 25TEST_F(PanelMouseWatcherTest, StartStopWatching) { 26 base::MessageLoopForUI loop; 27 28 scoped_ptr<PanelMouseWatcher> watcher(PanelMouseWatcher::Create()); 29 EXPECT_FALSE(watcher->IsActive()); 30 31 scoped_ptr<TestMouseObserver> user1(new TestMouseObserver()); 32 scoped_ptr<TestMouseObserver> user2(new TestMouseObserver()); 33 34 // No observers. 35 watcher->NotifyMouseMovement(gfx::Point(42, 101)); 36 EXPECT_EQ(0, user1->mouse_movements_); 37 EXPECT_EQ(0, user2->mouse_movements_); 38 39 // Only one mouse observer. 40 watcher->AddObserver(user1.get()); 41 EXPECT_TRUE(watcher->IsActive()); 42 watcher->NotifyMouseMovement(gfx::Point(42, 101)); 43 EXPECT_GE(user1->mouse_movements_, 1); 44 EXPECT_EQ(0, user2->mouse_movements_); 45 watcher->RemoveObserver(user1.get()); 46 EXPECT_FALSE(watcher->IsActive()); 47 48 // More than one mouse observer. 49 watcher->AddObserver(user1.get()); 50 EXPECT_TRUE(watcher->IsActive()); 51 watcher->AddObserver(user2.get()); 52 watcher->NotifyMouseMovement(gfx::Point(101, 42)); 53 EXPECT_GE(user1->mouse_movements_, 2); 54 EXPECT_GE(user2->mouse_movements_, 1); 55 56 // Back to one observer. 57 watcher->RemoveObserver(user1.get()); 58 EXPECT_TRUE(watcher->IsActive()); 59 int saved_count = user1->mouse_movements_; 60 watcher->NotifyMouseMovement(gfx::Point(1, 2)); 61 EXPECT_EQ(saved_count, user1->mouse_movements_); 62 EXPECT_GE(user2->mouse_movements_, 2); 63 watcher->RemoveObserver(user2.get()); 64 EXPECT_FALSE(watcher->IsActive()); 65} 66