blob: d1acea8e832c4590bba845f8b4c1aefecdab8851 [file] [log] [blame]
// Copyright 2014 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.
#import "ui/gfx/mac/coordinate_conversion.h"
#import <Cocoa/Cocoa.h>
#include <memory>
#import "base/mac/scoped_objc_class_swizzler.h"
#include "base/macros.h"
#import "testing/gtest_mac.h"
#import "testing/platform_test.h"
#include "ui/gfx/geometry/rect.h"
const int kTestWidth = 320;
const int kTestHeight = 200;
// Class to donate an implementation of -[NSScreen frame] that provides a known
// value for robust tests.
@interface MacCoordinateConversionTestScreenDonor : NSObject
- (NSRect)frame;
@end
@implementation MacCoordinateConversionTestScreenDonor
- (NSRect)frame {
return NSMakeRect(0, 0, kTestWidth, kTestHeight);
}
@end
namespace gfx {
namespace {
class MacCoordinateConversionTest : public PlatformTest {
public:
MacCoordinateConversionTest() {}
// Overridden from testing::Test:
void SetUp() override;
void TearDown() override;
private:
std::unique_ptr<base::mac::ScopedObjCClassSwizzler> swizzle_frame_;
DISALLOW_COPY_AND_ASSIGN(MacCoordinateConversionTest);
};
void MacCoordinateConversionTest::SetUp() {
// Before swizzling, do a sanity check that the primary screen's origin is
// (0, 0). This should always be true.
NSRect primary_screen_frame = [[[NSScreen screens] firstObject] frame];
EXPECT_EQ(0, primary_screen_frame.origin.x);
EXPECT_EQ(0, primary_screen_frame.origin.y);
swizzle_frame_.reset(new base::mac::ScopedObjCClassSwizzler(
[NSScreen class],
[MacCoordinateConversionTestScreenDonor class],
@selector(frame)));
primary_screen_frame = [[[NSScreen screens] firstObject] frame];
EXPECT_EQ(kTestWidth, primary_screen_frame.size.width);
EXPECT_EQ(kTestHeight, primary_screen_frame.size.height);
}
void MacCoordinateConversionTest::TearDown() {
swizzle_frame_.reset();
}
} // namespace
// Tests for coordinate conversion on Mac. Start with the following setup:
// AppKit ....... gfx
// 199 0
// 189 10 Window of height 40 fills in pixel
// 179 --------- 20 at index 20
// 169 | | 30 through
// ... : : .. to
// 150 | | 49 pixel
// 140 --------- 59 at index 59
// 130 69 (inclusive).
// .. ..
// 0 199
TEST_F(MacCoordinateConversionTest, ScreenRectToFromNSRect) {
// Window on the primary screen.
Rect gfx_rect = Rect(10, 20, 30, 40);
NSRect ns_rect = ScreenRectToNSRect(gfx_rect);
EXPECT_NSEQ(NSMakeRect(10, 140, 30, 40), ns_rect);
EXPECT_EQ(gfx_rect, ScreenRectFromNSRect(ns_rect));
// Window in a screen to the left of the primary screen.
gfx_rect = Rect(-40, 20, 30, 40);
ns_rect = ScreenRectToNSRect(gfx_rect);
EXPECT_NSEQ(NSMakeRect(-40, 140, 30, 40), ns_rect);
EXPECT_EQ(gfx_rect, ScreenRectFromNSRect(ns_rect));
// Window in a screen below the primary screen.
gfx_rect = Rect(10, 220, 30, 40);
ns_rect = ScreenRectToNSRect(gfx_rect);
EXPECT_NSEQ(NSMakeRect(10, -60, 30, 40), ns_rect);
EXPECT_EQ(gfx_rect, ScreenRectFromNSRect(ns_rect));
// Window in a screen below and to the left primary screen.
gfx_rect = Rect(-40, 220, 30, 40);
ns_rect = ScreenRectToNSRect(gfx_rect);
EXPECT_NSEQ(NSMakeRect(-40, -60, 30, 40), ns_rect);
EXPECT_EQ(gfx_rect, ScreenRectFromNSRect(ns_rect));
}
// Test point conversions using the same setup as ScreenRectToFromNSRect, but
// using only the origin.
TEST_F(MacCoordinateConversionTest, ScreenPointToFromNSPoint) {
// Point on the primary screen.
Point gfx_point = Point(10, 20);
NSPoint ns_point = ScreenPointToNSPoint(gfx_point);
EXPECT_NSEQ(NSMakePoint(10, 180), ns_point);
EXPECT_EQ(gfx_point, ScreenPointFromNSPoint(ns_point));
// Point in a screen to the left of the primary screen.
gfx_point = Point(-40, 20);
ns_point = ScreenPointToNSPoint(gfx_point);
EXPECT_NSEQ(NSMakePoint(-40, 180), ns_point);
EXPECT_EQ(gfx_point, ScreenPointFromNSPoint(ns_point));
// Point in a screen below the primary screen.
gfx_point = Point(10, 220);
ns_point = ScreenPointToNSPoint(gfx_point);
EXPECT_NSEQ(NSMakePoint(10, -20), ns_point);
EXPECT_EQ(gfx_point, ScreenPointFromNSPoint(ns_point));
// Point in a screen below and to the left primary screen.
gfx_point = Point(-40, 220);
ns_point = ScreenPointToNSPoint(gfx_point);
EXPECT_NSEQ(NSMakePoint(-40, -20), ns_point);
EXPECT_EQ(gfx_point, ScreenPointFromNSPoint(ns_point));
}
} // namespace gfx