blob: 32e3c5d2d5d709d262e193e434826fcb5d420d34 [file] [log] [blame]
// Copyright (c) 2012 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 "ash/display/screen_position_controller.h"
#include "ash/display/display_controller.h"
#include "ash/shell.h"
#include "ash/test/ash_test_base.h"
#include "ui/aura/env.h"
#include "ui/aura/root_window.h"
#include "ui/aura/test/test_window_delegate.h"
#include "ui/base/layout.h"
#include "ui/gfx/screen.h"
#if defined(OS_WIN)
// TOD(mazda): UpdateDisplay does not work properly on Win.
// Fix this and enable tests.
#define MAYBE_ConvertNativePointToScreen DISABLED_ConvertNativePointToScreen
#else
#define MAYBE_ConvertNativePointToScreen ConvertNativePointToScreen
#endif
namespace ash {
namespace test {
namespace {
void SetSecondaryDisplayLayout(DisplayLayout::Position position) {
DisplayController* display_controller =
Shell::GetInstance()->display_controller();
DisplayLayout layout = display_controller->default_display_layout();
layout.position = position;
display_controller->SetDefaultDisplayLayout(layout);
}
internal::ScreenPositionController* GetScreenPositionController() {
Shell::TestApi test_api(Shell::GetInstance());
return test_api.screen_position_controller();
}
class ScreenPositionControllerTest : public test::AshTestBase {
public:
ScreenPositionControllerTest() : window_(NULL) {}
virtual ~ScreenPositionControllerTest() {}
virtual void SetUp() OVERRIDE {
AshTestBase::SetUp();
window_.reset(new aura::Window(&window_delegate_));
window_->SetType(aura::client::WINDOW_TYPE_NORMAL);
window_->Init(ui::LAYER_NOT_DRAWN);
window_->SetParent(NULL);
window_->set_id(1);
}
virtual void TearDown() OVERRIDE {
window_.reset();
AshTestBase::TearDown();
}
// Converts a native point (x, y) to screen and returns its string
// representation.
std::string ConvertNativePointToScreen(int x, int y) const {
gfx::Point point(x, y);
GetScreenPositionController()->ConvertNativePointToScreen(
window_.get(), &point);
return point.ToString();
}
protected:
scoped_ptr<aura::Window> window_;
aura::test::TestWindowDelegate window_delegate_;
private:
DISALLOW_COPY_AND_ASSIGN(ScreenPositionControllerTest);
};
} // namespace
TEST_F(ScreenPositionControllerTest, MAYBE_ConvertNativePointToScreen) {
UpdateDisplay("100+100-200x200,100+500-200x200");
Shell::RootWindowList root_windows =
Shell::GetInstance()->GetAllRootWindows();
EXPECT_EQ("100,100", root_windows[0]->GetHostOrigin().ToString());
EXPECT_EQ("200x200", root_windows[0]->GetHostSize().ToString());
EXPECT_EQ("100,500", root_windows[1]->GetHostOrigin().ToString());
EXPECT_EQ("200x200", root_windows[1]->GetHostSize().ToString());
const gfx::Point window_pos(100, 100);
window_->SetBoundsInScreen(gfx::Rect(window_pos, gfx::Size(100, 100)),
gfx::Screen::GetDisplayNearestPoint(window_pos));
SetSecondaryDisplayLayout(DisplayLayout::RIGHT);
// The point is on the primary root window.
EXPECT_EQ("150,150", ConvertNativePointToScreen(50, 50));
// The point is out of the all root windows.
EXPECT_EQ("350,350", ConvertNativePointToScreen(250, 250));
// The point is on the secondary display.
EXPECT_EQ("350,100", ConvertNativePointToScreen(50, 400));
SetSecondaryDisplayLayout(DisplayLayout::BOTTOM);
// The point is on the primary root window.
EXPECT_EQ("150,150", ConvertNativePointToScreen(50, 50));
// The point is out of the all root windows.
EXPECT_EQ("350,350", ConvertNativePointToScreen(250, 250));
// The point is on the secondary display.
EXPECT_EQ("150,300", ConvertNativePointToScreen(50, 400));
SetSecondaryDisplayLayout(DisplayLayout::LEFT);
// The point is on the primary root window.
EXPECT_EQ("150,150", ConvertNativePointToScreen(50, 50));
// The point is out of the all root windows.
EXPECT_EQ("350,350", ConvertNativePointToScreen(250, 250));
// The point is on the secondary display.
EXPECT_EQ("-50,100", ConvertNativePointToScreen(50, 400));
SetSecondaryDisplayLayout(DisplayLayout::TOP);
// The point is on the primary root window.
EXPECT_EQ("150,150", ConvertNativePointToScreen(50, 50));
// The point is out of the all root windows.
EXPECT_EQ("350,350", ConvertNativePointToScreen(250, 250));
// The point is on the secondary display.
EXPECT_EQ("150,-100", ConvertNativePointToScreen(50, 400));
SetSecondaryDisplayLayout(DisplayLayout::RIGHT);
const gfx::Point window_pos2(300, 100);
window_->SetBoundsInScreen(gfx::Rect(window_pos2, gfx::Size(100, 100)),
gfx::Screen::GetDisplayNearestPoint(window_pos2));
// The point is on the secondary display.
EXPECT_EQ("350,150", ConvertNativePointToScreen(50, 50));
// The point is out of the all root windows.
EXPECT_EQ("550,350", ConvertNativePointToScreen(250, 250));
// The point is on the primary root window.
EXPECT_EQ("150,100", ConvertNativePointToScreen(50, -400));
SetSecondaryDisplayLayout(DisplayLayout::BOTTOM);
// The point is on the secondary display.
EXPECT_EQ("150,350", ConvertNativePointToScreen(50, 50));
// The point is out of the all root windows.
EXPECT_EQ("350,550", ConvertNativePointToScreen(250, 250));
// The point is on the primary root window.
EXPECT_EQ("150,100", ConvertNativePointToScreen(50, -400));
SetSecondaryDisplayLayout(DisplayLayout::LEFT);
// The point is on the secondary display.
EXPECT_EQ("-50,150", ConvertNativePointToScreen(50, 50));
// The point is out of the all root windows.
EXPECT_EQ("150,350", ConvertNativePointToScreen(250, 250));
// The point is on the primary root window.
EXPECT_EQ("150,100", ConvertNativePointToScreen(50, -400));
SetSecondaryDisplayLayout(DisplayLayout::TOP);
// The point is on the secondary display.
EXPECT_EQ("150,-50", ConvertNativePointToScreen(50, 50));
// The point is out of the all root windows.
EXPECT_EQ("350,150", ConvertNativePointToScreen(250, 250));
// The point is on the primary root window.
EXPECT_EQ("150,100", ConvertNativePointToScreen(50, -400));
}
} // namespace test
} // namespace ash