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_]; |
+} |