OLD | NEW |
---|---|
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/memory/scoped_nsobject.h" | 5 #include "base/memory/scoped_nsobject.h" |
6 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.h" | 6 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller.h" |
7 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_view.h" | 7 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_view.h" |
8 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_button.h" | 8 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_button.h" |
9 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_folder_target.h" | 9 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_folder_target.h" |
10 #import "chrome/browser/ui/cocoa/cocoa_test_helper.h" | 10 #import "chrome/browser/ui/cocoa/cocoa_test_helper.h" |
11 #import "chrome/browser/ui/cocoa/url_drop_target.h" | 11 #import "chrome/browser/ui/cocoa/url_drop_target.h" |
12 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
13 #include "testing/platform_test.h" | 13 #include "testing/platform_test.h" |
14 #import "third_party/mozilla/NSPasteboard+Utils.h" | 14 #import "third_party/mozilla/NSPasteboard+Utils.h" |
15 #import "third_party/ocmock/OCMock/OCMock.h" | |
15 | 16 |
16 namespace { | 17 namespace { |
17 const CGFloat kFakeIndicatorPos = 7.0; | |
18 }; | |
19 | 18 |
20 // Fake DraggingInfo, fake BookmarkBarController, fake NSPasteboard... | 19 // Some values used for mocks and fakes. |
21 @interface FakeDraggingInfo : NSObject { | 20 const CGFloat kFakeIndicatorPos = 7.0; |
22 @public | 21 const NSPoint kPoint = {10, 10}; |
23 BOOL dragButtonToPong_; | 22 const BOOL kYes = YES; |
24 BOOL dragURLsPong_; | 23 const BOOL kNo = NO; |
25 BOOL dragBookmarkDataPong_; | |
26 BOOL dropIndicatorShown_; | |
27 BOOL draggingEnteredCalled_; | |
28 // Only mock one type of drag data at a time. | |
29 NSString* dragDataType_; | |
30 } | |
31 @property (readwrite) BOOL dropIndicatorShown; | |
32 @property (readwrite) BOOL draggingEnteredCalled; | |
33 @property (copy) NSString* dragDataType; | |
34 @end | |
35 | |
36 @implementation FakeDraggingInfo | |
37 | |
38 @synthesize dropIndicatorShown = dropIndicatorShown_; | |
39 @synthesize draggingEnteredCalled = draggingEnteredCalled_; | |
40 @synthesize dragDataType = dragDataType_; | |
41 | |
42 - (id)init { | |
43 if ((self = [super init])) { | |
44 dropIndicatorShown_ = YES; | |
45 } | |
46 return self; | |
47 } | |
48 | |
49 - (void)dealloc { | |
50 [dragDataType_ release]; | |
51 [super dealloc]; | |
52 } | |
53 | |
54 - (void)reset { | |
55 [dragDataType_ release]; | |
56 dragDataType_ = nil; | |
57 dragButtonToPong_ = NO; | |
58 dragURLsPong_ = NO; | |
59 dragBookmarkDataPong_ = NO; | |
60 dropIndicatorShown_ = YES; | |
61 draggingEnteredCalled_ = NO; | |
62 } | |
63 | |
64 // NSDragInfo mocking functions. | |
65 | |
66 - (id)draggingPasteboard { | |
67 return self; | |
68 } | |
69 | |
70 // So we can look local. | |
71 - (id)draggingSource { | |
72 return self; | |
73 } | |
74 | |
75 - (NSDragOperation)draggingSourceOperationMask { | |
76 return NSDragOperationCopy | NSDragOperationMove; | |
77 } | |
78 | |
79 - (NSPoint)draggingLocation { | |
80 return NSMakePoint(10, 10); | |
81 } | |
82 | |
83 // NSPasteboard mocking functions. | |
84 | |
85 - (BOOL)containsURLData { | |
86 NSArray* urlTypes = [URLDropTargetHandler handledDragTypes]; | |
87 if (dragDataType_) | |
88 return [urlTypes containsObject:dragDataType_]; | |
89 return NO; | |
90 } | |
91 | |
92 - (NSData*)dataForType:(NSString*)type { | |
93 if (dragDataType_ && [dragDataType_ isEqualToString:type]) | |
94 return [NSData data]; // Return something, anything. | |
95 return nil; | |
96 } | |
97 | |
98 // Fake a controller for callback ponging | |
99 | |
100 - (BOOL)dragButton:(BookmarkButton*)button to:(NSPoint)point copy:(BOOL)copy { | |
101 dragButtonToPong_ = YES; | |
102 return YES; | |
103 } | |
104 | |
105 - (BOOL)addURLs:(NSArray*)urls withTitles:(NSArray*)titles at:(NSPoint)point { | |
106 dragURLsPong_ = YES; | |
107 return YES; | |
108 } | |
109 | |
110 - (void)getURLs:(NSArray**)outUrls | |
111 andTitles:(NSArray**)outTitles | |
112 convertingFilenames:(BOOL)convertFilenames { | |
113 } | |
114 | |
115 - (BOOL)dragBookmarkData:(id<NSDraggingInfo>)info { | |
116 dragBookmarkDataPong_ = YES; | |
117 return NO; | |
118 } | |
119 | |
120 // Confirm the pongs. | |
121 | |
122 - (BOOL)dragButtonToPong { | |
123 return dragButtonToPong_; | |
124 } | |
125 | |
126 - (BOOL)dragURLsPong { | |
127 return dragURLsPong_; | |
128 } | |
129 | |
130 - (BOOL)dragBookmarkDataPong { | |
131 return dragBookmarkDataPong_; | |
132 } | |
133 | |
134 - (CGFloat)indicatorPosForDragToPoint:(NSPoint)point { | |
135 return kFakeIndicatorPos; | |
136 } | |
137 | |
138 - (BOOL)shouldShowIndicatorShownForPoint:(NSPoint)point { | |
139 return dropIndicatorShown_; | |
140 } | |
141 | |
142 - (BOOL)draggingAllowed:(id<NSDraggingInfo>)info { | |
143 return YES; | |
144 } | |
145 | |
146 - (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)info { | |
147 draggingEnteredCalled_ = YES; | |
148 return NSDragOperationNone; | |
149 } | |
150 | |
151 @end | |
152 | |
153 namespace { | |
154 | 24 |
155 class BookmarkBarFolderViewTest : public CocoaTest { | 25 class BookmarkBarFolderViewTest : public CocoaTest { |
156 public: | 26 public: |
157 virtual void SetUp() { | 27 virtual void SetUp() { |
158 CocoaTest::SetUp(); | 28 CocoaTest::SetUp(); |
159 view_.reset([[BookmarkBarFolderView alloc] init]); | 29 view_.reset([[BookmarkBarFolderView alloc] init]); |
30 mock_controller_.reset([GetMockController(YES) retain]); | |
31 [view_ awakeFromNib]; | |
32 [view_ setController:mock_controller_]; | |
160 } | 33 } |
161 | 34 |
35 virtual void TearDown() { | |
36 [mock_controller_ verify]; | |
37 CocoaTest::TearDown(); | |
38 } | |
39 | |
40 id GetFakePasteboardForType(NSString* dataType) { | |
41 id pasteboard = [OCMockObject mockForClass:[NSPasteboard class]]; | |
42 [[[pasteboard stub] andReturn:[NSData data]] dataForType:dataType]; | |
43 [[[pasteboard stub] andReturn:nil] dataForType:OCMOCK_ANY]; | |
44 [[[pasteboard stub] andReturnValue:OCMOCK_VALUE(kYes)] containsURLData]; | |
45 [[pasteboard stub] getURLs:[OCMArg setTo:nil] | |
46 andTitles:[OCMArg setTo:nil] | |
47 convertingFilenames:YES]; | |
48 return pasteboard; | |
49 } | |
50 | |
51 id GetFakeDragInfoForType(NSString* dataType) { | |
52 id drag_info = [OCMockObject mockForProtocol:@protocol(NSDraggingInfo)]; | |
53 id pasteboard = GetFakePasteboardForType(dataType); | |
54 [[[drag_info stub] andReturn:pasteboard] draggingPasteboard]; | |
55 [[[drag_info stub] andReturnValue:[NSValue valueWithPoint:kPoint]] | |
56 draggingLocation]; | |
57 [[[drag_info stub] andReturn:drag_info] | |
58 draggingSource]; | |
59 NSDragOperation drag_operation = NSDragOperationCopy | NSDragOperationMove; | |
60 [[[drag_info stub] andReturnValue:OCMOCK_VALUE(drag_operation)] | |
61 draggingSourceOperationMask]; | |
62 return drag_info; | |
63 } | |
64 | |
65 id GetMockController(BOOL show_indicator) { | |
66 id mock_controller | |
67 = [OCMockObject mockForClass:[BookmarkBarFolderController class]]; | |
68 [[[mock_controller stub] andReturnValue:OCMOCK_VALUE(kYes)] | |
69 draggingAllowed:OCMOCK_ANY]; | |
70 [[[mock_controller stub] andReturnValue:OCMOCK_VALUE(show_indicator)] | |
71 shouldShowIndicatorShownForPoint:kPoint]; | |
72 [[[mock_controller stub] andReturnValue:OCMOCK_VALUE(kFakeIndicatorPos)] | |
73 indicatorPosForDragToPoint:kPoint]; | |
74 return mock_controller; | |
75 } | |
76 | |
77 scoped_nsobject<id> mock_controller_; | |
162 scoped_nsobject<BookmarkBarFolderView> view_; | 78 scoped_nsobject<BookmarkBarFolderView> view_; |
163 }; | 79 }; |
164 | 80 |
81 | |
mrossetti
2011/05/18 20:38:30
Nit: extra line.
| |
165 TEST_F(BookmarkBarFolderViewTest, BookmarkButtonDragAndDrop) { | 82 TEST_F(BookmarkBarFolderViewTest, BookmarkButtonDragAndDrop) { |
166 [view_ awakeFromNib]; | 83 id drag_info = GetFakeDragInfoForType(kBookmarkButtonDragType); |
167 scoped_nsobject<FakeDraggingInfo> info([[FakeDraggingInfo alloc] init]); | 84 NSDragOperation expectedValue = NSDragOperationNone; |
168 [view_ setController:info.get()]; | 85 [[[mock_controller_ expect] andReturnValue:OCMOCK_VALUE(expectedValue)] |
169 [info reset]; | 86 draggingEntered:drag_info]; |
87 [[[mock_controller_ expect] andReturnValue:OCMOCK_VALUE(kNo)] | |
88 dragBookmarkData:drag_info]; | |
89 [[[mock_controller_ expect] andReturnValue:OCMOCK_VALUE(kYes)] | |
90 dragButton:OCMOCK_ANY to:kPoint copy:NO]; | |
170 | 91 |
171 [info setDragDataType:kBookmarkButtonDragType]; | 92 EXPECT_EQ([view_ draggingEntered:drag_info], NSDragOperationMove); |
172 EXPECT_EQ([view_ draggingEntered:(id)info.get()], NSDragOperationMove); | 93 EXPECT_TRUE([view_ performDragOperation:drag_info]); |
173 EXPECT_TRUE([view_ performDragOperation:(id)info.get()]); | |
174 EXPECT_TRUE([info dragButtonToPong]); | |
175 EXPECT_FALSE([info dragURLsPong]); | |
176 EXPECT_TRUE([info dragBookmarkDataPong]); | |
177 } | 94 } |
178 | 95 |
179 TEST_F(BookmarkBarFolderViewTest, URLDragAndDrop) { | 96 TEST_F(BookmarkBarFolderViewTest, URLDragAndDrop) { |
180 [view_ awakeFromNib]; | |
181 scoped_nsobject<FakeDraggingInfo> info([[FakeDraggingInfo alloc] init]); | |
182 [view_ setController:info.get()]; | |
183 [info reset]; | |
184 | |
185 NSArray* dragTypes = [URLDropTargetHandler handledDragTypes]; | 97 NSArray* dragTypes = [URLDropTargetHandler handledDragTypes]; |
186 for (NSString* type in dragTypes) { | 98 for (NSString* type in dragTypes) { |
187 [info setDragDataType:type]; | 99 id drag_info = GetFakeDragInfoForType(type); |
188 EXPECT_EQ([view_ draggingEntered:(id)info.get()], NSDragOperationMove); | 100 NSDragOperation expectedValue = NSDragOperationNone; |
189 EXPECT_TRUE([view_ performDragOperation:(id)info.get()]); | 101 [[[mock_controller_ expect] andReturnValue:OCMOCK_VALUE(expectedValue)] |
190 EXPECT_FALSE([info dragButtonToPong]); | 102 draggingEntered:drag_info]; |
191 EXPECT_TRUE([info dragURLsPong]); | 103 [[[mock_controller_ expect] andReturnValue:OCMOCK_VALUE(kNo)] |
192 EXPECT_TRUE([info dragBookmarkDataPong]); | 104 dragBookmarkData:drag_info]; |
193 [info reset]; | 105 [[[mock_controller_ expect] andReturnValue:OCMOCK_VALUE(kYes)] |
106 addURLs:OCMOCK_ANY withTitles:OCMOCK_ANY at:kPoint]; | |
107 EXPECT_EQ([view_ draggingEntered:drag_info], NSDragOperationMove); | |
108 EXPECT_TRUE([view_ performDragOperation:drag_info]); | |
109 [mock_controller_ verify]; | |
194 } | 110 } |
195 } | 111 } |
196 | 112 |
197 TEST_F(BookmarkBarFolderViewTest, BookmarkButtonDropIndicator) { | 113 TEST_F(BookmarkBarFolderViewTest, BookmarkButtonDropIndicator) { |
198 [view_ awakeFromNib]; | |
199 scoped_nsobject<FakeDraggingInfo> info([[FakeDraggingInfo alloc] init]); | |
200 [view_ setController:info.get()]; | |
201 [info reset]; | |
202 | 114 |
mrossetti
2011/05/18 20:38:30
Nit: Extra line.
| |
203 [info setDragDataType:kBookmarkButtonDragType]; | 115 id drag_info = GetFakeDragInfoForType(kBookmarkButtonDragType); |
204 EXPECT_FALSE([info draggingEnteredCalled]); | 116 NSDragOperation expectedValue = NSDragOperationNone; |
205 EXPECT_EQ([view_ draggingEntered:(id)info.get()], NSDragOperationMove); | 117 [[[mock_controller_ expect] andReturnValue:OCMOCK_VALUE(expectedValue)] |
206 EXPECT_TRUE([info draggingEnteredCalled]); // Ensure controller pinged. | 118 draggingEntered:drag_info]; |
119 EXPECT_EQ([view_ draggingEntered:drag_info], NSDragOperationMove); | |
120 [mock_controller_ verify]; | |
207 EXPECT_TRUE([view_ dropIndicatorShown]); | 121 EXPECT_TRUE([view_ dropIndicatorShown]); |
208 EXPECT_EQ([view_ dropIndicatorPosition], kFakeIndicatorPos); | 122 EXPECT_EQ([view_ dropIndicatorPosition], kFakeIndicatorPos); |
209 | 123 mock_controller_.reset([GetMockController(NO) retain]); |
210 [info setDropIndicatorShown:NO]; | 124 [view_ setController:mock_controller_]; |
211 EXPECT_EQ([view_ draggingEntered:(id)info.get()], NSDragOperationMove); | 125 [[[mock_controller_ expect] andReturnValue:OCMOCK_VALUE(expectedValue)] |
126 draggingEntered:drag_info]; | |
127 EXPECT_EQ([view_ draggingEntered:drag_info], NSDragOperationMove); | |
212 EXPECT_FALSE([view_ dropIndicatorShown]); | 128 EXPECT_FALSE([view_ dropIndicatorShown]); |
213 } | 129 } |
214 | 130 |
215 } // namespace | 131 } // namespace |
OLD | NEW |