bookmark_bar_view_unittest.mm revision ddb351dbec246cf1fab5ec20d2d5520909041de1
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/memory/scoped_nsobject.h"
6#import "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.h"
7#import "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_view.h"
8#import "chrome/browser/ui/cocoa/bookmarks/bookmark_button.h"
9#import "chrome/browser/ui/cocoa/bookmarks/bookmark_folder_target.h"
10#import "chrome/browser/ui/cocoa/cocoa_test_helper.h"
11#import "chrome/browser/ui/cocoa/url_drop_target.h"
12#include "testing/gtest/include/gtest/gtest.h"
13#include "testing/platform_test.h"
14#import "third_party/mozilla/NSPasteboard+Utils.h"
15
16namespace {
17  const CGFloat kFakeIndicatorPos = 7.0;
18};
19
20// Fake DraggingInfo, fake BookmarkBarController, fake NSPasteboard...
21@interface FakeBookmarkDraggingInfo : NSObject {
22 @public
23  BOOL dragButtonToPong_;
24  BOOL dragURLsPong_;
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 (nonatomic) BOOL dropIndicatorShown;
32@property (nonatomic) BOOL draggingEnteredCalled;
33@property (nonatomic, copy) NSString* dragDataType;
34@end
35
36@implementation FakeBookmarkDraggingInfo
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- (BOOL)canEditBookmarks {
121  return YES;
122}
123
124// Confirm the pongs.
125
126- (BOOL)dragButtonToPong {
127  return dragButtonToPong_;
128}
129
130- (BOOL)dragURLsPong {
131  return dragURLsPong_;
132}
133
134- (BOOL)dragBookmarkDataPong {
135  return dragBookmarkDataPong_;
136}
137
138- (CGFloat)indicatorPosForDragToPoint:(NSPoint)point {
139  return kFakeIndicatorPos;
140}
141
142- (BOOL)shouldShowIndicatorShownForPoint:(NSPoint)point {
143  return dropIndicatorShown_;
144}
145
146- (BOOL)draggingAllowed:(id<NSDraggingInfo>)info {
147  return YES;
148}
149
150- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)info {
151  draggingEnteredCalled_ = YES;
152  return NSDragOperationNone;
153}
154
155- (void)setDropInsertionPos:(CGFloat)where {
156}
157
158- (void)clearDropInsertionPos {
159}
160
161@end
162
163namespace {
164
165class BookmarkBarViewTest : public CocoaTest {
166 public:
167  virtual void SetUp() {
168    CocoaTest::SetUp();
169    view_.reset([[BookmarkBarView alloc] init]);
170  }
171
172  scoped_nsobject<BookmarkBarView> view_;
173};
174
175TEST_F(BookmarkBarViewTest, CanDragWindow) {
176  EXPECT_FALSE([view_ mouseDownCanMoveWindow]);
177}
178
179TEST_F(BookmarkBarViewTest, BookmarkButtonDragAndDrop) {
180  scoped_nsobject<FakeBookmarkDraggingInfo>
181      info([[FakeBookmarkDraggingInfo alloc] init]);
182  [view_ setController:info.get()];
183  [info reset];
184
185  [info setDragDataType:kBookmarkButtonDragType];
186  EXPECT_EQ([view_ draggingEntered:(id)info.get()], NSDragOperationMove);
187  EXPECT_TRUE([view_ performDragOperation:(id)info.get()]);
188  EXPECT_TRUE([info dragButtonToPong]);
189  EXPECT_FALSE([info dragURLsPong]);
190  EXPECT_TRUE([info dragBookmarkDataPong]);
191}
192
193TEST_F(BookmarkBarViewTest, URLDragAndDrop) {
194  scoped_nsobject<FakeBookmarkDraggingInfo>
195      info([[FakeBookmarkDraggingInfo alloc] init]);
196  [view_ setController:info.get()];
197  [info reset];
198
199  NSArray* dragTypes = [URLDropTargetHandler handledDragTypes];
200  for (NSString* type in dragTypes) {
201    [info setDragDataType:type];
202    EXPECT_EQ([view_ draggingEntered:(id)info.get()], NSDragOperationMove);
203    EXPECT_TRUE([view_ performDragOperation:(id)info.get()]);
204    EXPECT_FALSE([info dragButtonToPong]);
205    EXPECT_TRUE([info dragURLsPong]);
206    EXPECT_TRUE([info dragBookmarkDataPong]);
207    [info reset];
208  }
209}
210
211TEST_F(BookmarkBarViewTest, BookmarkButtonDropIndicator) {
212  scoped_nsobject<FakeBookmarkDraggingInfo>
213      info([[FakeBookmarkDraggingInfo alloc] init]);
214  [view_ setController:info.get()];
215
216  [info reset];
217  [info setDragDataType:kBookmarkButtonDragType];
218  EXPECT_FALSE([info draggingEnteredCalled]);
219  EXPECT_EQ([view_ draggingEntered:(id)info.get()], NSDragOperationMove);
220  EXPECT_TRUE([info draggingEnteredCalled]);  // Ensure controller pinged.
221  EXPECT_TRUE([view_ dropIndicatorShown]);
222  EXPECT_EQ([view_ dropIndicatorPosition], kFakeIndicatorPos);
223
224  [info setDropIndicatorShown:NO];
225  EXPECT_EQ([view_ draggingEntered:(id)info.get()], NSDragOperationMove);
226  EXPECT_FALSE([view_ dropIndicatorShown]);
227}
228
229}  // namespace
230