Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1036)

Unified Diff: chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa_controller_unittest.mm

Issue 2005443002: Implement bluetooth chooser for Chrome Apps on Mac (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@refactor_chooser_bubble_ui_cocoa
Patch Set: rebase and address comments Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa_controller_unittest.mm
diff --git a/chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa_controller_unittest.mm b/chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa_controller_unittest.mm
new file mode 100644
index 0000000000000000000000000000000000000000..b9c39bd862354015c60f60191d9e4803ddef35bd
--- /dev/null
+++ b/chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa_controller_unittest.mm
@@ -0,0 +1,370 @@
+// Copyright 2016 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 "chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa_controller.h"
+
+#import <Cocoa/Cocoa.h>
+
+#include <memory>
+#include <vector>
+
+#include "base/strings/utf_string_conversions.h"
+#import "chrome/browser/ui/cocoa/chooser_content_view.h"
+#import "chrome/browser/ui/cocoa/cocoa_profile_test.h"
+#include "chrome/browser/ui/cocoa/cocoa_test_helper.h"
+#import "chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "testing/gtest_mac.h"
+
+namespace {
+
+class MockChooserController : public ChooserController {
+ public:
+ explicit MockChooserController(content::RenderFrameHost* owner)
+ : ChooserController(owner) {}
+ ~MockChooserController() override {}
+
+ // ChooserController:
+ size_t NumOptions() const override { return option_names_.size(); }
+
+ // ChooserController:
+ const base::string16& GetOption(size_t index) const override {
+ return option_names_[index];
+ }
+
+ // ChooserController:
+ MOCK_METHOD1(Select, void(size_t index));
+
+ // ChooserController:
+ MOCK_METHOD0(Cancel, void());
+
+ // ChooserController:
+ MOCK_METHOD0(Close, void());
+
+ // ChooserController:
+ MOCK_CONST_METHOD0(OpenHelpCenterUrl, void());
+
+ void OptionAdded(const base::string16 option_name) {
+ option_names_.push_back(option_name);
+ if (observer())
+ observer()->OnOptionAdded(option_names_.size() - 1);
+ }
+
+ void OptionRemoved(const base::string16 option_name) {
+ for (auto it = option_names_.begin(); it != option_names_.end(); ++it) {
+ if (*it == option_name) {
+ size_t index = it - option_names_.begin();
+ option_names_.erase(it);
+ if (observer())
+ observer()->OnOptionRemoved(index);
+ return;
+ }
+ }
+ }
+
+ private:
+ std::vector<base::string16> option_names_;
+
+ DISALLOW_COPY_AND_ASSIGN(MockChooserController);
+};
+
+} // namespace
+
+class ChooserDialogCocoaControllerTest : public CocoaProfileTest {
+ protected:
+ ChooserDialogCocoaControllerTest() {}
+ ~ChooserDialogCocoaControllerTest() override {}
+
+ void SetUp() override {
+ CocoaProfileTest::SetUp();
+ ASSERT_TRUE(browser());
+ }
+
+ // Create a ChooserDialogCocoa.
+ void CreateChooserDialog() {
+ content::WebContents* web_contents =
+ content::WebContents::Create(content::WebContents::CreateParams(
+ profile(), content::SiteInstance::Create(profile())));
+ ASSERT_TRUE(web_contents);
+ chooser_controller_.reset(
+ new MockChooserController(web_contents->GetMainFrame()));
+ ASSERT_TRUE(chooser_controller_);
+ chooser_dialog_.reset(
+ new ChooserDialogCocoa(web_contents, chooser_controller_.get()));
+ ASSERT_TRUE(chooser_dialog_);
+ chooser_dialog_controller_ =
+ chooser_dialog_->chooser_dialog_cocoa_controller_.get();
+ ASSERT_TRUE(chooser_dialog_controller_);
+ chooser_content_view_ = [chooser_dialog_controller_ chooserContentView];
+ ASSERT_TRUE(chooser_content_view_);
+ table_view_ = [chooser_content_view_ tableView];
+ ASSERT_TRUE(table_view_);
+ connect_button_ = [chooser_content_view_ connectButton];
+ ASSERT_TRUE(connect_button_);
+ cancel_button_ = [chooser_content_view_ cancelButton];
+ ASSERT_TRUE(cancel_button_);
+ help_button_ = [chooser_content_view_ helpButton];
+ ASSERT_TRUE(help_button_);
+ }
+
+ std::unique_ptr<MockChooserController> chooser_controller_;
+ std::unique_ptr<ChooserDialogCocoa> chooser_dialog_;
+
+ ChooserDialogCocoaController* chooser_dialog_controller_;
+ ChooserContentView* chooser_content_view_;
+ NSTableView* table_view_;
+ NSButton* connect_button_;
+ NSButton* cancel_button_;
+ NSButton* help_button_;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(ChooserDialogCocoaControllerTest);
+};
+
+TEST_F(ChooserDialogCocoaControllerTest, InitialState) {
+ CreateChooserDialog();
+
+ // Since "No devices found." needs to be displayed on the |table_view_|,
+ // the number of rows is 1.
+ EXPECT_EQ(table_view_.numberOfRows, 1);
+ EXPECT_EQ(table_view_.numberOfColumns, 1);
+ // |table_view_| should be disabled since there is no option shown.
+ ASSERT_FALSE(table_view_.enabled);
+ // No option selected.
+ EXPECT_EQ(table_view_.selectedRow, -1);
+ // |connect_button_| should be disabled since no option selected.
+ ASSERT_FALSE(connect_button_.enabled);
+ ASSERT_TRUE(cancel_button_.enabled);
+ ASSERT_TRUE(help_button_.enabled);
+}
+
+TEST_F(ChooserDialogCocoaControllerTest, AddOption) {
+ CreateChooserDialog();
+
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("a"));
+ EXPECT_EQ(table_view_.numberOfRows, 1);
+ EXPECT_EQ(table_view_.numberOfColumns, 1);
+ // |table_view_| should be enabled since there is an option.
+ ASSERT_TRUE(table_view_.enabled);
+ EXPECT_EQ(table_view_.selectedRow, -1);
+ ASSERT_FALSE(connect_button_.enabled);
+ ASSERT_TRUE(cancel_button_.enabled);
+ ASSERT_TRUE(help_button_.enabled);
+
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("b"));
+ EXPECT_EQ(table_view_.numberOfRows, 2);
+ EXPECT_EQ(table_view_.numberOfColumns, 1);
+ ASSERT_TRUE(table_view_.enabled);
+ EXPECT_EQ(table_view_.selectedRow, -1);
+
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("c"));
+ EXPECT_EQ(table_view_.numberOfRows, 3);
+ EXPECT_EQ(table_view_.numberOfColumns, 1);
+ ASSERT_TRUE(table_view_.enabled);
+ EXPECT_EQ(table_view_.selectedRow, -1);
+}
+
+TEST_F(ChooserDialogCocoaControllerTest, RemoveOption) {
+ CreateChooserDialog();
+
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("a"));
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("b"));
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("c"));
+
+ chooser_controller_->OptionRemoved(base::ASCIIToUTF16("b"));
+ EXPECT_EQ(table_view_.numberOfRows, 2);
+ EXPECT_EQ(table_view_.numberOfColumns, 1);
+ ASSERT_TRUE(table_view_.enabled);
+ EXPECT_EQ(table_view_.selectedRow, -1);
+
+ // Remove a non-existent option, the number of rows should not change.
+ chooser_controller_->OptionRemoved(base::ASCIIToUTF16("non-existent"));
+ EXPECT_EQ(table_view_.numberOfRows, 2);
+ EXPECT_EQ(table_view_.numberOfColumns, 1);
+ ASSERT_TRUE(table_view_.enabled);
+ EXPECT_EQ(table_view_.selectedRow, -1);
+
+ chooser_controller_->OptionRemoved(base::ASCIIToUTF16("c"));
+ EXPECT_EQ(table_view_.numberOfRows, 1);
+ EXPECT_EQ(table_view_.numberOfColumns, 1);
+ ASSERT_TRUE(table_view_.enabled);
+ EXPECT_EQ(table_view_.selectedRow, -1);
+
+ chooser_controller_->OptionRemoved(base::ASCIIToUTF16("a"));
+ // There is no option shown now. But since "No devices found."
+ // needs to be displayed on the |table_view_|, the number of rows is 1.
+ EXPECT_EQ(table_view_.numberOfRows, 1);
+ EXPECT_EQ(table_view_.numberOfColumns, 1);
+ // |table_view_| should be disabled since all options are removed.
+ ASSERT_FALSE(table_view_.enabled);
+ EXPECT_EQ(table_view_.selectedRow, -1);
+}
+
+TEST_F(ChooserDialogCocoaControllerTest, AddAndRemoveOption) {
+ CreateChooserDialog();
+
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("a"));
+ EXPECT_EQ(table_view_.numberOfRows, 1);
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("b"));
+ EXPECT_EQ(table_view_.numberOfRows, 2);
+ chooser_controller_->OptionRemoved(base::ASCIIToUTF16("b"));
+ EXPECT_EQ(table_view_.numberOfRows, 1);
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("c"));
+ EXPECT_EQ(table_view_.numberOfRows, 2);
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("d"));
+ EXPECT_EQ(table_view_.numberOfRows, 3);
+ chooser_controller_->OptionRemoved(base::ASCIIToUTF16("d"));
+ EXPECT_EQ(table_view_.numberOfRows, 2);
+ chooser_controller_->OptionRemoved(base::ASCIIToUTF16("c"));
+ // There is no option shown now. But since "No devices found."
+ // needs to be displayed on the |table_view_|, the number of rows is 1.
+ EXPECT_EQ(table_view_.numberOfRows, 1);
+}
+
+TEST_F(ChooserDialogCocoaControllerTest, SelectAndDeselectAnOption) {
+ CreateChooserDialog();
+
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("a"));
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("b"));
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("c"));
+
+ // Select option 0.
+ [table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0]
+ byExtendingSelection:NO];
+ EXPECT_EQ(table_view_.selectedRow, 0);
+ ASSERT_TRUE(connect_button_.enabled);
+
+ // Disselect option 0.
+ [table_view_ deselectRow:0];
+ EXPECT_EQ(table_view_.selectedRow, -1);
+ ASSERT_FALSE(connect_button_.enabled);
+
+ // Select option 1.
+ [table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:1]
+ byExtendingSelection:NO];
+ EXPECT_EQ(table_view_.selectedRow, 1);
+ ASSERT_TRUE(connect_button_.enabled);
+
+ // Disselect option 1.
+ [table_view_ deselectRow:1];
+ EXPECT_EQ(table_view_.selectedRow, -1);
+ ASSERT_FALSE(connect_button_.enabled);
+}
+
+TEST_F(ChooserDialogCocoaControllerTest,
+ SelectAnOptionAndThenSelectAnotherOption) {
+ CreateChooserDialog();
+
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("a"));
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("b"));
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("c"));
+
+ // Select option 0.
+ [table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0]
+ byExtendingSelection:NO];
+ EXPECT_EQ(table_view_.selectedRow, 0);
+ ASSERT_TRUE(connect_button_.enabled);
+
+ // Select option 1.
+ [table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:1]
+ byExtendingSelection:NO];
+ EXPECT_EQ(table_view_.selectedRow, 1);
+ ASSERT_TRUE(connect_button_.enabled);
+
+ // Select option 2.
+ [table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:2]
+ byExtendingSelection:NO];
+ EXPECT_EQ(table_view_.selectedRow, 2);
+ ASSERT_TRUE(connect_button_.enabled);
+}
+
+TEST_F(ChooserDialogCocoaControllerTest,
+ SelectAnOptionAndRemoveTheSelectedOption) {
+ CreateChooserDialog();
+
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("a"));
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("b"));
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("c"));
+
+ // Select option 1.
+ [table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:1]
+ byExtendingSelection:NO];
+ EXPECT_EQ(table_view_.numberOfRows, 3);
+ EXPECT_EQ(table_view_.selectedRow, 1);
+ ASSERT_TRUE(connect_button_.enabled);
+
+ // Remove option 1
+ chooser_controller_->OptionRemoved(base::ASCIIToUTF16("b"));
+ EXPECT_EQ(table_view_.numberOfRows, 2);
+ // No option selected.
+ EXPECT_EQ(table_view_.selectedRow, -1);
+ // Since no option selected, the "Connect" button should be disabled.
+ ASSERT_FALSE(connect_button_.enabled);
+}
+
+TEST_F(ChooserDialogCocoaControllerTest, NoOptionSelectedAndPressCancelButton) {
+ CreateChooserDialog();
+
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("a"));
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("b"));
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("c"));
+
+ EXPECT_CALL(*chooser_controller_, Select(testing::_)).Times(0);
+ EXPECT_CALL(*chooser_controller_, Cancel()).Times(1);
+ [cancel_button_ performClick:chooser_dialog_controller_];
+}
+
+TEST_F(ChooserDialogCocoaControllerTest, SelectAnOptionAndPressConnectButton) {
+ CreateChooserDialog();
+
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("a"));
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("b"));
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("c"));
+
+ // Select option 0 and press "Connect" button.
+ [table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0]
+ byExtendingSelection:NO];
+ EXPECT_CALL(*chooser_controller_, Select(0)).Times(1);
+ EXPECT_CALL(*chooser_controller_, Cancel()).Times(0);
+ [connect_button_ performClick:chooser_dialog_controller_];
+
+ // Select option 2 and press "Connect" button.
+ [table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:2]
+ byExtendingSelection:NO];
+ EXPECT_CALL(*chooser_controller_, Select(2)).Times(1);
+ EXPECT_CALL(*chooser_controller_, Cancel()).Times(0);
+ [connect_button_ performClick:chooser_dialog_controller_];
+}
+
+TEST_F(ChooserDialogCocoaControllerTest, SelectAnOptionAndPressCancelButton) {
+ CreateChooserDialog();
+
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("a"));
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("b"));
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("c"));
+
+ // Select option 0 and press "Cancel" button.
+ [table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0]
+ byExtendingSelection:NO];
+ EXPECT_CALL(*chooser_controller_, Select(testing::_)).Times(0);
+ EXPECT_CALL(*chooser_controller_, Cancel()).Times(1);
+ [cancel_button_ performClick:chooser_dialog_controller_];
+}
+
+TEST_F(ChooserDialogCocoaControllerTest, PressHelpButton) {
+ CreateChooserDialog();
+
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("a"));
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("b"));
+ chooser_controller_->OptionAdded(base::ASCIIToUTF16("c"));
+
+ // Select option 0 and press "Get help" button.
+ [table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0]
+ byExtendingSelection:NO];
+ EXPECT_CALL(*chooser_controller_, Select(testing::_)).Times(0);
+ EXPECT_CALL(*chooser_controller_, Cancel()).Times(0);
+ EXPECT_CALL(*chooser_controller_, OpenHelpCenterUrl()).Times(1);
+ [help_button_ performClick:chooser_dialog_controller_];
+}

Powered by Google App Engine
This is Rietveld 408576698