blob: a60327b760ba81aa2cfb370b894c36a904998796 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import <Cocoa/Cocoa.h>
#include "base/strings/sys_string_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/bookmarks/bookmark_model_factory.h"
#import "chrome/browser/ui/cocoa/bookmarks/bookmark_editor_controller.h"
#include "chrome/browser/ui/cocoa/cocoa_profile_test.h"
#include "chrome/test/base/test_browser_window.h"
#include "chrome/test/base/testing_profile.h"
#include "components/bookmarks/browser/bookmark_model.h"
#include "grit/generated_resources.h"
#include "testing/gtest/include/gtest/gtest.h"
#import "testing/gtest_mac.h"
#include "testing/platform_test.h"
#include "ui/base/l10n/l10n_util_mac.h"
using base::ASCIIToUTF16;
class BookmarkEditorBaseControllerTest : public CocoaProfileTest {
public:
BookmarkEditorBaseController* controller_; // weak
const BookmarkNode* folder_a_;
const BookmarkNode* folder_b_;
const BookmarkNode* folder_b_0_;
const BookmarkNode* folder_b_3_;
const BookmarkNode* folder_c_;
void CreateModel() {
// Set up a small bookmark hierarchy, which will look as follows:
// a b c d
// a-0 b-0 c-0
// a-1 b-00 c-1
// a-2 b-1 c-2
// b-2 c-3
// b-3
// b-30
// b-31
// b-4
BookmarkModel* model = BookmarkModelFactory::GetForProfile(profile());
const BookmarkNode* root = model->bookmark_bar_node();
folder_a_ = model->AddFolder(root, 0, ASCIIToUTF16("a"));
model->AddURL(folder_a_, 0, ASCIIToUTF16("a-0"), GURL("http://a-0.com"));
model->AddURL(folder_a_, 1, ASCIIToUTF16("a-1"), GURL("http://a-1.com"));
model->AddURL(folder_a_, 2, ASCIIToUTF16("a-2"), GURL("http://a-2.com"));
folder_b_ = model->AddFolder(root, 1, ASCIIToUTF16("b"));
folder_b_0_ = model->AddFolder(folder_b_, 0, ASCIIToUTF16("b-0"));
model->AddURL(folder_b_0_, 0, ASCIIToUTF16("bb-0"),
GURL("http://bb-0.com"));
model->AddURL(folder_b_, 1, ASCIIToUTF16("b-1"), GURL("http://b-1.com"));
model->AddURL(folder_b_, 2, ASCIIToUTF16("b-2"), GURL("http://b-2.com"));
folder_b_3_ = model->AddFolder(folder_b_, 3, ASCIIToUTF16("b-3"));
model->AddURL(folder_b_3_, 0, ASCIIToUTF16("b-30"),
GURL("http://b-30.com"));
model->AddURL(folder_b_3_, 1, ASCIIToUTF16("b-31"),
GURL("http://b-31.com"));
model->AddURL(folder_b_, 4, ASCIIToUTF16("b-4"), GURL("http://b-4.com"));
folder_c_ = model->AddFolder(root, 2, ASCIIToUTF16("c"));
model->AddURL(folder_c_, 0, ASCIIToUTF16("c-0"), GURL("http://c-0.com"));
model->AddURL(folder_c_, 1, ASCIIToUTF16("c-1"), GURL("http://c-1.com"));
model->AddURL(folder_c_, 2, ASCIIToUTF16("c-2"), GURL("http://c-2.com"));
model->AddURL(folder_c_, 3, ASCIIToUTF16("c-3"), GURL("http://c-3.com"));
model->AddFolder(folder_c_, 4, ASCIIToUTF16("c-4"));
model->AddURL(root, 3, ASCIIToUTF16("d"), GURL("http://d-0.com"));
}
virtual BookmarkEditorBaseController* CreateController() {
return [[BookmarkEditorBaseController alloc]
initWithParentWindow:test_window()
nibName:@"BookmarkAllTabs"
profile:profile()
parent:folder_b_0_
url:GURL()
title:base::string16()
configuration:BookmarkEditor::SHOW_TREE];
}
virtual void SetUp() OVERRIDE {
CocoaProfileTest::SetUp();
ASSERT_TRUE(profile());
CreateModel();
controller_ = CreateController();
EXPECT_TRUE([controller_ window]);
[controller_ runAsModalSheet];
}
virtual void TearDown() OVERRIDE {
controller_ = NULL;
CocoaTest::TearDown();
}
virtual Browser* CreateBrowser() OVERRIDE {
Browser::CreateParams native_params(profile(), chrome::GetActiveDesktop());
return chrome::CreateBrowserWithTestWindowForParams(&native_params);
}
};
TEST_F(BookmarkEditorBaseControllerTest, VerifyBookmarkTestModel) {
BookmarkModel* model = BookmarkModelFactory::GetForProfile(profile());
const BookmarkNode* root = model->bookmark_bar_node();
EXPECT_EQ(4, root->child_count());
// a
const BookmarkNode* child = root->GetChild(0);
EXPECT_EQ(3, child->child_count());
const BookmarkNode* subchild = child->GetChild(0);
EXPECT_EQ(0, subchild->child_count());
subchild = child->GetChild(1);
EXPECT_EQ(0, subchild->child_count());
subchild = child->GetChild(2);
EXPECT_EQ(0, subchild->child_count());
// b
child = root->GetChild(1);
EXPECT_EQ(5, child->child_count());
subchild = child->GetChild(0);
EXPECT_EQ(1, subchild->child_count());
const BookmarkNode* subsubchild = subchild->GetChild(0);
EXPECT_EQ(0, subsubchild->child_count());
subchild = child->GetChild(1);
EXPECT_EQ(0, subchild->child_count());
subchild = child->GetChild(2);
EXPECT_EQ(0, subchild->child_count());
subchild = child->GetChild(3);
EXPECT_EQ(2, subchild->child_count());
subsubchild = subchild->GetChild(0);
EXPECT_EQ(0, subsubchild->child_count());
subsubchild = subchild->GetChild(1);
EXPECT_EQ(0, subsubchild->child_count());
subchild = child->GetChild(4);
EXPECT_EQ(0, subchild->child_count());
// c
child = root->GetChild(2);
EXPECT_EQ(5, child->child_count());
subchild = child->GetChild(0);
EXPECT_EQ(0, subchild->child_count());
subchild = child->GetChild(1);
EXPECT_EQ(0, subchild->child_count());
subchild = child->GetChild(2);
EXPECT_EQ(0, subchild->child_count());
subchild = child->GetChild(3);
EXPECT_EQ(0, subchild->child_count());
subchild = child->GetChild(4);
EXPECT_EQ(0, subchild->child_count());
// d
child = root->GetChild(3);
EXPECT_EQ(0, child->child_count());
[controller_ cancel:nil];
}
TEST_F(BookmarkEditorBaseControllerTest, NodeSelection) {
EXPECT_TRUE([controller_ folderTreeArray]);
[controller_ selectTestNodeInBrowser:folder_b_3_];
const BookmarkNode* node = [controller_ selectedNode];
EXPECT_EQ(node, folder_b_3_);
[controller_ cancel:nil];
}
TEST_F(BookmarkEditorBaseControllerTest, CreateFolder) {
EXPECT_EQ(2, folder_b_3_->child_count());
[controller_ selectTestNodeInBrowser:folder_b_3_];
NSString* expectedName =
l10n_util::GetNSStringWithFixup(IDS_BOOKMARK_EDITOR_NEW_FOLDER_NAME);
[controller_ setDisplayName:expectedName];
[controller_ newFolder:nil];
NSArray* selectionPaths = [controller_ tableSelectionPaths];
EXPECT_EQ(1U, [selectionPaths count]);
NSIndexPath* selectionPath = [selectionPaths objectAtIndex:0];
EXPECT_EQ(4U, [selectionPath length]);
BookmarkFolderInfo* newFolderInfo = [controller_ selectedFolder];
EXPECT_TRUE(newFolderInfo);
NSString* newFolderName = [newFolderInfo folderName];
EXPECT_NSEQ(expectedName, newFolderName);
[controller_ createNewFolders];
// Verify that the tab folder was added to the new folder.
EXPECT_EQ(3, folder_b_3_->child_count());
[controller_ cancel:nil];
}
TEST_F(BookmarkEditorBaseControllerTest, CreateTwoFolders) {
BookmarkModel* model = BookmarkModelFactory::GetForProfile(profile());
const BookmarkNode* bar = model->bookmark_bar_node();
// Create 2 folders which are children of the bar.
[controller_ selectTestNodeInBrowser:bar];
[controller_ newFolder:nil];
[controller_ selectTestNodeInBrowser:bar];
[controller_ newFolder:nil];
// If we do NOT crash on createNewFolders, success!
// (e.g. http://crbug.com/47877 is fixed).
[controller_ createNewFolders];
[controller_ cancel:nil];
}
TEST_F(BookmarkEditorBaseControllerTest, SelectedFolderDeleted) {
BookmarkModel* model = BookmarkModelFactory::GetForProfile(profile());
[controller_ selectTestNodeInBrowser:folder_b_3_];
EXPECT_EQ(folder_b_3_, [controller_ selectedNode]);
// Delete the selected node, and verify it's no longer selected:
model->Remove(folder_b_, 3);
EXPECT_NE(folder_b_3_, [controller_ selectedNode]);
[controller_ cancel:nil];
}
TEST_F(BookmarkEditorBaseControllerTest, SelectedFoldersParentDeleted) {
BookmarkModel* model = BookmarkModelFactory::GetForProfile(profile());
const BookmarkNode* root = model->bookmark_bar_node();
[controller_ selectTestNodeInBrowser:folder_b_3_];
EXPECT_EQ(folder_b_3_, [controller_ selectedNode]);
// Delete the selected node's parent, and verify it's no longer selected:
model->Remove(root, 1);
EXPECT_NE(folder_b_3_, [controller_ selectedNode]);
[controller_ cancel:nil];
}
TEST_F(BookmarkEditorBaseControllerTest, FolderAdded) {
BookmarkModel* model = BookmarkModelFactory::GetForProfile(profile());
const BookmarkNode* root = model->bookmark_bar_node();
// Add a folder node to the model, and verify it can be selected in the tree:
const BookmarkNode* folder_added = model->AddFolder(
root, 0, ASCIIToUTF16("added"));
[controller_ selectTestNodeInBrowser:folder_added];
EXPECT_EQ(folder_added, [controller_ selectedNode]);
[controller_ cancel:nil];
}
// Verifies expandeNodes and getExpandedNodes.
TEST_F(BookmarkEditorBaseControllerTest, ExpandedState) {
BookmarkModel* model = BookmarkModelFactory::GetForProfile(profile());
// Sets up the state we're going to expand.
BookmarkExpandedStateTracker::Nodes nodes;
nodes.insert(model->bookmark_bar_node());
nodes.insert(folder_b_);
nodes.insert(folder_c_);
// Initial state shouldn't match expected state, otherwise this test isn't
// really going to test anything.
BookmarkExpandedStateTracker::Nodes actual = [controller_ getExpandedNodes];
EXPECT_NE(actual, nodes);
[controller_ expandNodes:nodes];
actual = [controller_ getExpandedNodes];
EXPECT_EQ(nodes, actual);
[controller_ cancel:nil];
}
class BookmarkFolderInfoTest : public CocoaTest { };
TEST_F(BookmarkFolderInfoTest, Construction) {
NSMutableArray* children = [NSMutableArray arrayWithObject:@"child"];
// We just need a pointer, and any pointer will do.
const BookmarkNode* fakeNode =
reinterpret_cast<const BookmarkNode*>(&children);
BookmarkFolderInfo* info =
[BookmarkFolderInfo bookmarkFolderInfoWithFolderName:@"name"
folderNode:fakeNode
children:children];
EXPECT_TRUE(info);
EXPECT_EQ([info folderName], @"name");
EXPECT_EQ([info children], children);
EXPECT_EQ([info folderNode], fakeNode);
}