Index: ui/aura/desktop_unittest.cc |
diff --git a/ui/aura/desktop_unittest.cc b/ui/aura/desktop_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..30e326016f0058e8e161c2807d90b1a033670e72 |
--- /dev/null |
+++ b/ui/aura/desktop_unittest.cc |
@@ -0,0 +1,97 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "ui/aura/desktop.h" |
+ |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "ui/aura/event.h" |
+#include "ui/aura/test/aura_test_base.h" |
+#include "ui/aura/test/test_window_delegate.h" |
+#include "ui/aura/test/test_windows.h" |
+#include "ui/base/hit_test.h" |
+#include "ui/gfx/point.h" |
+#include "ui/gfx/rect.h" |
+ |
+namespace aura { |
+namespace test { |
+ |
+namespace { |
+ |
+// A delegate that always returns a non-client component for hit tests. |
+class NonClientDelegate : public TestWindowDelegate { |
+ public: |
+ NonClientDelegate() |
+ : non_client_count_(0), |
+ mouse_event_count_(0), |
+ mouse_event_flags_(0x0) { |
+ } |
+ virtual ~NonClientDelegate() {} |
+ |
+ int non_client_count() const { return non_client_count_; } |
+ gfx::Point non_client_location() const { return non_client_location_; } |
+ int mouse_event_count() const { return mouse_event_count_; } |
+ gfx::Point mouse_event_location() const { return mouse_event_location_; } |
+ int mouse_event_flags() const { return mouse_event_flags_; } |
+ |
+ virtual int GetNonClientComponent(const gfx::Point& location) const OVERRIDE { |
+ NonClientDelegate* self = const_cast<NonClientDelegate*>(this); |
+ self->non_client_count_++; |
+ self->non_client_location_ = location; |
+ return HTTOPLEFT; |
+ } |
+ virtual bool OnMouseEvent(MouseEvent* event) OVERRIDE { |
+ mouse_event_count_++; |
+ mouse_event_location_ = event->location(); |
+ mouse_event_flags_ = event->flags(); |
+ return true; |
+ } |
+ |
+ private: |
+ int non_client_count_; |
+ gfx::Point non_client_location_; |
+ int mouse_event_count_; |
+ gfx::Point mouse_event_location_; |
+ int mouse_event_flags_; |
+}; |
+ |
+} // namespace |
+ |
+class DesktopTest : public AuraTestBase { |
+}; |
+ |
+TEST_F(DesktopTest, DispatchMouseEvent) { |
+ // Create two non-overlapping windows so we don't have to worry about which |
+ // is on top. |
+ scoped_ptr<NonClientDelegate> delegate1(new NonClientDelegate()); |
+ scoped_ptr<NonClientDelegate> delegate2(new NonClientDelegate()); |
+ const int kWindowWidth = 123; |
+ const int kWindowHeight = 45; |
+ gfx::Rect bounds1(100, 200, kWindowWidth, kWindowHeight); |
+ gfx::Rect bounds2(300, 400, kWindowWidth, kWindowHeight); |
+ scoped_ptr<aura::Window> window1(CreateTestWindowWithDelegate( |
+ delegate1.get(), -1234, bounds1, NULL)); |
+ scoped_ptr<aura::Window> window2(CreateTestWindowWithDelegate( |
+ delegate2.get(), -5678, bounds2, NULL)); |
+ |
+ // Send a mouse event to window1. |
+ gfx::Point point(101, 201); |
+ MouseEvent event1(ui::ET_MOUSE_PRESSED, point, ui::EF_LEFT_BUTTON_DOWN); |
+ Desktop::GetInstance()->DispatchMouseEvent(&event1); |
+ |
+ // Event was tested for non-client area for the target window. |
+ EXPECT_EQ(1, delegate1->non_client_count()); |
+ EXPECT_EQ(0, delegate2->non_client_count()); |
+ // The non-client component test was in local coordinates. |
+ EXPECT_EQ(gfx::Point(1, 1), delegate1->non_client_location()); |
+ // Mouse event was received by target window. |
+ EXPECT_EQ(1, delegate1->mouse_event_count()); |
+ EXPECT_EQ(0, delegate2->mouse_event_count()); |
+ // Event was in local coordinates. |
+ EXPECT_EQ(gfx::Point(1, 1), delegate1->mouse_event_location()); |
+ // Non-client flag was set. |
+ EXPECT_TRUE(delegate1->mouse_event_flags() & ui::EF_IS_NON_CLIENT); |
+} |
+ |
+} // namespace test |
+} // namespace aura |