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