tracking_area_unittest.mm revision dc0f95d653279beabeb9817299e2902918ba123e
1// Copyright (c) 2011 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#include "base/scoped_nsobject.h"
6#include "chrome/browser/ui/cocoa/cocoa_test_helper.h"
7#include "chrome/browser/ui/cocoa/objc_zombie.h"
8#import "chrome/browser/ui/cocoa/tracking_area.h"
9
10// A test object that counts the number of times a message is sent to it.
11@interface TestTrackingAreaOwner : NSObject {
12 @private
13  NSUInteger messageCount_;
14}
15@property(nonatomic, assign) NSUInteger messageCount;
16- (void)performMessage;
17@end
18
19@implementation TestTrackingAreaOwner
20@synthesize messageCount = messageCount_;
21- (void)performMessage {
22  ++messageCount_;
23}
24@end
25
26class CrTrackingAreaTest : public CocoaTest {
27 public:
28  CrTrackingAreaTest()
29      : owner_([[TestTrackingAreaOwner alloc] init]),
30        trackingArea_([[CrTrackingArea alloc]
31            initWithRect:NSMakeRect(0, 0, 100, 100)
32                 options:NSTrackingMouseMoved | NSTrackingActiveInKeyWindow
33            proxiedOwner:owner_.get()
34                userInfo:nil]) {
35  }
36
37  scoped_nsobject<TestTrackingAreaOwner> owner_;
38  scoped_nsobject<CrTrackingArea> trackingArea_;
39};
40
41TEST_F(CrTrackingAreaTest, OwnerForwards) {
42  [[trackingArea_ owner] performMessage];
43  EXPECT_EQ(1U, [owner_ messageCount]);
44
45  [[trackingArea_ owner] performMessage];
46  EXPECT_EQ(2U, [owner_ messageCount]);
47}
48
49TEST_F(CrTrackingAreaTest, OwnerStopsForwarding) {
50  [[trackingArea_ owner] performMessage];
51  EXPECT_EQ(1U, [owner_ messageCount]);
52
53  [trackingArea_ clearOwner];
54
55  [[trackingArea_ owner] performMessage];
56  EXPECT_EQ(1U, [owner_ messageCount]);
57}
58
59TEST_F(CrTrackingAreaTest, OwnerAutomaticallyStopsForwardingOnClose) {
60  [test_window() orderFront:nil];
61  [trackingArea_ clearOwnerWhenWindowWillClose:test_window()];
62
63  [[trackingArea_ owner] performMessage];
64  EXPECT_EQ(1U, [owner_ messageCount]);
65
66  [test_window() close];
67
68  [[trackingArea_ owner] performMessage];
69  EXPECT_EQ(1U, [owner_ messageCount]);
70}
71
72TEST_F(CrTrackingAreaTest, ZombieOwner) {
73  EXPECT_TRUE(ObjcEvilDoers::ZombieEnable(NO, 20));
74
75  [[trackingArea_ owner] performMessage];
76  EXPECT_EQ(1U, [owner_ messageCount]);
77
78  [owner_ shouldBecomeCrZombie];
79  owner_.reset();
80  [trackingArea_ clearOwner];
81
82  [[trackingArea_ owner] performMessage];
83  // Don't crash!
84
85  ObjcEvilDoers::ZombieDisable();
86}
87
88TEST_F(CrTrackingAreaTest, ScoperInit) {
89  {
90    ScopedCrTrackingArea scoper([trackingArea_ retain]);
91    [[scoper.get() owner] performMessage];
92    EXPECT_EQ(1U, [owner_ messageCount]);
93  }
94
95  [[trackingArea_ owner] performMessage];
96  EXPECT_EQ(1U, [owner_ messageCount]);
97}
98
99TEST_F(CrTrackingAreaTest, ScoperReset) {
100  {
101    ScopedCrTrackingArea scoper;
102    EXPECT_FALSE(scoper.get());
103
104    scoper.reset([trackingArea_ retain]);
105    [[scoper.get() owner] performMessage];
106    EXPECT_EQ(1U, [owner_ messageCount]);
107
108    [[scoper.get() owner] performMessage];
109    EXPECT_EQ(2U, [owner_ messageCount]);
110  }
111
112  [[trackingArea_ owner] performMessage];
113  EXPECT_EQ(2U, [owner_ messageCount]);
114}
115