15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 69ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/panels/panel_mouse_watcher.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/panels/panel_mouse_watcher_observer.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/point.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestMouseObserver : public PanelMouseWatcherObserver { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestMouseObserver() : mouse_movements_(0) {} 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from PanelMouseWatcherObserver: 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnMouseMove(const gfx::Point& mouse_position) OVERRIDE { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++mouse_movements_; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mouse_movements_; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PanelMouseWatcherTest : public testing::Test { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PanelMouseWatcherTest, StartStopWatching) { 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::MessageLoopForUI loop; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<PanelMouseWatcher> watcher(PanelMouseWatcher::Create()); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(watcher->IsActive()); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestMouseObserver> user1(new TestMouseObserver()); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestMouseObserver> user2(new TestMouseObserver()); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No observers. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) watcher->NotifyMouseMovement(gfx::Point(42, 101)); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, user1->mouse_movements_); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, user2->mouse_movements_); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only one mouse observer. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) watcher->AddObserver(user1.get()); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(watcher->IsActive()); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) watcher->NotifyMouseMovement(gfx::Point(42, 101)); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(user1->mouse_movements_, 1); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, user2->mouse_movements_); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) watcher->RemoveObserver(user1.get()); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(watcher->IsActive()); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // More than one mouse observer. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) watcher->AddObserver(user1.get()); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(watcher->IsActive()); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) watcher->AddObserver(user2.get()); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) watcher->NotifyMouseMovement(gfx::Point(101, 42)); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(user1->mouse_movements_, 2); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(user2->mouse_movements_, 1); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Back to one observer. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) watcher->RemoveObserver(user1.get()); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(watcher->IsActive()); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int saved_count = user1->mouse_movements_; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) watcher->NotifyMouseMovement(gfx::Point(1, 2)); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(saved_count, user1->mouse_movements_); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(user2->mouse_movements_, 2); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) watcher->RemoveObserver(user2.get()); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(watcher->IsActive()); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 66