OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2009 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 <Cocoa/Cocoa.h> |
| 6 |
| 7 #include "base/basictypes.h" |
| 8 #include "base/scoped_nsobject.h" |
| 9 #import "chrome/browser/cocoa/bookmark_bubble_controller.h" |
| 10 #include "chrome/browser/cocoa/browser_test_helper.h" |
| 11 #import "chrome/browser/cocoa/cocoa_test_helper.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" |
| 13 #include "testing/platform_test.h" |
| 14 |
| 15 @interface BBDelegate : NSObject<BookmarkBubbleControllerDelegate> { |
| 16 NSWindow* window_; // weak |
| 17 int edits_; |
| 18 int dones_; |
| 19 } |
| 20 @property (readonly) int edits; |
| 21 @property (readonly) int dones; |
| 22 @property (readonly) NSWindow* window; |
| 23 @end |
| 24 |
| 25 @implementation BBDelegate |
| 26 |
| 27 @synthesize edits = edits_; |
| 28 @synthesize window = window_; |
| 29 @synthesize dones = dones_; |
| 30 |
| 31 - (NSPoint)topLeftForBubble { |
| 32 return NSMakePoint(10, 300); |
| 33 } |
| 34 |
| 35 - (void)editBookmarkNode:(const BookmarkNode*)node { |
| 36 edits_++; |
| 37 } |
| 38 |
| 39 - (void)doneWithBubbleController:(BookmarkBubbleController*)controller { |
| 40 dones_++; |
| 41 } |
| 42 |
| 43 - (void)clear { |
| 44 edits_ = 0; |
| 45 dones_ = 0; |
| 46 } |
| 47 |
| 48 @end |
| 49 |
| 50 namespace { |
| 51 |
| 52 class BookmarkBubbleControllerTest : public PlatformTest { |
| 53 public: |
| 54 CocoaTestHelper cocoa_helper_; // Inits Cocoa, creates window, etc... |
| 55 BrowserTestHelper helper_; |
| 56 scoped_nsobject<BBDelegate> delegate_; |
| 57 scoped_nsobject<BookmarkBubbleController> controller_; |
| 58 |
| 59 BookmarkBubbleControllerTest() { |
| 60 delegate_.reset([[BBDelegate alloc] init]); |
| 61 } |
| 62 |
| 63 // Returns a controller but ownership not transferred. |
| 64 // Only one of these will be valid at a time. |
| 65 BookmarkBubbleController* ControllerForNode(const BookmarkNode* node) { |
| 66 controller_.reset([[BookmarkBubbleController alloc] |
| 67 initWithDelegate:delegate_.get() |
| 68 parentWindow:cocoa_helper_.window() |
| 69 topLeftForBubble:[delegate_ topLeftForBubble] |
| 70 model:helper_.profile()->GetBookmarkModel() |
| 71 node:node |
| 72 alreadyBookmarked:YES]); |
| 73 [controller_ view]; // force nib load |
| 74 return controller_.get(); |
| 75 } |
| 76 |
| 77 BookmarkModel* GetBookmarkModel() { |
| 78 return helper_.profile()->GetBookmarkModel(); |
| 79 } |
| 80 }; |
| 81 |
| 82 // Confirm basics about the bubble window (e.g. that it is inside the |
| 83 // parent window) |
| 84 TEST_F(BookmarkBubbleControllerTest, TestBubbleWindow) { |
| 85 BookmarkModel* model = GetBookmarkModel(); |
| 86 const BookmarkNode* node = model->AddURL(model->GetBookmarkBarNode(), |
| 87 0, |
| 88 L"Bookie markie title", |
| 89 GURL("http://www.google.com")); |
| 90 BookmarkBubbleController* controller = ControllerForNode(node); |
| 91 EXPECT_TRUE(controller); |
| 92 NSWindow* window = [controller createBubbleWindow]; |
| 93 EXPECT_TRUE(window); |
| 94 EXPECT_TRUE(NSContainsRect([cocoa_helper_.window() frame], |
| 95 [window frame])); |
| 96 } |
| 97 |
| 98 // Confirm population of folder list |
| 99 TEST_F(BookmarkBubbleControllerTest, TestFillInFolder) { |
| 100 // Create some folders, including a nested folder |
| 101 BookmarkModel* model = GetBookmarkModel(); |
| 102 const BookmarkNode* node1 = model->AddGroup(model->GetBookmarkBarNode(), |
| 103 0, L"one"); |
| 104 const BookmarkNode* node2 = model->AddGroup(model->GetBookmarkBarNode(), |
| 105 1, L"two"); |
| 106 const BookmarkNode* node3 = model->AddGroup(model->GetBookmarkBarNode(), |
| 107 2, L"three"); |
| 108 const BookmarkNode* node4 = model->AddGroup(node2, |
| 109 0, L"sub"); |
| 110 model->AddURL(node1, 0, L"title1", GURL("http://www.google.com")); |
| 111 model->AddURL(node3, 0, L"title2", GURL("http://www.google.com")); |
| 112 model->AddURL(node4, 0, L"title3", GURL("http://www.google.com/reader")); |
| 113 |
| 114 BookmarkBubbleController* controller = ControllerForNode(node4); |
| 115 EXPECT_TRUE(controller); |
| 116 |
| 117 NSArray* items = [[controller folderComboBox] objectValues]; |
| 118 EXPECT_TRUE([items containsObject:@"one"]); |
| 119 EXPECT_TRUE([items containsObject:@"two"]); |
| 120 EXPECT_TRUE([items containsObject:@"three"]); |
| 121 EXPECT_TRUE([items containsObject:@"sub"]); |
| 122 EXPECT_FALSE([items containsObject:@"title1"]); |
| 123 EXPECT_FALSE([items containsObject:@"title2"]); |
| 124 } |
| 125 |
| 126 // Click on edit; bubble gets closed. |
| 127 TEST_F(BookmarkBubbleControllerTest, TestSimpleActions) { |
| 128 BookmarkModel* model = GetBookmarkModel(); |
| 129 const BookmarkNode* node = model->AddURL(model->GetBookmarkBarNode(), |
| 130 0, |
| 131 L"Bookie markie title", |
| 132 GURL("http://www.google.com")); |
| 133 BookmarkBubbleController* controller = ControllerForNode(node); |
| 134 EXPECT_TRUE(controller); |
| 135 |
| 136 EXPECT_EQ([delegate_ edits], 0); |
| 137 EXPECT_EQ([delegate_ dones], 0); |
| 138 EXPECT_FALSE([controller windowHasBeenClosed]); |
| 139 [controller edit:controller]; |
| 140 EXPECT_EQ([delegate_ edits], 1); |
| 141 EXPECT_EQ([delegate_ dones], 1); |
| 142 EXPECT_TRUE([controller windowHasBeenClosed]); |
| 143 |
| 144 [delegate_ clear]; |
| 145 EXPECT_EQ([delegate_ edits], 0); |
| 146 EXPECT_EQ([delegate_ dones], 0); |
| 147 |
| 148 controller = ControllerForNode(node); |
| 149 EXPECT_TRUE(controller); |
| 150 EXPECT_FALSE([controller windowHasBeenClosed]); |
| 151 [controller close:controller]; |
| 152 EXPECT_EQ([delegate_ edits], 0); |
| 153 EXPECT_EQ([delegate_ dones], 1); |
| 154 EXPECT_TRUE([controller windowHasBeenClosed]); |
| 155 } |
| 156 |
| 157 // User changes title and parent folder in the UI |
| 158 TEST_F(BookmarkBubbleControllerTest, TestUserEdit) { |
| 159 BookmarkModel* model = GetBookmarkModel(); |
| 160 const BookmarkNode* node = model->AddURL(model->GetBookmarkBarNode(), |
| 161 0, |
| 162 L"short-title", |
| 163 GURL("http://www.google.com")); |
| 164 model->AddGroup(model->GetBookmarkBarNode(), 0, L"grandma"); |
| 165 model->AddGroup(model->GetBookmarkBarNode(), 0, L"grandpa"); |
| 166 BookmarkBubbleController* controller = ControllerForNode(node); |
| 167 EXPECT_TRUE(controller); |
| 168 |
| 169 // simulate a user edit |
| 170 [controller setTitle:@"oops" parentFolder:@"grandma"]; |
| 171 [controller edit:controller]; |
| 172 |
| 173 // Make sure bookmark has changed |
| 174 EXPECT_EQ(node->GetTitle(), L"oops"); |
| 175 EXPECT_EQ(node->GetParent()->GetTitle(), L"grandma"); |
| 176 } |
| 177 |
| 178 // Click the "remove" button |
| 179 TEST_F(BookmarkBubbleControllerTest, TestRemove) { |
| 180 BookmarkModel* model = GetBookmarkModel(); |
| 181 GURL gurl("http://www.google.com"); |
| 182 const BookmarkNode* node = model->AddURL(model->GetBookmarkBarNode(), |
| 183 0, |
| 184 L"Bookie markie title", |
| 185 gurl); |
| 186 BookmarkBubbleController* controller = ControllerForNode(node); |
| 187 EXPECT_TRUE(controller); |
| 188 EXPECT_TRUE(model->IsBookmarked(gurl)); |
| 189 |
| 190 [controller remove:controller]; |
| 191 EXPECT_FALSE(model->IsBookmarked(gurl)); |
| 192 EXPECT_TRUE([controller windowHasBeenClosed]); |
| 193 EXPECT_EQ([delegate_ dones], 1); |
| 194 } |
| 195 |
| 196 // Confirm picking "choose another folder" caused edit: to be called. |
| 197 TEST_F(BookmarkBubbleControllerTest, ComboSelectionChanged) { |
| 198 BookmarkModel* model = GetBookmarkModel(); |
| 199 GURL gurl("http://www.google.com"); |
| 200 const BookmarkNode* node = model->AddURL(model->GetBookmarkBarNode(), |
| 201 0, L"super-title", |
| 202 gurl); |
| 203 BookmarkBubbleController* controller = ControllerForNode(node); |
| 204 EXPECT_TRUE(controller); |
| 205 |
| 206 NSString* chooseAnotherFolder = [controller chooseAnotherFolderString]; |
| 207 EXPECT_EQ([delegate_ edits], 0); |
| 208 [controller setTitle:@"DOH!" parentFolder:chooseAnotherFolder]; |
| 209 EXPECT_EQ([delegate_ edits], 1); |
| 210 } |
| 211 |
| 212 |
| 213 } // namespace |
OLD | NEW |