1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #import "ui/gfx/mac/coordinate_conversion.h"
7 #import <Cocoa/Cocoa.h>
9 #import "base/mac/scoped_objc_class_swizzler.h"
10 #include "base/macros.h"
11 #include "base/memory/scoped_ptr.h"
12 #import "testing/gtest_mac.h"
13 #import "testing/platform_test.h"
14 #include "ui/gfx/geometry/rect.h"
16 const int kTestWidth = 320;
17 const int kTestHeight = 200;
19 // Class to donate an implementation of -[NSScreen frame] that provides a known
20 // value for robust tests.
21 @interface MacCoordinateConversionTestScreenDonor : NSObject
25 @implementation MacCoordinateConversionTestScreenDonor
27 return NSMakeRect(0, 0, kTestWidth, kTestHeight);
34 class MacCoordinateConversionTest : public PlatformTest {
36 MacCoordinateConversionTest() {}
38 // Overridden from testing::Test:
39 void SetUp() override;
40 void TearDown() override;
43 scoped_ptr<base::mac::ScopedObjCClassSwizzler> swizzle_frame_;
45 DISALLOW_COPY_AND_ASSIGN(MacCoordinateConversionTest);
48 void MacCoordinateConversionTest::SetUp() {
49 // Before swizzling, do a sanity check that the primary screen's origin is
50 // (0, 0). This should always be true.
51 NSRect primary_screen_frame = [[[NSScreen screens] objectAtIndex:0] frame];
52 EXPECT_EQ(0, primary_screen_frame.origin.x);
53 EXPECT_EQ(0, primary_screen_frame.origin.y);
55 swizzle_frame_.reset(new base::mac::ScopedObjCClassSwizzler(
57 [MacCoordinateConversionTestScreenDonor class],
60 primary_screen_frame = [[[NSScreen screens] objectAtIndex:0] frame];
61 EXPECT_EQ(kTestWidth, primary_screen_frame.size.width);
62 EXPECT_EQ(kTestHeight, primary_screen_frame.size.height);
65 void MacCoordinateConversionTest::TearDown() {
66 swizzle_frame_.reset();
71 // Tests for coordinate conversion on Mac. Start with the following setup:
74 // 189 10 Window of height 40 fills in pixel
75 // 179 --------- 20 at index 20
79 // 140 --------- 59 at index 59
80 // 130 69 (inclusive).
83 TEST_F(MacCoordinateConversionTest, ScreenRectToFromNSRect) {
84 // Window on the primary screen.
85 Rect gfx_rect = Rect(10, 20, 30, 40);
86 NSRect ns_rect = ScreenRectToNSRect(gfx_rect);
87 EXPECT_NSEQ(NSMakeRect(10, 140, 30, 40), ns_rect);
88 EXPECT_EQ(gfx_rect, ScreenRectFromNSRect(ns_rect));
90 // Window in a screen to the left of the primary screen.
91 gfx_rect = Rect(-40, 20, 30, 40);
92 ns_rect = ScreenRectToNSRect(gfx_rect);
93 EXPECT_NSEQ(NSMakeRect(-40, 140, 30, 40), ns_rect);
94 EXPECT_EQ(gfx_rect, ScreenRectFromNSRect(ns_rect));
96 // Window in a screen below the primary screen.
97 gfx_rect = Rect(10, 220, 30, 40);
98 ns_rect = ScreenRectToNSRect(gfx_rect);
99 EXPECT_NSEQ(NSMakeRect(10, -60, 30, 40), ns_rect);
100 EXPECT_EQ(gfx_rect, ScreenRectFromNSRect(ns_rect));
102 // Window in a screen below and to the left primary screen.
103 gfx_rect = Rect(-40, 220, 30, 40);
104 ns_rect = ScreenRectToNSRect(gfx_rect);
105 EXPECT_NSEQ(NSMakeRect(-40, -60, 30, 40), ns_rect);
106 EXPECT_EQ(gfx_rect, ScreenRectFromNSRect(ns_rect));
109 // Test point conversions using the same setup as ScreenRectToFromNSRect, but
110 // using only the origin.
111 TEST_F(MacCoordinateConversionTest, ScreenPointToFromNSPoint) {
112 // Point on the primary screen.
113 Point gfx_point = Point(10, 20);
114 NSPoint ns_point = ScreenPointToNSPoint(gfx_point);
115 EXPECT_NSEQ(NSMakePoint(10, 180), ns_point);
116 EXPECT_EQ(gfx_point, ScreenPointFromNSPoint(ns_point));
118 // Point in a screen to the left of the primary screen.
119 gfx_point = Point(-40, 20);
120 ns_point = ScreenPointToNSPoint(gfx_point);
121 EXPECT_NSEQ(NSMakePoint(-40, 180), ns_point);
122 EXPECT_EQ(gfx_point, ScreenPointFromNSPoint(ns_point));
124 // Point in a screen below the primary screen.
125 gfx_point = Point(10, 220);
126 ns_point = ScreenPointToNSPoint(gfx_point);
127 EXPECT_NSEQ(NSMakePoint(10, -20), ns_point);
128 EXPECT_EQ(gfx_point, ScreenPointFromNSPoint(ns_point));
130 // Point in a screen below and to the left primary screen.
131 gfx_point = Point(-40, 220);
132 ns_point = ScreenPointToNSPoint(gfx_point);
133 EXPECT_NSEQ(NSMakePoint(-40, -20), ns_point);
134 EXPECT_EQ(gfx_point, ScreenPointFromNSPoint(ns_point));