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