bookmark_editor_base_controller_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#import <Cocoa/Cocoa.h>
6
7#include "base/memory/scoped_nsobject.h"
8#include "base/sys_string_conversions.h"
9#include "base/utf_string_conversions.h"
10#include "chrome/browser/bookmarks/bookmark_model.h"
11#import "chrome/browser/ui/cocoa/bookmarks/bookmark_editor_controller.h"
12#include "chrome/browser/ui/cocoa/browser_test_helper.h"
13#import "chrome/browser/ui/cocoa/cocoa_test_helper.h"
14#include "grit/generated_resources.h"
15#include "testing/gtest/include/gtest/gtest.h"
16#import "testing/gtest_mac.h"
17#include "testing/platform_test.h"
18#include "ui/base/l10n/l10n_util_mac.h"
19
20class BookmarkEditorBaseControllerTest : public CocoaTest {
21 public:
22  BrowserTestHelper browser_helper_;
23  BookmarkEditorBaseController* controller_;  // weak
24  const BookmarkNode* folder_a_;
25  const BookmarkNode* folder_b_;
26  const BookmarkNode* folder_b_0_;
27  const BookmarkNode* folder_b_3_;
28  const BookmarkNode* folder_c_;
29
30  BookmarkEditorBaseControllerTest() {
31    // Set up a small bookmark hierarchy, which will look as follows:
32    //    a      b      c    d
33    //     a-0    b-0    c-0
34    //     a-1     b-00  c-1
35    //     a-2    b-1    c-2
36    //            b-2    c-3
37    //            b-3
38    //             b-30
39    //             b-31
40    //            b-4
41    BookmarkModel& model(*(browser_helper_.profile()->GetBookmarkModel()));
42    const BookmarkNode* root = model.GetBookmarkBarNode();
43    folder_a_ = model.AddFolder(root, 0, ASCIIToUTF16("a"));
44    model.AddURL(folder_a_, 0, ASCIIToUTF16("a-0"), GURL("http://a-0.com"));
45    model.AddURL(folder_a_, 1, ASCIIToUTF16("a-1"), GURL("http://a-1.com"));
46    model.AddURL(folder_a_, 2, ASCIIToUTF16("a-2"), GURL("http://a-2.com"));
47
48    folder_b_ = model.AddFolder(root, 1, ASCIIToUTF16("b"));
49    folder_b_0_ = model.AddFolder(folder_b_, 0, ASCIIToUTF16("b-0"));
50    model.AddURL(folder_b_0_, 0, ASCIIToUTF16("bb-0"), GURL("http://bb-0.com"));
51    model.AddURL(folder_b_, 1, ASCIIToUTF16("b-1"), GURL("http://b-1.com"));
52    model.AddURL(folder_b_, 2, ASCIIToUTF16("b-2"), GURL("http://b-2.com"));
53    folder_b_3_ = model.AddFolder(folder_b_, 3, ASCIIToUTF16("b-3"));
54    model.AddURL(folder_b_3_, 0, ASCIIToUTF16("b-30"), GURL("http://b-30.com"));
55    model.AddURL(folder_b_3_, 1, ASCIIToUTF16("b-31"), GURL("http://b-31.com"));
56    model.AddURL(folder_b_, 4, ASCIIToUTF16("b-4"), GURL("http://b-4.com"));
57
58    folder_c_ = model.AddFolder(root, 2, ASCIIToUTF16("c"));
59    model.AddURL(folder_c_, 0, ASCIIToUTF16("c-0"), GURL("http://c-0.com"));
60    model.AddURL(folder_c_, 1, ASCIIToUTF16("c-1"), GURL("http://c-1.com"));
61    model.AddURL(folder_c_, 2, ASCIIToUTF16("c-2"), GURL("http://c-2.com"));
62    model.AddURL(folder_c_, 3, ASCIIToUTF16("c-3"), GURL("http://c-3.com"));
63
64    model.AddURL(root, 3, ASCIIToUTF16("d"), GURL("http://d-0.com"));
65  }
66
67  virtual BookmarkEditorBaseController* CreateController() {
68    return [[BookmarkEditorBaseController alloc]
69            initWithParentWindow:test_window()
70                         nibName:@"BookmarkAllTabs"
71                         profile:browser_helper_.profile()
72                          parent:folder_b_0_
73                   configuration:BookmarkEditor::SHOW_TREE];
74  }
75
76  virtual void SetUp() {
77    CocoaTest::SetUp();
78    controller_ = CreateController();
79    EXPECT_TRUE([controller_ window]);
80    [controller_ runAsModalSheet];
81  }
82
83  virtual void TearDown() {
84    controller_ = NULL;
85    CocoaTest::TearDown();
86  }
87};
88
89TEST_F(BookmarkEditorBaseControllerTest, VerifyBookmarkTestModel) {
90  BookmarkModel& model(*(browser_helper_.profile()->GetBookmarkModel()));
91  const BookmarkNode& root(*model.GetBookmarkBarNode());
92  EXPECT_EQ(4, root.child_count());
93  // a
94  const BookmarkNode* child = root.GetChild(0);
95  EXPECT_EQ(3, child->child_count());
96  const BookmarkNode* subchild = child->GetChild(0);
97  EXPECT_EQ(0, subchild->child_count());
98  subchild = child->GetChild(1);
99  EXPECT_EQ(0, subchild->child_count());
100  subchild = child->GetChild(2);
101  EXPECT_EQ(0, subchild->child_count());
102  // b
103  child = root.GetChild(1);
104  EXPECT_EQ(5, child->child_count());
105  subchild = child->GetChild(0);
106  EXPECT_EQ(1, subchild->child_count());
107  const BookmarkNode* subsubchild = subchild->GetChild(0);
108  EXPECT_EQ(0, subsubchild->child_count());
109  subchild = child->GetChild(1);
110  EXPECT_EQ(0, subchild->child_count());
111  subchild = child->GetChild(2);
112  EXPECT_EQ(0, subchild->child_count());
113  subchild = child->GetChild(3);
114  EXPECT_EQ(2, subchild->child_count());
115  subsubchild = subchild->GetChild(0);
116  EXPECT_EQ(0, subsubchild->child_count());
117  subsubchild = subchild->GetChild(1);
118  EXPECT_EQ(0, subsubchild->child_count());
119  subchild = child->GetChild(4);
120  EXPECT_EQ(0, subchild->child_count());
121  // c
122  child = root.GetChild(2);
123  EXPECT_EQ(4, child->child_count());
124  subchild = child->GetChild(0);
125  EXPECT_EQ(0, subchild->child_count());
126  subchild = child->GetChild(1);
127  EXPECT_EQ(0, subchild->child_count());
128  subchild = child->GetChild(2);
129  EXPECT_EQ(0, subchild->child_count());
130  subchild = child->GetChild(3);
131  EXPECT_EQ(0, subchild->child_count());
132  // d
133  child = root.GetChild(3);
134  EXPECT_EQ(0, child->child_count());
135  [controller_ cancel:nil];
136}
137
138TEST_F(BookmarkEditorBaseControllerTest, NodeSelection) {
139  EXPECT_TRUE([controller_ folderTreeArray]);
140  [controller_ selectTestNodeInBrowser:folder_b_3_];
141  const BookmarkNode* node = [controller_ selectedNode];
142  EXPECT_EQ(node, folder_b_3_);
143  [controller_ cancel:nil];
144}
145
146TEST_F(BookmarkEditorBaseControllerTest, CreateFolder) {
147  EXPECT_EQ(2, folder_b_3_->child_count());
148  [controller_ selectTestNodeInBrowser:folder_b_3_];
149  NSString* expectedName =
150      l10n_util::GetNSStringWithFixup(IDS_BOOMARK_EDITOR_NEW_FOLDER_NAME);
151  [controller_ setDisplayName:expectedName];
152  [controller_ newFolder:nil];
153  NSArray* selectionPaths = [controller_ tableSelectionPaths];
154  EXPECT_EQ(1U, [selectionPaths count]);
155  NSIndexPath* selectionPath = [selectionPaths objectAtIndex:0];
156  EXPECT_EQ(4U, [selectionPath length]);
157  BookmarkFolderInfo* newFolderInfo = [controller_ selectedFolder];
158  EXPECT_TRUE(newFolderInfo);
159  NSString* newFolderName = [newFolderInfo folderName];
160  EXPECT_NSEQ(expectedName, newFolderName);
161  [controller_ createNewFolders];
162  // Verify that the tab folder was added to the new folder.
163  EXPECT_EQ(3, folder_b_3_->child_count());
164  [controller_ cancel:nil];
165}
166
167TEST_F(BookmarkEditorBaseControllerTest, CreateTwoFolders) {
168  BookmarkModel* model = browser_helper_.profile()->GetBookmarkModel();
169  const BookmarkNode* bar = model->GetBookmarkBarNode();
170  // Create 2 folders which are children of the bar.
171  [controller_ selectTestNodeInBrowser:bar];
172  [controller_ newFolder:nil];
173  [controller_ selectTestNodeInBrowser:bar];
174  [controller_ newFolder:nil];
175  // If we do NOT crash on createNewFolders, success!
176  // (e.g. http://crbug.com/47877 is fixed).
177  [controller_ createNewFolders];
178  [controller_ cancel:nil];
179}
180
181TEST_F(BookmarkEditorBaseControllerTest, SelectedFolderDeleted) {
182  BookmarkModel& model(*(browser_helper_.profile()->GetBookmarkModel()));
183  [controller_ selectTestNodeInBrowser:folder_b_3_];
184  EXPECT_EQ(folder_b_3_, [controller_ selectedNode]);
185
186  // Delete the selected node, and verify it's no longer selected:
187  model.Remove(folder_b_, 3);
188  EXPECT_NE(folder_b_3_, [controller_ selectedNode]);
189
190  [controller_ cancel:nil];
191}
192
193TEST_F(BookmarkEditorBaseControllerTest, SelectedFoldersParentDeleted) {
194  BookmarkModel& model(*(browser_helper_.profile()->GetBookmarkModel()));
195  const BookmarkNode* root = model.GetBookmarkBarNode();
196  [controller_ selectTestNodeInBrowser:folder_b_3_];
197  EXPECT_EQ(folder_b_3_, [controller_ selectedNode]);
198
199  // Delete the selected node's parent, and verify it's no longer selected:
200  model.Remove(root, 1);
201  EXPECT_NE(folder_b_3_, [controller_ selectedNode]);
202
203  [controller_ cancel:nil];
204}
205
206TEST_F(BookmarkEditorBaseControllerTest, FolderAdded) {
207  BookmarkModel& model(*(browser_helper_.profile()->GetBookmarkModel()));
208  const BookmarkNode* root = model.GetBookmarkBarNode();
209
210  // Add a folder node to the model, and verify it can be selected in the tree:
211  const BookmarkNode* folder_added = model.AddFolder(
212      root, 0, ASCIIToUTF16("added"));
213  [controller_ selectTestNodeInBrowser:folder_added];
214  EXPECT_EQ(folder_added, [controller_ selectedNode]);
215
216  [controller_ cancel:nil];
217}
218
219
220class BookmarkFolderInfoTest : public CocoaTest { };
221
222TEST_F(BookmarkFolderInfoTest, Construction) {
223  NSMutableArray* children = [NSMutableArray arrayWithObject:@"child"];
224  // We just need a pointer, and any pointer will do.
225  const BookmarkNode* fakeNode =
226      reinterpret_cast<const BookmarkNode*>(&children);
227  BookmarkFolderInfo* info =
228    [BookmarkFolderInfo bookmarkFolderInfoWithFolderName:@"name"
229                                              folderNode:fakeNode
230                                                children:children];
231  EXPECT_TRUE(info);
232  EXPECT_EQ([info folderName], @"name");
233  EXPECT_EQ([info children], children);
234  EXPECT_EQ([info folderNode], fakeNode);
235}
236