• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
4
5#import "ui/gfx/mac/coordinate_conversion.h"
6
7#import <Cocoa/Cocoa.h>
8
9#import "base/mac/scoped_objc_class_swizzler.h"
10#include "base/macros.h"
11#include "base/memory/scoped_ptr.h"
12#import "testing/platform_test.h"
13#include "ui/gfx/geometry/rect.h"
14
15const int kTestWidth = 320;
16const int kTestHeight = 200;
17
18// Class to donate an implementation of -[NSScreen frame] that provides a known
19// value for robust tests.
20@interface MacCoordinateConversionTestScreenDonor : NSObject
21- (NSRect)frame;
22@end
23
24@implementation MacCoordinateConversionTestScreenDonor
25- (NSRect)frame {
26  return NSMakeRect(0, 0, kTestWidth, kTestHeight);
27}
28@end
29
30namespace gfx {
31namespace {
32
33class MacCoordinateConversionTest : public PlatformTest {
34 public:
35  MacCoordinateConversionTest() {}
36
37  // Overridden from testing::Test:
38  virtual void SetUp() OVERRIDE;
39  virtual void TearDown() OVERRIDE;
40
41 private:
42  scoped_ptr<base::mac::ScopedObjCClassSwizzler> swizzle_frame_;
43
44  DISALLOW_COPY_AND_ASSIGN(MacCoordinateConversionTest);
45};
46
47void MacCoordinateConversionTest::SetUp() {
48  // Before swizzling, do a sanity check that the primary screen's origin is
49  // (0, 0). This should always be true.
50  NSRect primary_screen_frame = [[[NSScreen screens] objectAtIndex:0] frame];
51  EXPECT_EQ(0, primary_screen_frame.origin.x);
52  EXPECT_EQ(0, primary_screen_frame.origin.y);
53
54  swizzle_frame_.reset(new base::mac::ScopedObjCClassSwizzler(
55      [NSScreen class],
56      [MacCoordinateConversionTestScreenDonor class],
57      @selector(frame)));
58
59  primary_screen_frame = [[[NSScreen screens] objectAtIndex:0] frame];
60  EXPECT_EQ(kTestWidth, primary_screen_frame.size.width);
61  EXPECT_EQ(kTestHeight, primary_screen_frame.size.height);
62}
63
64void MacCoordinateConversionTest::TearDown() {
65  swizzle_frame_.reset();
66}
67
68}  // namespace
69
70// Tests for coordinate conversion on Mac. Start with the following setup:
71// AppKit ....... gfx
72// 199              0
73// 189             10   Window of height 40 fills in pixel
74// 179  ---------  20   at index 20
75// 169  |       |  30   through
76// ...  :       :  ..   to
77// 150  |       |  49   pixel
78// 140  ---------  59   at index 59
79// 130             69   (inclusive).
80//  ..             ..
81//   0            199
82TEST_F(MacCoordinateConversionTest, ScreenRectToFromNSRect) {
83  Rect gfx_rect = Rect(10, 20, 30, 40);
84  NSRect ns_rect = ScreenRectToNSRect(gfx_rect);
85  EXPECT_TRUE(NSEqualRects(NSMakeRect(10, 140, 30, 40), ns_rect));
86  EXPECT_EQ(gfx_rect.ToString(), ScreenRectFromNSRect(ns_rect).ToString());
87
88  // Window in a screen to the left of the primary screen.
89  gfx_rect = Rect(-40, 20, 30, 40);
90  ns_rect = ScreenRectToNSRect(gfx_rect);
91  EXPECT_TRUE(NSEqualRects(NSMakeRect(-40, 140, 30, 40), ns_rect));
92  EXPECT_EQ(gfx_rect.ToString(), ScreenRectFromNSRect(ns_rect).ToString());
93
94  // Window in a screen below the primary screen.
95  gfx_rect = Rect(10, 220, 30, 40);
96  ns_rect = ScreenRectToNSRect(gfx_rect);
97  EXPECT_TRUE(NSEqualRects(NSMakeRect(10, -60, 30, 40), ns_rect));
98  EXPECT_EQ(gfx_rect.ToString(), ScreenRectFromNSRect(ns_rect).ToString());
99
100  // Window in a screen below and to the left primary screen.
101  gfx_rect = Rect(-40, 220, 30, 40);
102  ns_rect = ScreenRectToNSRect(gfx_rect);
103  EXPECT_TRUE(NSEqualRects(NSMakeRect(-40, -60, 30, 40), ns_rect));
104  EXPECT_EQ(gfx_rect.ToString(), ScreenRectFromNSRect(ns_rect).ToString());
105}
106
107}  // namespace gfx
108