| Index: ui/views/widget/desktop_aura/desktop_screen_x11_unittest.cc
 | 
| diff --git a/ui/views/widget/desktop_aura/desktop_screen_x11_unittest.cc b/ui/views/widget/desktop_aura/desktop_screen_x11_unittest.cc
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..45a2edfd8655e59a6099f78562a2aaf19d33da4a
 | 
| --- /dev/null
 | 
| +++ b/ui/views/widget/desktop_aura/desktop_screen_x11_unittest.cc
 | 
| @@ -0,0 +1,186 @@
 | 
| +// Copyright (c) 2013 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/views/widget/desktop_aura/desktop_screen_x11.h"
 | 
| +
 | 
| +#include "base/message_loop/message_loop.h"
 | 
| +#include "testing/gtest/include/gtest/gtest.h"
 | 
| +#include "ui/gfx/display_observer.h"
 | 
| +
 | 
| +namespace views {
 | 
| +
 | 
| +const int64 kFirstDisplay = 5321829;
 | 
| +const int64 kSecondDisplay = 928310;
 | 
| +
 | 
| +class DesktopScreenX11Test : public testing::Test,
 | 
| +                             public gfx::DisplayObserver {
 | 
| + public:
 | 
| +  DesktopScreenX11Test() {}
 | 
| +  virtual ~DesktopScreenX11Test() {}
 | 
| +
 | 
| +  // Overridden from testing::Test:
 | 
| +  virtual void SetUp() OVERRIDE {
 | 
| +    // Initialize the world to the single monitor case.
 | 
| +    std::vector<gfx::Display> displays;
 | 
| +    displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480)));
 | 
| +    screen_.reset(new DesktopScreenX11(displays));
 | 
| +    screen_->AddObserver(this);
 | 
| +  }
 | 
| +  virtual void TearDown() OVERRIDE {
 | 
| +    screen_.reset();
 | 
| +    message_loop_.RunUntilIdle();
 | 
| +  }
 | 
| +
 | 
| + protected:
 | 
| +  std::vector<gfx::Display> changed_display_;
 | 
| +  std::vector<gfx::Display> added_display_;
 | 
| +  std::vector<gfx::Display> removed_display_;
 | 
| +
 | 
| +  DesktopScreenX11* screen() { return screen_.get(); }
 | 
| +
 | 
| +  void ResetDisplayChanges() {
 | 
| +    changed_display_.clear();
 | 
| +    added_display_.clear();
 | 
| +    removed_display_.clear();
 | 
| +  }
 | 
| +
 | 
| + private:
 | 
| +  // Overridden from gfx::DisplayObserver:
 | 
| +  virtual void OnDisplayBoundsChanged(const gfx::Display& display) OVERRIDE {
 | 
| +    changed_display_.push_back(display);
 | 
| +  }
 | 
| +
 | 
| +  virtual void OnDisplayAdded(const gfx::Display& new_display) OVERRIDE {
 | 
| +    added_display_.push_back(new_display);
 | 
| +  }
 | 
| +
 | 
| +  virtual void OnDisplayRemoved(const gfx::Display& old_display) OVERRIDE {
 | 
| +    removed_display_.push_back(old_display);
 | 
| +  }
 | 
| +
 | 
| +  base::MessageLoopForUI message_loop_;
 | 
| +  scoped_ptr<DesktopScreenX11> screen_;
 | 
| +
 | 
| +  DISALLOW_COPY_AND_ASSIGN(DesktopScreenX11Test);
 | 
| +};
 | 
| +
 | 
| +TEST_F(DesktopScreenX11Test, BoundsChangeSingleMonitor) {
 | 
| +  std::vector<gfx::Display> displays;
 | 
| +  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 1024, 768)));
 | 
| +  screen()->ProcessDisplayChange(displays);
 | 
| +
 | 
| +  EXPECT_EQ(1u, changed_display_.size());
 | 
| +  EXPECT_EQ(0u, added_display_.size());
 | 
| +  EXPECT_EQ(0u, removed_display_.size());
 | 
| +}
 | 
| +
 | 
| +TEST_F(DesktopScreenX11Test, AddMonitorToTheRight) {
 | 
| +  std::vector<gfx::Display> displays;
 | 
| +  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480)));
 | 
| +  displays.push_back(gfx::Display(kSecondDisplay,
 | 
| +                                  gfx::Rect(640, 0, 1024, 768)));
 | 
| +  screen()->ProcessDisplayChange(displays);
 | 
| +
 | 
| +  EXPECT_EQ(0u, changed_display_.size());
 | 
| +  EXPECT_EQ(1u, added_display_.size());
 | 
| +  EXPECT_EQ(0u, removed_display_.size());
 | 
| +}
 | 
| +
 | 
| +TEST_F(DesktopScreenX11Test, AddMonitorToTheLeft) {
 | 
| +  std::vector<gfx::Display> displays;
 | 
| +  displays.push_back(gfx::Display(kSecondDisplay, gfx::Rect(0, 0, 1024, 768)));
 | 
| +  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(1024, 0, 640, 480)));
 | 
| +  screen()->ProcessDisplayChange(displays);
 | 
| +
 | 
| +  EXPECT_EQ(1u, changed_display_.size());
 | 
| +  EXPECT_EQ(1u, added_display_.size());
 | 
| +  EXPECT_EQ(0u, removed_display_.size());
 | 
| +}
 | 
| +
 | 
| +TEST_F(DesktopScreenX11Test, RemoveMonitorOnRight) {
 | 
| +  std::vector<gfx::Display> displays;
 | 
| +  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480)));
 | 
| +  displays.push_back(gfx::Display(kSecondDisplay,
 | 
| +                                  gfx::Rect(640, 0, 1024, 768)));
 | 
| +  screen()->ProcessDisplayChange(displays);
 | 
| +
 | 
| +  ResetDisplayChanges();
 | 
| +
 | 
| +  displays.clear();
 | 
| +  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480)));
 | 
| +  screen()->ProcessDisplayChange(displays);
 | 
| +
 | 
| +  EXPECT_EQ(0u, changed_display_.size());
 | 
| +  EXPECT_EQ(0u, added_display_.size());
 | 
| +  EXPECT_EQ(1u, removed_display_.size());
 | 
| +}
 | 
| +
 | 
| +TEST_F(DesktopScreenX11Test, RemoveMonitorOnLeft) {
 | 
| +  std::vector<gfx::Display> displays;
 | 
| +  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480)));
 | 
| +  displays.push_back(gfx::Display(kSecondDisplay,
 | 
| +                                  gfx::Rect(640, 0, 1024, 768)));
 | 
| +  screen()->ProcessDisplayChange(displays);
 | 
| +
 | 
| +  ResetDisplayChanges();
 | 
| +
 | 
| +  displays.clear();
 | 
| +  displays.push_back(gfx::Display(kSecondDisplay, gfx::Rect(0, 0, 1024, 768)));
 | 
| +  screen()->ProcessDisplayChange(displays);
 | 
| +
 | 
| +  EXPECT_EQ(1u, changed_display_.size());
 | 
| +  EXPECT_EQ(0u, added_display_.size());
 | 
| +  EXPECT_EQ(1u, removed_display_.size());
 | 
| +}
 | 
| +
 | 
| +TEST_F(DesktopScreenX11Test, GetDisplayNearestPoint) {
 | 
| +  std::vector<gfx::Display> displays;
 | 
| +  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480)));
 | 
| +  displays.push_back(gfx::Display(kSecondDisplay,
 | 
| +                                  gfx::Rect(640, 0, 1024, 768)));
 | 
| +  screen()->ProcessDisplayChange(displays);
 | 
| +
 | 
| +  EXPECT_EQ(kSecondDisplay,
 | 
| +            screen()->GetDisplayNearestPoint(gfx::Point(650, 10)).id());
 | 
| +  EXPECT_EQ(kFirstDisplay,
 | 
| +            screen()->GetDisplayNearestPoint(gfx::Point(10, 10)).id());
 | 
| +  EXPECT_EQ(kFirstDisplay,
 | 
| +            screen()->GetDisplayNearestPoint(gfx::Point(10000, 10000)).id());
 | 
| +}
 | 
| +
 | 
| +TEST_F(DesktopScreenX11Test, GetDisplayMatchingBasic) {
 | 
| +  std::vector<gfx::Display> displays;
 | 
| +  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480)));
 | 
| +  displays.push_back(gfx::Display(kSecondDisplay,
 | 
| +                                  gfx::Rect(640, 0, 1024, 768)));
 | 
| +  screen()->ProcessDisplayChange(displays);
 | 
| +
 | 
| +  EXPECT_EQ(kSecondDisplay,
 | 
| +            screen()->GetDisplayMatching(gfx::Rect(700, 20, 100, 100)).id());
 | 
| +}
 | 
| +
 | 
| +TEST_F(DesktopScreenX11Test, GetDisplayMatchingOverlap) {
 | 
| +  std::vector<gfx::Display> displays;
 | 
| +  displays.push_back(gfx::Display(kFirstDisplay, gfx::Rect(0, 0, 640, 480)));
 | 
| +  displays.push_back(gfx::Display(kSecondDisplay,
 | 
| +                                  gfx::Rect(640, 0, 1024, 768)));
 | 
| +  screen()->ProcessDisplayChange(displays);
 | 
| +
 | 
| +  EXPECT_EQ(kSecondDisplay,
 | 
| +            screen()->GetDisplayMatching(gfx::Rect(630, 20, 100, 100)).id());
 | 
| +}
 | 
| +
 | 
| +TEST_F(DesktopScreenX11Test, GetPrimaryDisplay) {
 | 
| +  std::vector<gfx::Display> displays;
 | 
| +  displays.push_back(gfx::Display(kFirstDisplay,
 | 
| +                                  gfx::Rect(640, 0, 1024, 768)));
 | 
| +  displays.push_back(gfx::Display(kSecondDisplay, gfx::Rect(0, 0, 640, 480)));
 | 
| +  screen()->ProcessDisplayChange(displays);
 | 
| +
 | 
| +  // The first display in the list is always the primary, even if other
 | 
| +  // displays are to the left in screen layout.
 | 
| +  EXPECT_EQ(kFirstDisplay, screen()->GetPrimaryDisplay().id());
 | 
| +}
 | 
| +
 | 
| +}  // namespace views
 | 
| 
 |