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

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: 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..e83d6da11aad036fd89bf93917f1447a0746b63e
--- /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 optionNames_.size(); }
+
+ // ChooserController:
+ const base::string16& GetOption(size_t index) const override {
+ return optionNames_[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 optionName) {
+ optionNames_.push_back(optionName);
+ if (observer())
+ observer()->OnOptionAdded(optionNames_.size() - 1);
+ }
+
+ void OptionRemoved(const base::string16 optionName) {
+ for (auto it = optionNames_.begin(); it != optionNames_.end(); ++it) {
+ if (*it == optionName) {
+ size_t index = it - optionNames_.begin();
+ optionNames_.erase(it);
+ if (observer())
+ observer()->OnOptionRemoved(index);
+ return;
+ }
+ }
+ }
+
+ private:
+ std::vector<base::string16> optionNames_;
Robert Sesek 2016/05/31 17:27:51 nit: names in C++ classes should use under_scores,
juncai 2016/05/31 20:45:02 Done.
+
+ DISALLOW_COPY_AND_ASSIGN(MockChooserController);
+};
+
+} // namespace
+
+class ChooserDialogCocoaControllerTest : public CocoaProfileTest {
+ protected:
+ ChooserDialogCocoaControllerTest() {}
+ ~ChooserDialogCocoaControllerTest() override {}
+
+ void SetUp() override {
+ CocoaProfileTest::SetUp();
+ ASSERT_TRUE(browser());
+ }
+
+ // Create an ChooserDialogCocoa.
+ void CreateChooserDialog() {
+ content::WebContents* web_contents =
+ content::WebContents::Create(content::WebContents::CreateParams(
+ profile(), content::SiteInstance::Create(profile())));
+ ASSERT_TRUE(web_contents);
+ chooserController_.reset(
+ new MockChooserController(web_contents->GetMainFrame()));
+ ASSERT_TRUE(chooserController_);
+ chooserDialog_.reset(
+ new ChooserDialogCocoa(web_contents, chooserController_.get()));
+ ASSERT_TRUE(chooserDialog_);
+ chooserDialogController_ =
+ chooserDialog_->chooser_dialog_cocoa_controller_.get();
+ ASSERT_TRUE(chooserDialogController_);
+ chooserContentView_ = [chooserDialogController_ chooserContentView];
+ ASSERT_TRUE(chooserContentView_);
+ tableView_ = [chooserContentView_ tableView];
+ ASSERT_TRUE(tableView_);
+ connectButton_ = [chooserContentView_ connectButton];
+ ASSERT_TRUE(connectButton_);
+ cancelButton_ = [chooserContentView_ cancelButton];
+ ASSERT_TRUE(cancelButton_);
+ helpButton_ = [chooserContentView_ helpButton];
+ ASSERT_TRUE(helpButton_);
+ }
+
+ std::unique_ptr<MockChooserController> chooserController_;
+ std::unique_ptr<ChooserDialogCocoa> chooserDialog_;
+
+ ChooserDialogCocoaController* chooserDialogController_;
+ ChooserContentView* chooserContentView_;
+ NSTableView* tableView_;
+ NSButton* connectButton_;
+ NSButton* cancelButton_;
+ NSButton* helpButton_;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(ChooserDialogCocoaControllerTest);
+};
+
+TEST_F(ChooserDialogCocoaControllerTest, InitialState) {
+ CreateChooserDialog();
+
+ // Since "No devices found." needs to be displayed on the |tableView_|,
+ // the number of rows is 1.
+ EXPECT_EQ(tableView_.numberOfRows, 1);
+ EXPECT_EQ(tableView_.numberOfColumns, 1);
+ // |tableView_| should be disabled since there is no option shown.
+ ASSERT_FALSE(tableView_.enabled);
+ // No option selected.
+ EXPECT_EQ(tableView_.selectedRow, -1);
+ // |connectButton_| should be disabled since no option selected.
+ ASSERT_FALSE(connectButton_.enabled);
+ ASSERT_TRUE(cancelButton_.enabled);
+ ASSERT_TRUE(helpButton_.enabled);
+}
+
+TEST_F(ChooserDialogCocoaControllerTest, AddOption) {
+ CreateChooserDialog();
+
+ chooserController_->OptionAdded(base::ASCIIToUTF16("a"));
+ EXPECT_EQ(tableView_.numberOfRows, 1);
+ EXPECT_EQ(tableView_.numberOfColumns, 1);
+ // |tableView_| should be enabled since there is an option.
+ ASSERT_TRUE(tableView_.enabled);
+ EXPECT_EQ(tableView_.selectedRow, -1);
+ ASSERT_FALSE(connectButton_.enabled);
+ ASSERT_TRUE(cancelButton_.enabled);
+ ASSERT_TRUE(helpButton_.enabled);
+
+ chooserController_->OptionAdded(base::ASCIIToUTF16("b"));
+ EXPECT_EQ(tableView_.numberOfRows, 2);
+ EXPECT_EQ(tableView_.numberOfColumns, 1);
+ ASSERT_TRUE(tableView_.enabled);
+ EXPECT_EQ(tableView_.selectedRow, -1);
+
+ chooserController_->OptionAdded(base::ASCIIToUTF16("c"));
+ EXPECT_EQ(tableView_.numberOfRows, 3);
+ EXPECT_EQ(tableView_.numberOfColumns, 1);
+ ASSERT_TRUE(tableView_.enabled);
+ EXPECT_EQ(tableView_.selectedRow, -1);
+}
+
+TEST_F(ChooserDialogCocoaControllerTest, RemoveOption) {
+ CreateChooserDialog();
+
+ chooserController_->OptionAdded(base::ASCIIToUTF16("a"));
+ chooserController_->OptionAdded(base::ASCIIToUTF16("b"));
+ chooserController_->OptionAdded(base::ASCIIToUTF16("c"));
+
+ chooserController_->OptionRemoved(base::ASCIIToUTF16("b"));
+ EXPECT_EQ(tableView_.numberOfRows, 2);
+ EXPECT_EQ(tableView_.numberOfColumns, 1);
+ ASSERT_TRUE(tableView_.enabled);
+ EXPECT_EQ(tableView_.selectedRow, -1);
+
+ // Remove a non-existent option, the number of rows should not change.
+ chooserController_->OptionRemoved(base::ASCIIToUTF16("non-existent"));
+ EXPECT_EQ(tableView_.numberOfRows, 2);
+ EXPECT_EQ(tableView_.numberOfColumns, 1);
+ ASSERT_TRUE(tableView_.enabled);
+ EXPECT_EQ(tableView_.selectedRow, -1);
+
+ chooserController_->OptionRemoved(base::ASCIIToUTF16("c"));
+ EXPECT_EQ(tableView_.numberOfRows, 1);
+ EXPECT_EQ(tableView_.numberOfColumns, 1);
+ ASSERT_TRUE(tableView_.enabled);
+ EXPECT_EQ(tableView_.selectedRow, -1);
+
+ chooserController_->OptionRemoved(base::ASCIIToUTF16("a"));
+ // There is no option shown now. But since "No devices found."
+ // needs to be displayed on the |tableView_|, the number of rows is 1.
+ EXPECT_EQ(tableView_.numberOfRows, 1);
+ EXPECT_EQ(tableView_.numberOfColumns, 1);
+ // |tableView_| should be disabled since all options are removed.
+ ASSERT_FALSE(tableView_.enabled);
+ EXPECT_EQ(tableView_.selectedRow, -1);
+}
+
+TEST_F(ChooserDialogCocoaControllerTest, AddAndRemoveOption) {
+ CreateChooserDialog();
+
+ chooserController_->OptionAdded(base::ASCIIToUTF16("a"));
+ EXPECT_EQ(tableView_.numberOfRows, 1);
+ chooserController_->OptionAdded(base::ASCIIToUTF16("b"));
+ EXPECT_EQ(tableView_.numberOfRows, 2);
+ chooserController_->OptionRemoved(base::ASCIIToUTF16("b"));
+ EXPECT_EQ(tableView_.numberOfRows, 1);
+ chooserController_->OptionAdded(base::ASCIIToUTF16("c"));
+ EXPECT_EQ(tableView_.numberOfRows, 2);
+ chooserController_->OptionAdded(base::ASCIIToUTF16("d"));
+ EXPECT_EQ(tableView_.numberOfRows, 3);
+ chooserController_->OptionRemoved(base::ASCIIToUTF16("d"));
+ EXPECT_EQ(tableView_.numberOfRows, 2);
+ chooserController_->OptionRemoved(base::ASCIIToUTF16("c"));
+ // There is no option shown now. But since "No devices found."
+ // needs to be displayed on the |tableView_|, the number of rows is 1.
+ EXPECT_EQ(tableView_.numberOfRows, 1);
+}
+
+TEST_F(ChooserDialogCocoaControllerTest, SelectAndDeselectAnOption) {
+ CreateChooserDialog();
+
+ chooserController_->OptionAdded(base::ASCIIToUTF16("a"));
+ chooserController_->OptionAdded(base::ASCIIToUTF16("b"));
+ chooserController_->OptionAdded(base::ASCIIToUTF16("c"));
+
+ // Select option 0.
+ [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0]
+ byExtendingSelection:NO];
+ EXPECT_EQ(tableView_.selectedRow, 0);
+ ASSERT_TRUE(connectButton_.enabled);
+
+ // Disselect option 0.
+ [tableView_ deselectRow:0];
+ EXPECT_EQ(tableView_.selectedRow, -1);
+ ASSERT_FALSE(connectButton_.enabled);
+
+ // Select option 1.
+ [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:1]
+ byExtendingSelection:NO];
+ EXPECT_EQ(tableView_.selectedRow, 1);
+ ASSERT_TRUE(connectButton_.enabled);
+
+ // Disselect option 1.
+ [tableView_ deselectRow:1];
+ EXPECT_EQ(tableView_.selectedRow, -1);
+ ASSERT_FALSE(connectButton_.enabled);
+}
+
+TEST_F(ChooserDialogCocoaControllerTest,
+ SelectAnOptionAndThenSelectAnotherOption) {
+ CreateChooserDialog();
+
+ chooserController_->OptionAdded(base::ASCIIToUTF16("a"));
+ chooserController_->OptionAdded(base::ASCIIToUTF16("b"));
+ chooserController_->OptionAdded(base::ASCIIToUTF16("c"));
+
+ // Select option 0.
+ [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0]
+ byExtendingSelection:NO];
+ EXPECT_EQ(tableView_.selectedRow, 0);
+ ASSERT_TRUE(connectButton_.enabled);
+
+ // Select option 1.
+ [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:1]
+ byExtendingSelection:NO];
+ EXPECT_EQ(tableView_.selectedRow, 1);
+ ASSERT_TRUE(connectButton_.enabled);
+
+ // Select option 2.
+ [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:2]
+ byExtendingSelection:NO];
+ EXPECT_EQ(tableView_.selectedRow, 2);
+ ASSERT_TRUE(connectButton_.enabled);
+}
+
+TEST_F(ChooserDialogCocoaControllerTest,
+ SelectAnOptionAndRemoveTheSelectedOption) {
+ CreateChooserDialog();
+
+ chooserController_->OptionAdded(base::ASCIIToUTF16("a"));
+ chooserController_->OptionAdded(base::ASCIIToUTF16("b"));
+ chooserController_->OptionAdded(base::ASCIIToUTF16("c"));
+
+ // Select option 1.
+ [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:1]
+ byExtendingSelection:NO];
+ EXPECT_EQ(tableView_.numberOfRows, 3);
+ EXPECT_EQ(tableView_.selectedRow, 1);
+ ASSERT_TRUE(connectButton_.enabled);
+
+ // Remove option 1
+ chooserController_->OptionRemoved(base::ASCIIToUTF16("b"));
+ EXPECT_EQ(tableView_.numberOfRows, 2);
+ // No option selected.
+ EXPECT_EQ(tableView_.selectedRow, -1);
+ // Since no option selected, the "Connect" button should be disabled.
+ ASSERT_FALSE(connectButton_.enabled);
+}
+
+TEST_F(ChooserDialogCocoaControllerTest, NoOptionSelectedAndPressCancelButton) {
+ CreateChooserDialog();
+
+ chooserController_->OptionAdded(base::ASCIIToUTF16("a"));
+ chooserController_->OptionAdded(base::ASCIIToUTF16("b"));
+ chooserController_->OptionAdded(base::ASCIIToUTF16("c"));
+
+ EXPECT_CALL(*chooserController_, Select(testing::_)).Times(0);
+ EXPECT_CALL(*chooserController_, Cancel()).Times(1);
+ [cancelButton_ performClick:chooserDialogController_];
+}
+
+TEST_F(ChooserDialogCocoaControllerTest, SelectAnOptionAndPressConnectButton) {
+ CreateChooserDialog();
+
+ chooserController_->OptionAdded(base::ASCIIToUTF16("a"));
+ chooserController_->OptionAdded(base::ASCIIToUTF16("b"));
+ chooserController_->OptionAdded(base::ASCIIToUTF16("c"));
+
+ // Select option 0 and press "Connect" button.
+ [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0]
+ byExtendingSelection:NO];
+ EXPECT_CALL(*chooserController_, Select(0)).Times(1);
+ EXPECT_CALL(*chooserController_, Cancel()).Times(0);
+ [connectButton_ performClick:chooserDialogController_];
+
+ // Select option 2 and press "Connect" button.
+ [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:2]
+ byExtendingSelection:NO];
+ EXPECT_CALL(*chooserController_, Select(2)).Times(1);
+ EXPECT_CALL(*chooserController_, Cancel()).Times(0);
+ [connectButton_ performClick:chooserDialogController_];
+}
+
+TEST_F(ChooserDialogCocoaControllerTest, SelectAnOptionAndPressCancelButton) {
+ CreateChooserDialog();
+
+ chooserController_->OptionAdded(base::ASCIIToUTF16("a"));
+ chooserController_->OptionAdded(base::ASCIIToUTF16("b"));
+ chooserController_->OptionAdded(base::ASCIIToUTF16("c"));
+
+ // Select option 0 and press "Cancel" button.
+ [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0]
+ byExtendingSelection:NO];
+ EXPECT_CALL(*chooserController_, Select(testing::_)).Times(0);
+ EXPECT_CALL(*chooserController_, Cancel()).Times(1);
+ [cancelButton_ performClick:chooserDialogController_];
+}
+
+TEST_F(ChooserDialogCocoaControllerTest, PressHelpButton) {
+ CreateChooserDialog();
+
+ chooserController_->OptionAdded(base::ASCIIToUTF16("a"));
+ chooserController_->OptionAdded(base::ASCIIToUTF16("b"));
+ chooserController_->OptionAdded(base::ASCIIToUTF16("c"));
+
+ // Select option 0 and press "Get help" button.
+ [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0]
+ byExtendingSelection:NO];
+ EXPECT_CALL(*chooserController_, Select(testing::_)).Times(0);
+ EXPECT_CALL(*chooserController_, Cancel()).Times(0);
+ EXPECT_CALL(*chooserController_, OpenHelpCenterUrl()).Times(1);
+ [helpButton_ performClick:chooserDialogController_];
+}
« no previous file with comments | « chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa_controller.mm ('k') | chrome/chrome_browser_extensions.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698