// Copyright (c) 2009 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/scoped_nsobject.h"
#import "chrome/browser/cocoa/bookmark_name_folder_controller.h"
#include "chrome/browser/cocoa/browser_test_helper.h"
#import "chrome/browser/cocoa/cocoa_test_helper.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/platform_test.h"

class BookmarkNameFolderControllerTest : public CocoaTest {
 public:
  BrowserTestHelper helper_;
};


TEST_F(BookmarkNameFolderControllerTest, AddNew) {
  BookmarkModel* model = helper_.profile()->GetBookmarkModel();
  const BookmarkNode* parent = model->GetBookmarkBarNode();
  const BookmarkNode* node = NULL;
  EXPECT_EQ(0, parent->GetChildCount());

  scoped_nsobject<BookmarkNameFolderController>
    controller([[BookmarkNameFolderController alloc]
                 initWithParentWindow:test_window()
                              profile:helper_.profile()
                                 node:node]);
  [controller window];  // force nib load

  // Do nothing.
  [controller cancel:nil];
  EXPECT_EQ(0, parent->GetChildCount());

  // Change name then cancel.
  [controller setFolderName:@"Bozo"];
  [controller cancel:nil];
  EXPECT_EQ(0, parent->GetChildCount());

  // Add a new folder.
  [controller ok:nil];
  EXPECT_EQ(1, parent->GetChildCount());
  EXPECT_TRUE(parent->GetChild(0)->is_folder());
  EXPECT_EQ(L"Bozo", parent->GetChild(0)->GetTitle());
}


// Make sure we are allowed to create a folder named "New Folder".
TEST_F(BookmarkNameFolderControllerTest, AddNewDefaultName) {
 BookmarkModel* model = helper_.profile()->GetBookmarkModel();
  const BookmarkNode* parent = model->GetBookmarkBarNode();
  EXPECT_EQ(0, parent->GetChildCount());

  scoped_nsobject<BookmarkNameFolderController>
    controller([[BookmarkNameFolderController alloc]
                 initWithParentWindow:test_window()
                              profile:helper_.profile()
                                 node:NULL]);
  [controller window];  // force nib load

  // Click OK without changing the name
  [controller ok:nil];
  EXPECT_EQ(1, parent->GetChildCount());
  EXPECT_TRUE(parent->GetChild(0)->is_folder());
}

// Make sure we are allowed to create a folder with an empty name.
TEST_F(BookmarkNameFolderControllerTest, AddNewBlankName) {
  BookmarkModel* model = helper_.profile()->GetBookmarkModel();
  const BookmarkNode* parent = model->GetBookmarkBarNode();
  EXPECT_EQ(0, parent->GetChildCount());

  scoped_nsobject<BookmarkNameFolderController>
  controller([[BookmarkNameFolderController alloc]
              initWithParentWindow:test_window()
                           profile:helper_.profile()
                              node:NULL]);
  [controller window];  // force nib load

  // Change the name to blank, click OK.
  [controller setFolderName:@""];
  [controller ok:nil];
  EXPECT_EQ(1, parent->GetChildCount());
  EXPECT_TRUE(parent->GetChild(0)->is_folder());
}

TEST_F(BookmarkNameFolderControllerTest, Rename) {
  BookmarkModel* model = helper_.profile()->GetBookmarkModel();
  const BookmarkNode* parent = model->GetBookmarkBarNode();
  const BookmarkNode* folder = model->AddGroup(parent,
                                               parent->GetChildCount(),
                                               L"group");

  // Rename the folder by creating a controller that originates from
  // the node.
  scoped_nsobject<BookmarkNameFolderController>
    controller([[BookmarkNameFolderController alloc]
                 initWithParentWindow:test_window()
                              profile:helper_.profile()
                                 node:folder]);
  [controller window];  // force nib load

  EXPECT_TRUE([[controller folderName] isEqual:@"group"]);
  [controller setFolderName:@"Zobo"];
  [controller ok:nil];
  EXPECT_EQ(1, parent->GetChildCount());
  EXPECT_TRUE(parent->GetChild(0)->is_folder());
  EXPECT_EQ(L"Zobo", parent->GetChild(0)->GetTitle());
}

TEST_F(BookmarkNameFolderControllerTest, EditAndConfirmOKButton) {
  BookmarkModel* model = helper_.profile()->GetBookmarkModel();
  const BookmarkNode* parent = model->GetBookmarkBarNode();
  const BookmarkNode* node = NULL;
  EXPECT_EQ(0, parent->GetChildCount());

  scoped_nsobject<BookmarkNameFolderController>
    controller([[BookmarkNameFolderController alloc]
                 initWithParentWindow:test_window()
                              profile:helper_.profile()
                                 node:node]);
  [controller window];  // force nib load

  // We start enabled since the default "New Folder" is added for us.
  EXPECT_TRUE([[controller okButton] isEnabled]);

  [controller setFolderName:@"Bozo"];
  EXPECT_TRUE([[controller okButton] isEnabled]);
  [controller setFolderName:@" "];
  EXPECT_TRUE([[controller okButton] isEnabled]);

  [controller setFolderName:@""];
  EXPECT_TRUE([[controller okButton] isEnabled]);
}