blob: 2dc16d13abf266afc24bb3e3515c216e92c7cb40 [file] [log] [blame]
// Copyright 2010-2014, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Unit tests for WindowUtil class.
#include "renderer/window_util.h"
#include "base/coordinates.h"
#include "testing/base/public/gunit.h"
namespace mozc {
namespace renderer {
class WindowUtilTest : public testing::Test {
public:
WindowUtilTest()
: working_area_(0, 0, 200, 100),
window_size_(10, 20),
zero_point_offset_(1, -2) {
}
void VerifyMainWindowWithPreeditRect(
int preedit_left, int preedit_top, int preedit_width, int preedit_height,
int expected_left, int expected_top,
const char *message) {
Rect preedit_rect(preedit_left, preedit_top, preedit_width, preedit_height);
Rect result = WindowUtil::GetWindowRectForMainWindowFromPreeditRect(
preedit_rect, window_size_, zero_point_offset_, working_area_);
EXPECT_EQ(expected_left, result.Left()) << message;
EXPECT_EQ(expected_top, result.Top()) << message;
}
void VerifyMainWindowWithTargetPoint(
int target_point_x, int target_point_y,
int expected_left, int expected_top, const char *message) {
Point target_point(target_point_x, target_point_y);
Rect result = WindowUtil::GetWindowRectForMainWindowFromTargetPoint(
target_point, window_size_, zero_point_offset_, working_area_);
EXPECT_EQ(expected_left, result.Left()) << message;
EXPECT_EQ(expected_top, result.Top()) << message;
}
void VerifyMainWindowWithTargetPointAndPreeditHorizontal(
int target_point_x, int target_point_y,
int preedit_left, int preedit_top, int preedit_width, int preedit_height,
int expected_left, int expected_top, const char *message) {
Point target_point(target_point_x, target_point_y);
Rect preedit_rect(preedit_left, preedit_top, preedit_width, preedit_height);
Rect result =
WindowUtil::GetWindowRectForMainWindowFromTargetPointAndPreedit(
target_point, preedit_rect, window_size_, zero_point_offset_,
working_area_, false);
EXPECT_EQ(expected_left, result.Left()) << message;
EXPECT_EQ(expected_top, result.Top()) << message;
}
void VerifyMainWindowWithTargetPointAndPreeditVertical(
int target_point_x, int target_point_y,
int preedit_left, int preedit_top, int preedit_width, int preedit_height,
int expected_left, int expected_top, const char *message) {
Point target_point(target_point_x, target_point_y);
Rect preedit_rect(preedit_left, preedit_top, preedit_width, preedit_height);
Rect result =
WindowUtil::GetWindowRectForMainWindowFromTargetPointAndPreedit(
target_point, preedit_rect, window_size_, zero_point_offset_,
working_area_, true);
EXPECT_EQ(expected_left, result.Left()) << message;
EXPECT_EQ(expected_top, result.Top()) << message;
}
void VerifyCascadingWindow(
int row_left, int row_top, int row_width, int row_height,
int expected_left, int expected_top,
const char *message) {
Rect selected_row(row_left, row_top, row_width, row_height);
Rect result = WindowUtil::GetWindowRectForCascadingWindow(
selected_row, window_size_, zero_point_offset_, working_area_);
EXPECT_EQ(expected_left, result.Left()) << message;
EXPECT_EQ(expected_top, result.Top()) << message;
}
void VerifyInfolistWindow(
int infolist_width, int infolist_height,
int candidate_left, int candidate_top,
int candidate_width, int candidate_height,
int expected_left, int expected_top,
const char *message) {
Size window_size(infolist_width, infolist_height);
Rect candidate_rect(candidate_left, candidate_top,
candidate_width, candidate_height);
Rect result = WindowUtil::GetWindowRectForInfolistWindow(
window_size, candidate_rect, working_area_);
EXPECT_EQ(expected_left, result.Left()) << message;
EXPECT_EQ(expected_top, result.Top()) << message;
}
private:
Rect working_area_;
Size window_size_;
Point zero_point_offset_;
Rect selected_row_;
};
TEST_F(WindowUtilTest, MainWindow) {
VerifyMainWindowWithPreeditRect(
50, 50, 20, 5, 49, 57, "Preedit is in the middle of the window");
VerifyMainWindowWithPreeditRect(
198, 50, 20, 5, 190, 57, "On the right edge");
VerifyMainWindowWithPreeditRect(
-5, 50, 20, 5, 0, 57, "On the left edge");
// If the candidate window across the bottom edge, it appears above
// the preedit.
VerifyMainWindowWithPreeditRect(
50, 92, 20, 5, 49, 70, "On the bottom edge");
VerifyMainWindowWithPreeditRect(
50, 110, 20, 5, 49, 80, "Under the bottom edge");
VerifyMainWindowWithPreeditRect(
50, -10, 20, 5, 49, 0, "On the top edge");
VerifyMainWindowWithTargetPoint(
50, 55, 49, 57, "Preedit is in the middle of the window");
VerifyMainWindowWithTargetPoint(
198, 55, 190, 57, "On the right edge");
VerifyMainWindowWithTargetPoint(
-5, 55, 0, 57, "On the left edge");
// If the candidate window across the bottom edge, it appears above
// the preedit.
VerifyMainWindowWithTargetPoint(
50, 97, 49, 80, "On the bottom edge");
VerifyMainWindowWithTargetPoint(
50, 115, 49, 80, "Under the bottom edge");
VerifyMainWindowWithTargetPoint(
50, -5, 49, 0, "On the top edge");
VerifyMainWindowWithTargetPointAndPreeditHorizontal(
50, 55, 50, 50, 20, 5, 49, 57, "Preedit is in the middle of the window");
VerifyMainWindowWithTargetPointAndPreeditHorizontal(
198, 55, 198, 50, 20, 5, 190, 57, "On the right edge");
VerifyMainWindowWithTargetPointAndPreeditHorizontal(
50, -5, 50, -10, 20, 5, 49, 0, "On the top edge");
VerifyMainWindowWithTargetPointAndPreeditHorizontal(
50, 55, 0, 50, 100, 5, 49, 57,
"Preedit width is the same to client area");
// If the candidate window across the bottom edge, it appears above
// the preedit.
VerifyMainWindowWithTargetPointAndPreeditHorizontal(
50, 97, 50, 92, 20, 5, 49, 70, "On the bottom edge");
VerifyMainWindowWithTargetPointAndPreeditHorizontal(
50, 115, 50, 110, 20, 5, 49, 80, "Under the bottom edge");
VerifyMainWindowWithTargetPointAndPreeditHorizontal(
50, -5, 50, -10, 20, 5, 49, 0, "On the top edge");
VerifyMainWindowWithTargetPointAndPreeditVertical(
50, 55, 50, 50, 20, 5, 70, 55, "Preedit is in the middle of the window");
VerifyMainWindowWithTargetPointAndPreeditVertical(
50, 198, 50, 198, 5, 20, 55, 80, "On the bottom edge");
VerifyMainWindowWithTargetPointAndPreeditVertical(
-50, 50, -50, 50, 5, 20, 0, 50, "On the left edge");
VerifyMainWindowWithTargetPointAndPreeditVertical(
50, 55, 50, 0, 20, 100, 70, 55,
"Preedit height is the same to client area");
// If the candidate window across the right edge, it appears in the left of
// the preedit.
VerifyMainWindowWithTargetPointAndPreeditVertical(
192, 50, 192, 50, 5, 20, 182, 50, "On the right edge");
VerifyMainWindowWithTargetPointAndPreeditVertical(
215, 50, 210, 50, 5, 20, 190, 50, "Under the right edge");
VerifyMainWindowWithTargetPointAndPreeditVertical(
-5, 50, -10, 50, 5, 20, 0, 50, "On the left edge");
}
TEST_F(WindowUtilTest, CascadingWindow) {
VerifyCascadingWindow(50, 50, 20, 5,
69, 52, "Selected row is in the middle of the window");
// If the cascading window across the right edge, it appears the
// left side of the main window.
VerifyCascadingWindow(178, 50, 20, 5,
169, 52, "On the right edge");
VerifyCascadingWindow(-30, 50, 20, 5,
0, 52, "On the left edge");
VerifyCascadingWindow(50, 92, 20, 5,
69, 80, "On the bottom edge");
VerifyCascadingWindow(50, -20, 20, 5,
69, 0, "On the top edge");
}
TEST_F(WindowUtilTest, InfolistWindow) {
VerifyInfolistWindow(10, 20, 20, 30, 11, 12,
31, 30, "Right of the candidate window");
VerifyInfolistWindow(10, 10, 160, 30, 40, 12,
150, 30, "Left of the candidate window");
VerifyInfolistWindow(10, 20, 20, 85, 11, 12,
31, 80, "On the bottom edge");
}
TEST_F(WindowUtilTest, MonitorErrors) {
// Error! monitor doesn't have width nor height.
Rect working_area(0, 0, 0, 0);
Size window_size(10, 20);
Point zero_point_offset(1, -2);
Rect preedit_rect(50, 50, 20, 5);
Point target_point(preedit_rect.Left(), preedit_rect.Bottom());
Rect result = WindowUtil::GetWindowRectForMainWindowFromPreeditRect(
preedit_rect, window_size, zero_point_offset, working_area);
// It doesn't apply edge across processing.
EXPECT_EQ(49, result.Left());
EXPECT_EQ(57, result.Top());
result = WindowUtil::GetWindowRectForMainWindowFromTargetPoint(
target_point, window_size, zero_point_offset, working_area);
// It doesn't apply edge across processing.
EXPECT_EQ(49, result.Left());
EXPECT_EQ(57, result.Top());
// Same as cascading window.
result = WindowUtil::GetWindowRectForCascadingWindow(
preedit_rect, window_size, zero_point_offset, working_area);
EXPECT_EQ(69, result.Left());
EXPECT_EQ(52, result.Top());
// Same as infolist window.
Rect candidate_rect(50, 32, 20, 5);
result = WindowUtil::GetWindowRectForInfolistWindow(
window_size, candidate_rect, working_area);
EXPECT_EQ(70, result.Left());
EXPECT_EQ(32, result.Top());
}
} // namespace renderer
} // namespace mozc