1// Copyright (c) 2012 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 "chrome/browser/ui/cocoa/bookmarks/bookmark_menu_cocoa_controller.h"
6
7#import "base/mac/scoped_nsobject.h"
8#include "base/strings/string16.h"
9#include "chrome/browser/bookmarks/bookmark_model_factory.h"
10#include "chrome/browser/ui/browser.h"
11#include "chrome/browser/ui/cocoa/test/cocoa_test_helper.h"
12#include "chrome/test/base/browser_with_test_window_test.h"
13#include "chrome/test/base/testing_profile.h"
14#include "components/bookmarks/browser/bookmark_model.h"
15#include "components/bookmarks/browser/bookmark_utils.h"
16#include "components/bookmarks/test/bookmark_test_helpers.h"
17#include "testing/gtest/include/gtest/gtest.h"
18
19using bookmarks::BookmarkModel;
20using bookmarks::BookmarkNode;
21
22@interface FakeBookmarkMenuController : BookmarkMenuCocoaController {
23 @public
24  const BookmarkNode* _nodes[2];
25  BOOL _opened[2];
26}
27- (id)initWithProfile:(Profile*)profile;
28@end
29
30@implementation FakeBookmarkMenuController
31
32- (id)initWithProfile:(Profile*)profile {
33  if ((self = [super init])) {
34    base::string16 empty;
35    BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile);
36    const BookmarkNode* bookmark_bar = model->bookmark_bar_node();
37    _nodes[0] = model->AddURL(bookmark_bar, 0, empty, GURL("http://0.com"));
38    _nodes[1] = model->AddURL(bookmark_bar, 1, empty, GURL("http://1.com"));
39  }
40  return self;
41}
42
43- (const BookmarkNode*)nodeForIdentifier:(int)identifier {
44  if ((identifier < 0) || (identifier >= 2))
45    return NULL;
46  return _nodes[identifier];
47}
48
49- (void)openURLForNode:(const BookmarkNode*)node {
50  std::string url = node->url().possibly_invalid_spec();
51  if (url.find("http://0.com") != std::string::npos)
52    _opened[0] = YES;
53  if (url.find("http://1.com") != std::string::npos)
54    _opened[1] = YES;
55}
56
57@end  // FakeBookmarkMenuController
58
59class BookmarkMenuCocoaControllerTest : public BrowserWithTestWindowTest {
60 public:
61  void SetUp() override {
62    BrowserWithTestWindowTest::SetUp();
63
64    bookmarks::test::WaitForBookmarkModelToLoad(
65        BookmarkModelFactory::GetForBrowserContext(profile()));
66    controller_.reset(
67        [[FakeBookmarkMenuController alloc] initWithProfile:profile()]);
68  }
69
70  TestingProfile::TestingFactories GetTestingFactories() override {
71    return {{BookmarkModelFactory::GetInstance(),
72             BookmarkModelFactory::GetDefaultFactory()}};
73  }
74
75  FakeBookmarkMenuController* controller() { return controller_.get(); }
76
77 private:
78  CocoaTestHelper cocoa_test_helper_;
79  base::scoped_nsobject<FakeBookmarkMenuController> controller_;
80};
81
82TEST_F(BookmarkMenuCocoaControllerTest, TestOpenItem) {
83  FakeBookmarkMenuController* c = controller();
84  NSMenuItem *item = [[[NSMenuItem alloc] init] autorelease];
85  for (int i = 0; i < 2; i++) {
86    [item setTag:i];
87    ASSERT_EQ(c->_opened[i], NO);
88    [c openBookmarkMenuItem:item];
89    ASSERT_NE(c->_opened[i], NO);
90  }
91}
92