blob: 3d6b6f7616a7be7cf594f9229a41e4aae87584c0 [file] [log] [blame]
// 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"
#include "chrome/browser/chooser_controller/mock_chooser_controller.h"
#import "chrome/browser/ui/cocoa/device_chooser_content_view_cocoa.h"
#import "chrome/browser/ui/cocoa/extensions/chooser_dialog_cocoa.h"
#include "chrome/browser/ui/cocoa/spinner_view.h"
#import "chrome/browser/ui/cocoa/test/cocoa_profile_test.h"
#include "chrome/browser/ui/cocoa/test/cocoa_test_helper.h"
#include "chrome/grit/generated_resources.h"
#include "components/vector_icons/vector_icons.h"
#include "skia/ext/skia_utils_mac.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/gtest_mac.h"
#include "ui/base/l10n/l10n_util_mac.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/color_palette.h"
#include "ui/gfx/image/image.h"
#include "ui/gfx/image/image_unittest_util.h"
#include "ui/gfx/paint_vector_icon.h"
#include "ui/resources/grit/ui_resources.h"
namespace {
// The lookup table for signal strength level image.
const int kSignalStrengthLevelImageIds[5] = {IDR_SIGNAL_0_BAR, IDR_SIGNAL_1_BAR,
IDR_SIGNAL_2_BAR, IDR_SIGNAL_3_BAR,
IDR_SIGNAL_4_BAR};
const int kSignalStrengthLevelImageSelectedIds[5] = {
IDR_SIGNAL_0_BAR_SELECTED, IDR_SIGNAL_1_BAR_SELECTED,
IDR_SIGNAL_2_BAR_SELECTED, IDR_SIGNAL_3_BAR_SELECTED,
IDR_SIGNAL_4_BAR_SELECTED};
} // namespace
class ChooserDialogCocoaControllerTest : public CocoaProfileTest {
protected:
ChooserDialogCocoaControllerTest()
: rb_(ui::ResourceBundle::GetSharedInstance()) {}
~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);
auto chooser_controller = base::MakeUnique<MockChooserController>();
mock_chooser_controller_ = chooser_controller.get();
chooser_dialog_.reset(
new ChooserDialogCocoa(web_contents, std::move(chooser_controller)));
ASSERT_TRUE(chooser_dialog_);
chooser_dialog_controller_ =
chooser_dialog_->chooser_dialog_cocoa_controller_.get();
ASSERT_TRUE(chooser_dialog_controller_);
device_chooser_content_view_ =
[chooser_dialog_controller_ deviceChooserContentView];
ASSERT_TRUE(device_chooser_content_view_);
adapter_off_help_button_ =
[device_chooser_content_view_ adapterOffHelpButton];
ASSERT_TRUE(adapter_off_help_button_);
table_view_ = [device_chooser_content_view_ tableView];
ASSERT_TRUE(table_view_);
spinner_ = [device_chooser_content_view_ spinner];
ASSERT_TRUE(spinner_);
connect_button_ = [device_chooser_content_view_ connectButton];
ASSERT_TRUE(connect_button_);
cancel_button_ = [device_chooser_content_view_ cancelButton];
ASSERT_TRUE(cancel_button_);
help_button_ = [device_chooser_content_view_ helpButton];
ASSERT_TRUE(help_button_);
scanning_message_ = [device_chooser_content_view_ scanningMessage];
ASSERT_TRUE(scanning_message_);
word_connector_ = [device_chooser_content_view_ wordConnector];
ASSERT_TRUE(word_connector_);
rescan_button_ = [device_chooser_content_view_ rescanButton];
ASSERT_TRUE(rescan_button_);
}
void ExpectNoRowImage(int row) {
ASSERT_FALSE([device_chooser_content_view_
tableRowViewImage:static_cast<NSInteger>(row)]);
}
void ExpectSignalStrengthLevelImageIs(int row,
int expected_signal_strength_level,
int expected_color) {
NSImageView* image_view = [device_chooser_content_view_
tableRowViewImage:static_cast<NSInteger>(row)];
ASSERT_TRUE(image_view);
int image_id =
expected_color == MockChooserController::kImageColorUnselected
? kSignalStrengthLevelImageIds[expected_signal_strength_level]
: kSignalStrengthLevelImageSelectedIds
[expected_signal_strength_level];
EXPECT_NSEQ(rb_.GetNativeImageNamed(image_id).ToNSImage(),
[image_view image]);
}
void ExpectRowImageIsConnectedImage(int row, SkColor expected_color) {
NSImageView* image_view = [device_chooser_content_view_
tableRowViewImage:static_cast<NSInteger>(row)];
ASSERT_TRUE(image_view);
EXPECT_TRUE(gfx::test::AreImagesEqual(
gfx::Image(gfx::CreateVectorIcon(vector_icons::kBluetoothConnectedIcon,
expected_color)),
gfx::Image([[image_view image] copy])));
}
void ExpectRowTextIs(int row, NSString* expected_text) {
EXPECT_NSEQ(expected_text,
[[device_chooser_content_view_
tableRowViewText:static_cast<NSInteger>(row)] stringValue]);
}
void ExpectRowTextColorIs(int row, NSColor* expected_color) {
EXPECT_NSEQ(expected_color,
[[device_chooser_content_view_
tableRowViewText:static_cast<NSInteger>(row)] textColor]);
}
bool IsRowPaired(int row) {
NSTextField* paired_status = [device_chooser_content_view_
tableRowViewPairedStatus:static_cast<NSInteger>(row)];
if (paired_status) {
EXPECT_NSEQ(l10n_util::GetNSString(IDS_DEVICE_CHOOSER_PAIRED_STATUS_TEXT),
[paired_status stringValue]);
return true;
} else {
return false;
}
}
void ExpectPairedTextColorIs(int row, NSColor* expected_color) {
EXPECT_NSEQ(
expected_color,
[[device_chooser_content_view_
tableRowViewPairedStatus:static_cast<NSInteger>(row)] textColor]);
}
ui::ResourceBundle& rb_;
std::unique_ptr<ChooserDialogCocoa> chooser_dialog_;
MockChooserController* mock_chooser_controller_;
ChooserDialogCocoaController* chooser_dialog_controller_;
DeviceChooserContentViewCocoa* device_chooser_content_view_;
NSButton* adapter_off_help_button_;
NSTableView* table_view_;
SpinnerView* spinner_;
NSButton* connect_button_;
NSButton* cancel_button_;
NSButton* help_button_;
NSTextField* scanning_message_;
NSTextField* word_connector_;
NSButton* rescan_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(1, table_view_.numberOfRows);
EXPECT_EQ(1, table_view_.numberOfColumns);
// No image shown.
ExpectNoRowImage(0);
ExpectRowTextIs(
0, l10n_util::GetNSString(IDS_DEVICE_CHOOSER_NO_DEVICES_FOUND_PROMPT));
EXPECT_FALSE(IsRowPaired(0));
// |table_view_| should be disabled since there is no option shown.
EXPECT_FALSE(table_view_.enabled);
// No option selected.
EXPECT_EQ(-1, table_view_.selectedRow);
// |connect_button_| should be disabled since no option selected.
EXPECT_FALSE(connect_button_.enabled);
EXPECT_TRUE(cancel_button_.enabled);
EXPECT_TRUE(help_button_.enabled);
EXPECT_NSEQ(l10n_util::GetNSStringF(
IDS_DEVICE_CHOOSER_GET_HELP_LINK_WITH_SCANNING_STATUS,
base::string16()),
help_button_.title);
}
TEST_F(ChooserDialogCocoaControllerTest, AddOption) {
CreateChooserDialog();
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("a"),
MockChooserController::kNoSignalStrengthLevelImage,
MockChooserController::ConnectedPairedStatus::CONNECTED |
MockChooserController::ConnectedPairedStatus::PAIRED);
EXPECT_EQ(1, table_view_.numberOfRows);
EXPECT_EQ(1, table_view_.numberOfColumns);
// |table_view_| should be enabled since there is an option.
EXPECT_TRUE(table_view_.enabled);
EXPECT_EQ(-1, table_view_.selectedRow);
ExpectRowImageIsConnectedImage(0, gfx::kChromeIconGrey);
ExpectRowTextIs(0, @"a");
EXPECT_TRUE(IsRowPaired(0));
EXPECT_FALSE(connect_button_.enabled);
EXPECT_TRUE(cancel_button_.enabled);
EXPECT_TRUE(help_button_.enabled);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("b"), MockChooserController::kSignalStrengthLevel0Bar,
MockChooserController::ConnectedPairedStatus::NONE);
EXPECT_EQ(2, table_view_.numberOfRows);
EXPECT_EQ(1, table_view_.numberOfColumns);
EXPECT_TRUE(table_view_.enabled);
EXPECT_EQ(-1, table_view_.selectedRow);
ExpectSignalStrengthLevelImageIs(
1, MockChooserController::kSignalStrengthLevel0Bar,
MockChooserController::kImageColorUnselected);
ExpectRowTextIs(1, @"b");
EXPECT_FALSE(IsRowPaired(1));
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("c"), MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::ConnectedPairedStatus::NONE);
EXPECT_EQ(3, table_view_.numberOfRows);
EXPECT_EQ(1, table_view_.numberOfColumns);
EXPECT_TRUE(table_view_.enabled);
EXPECT_EQ(-1, table_view_.selectedRow);
ExpectSignalStrengthLevelImageIs(
2, MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::kImageColorUnselected);
ExpectRowTextIs(2, @"c");
EXPECT_FALSE(IsRowPaired(2));
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("d"), MockChooserController::kSignalStrengthLevel2Bar,
MockChooserController::ConnectedPairedStatus::NONE);
ExpectSignalStrengthLevelImageIs(
3, MockChooserController::kSignalStrengthLevel2Bar,
MockChooserController::kImageColorUnselected);
ExpectRowTextIs(3, @"d");
EXPECT_FALSE(IsRowPaired(3));
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("e"), MockChooserController::kSignalStrengthLevel3Bar,
MockChooserController::ConnectedPairedStatus::NONE);
ExpectSignalStrengthLevelImageIs(
4, MockChooserController::kSignalStrengthLevel3Bar,
MockChooserController::kImageColorUnselected);
ExpectRowTextIs(4, @"e");
EXPECT_FALSE(IsRowPaired(4));
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("f"), MockChooserController::kSignalStrengthLevel4Bar,
MockChooserController::ConnectedPairedStatus::NONE);
ExpectSignalStrengthLevelImageIs(
5, MockChooserController::kSignalStrengthLevel4Bar,
MockChooserController::kImageColorUnselected);
ExpectRowTextIs(5, @"f");
EXPECT_FALSE(IsRowPaired(5));
}
TEST_F(ChooserDialogCocoaControllerTest, RemoveOption) {
CreateChooserDialog();
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("a"),
MockChooserController::kNoSignalStrengthLevelImage,
MockChooserController::ConnectedPairedStatus::CONNECTED |
MockChooserController::ConnectedPairedStatus::PAIRED);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("b"), MockChooserController::kSignalStrengthLevel0Bar,
MockChooserController::ConnectedPairedStatus::NONE);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("c"), MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::ConnectedPairedStatus::NONE);
mock_chooser_controller_->OptionRemoved(base::ASCIIToUTF16("b"));
EXPECT_EQ(2, table_view_.numberOfRows);
EXPECT_EQ(1, table_view_.numberOfColumns);
EXPECT_TRUE(table_view_.enabled);
EXPECT_EQ(-1, table_view_.selectedRow);
ExpectRowImageIsConnectedImage(0, gfx::kChromeIconGrey);
ExpectRowTextIs(0, @"a");
EXPECT_TRUE(IsRowPaired(0));
ExpectSignalStrengthLevelImageIs(
1, MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::kImageColorUnselected);
ExpectRowTextIs(1, @"c");
EXPECT_FALSE(IsRowPaired(1));
// Remove a non-existent option, the number of rows should not change.
mock_chooser_controller_->OptionRemoved(base::ASCIIToUTF16("non-existent"));
EXPECT_EQ(2, table_view_.numberOfRows);
EXPECT_EQ(1, table_view_.numberOfColumns);
EXPECT_TRUE(table_view_.enabled);
EXPECT_EQ(-1, table_view_.selectedRow);
ExpectRowTextIs(0, @"a");
ExpectRowTextIs(1, @"c");
mock_chooser_controller_->OptionRemoved(base::ASCIIToUTF16("c"));
EXPECT_EQ(1, table_view_.numberOfRows);
EXPECT_EQ(1, table_view_.numberOfColumns);
EXPECT_TRUE(table_view_.enabled);
EXPECT_EQ(-1, table_view_.selectedRow);
ExpectRowTextIs(0, @"a");
mock_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(1, table_view_.numberOfRows);
EXPECT_EQ(1, table_view_.numberOfColumns);
// |table_view_| should be disabled since all options are removed.
EXPECT_FALSE(table_view_.enabled);
EXPECT_EQ(-1, table_view_.selectedRow);
ExpectNoRowImage(0);
ExpectRowTextIs(
0, l10n_util::GetNSString(IDS_DEVICE_CHOOSER_NO_DEVICES_FOUND_PROMPT));
EXPECT_FALSE(IsRowPaired(0));
}
TEST_F(ChooserDialogCocoaControllerTest, UpdateOption) {
CreateChooserDialog();
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("a"),
MockChooserController::kNoSignalStrengthLevelImage,
MockChooserController::ConnectedPairedStatus::CONNECTED |
MockChooserController::ConnectedPairedStatus::PAIRED);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("b"), MockChooserController::kSignalStrengthLevel0Bar,
MockChooserController::ConnectedPairedStatus::NONE);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("c"), MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::ConnectedPairedStatus::NONE);
mock_chooser_controller_->OptionUpdated(
base::ASCIIToUTF16("b"), base::ASCIIToUTF16("d"),
MockChooserController::kNoSignalStrengthLevelImage,
MockChooserController::ConnectedPairedStatus::CONNECTED |
MockChooserController::ConnectedPairedStatus::PAIRED);
EXPECT_EQ(3, table_view_.numberOfRows);
EXPECT_EQ(1, table_view_.numberOfColumns);
EXPECT_TRUE(table_view_.enabled);
EXPECT_EQ(-1, table_view_.selectedRow);
ExpectRowImageIsConnectedImage(0, gfx::kChromeIconGrey);
ExpectRowTextIs(0, @"a");
EXPECT_TRUE(IsRowPaired(0));
ExpectRowImageIsConnectedImage(1, gfx::kChromeIconGrey);
ExpectRowTextIs(1, @"d");
EXPECT_TRUE(IsRowPaired(1));
ExpectSignalStrengthLevelImageIs(
2, MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::kImageColorUnselected);
ExpectRowTextIs(2, @"c");
EXPECT_FALSE(IsRowPaired(2));
}
TEST_F(ChooserDialogCocoaControllerTest, AddAndRemoveOption) {
CreateChooserDialog();
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("a"),
MockChooserController::kNoSignalStrengthLevelImage,
MockChooserController::ConnectedPairedStatus::CONNECTED |
MockChooserController::ConnectedPairedStatus::PAIRED);
EXPECT_EQ(1, table_view_.numberOfRows);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("b"), MockChooserController::kSignalStrengthLevel0Bar,
MockChooserController::ConnectedPairedStatus::NONE);
EXPECT_EQ(2, table_view_.numberOfRows);
mock_chooser_controller_->OptionRemoved(base::ASCIIToUTF16("b"));
EXPECT_EQ(1, table_view_.numberOfRows);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("c"), MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::ConnectedPairedStatus::NONE);
EXPECT_EQ(2, table_view_.numberOfRows);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("d"), MockChooserController::kSignalStrengthLevel2Bar,
MockChooserController::ConnectedPairedStatus::NONE);
EXPECT_EQ(3, table_view_.numberOfRows);
mock_chooser_controller_->OptionRemoved(base::ASCIIToUTF16("d"));
EXPECT_EQ(2, table_view_.numberOfRows);
mock_chooser_controller_->OptionRemoved(base::ASCIIToUTF16("c"));
EXPECT_EQ(1, table_view_.numberOfRows);
}
TEST_F(ChooserDialogCocoaControllerTest, UpdateAndRemoveTheUpdatedOption) {
CreateChooserDialog();
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("a"),
MockChooserController::kNoSignalStrengthLevelImage,
MockChooserController::ConnectedPairedStatus::CONNECTED |
MockChooserController::ConnectedPairedStatus::PAIRED);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("b"), MockChooserController::kSignalStrengthLevel0Bar,
MockChooserController::ConnectedPairedStatus::NONE);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("c"), MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::ConnectedPairedStatus::NONE);
mock_chooser_controller_->OptionUpdated(
base::ASCIIToUTF16("b"), base::ASCIIToUTF16("d"),
MockChooserController::kNoSignalStrengthLevelImage,
MockChooserController::ConnectedPairedStatus::CONNECTED |
MockChooserController::ConnectedPairedStatus::PAIRED);
mock_chooser_controller_->OptionRemoved(base::ASCIIToUTF16("d"));
EXPECT_EQ(2, table_view_.numberOfRows);
EXPECT_EQ(1, table_view_.numberOfColumns);
EXPECT_TRUE(table_view_.enabled);
EXPECT_EQ(-1, table_view_.selectedRow);
ExpectRowImageIsConnectedImage(0, gfx::kChromeIconGrey);
ExpectRowTextIs(0, @"a");
EXPECT_TRUE(IsRowPaired(0));
ExpectSignalStrengthLevelImageIs(
1, MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::kImageColorUnselected);
ExpectRowTextIs(1, @"c");
EXPECT_FALSE(IsRowPaired(1));
}
TEST_F(ChooserDialogCocoaControllerTest,
RowImageAndTextChangeColorWhenSelectionChanges) {
CreateChooserDialog();
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("a"),
MockChooserController::kNoSignalStrengthLevelImage,
MockChooserController::ConnectedPairedStatus::CONNECTED |
MockChooserController::ConnectedPairedStatus::PAIRED);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("b"), MockChooserController::kSignalStrengthLevel0Bar,
MockChooserController::ConnectedPairedStatus::NONE);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("c"), MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::ConnectedPairedStatus::NONE);
ExpectRowImageIsConnectedImage(0, gfx::kChromeIconGrey);
ExpectSignalStrengthLevelImageIs(
1, MockChooserController::kSignalStrengthLevel0Bar,
MockChooserController::kImageColorUnselected);
ExpectSignalStrengthLevelImageIs(
2, MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::kImageColorUnselected);
ExpectRowTextColorIs(0, [NSColor blackColor]);
ExpectRowTextColorIs(1, [NSColor blackColor]);
ExpectRowTextColorIs(2, [NSColor blackColor]);
ExpectPairedTextColorIs(
0, skia::SkColorToCalibratedNSColor(gfx::kGoogleGreen700));
// Option 0 shows a Bluetooth connected image, the following code tests the
// color of that image and text change when the option is selected or
// deselected.
// Select option 0.
[table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0]
byExtendingSelection:NO];
EXPECT_EQ(0, table_view_.selectedRow);
ExpectRowImageIsConnectedImage(0, SK_ColorWHITE);
ExpectSignalStrengthLevelImageIs(
1, MockChooserController::kSignalStrengthLevel0Bar,
MockChooserController::kImageColorUnselected);
ExpectSignalStrengthLevelImageIs(
2, MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::kImageColorUnselected);
ExpectRowTextColorIs(0, [NSColor whiteColor]);
ExpectRowTextColorIs(1, [NSColor blackColor]);
ExpectRowTextColorIs(2, [NSColor blackColor]);
ExpectPairedTextColorIs(
0, skia::SkColorToCalibratedNSColor(gfx::kGoogleGreen300));
// Deselect option 0.
[table_view_ deselectRow:0];
EXPECT_EQ(-1, table_view_.selectedRow);
ExpectRowImageIsConnectedImage(0, gfx::kChromeIconGrey);
ExpectSignalStrengthLevelImageIs(
1, MockChooserController::kSignalStrengthLevel0Bar,
MockChooserController::kImageColorUnselected);
ExpectSignalStrengthLevelImageIs(
2, MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::kImageColorUnselected);
ExpectRowTextColorIs(0, [NSColor blackColor]);
ExpectRowTextColorIs(1, [NSColor blackColor]);
ExpectRowTextColorIs(2, [NSColor blackColor]);
ExpectPairedTextColorIs(
0, skia::SkColorToCalibratedNSColor(gfx::kGoogleGreen700));
// Option 1 shows a signal strengh level image, the following code tests the
// color of that image and text change when the option is selected or
// deselected.
// Select option 1.
[table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:1]
byExtendingSelection:NO];
EXPECT_EQ(1, table_view_.selectedRow);
ExpectRowImageIsConnectedImage(0, gfx::kChromeIconGrey);
ExpectSignalStrengthLevelImageIs(
1, MockChooserController::kSignalStrengthLevel0Bar,
MockChooserController::kImageColorSelected);
ExpectSignalStrengthLevelImageIs(
2, MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::kImageColorUnselected);
ExpectRowTextColorIs(0, [NSColor blackColor]);
ExpectRowTextColorIs(1, [NSColor whiteColor]);
ExpectRowTextColorIs(2, [NSColor blackColor]);
ExpectPairedTextColorIs(
0, skia::SkColorToCalibratedNSColor(gfx::kGoogleGreen700));
// Deselect option 1.
[table_view_ deselectRow:1];
EXPECT_EQ(-1, table_view_.selectedRow);
ExpectRowImageIsConnectedImage(0, gfx::kChromeIconGrey);
ExpectSignalStrengthLevelImageIs(
1, MockChooserController::kSignalStrengthLevel0Bar,
MockChooserController::kImageColorUnselected);
ExpectSignalStrengthLevelImageIs(
2, MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::kImageColorUnselected);
ExpectRowTextColorIs(0, [NSColor blackColor]);
ExpectRowTextColorIs(1, [NSColor blackColor]);
ExpectRowTextColorIs(2, [NSColor blackColor]);
ExpectPairedTextColorIs(
0, skia::SkColorToCalibratedNSColor(gfx::kGoogleGreen700));
// The following code tests the color of the image and text change when
// selecting another option without deselecting the first.
// Select option 0.
[table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0]
byExtendingSelection:NO];
// Select option 1.
[table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:1]
byExtendingSelection:NO];
EXPECT_EQ(1, table_view_.selectedRow);
ExpectRowImageIsConnectedImage(0, gfx::kChromeIconGrey);
ExpectSignalStrengthLevelImageIs(
1, MockChooserController::kSignalStrengthLevel0Bar,
MockChooserController::kImageColorSelected);
ExpectSignalStrengthLevelImageIs(
2, MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::kImageColorUnselected);
ExpectRowTextColorIs(0, [NSColor blackColor]);
ExpectRowTextColorIs(1, [NSColor whiteColor]);
ExpectRowTextColorIs(2, [NSColor blackColor]);
ExpectPairedTextColorIs(
0, skia::SkColorToCalibratedNSColor(gfx::kGoogleGreen700));
// The following code tests the color of the image and text of a selected
// option when it is updated.
// Select option 2.
[table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:2]
byExtendingSelection:NO];
// Update option 2 from one signal strength to another.
mock_chooser_controller_->OptionUpdated(
base::ASCIIToUTF16("c"), base::ASCIIToUTF16("e"),
MockChooserController::kSignalStrengthLevel2Bar,
MockChooserController::ConnectedPairedStatus::NONE);
ExpectSignalStrengthLevelImageIs(
2, MockChooserController::kSignalStrengthLevel2Bar,
MockChooserController::kImageColorSelected);
ExpectRowTextColorIs(0, [NSColor blackColor]);
ExpectRowTextColorIs(1, [NSColor blackColor]);
ExpectRowTextColorIs(2, [NSColor whiteColor]);
// Update option 2 again from non-connected and non-paired to connected
// and paired.
mock_chooser_controller_->OptionUpdated(
base::ASCIIToUTF16("e"), base::ASCIIToUTF16("f"),
MockChooserController::kNoSignalStrengthLevelImage,
MockChooserController::ConnectedPairedStatus::CONNECTED |
MockChooserController::ConnectedPairedStatus::PAIRED);
ExpectRowImageIsConnectedImage(2, SK_ColorWHITE);
ExpectRowTextColorIs(0, [NSColor blackColor]);
ExpectRowTextColorIs(1, [NSColor blackColor]);
ExpectRowTextColorIs(2, [NSColor whiteColor]);
ExpectPairedTextColorIs(
2, skia::SkColorToCalibratedNSColor(gfx::kGoogleGreen300));
}
TEST_F(ChooserDialogCocoaControllerTest, SelectAndDeselectAnOption) {
CreateChooserDialog();
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("a"),
MockChooserController::kNoSignalStrengthLevelImage,
MockChooserController::ConnectedPairedStatus::CONNECTED |
MockChooserController::ConnectedPairedStatus::PAIRED);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("b"), MockChooserController::kSignalStrengthLevel0Bar,
MockChooserController::ConnectedPairedStatus::NONE);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("c"), MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::ConnectedPairedStatus::NONE);
// Select option 0.
[table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0]
byExtendingSelection:NO];
EXPECT_EQ(0, table_view_.selectedRow);
EXPECT_TRUE(connect_button_.enabled);
// Deselect option 0.
[table_view_ deselectRow:0];
EXPECT_EQ(-1, table_view_.selectedRow);
EXPECT_FALSE(connect_button_.enabled);
// Select option 1.
[table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:1]
byExtendingSelection:NO];
EXPECT_EQ(1, table_view_.selectedRow);
EXPECT_TRUE(connect_button_.enabled);
// Deselect option 1.
[table_view_ deselectRow:1];
EXPECT_EQ(-1, table_view_.selectedRow);
EXPECT_FALSE(connect_button_.enabled);
}
TEST_F(ChooserDialogCocoaControllerTest,
SelectAnOptionAndThenSelectAnotherOption) {
CreateChooserDialog();
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("a"),
MockChooserController::kNoSignalStrengthLevelImage,
MockChooserController::ConnectedPairedStatus::CONNECTED |
MockChooserController::ConnectedPairedStatus::PAIRED);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("b"), MockChooserController::kSignalStrengthLevel0Bar,
MockChooserController::ConnectedPairedStatus::NONE);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("c"), MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::ConnectedPairedStatus::NONE);
// Select option 0.
[table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0]
byExtendingSelection:NO];
EXPECT_EQ(0, table_view_.selectedRow);
EXPECT_TRUE(connect_button_.enabled);
// Select option 1.
[table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:1]
byExtendingSelection:NO];
EXPECT_EQ(1, table_view_.selectedRow);
EXPECT_TRUE(connect_button_.enabled);
// Select option 2.
[table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:2]
byExtendingSelection:NO];
EXPECT_EQ(2, table_view_.selectedRow);
EXPECT_TRUE(connect_button_.enabled);
}
TEST_F(ChooserDialogCocoaControllerTest, SelectAnOptionAndRemoveAnotherOption) {
CreateChooserDialog();
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("a"),
MockChooserController::kNoSignalStrengthLevelImage,
MockChooserController::ConnectedPairedStatus::CONNECTED |
MockChooserController::ConnectedPairedStatus::PAIRED);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("b"), MockChooserController::kSignalStrengthLevel0Bar,
MockChooserController::ConnectedPairedStatus::NONE);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("c"), MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::ConnectedPairedStatus::NONE);
// Select option 1.
[table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:1]
byExtendingSelection:NO];
EXPECT_EQ(3, table_view_.numberOfRows);
EXPECT_EQ(1, table_view_.selectedRow);
EXPECT_TRUE(connect_button_.enabled);
// Remove option 0. The list becomes: b c. And the index of the previously
// selected item "b" becomes 0.
mock_chooser_controller_->OptionRemoved(base::ASCIIToUTF16("a"));
EXPECT_EQ(2, table_view_.numberOfRows);
EXPECT_EQ(0, table_view_.selectedRow);
EXPECT_TRUE(connect_button_.enabled);
// Remove option 1. The list becomes: b.
mock_chooser_controller_->OptionRemoved(base::ASCIIToUTF16("c"));
EXPECT_EQ(1, table_view_.numberOfRows);
EXPECT_EQ(0, table_view_.selectedRow);
EXPECT_TRUE(connect_button_.enabled);
}
TEST_F(ChooserDialogCocoaControllerTest,
SelectAnOptionAndRemoveTheSelectedOption) {
CreateChooserDialog();
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("a"),
MockChooserController::kNoSignalStrengthLevelImage,
MockChooserController::ConnectedPairedStatus::CONNECTED |
MockChooserController::ConnectedPairedStatus::PAIRED);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("b"), MockChooserController::kSignalStrengthLevel0Bar,
MockChooserController::ConnectedPairedStatus::NONE);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("c"), MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::ConnectedPairedStatus::NONE);
// Select option 1.
[table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:1]
byExtendingSelection:NO];
EXPECT_EQ(3, table_view_.numberOfRows);
EXPECT_EQ(1, table_view_.selectedRow);
EXPECT_TRUE(connect_button_.enabled);
// Remove option 1
mock_chooser_controller_->OptionRemoved(base::ASCIIToUTF16("b"));
EXPECT_EQ(2, table_view_.numberOfRows);
// No option selected.
EXPECT_EQ(-1, table_view_.selectedRow);
// Since no option selected, the "Connect" button should be disabled.
EXPECT_FALSE(connect_button_.enabled);
}
TEST_F(ChooserDialogCocoaControllerTest,
SelectAnOptionAndUpdateTheSelectedOption) {
CreateChooserDialog();
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("a"),
MockChooserController::kNoSignalStrengthLevelImage,
MockChooserController::ConnectedPairedStatus::CONNECTED |
MockChooserController::ConnectedPairedStatus::PAIRED);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("b"), MockChooserController::kSignalStrengthLevel0Bar,
MockChooserController::ConnectedPairedStatus::NONE);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("c"), MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::ConnectedPairedStatus::NONE);
// Select option 1.
[table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:1]
byExtendingSelection:NO];
// Update option 1.
mock_chooser_controller_->OptionUpdated(
base::ASCIIToUTF16("b"), base::ASCIIToUTF16("d"),
MockChooserController::kNoSignalStrengthLevelImage,
MockChooserController::ConnectedPairedStatus::CONNECTED |
MockChooserController::ConnectedPairedStatus::PAIRED);
EXPECT_EQ(1, table_view_.selectedRow);
ExpectRowImageIsConnectedImage(0, gfx::kChromeIconGrey);
ExpectRowTextIs(0, @"a");
EXPECT_TRUE(IsRowPaired(0));
ExpectRowImageIsConnectedImage(1, SK_ColorWHITE);
ExpectRowTextIs(1, @"d");
EXPECT_TRUE(IsRowPaired(1));
ExpectSignalStrengthLevelImageIs(
2, MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::kImageColorUnselected);
ExpectRowTextIs(2, @"c");
EXPECT_FALSE(IsRowPaired(2));
EXPECT_TRUE(connect_button_.enabled);
}
TEST_F(ChooserDialogCocoaControllerTest,
AddAnOptionAndSelectItAndRemoveTheSelectedOption) {
CreateChooserDialog();
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("a"),
MockChooserController::kNoSignalStrengthLevelImage,
MockChooserController::ConnectedPairedStatus::CONNECTED |
MockChooserController::ConnectedPairedStatus::PAIRED);
// Select option 0.
[table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0]
byExtendingSelection:NO];
EXPECT_EQ(1, table_view_.numberOfRows);
EXPECT_EQ(0, table_view_.selectedRow);
EXPECT_TRUE(connect_button_.enabled);
// Remove option 0.
mock_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(1, table_view_.numberOfRows);
// No option selected.
EXPECT_EQ(-1, table_view_.selectedRow);
// |table_view_| should be disabled since there is no option shown.
EXPECT_FALSE(table_view_.enabled);
ExpectNoRowImage(0);
ExpectRowTextIs(
0, l10n_util::GetNSString(IDS_DEVICE_CHOOSER_NO_DEVICES_FOUND_PROMPT));
EXPECT_FALSE(IsRowPaired(0));
// Since no option selected, the "Connect" button should be disabled.
EXPECT_FALSE(connect_button_.enabled);
}
TEST_F(ChooserDialogCocoaControllerTest, NoOptionSelectedAndPressCancelButton) {
CreateChooserDialog();
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("a"),
MockChooserController::kNoSignalStrengthLevelImage,
MockChooserController::ConnectedPairedStatus::CONNECTED |
MockChooserController::ConnectedPairedStatus::PAIRED);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("b"), MockChooserController::kSignalStrengthLevel0Bar,
MockChooserController::ConnectedPairedStatus::NONE);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("c"), MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::ConnectedPairedStatus::NONE);
EXPECT_CALL(*mock_chooser_controller_, Select(testing::_)).Times(0);
EXPECT_CALL(*mock_chooser_controller_, Cancel()).Times(1);
[cancel_button_ performClick:chooser_dialog_controller_];
}
TEST_F(ChooserDialogCocoaControllerTest, SelectAnOptionAndPressConnectButton) {
CreateChooserDialog();
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("a"),
MockChooserController::kNoSignalStrengthLevelImage,
MockChooserController::ConnectedPairedStatus::CONNECTED |
MockChooserController::ConnectedPairedStatus::PAIRED);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("b"), MockChooserController::kSignalStrengthLevel0Bar,
MockChooserController::ConnectedPairedStatus::NONE);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("c"), MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::ConnectedPairedStatus::NONE);
// Select option 0 and press "Connect" button.
[table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0]
byExtendingSelection:NO];
std::vector<size_t> indices(1);
indices[0] = 0;
EXPECT_CALL(*mock_chooser_controller_, Select(indices)).Times(1);
EXPECT_CALL(*mock_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];
indices[0] = 2;
EXPECT_CALL(*mock_chooser_controller_, Select(indices)).Times(1);
EXPECT_CALL(*mock_chooser_controller_, Cancel()).Times(0);
[connect_button_ performClick:chooser_dialog_controller_];
}
TEST_F(ChooserDialogCocoaControllerTest, SelectAnOptionAndPressCancelButton) {
CreateChooserDialog();
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("a"),
MockChooserController::kNoSignalStrengthLevelImage,
MockChooserController::ConnectedPairedStatus::CONNECTED |
MockChooserController::ConnectedPairedStatus::PAIRED);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("b"), MockChooserController::kSignalStrengthLevel0Bar,
MockChooserController::ConnectedPairedStatus::NONE);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("c"), MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::ConnectedPairedStatus::NONE);
// Select option 0 and press "Cancel" button.
[table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0]
byExtendingSelection:NO];
EXPECT_CALL(*mock_chooser_controller_, Select(testing::_)).Times(0);
EXPECT_CALL(*mock_chooser_controller_, Cancel()).Times(1);
[cancel_button_ performClick:chooser_dialog_controller_];
}
TEST_F(ChooserDialogCocoaControllerTest, AdapterOnAndOffAndOn) {
CreateChooserDialog();
mock_chooser_controller_->OnAdapterPresenceChanged(
content::BluetoothChooser::AdapterPresence::POWERED_ON);
EXPECT_TRUE(adapter_off_help_button_.hidden);
EXPECT_FALSE(table_view_.hidden);
// 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(1, table_view_.numberOfRows);
// |table_view_| should be disabled since there is no option shown.
EXPECT_FALSE(table_view_.enabled);
// No option selected.
EXPECT_EQ(-1, table_view_.selectedRow);
ExpectNoRowImage(0);
ExpectRowTextIs(
0, l10n_util::GetNSString(IDS_DEVICE_CHOOSER_NO_DEVICES_FOUND_PROMPT));
EXPECT_FALSE(IsRowPaired(0));
EXPECT_TRUE(spinner_.hidden);
EXPECT_TRUE(scanning_message_.hidden);
EXPECT_FALSE(word_connector_.hidden);
EXPECT_FALSE(rescan_button_.hidden);
EXPECT_NSEQ(l10n_util::GetNSString(IDS_BLUETOOTH_DEVICE_CHOOSER_RE_SCAN),
rescan_button_.title);
EXPECT_FALSE(connect_button_.enabled);
EXPECT_TRUE(cancel_button_.enabled);
// Add options
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("a"),
MockChooserController::kNoSignalStrengthLevelImage,
MockChooserController::ConnectedPairedStatus::CONNECTED |
MockChooserController::ConnectedPairedStatus::PAIRED);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("b"), MockChooserController::kSignalStrengthLevel0Bar,
MockChooserController::ConnectedPairedStatus::NONE);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("c"), MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::ConnectedPairedStatus::NONE);
EXPECT_TRUE(table_view_.enabled);
EXPECT_EQ(3, table_view_.numberOfRows);
// Select option 1.
[table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:1]
byExtendingSelection:NO];
EXPECT_EQ(1, table_view_.selectedRow);
EXPECT_TRUE(connect_button_.enabled);
EXPECT_TRUE(cancel_button_.enabled);
mock_chooser_controller_->OnAdapterPresenceChanged(
content::BluetoothChooser::AdapterPresence::POWERED_OFF);
EXPECT_FALSE(adapter_off_help_button_.hidden);
EXPECT_NSEQ(l10n_util::GetNSString(
IDS_BLUETOOTH_DEVICE_CHOOSER_TURN_ON_BLUETOOTH_LINK_TEXT),
adapter_off_help_button_.title);
EXPECT_TRUE(table_view_.hidden);
EXPECT_TRUE(spinner_.hidden);
EXPECT_TRUE(scanning_message_.hidden);
EXPECT_TRUE(word_connector_.hidden);
EXPECT_TRUE(rescan_button_.hidden);
// Since the adapter is turned off, the previously selected option
// becomes invalid, the OK button is disabled.
EXPECT_EQ(0u, mock_chooser_controller_->NumOptions());
EXPECT_FALSE(connect_button_.enabled);
EXPECT_TRUE(cancel_button_.enabled);
mock_chooser_controller_->OnAdapterPresenceChanged(
content::BluetoothChooser::AdapterPresence::POWERED_ON);
EXPECT_TRUE(adapter_off_help_button_.hidden);
EXPECT_FALSE(table_view_.hidden);
ExpectNoRowImage(0);
ExpectRowTextIs(
0, l10n_util::GetNSString(IDS_DEVICE_CHOOSER_NO_DEVICES_FOUND_PROMPT));
EXPECT_FALSE(IsRowPaired(0));
EXPECT_EQ(0u, mock_chooser_controller_->NumOptions());
EXPECT_FALSE(connect_button_.enabled);
EXPECT_TRUE(cancel_button_.enabled);
}
TEST_F(ChooserDialogCocoaControllerTest, DiscoveringAndNoOptionAddedAndIdle) {
CreateChooserDialog();
// Add options
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("a"),
MockChooserController::kNoSignalStrengthLevelImage,
MockChooserController::ConnectedPairedStatus::CONNECTED |
MockChooserController::ConnectedPairedStatus::PAIRED);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("b"), MockChooserController::kSignalStrengthLevel0Bar,
MockChooserController::ConnectedPairedStatus::NONE);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("c"), MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::ConnectedPairedStatus::NONE);
EXPECT_FALSE(table_view_.hidden);
EXPECT_TRUE(table_view_.enabled);
EXPECT_EQ(3, table_view_.numberOfRows);
// Select option 1.
[table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:1]
byExtendingSelection:NO];
EXPECT_EQ(1, table_view_.selectedRow);
EXPECT_TRUE(spinner_.hidden);
EXPECT_TRUE(scanning_message_.hidden);
EXPECT_TRUE(word_connector_.hidden);
EXPECT_TRUE(rescan_button_.hidden);
EXPECT_TRUE(connect_button_.enabled);
EXPECT_TRUE(cancel_button_.enabled);
mock_chooser_controller_->OnDiscoveryStateChanged(
content::BluetoothChooser::DiscoveryState::DISCOVERING);
EXPECT_TRUE(table_view_.hidden);
EXPECT_FALSE(spinner_.hidden);
EXPECT_FALSE(scanning_message_.hidden);
EXPECT_TRUE(word_connector_.hidden);
EXPECT_TRUE(rescan_button_.hidden);
// OK button is disabled since the chooser is refreshing options.
EXPECT_FALSE(connect_button_.enabled);
EXPECT_TRUE(cancel_button_.enabled);
mock_chooser_controller_->OnDiscoveryStateChanged(
content::BluetoothChooser::DiscoveryState::IDLE);
EXPECT_FALSE(table_view_.hidden);
// 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(1, table_view_.numberOfRows);
// |table_view_| should be disabled since there is no option shown.
EXPECT_FALSE(table_view_.enabled);
// No option selected.
EXPECT_EQ(-1, table_view_.selectedRow);
ExpectNoRowImage(0);
ExpectRowTextIs(
0, l10n_util::GetNSString(IDS_DEVICE_CHOOSER_NO_DEVICES_FOUND_PROMPT));
EXPECT_FALSE(IsRowPaired(0));
EXPECT_TRUE(spinner_.hidden);
EXPECT_TRUE(scanning_message_.hidden);
EXPECT_FALSE(word_connector_.hidden);
EXPECT_FALSE(rescan_button_.hidden);
EXPECT_NSEQ(l10n_util::GetNSString(IDS_BLUETOOTH_DEVICE_CHOOSER_RE_SCAN),
rescan_button_.title);
// OK button is disabled since the chooser refreshed options.
EXPECT_FALSE(connect_button_.enabled);
EXPECT_TRUE(cancel_button_.enabled);
}
TEST_F(ChooserDialogCocoaControllerTest,
DiscoveringAndOneOptionAddedAndSelectedAndIdle) {
CreateChooserDialog();
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("a"),
MockChooserController::kNoSignalStrengthLevelImage,
MockChooserController::ConnectedPairedStatus::CONNECTED |
MockChooserController::ConnectedPairedStatus::PAIRED);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("b"), MockChooserController::kSignalStrengthLevel0Bar,
MockChooserController::ConnectedPairedStatus::NONE);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("c"), MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::ConnectedPairedStatus::NONE);
[table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:1]
byExtendingSelection:NO];
mock_chooser_controller_->OnDiscoveryStateChanged(
content::BluetoothChooser::DiscoveryState::DISCOVERING);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("d"), MockChooserController::kSignalStrengthLevel2Bar,
MockChooserController::ConnectedPairedStatus::NONE);
EXPECT_FALSE(table_view_.hidden);
// |table_view_| should be enabled since there is an option.
EXPECT_TRUE(table_view_.enabled);
EXPECT_EQ(1, table_view_.numberOfRows);
// No option selected.
EXPECT_EQ(-1, table_view_.selectedRow);
ExpectSignalStrengthLevelImageIs(
0, MockChooserController::kSignalStrengthLevel2Bar,
MockChooserController::kImageColorUnselected);
ExpectRowTextIs(0, @"d");
EXPECT_FALSE(IsRowPaired(0));
EXPECT_TRUE(spinner_.hidden);
EXPECT_FALSE(scanning_message_.hidden);
EXPECT_TRUE(word_connector_.hidden);
EXPECT_TRUE(rescan_button_.hidden);
// OK button is disabled since no option is selected.
EXPECT_FALSE(connect_button_.enabled);
EXPECT_TRUE(cancel_button_.enabled);
[table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0]
byExtendingSelection:NO];
EXPECT_EQ(0, table_view_.selectedRow);
EXPECT_TRUE(connect_button_.enabled);
EXPECT_TRUE(cancel_button_.enabled);
mock_chooser_controller_->OnDiscoveryStateChanged(
content::BluetoothChooser::DiscoveryState::IDLE);
EXPECT_FALSE(table_view_.hidden);
EXPECT_TRUE(table_view_.enabled);
EXPECT_EQ(1, table_view_.numberOfRows);
EXPECT_EQ(0, table_view_.selectedRow);
ExpectRowTextIs(0, @"d");
EXPECT_FALSE(IsRowPaired(0));
EXPECT_TRUE(spinner_.hidden);
EXPECT_TRUE(scanning_message_.hidden);
EXPECT_FALSE(word_connector_.hidden);
EXPECT_FALSE(rescan_button_.hidden);
EXPECT_NSEQ(l10n_util::GetNSString(IDS_BLUETOOTH_DEVICE_CHOOSER_RE_SCAN),
rescan_button_.title);
EXPECT_TRUE(connect_button_.enabled);
EXPECT_TRUE(cancel_button_.enabled);
}
TEST_F(ChooserDialogCocoaControllerTest, MultipleSelection) {
CreateChooserDialog();
[table_view_ setAllowsMultipleSelection:YES];
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("a"),
MockChooserController::kNoSignalStrengthLevelImage,
MockChooserController::ConnectedPairedStatus::CONNECTED |
MockChooserController::ConnectedPairedStatus::PAIRED);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("b"), MockChooserController::kSignalStrengthLevel0Bar,
MockChooserController::ConnectedPairedStatus::NONE);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("c"), MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::ConnectedPairedStatus::NONE);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("d"), MockChooserController::kSignalStrengthLevel2Bar,
MockChooserController::ConnectedPairedStatus::NONE);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("e"), MockChooserController::kSignalStrengthLevel3Bar,
MockChooserController::ConnectedPairedStatus::NONE);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("f"), MockChooserController::kSignalStrengthLevel4Bar,
MockChooserController::ConnectedPairedStatus::NONE);
NSMutableIndexSet* selected_rows = [NSMutableIndexSet indexSet];
// Select options "a", "c", "d".
[selected_rows addIndex:0];
[selected_rows addIndex:2];
[selected_rows addIndex:3];
[table_view_ selectRowIndexes:selected_rows byExtendingSelection:NO];
// The options are: [a] b [c] [d] e f. The option with [] is selected.
EXPECT_NSEQ(selected_rows, [table_view_ selectedRowIndexes]);
ExpectRowImageIsConnectedImage(0, SK_ColorWHITE);
ExpectSignalStrengthLevelImageIs(
1, MockChooserController::kSignalStrengthLevel0Bar,
MockChooserController::kImageColorUnselected);
ExpectSignalStrengthLevelImageIs(
2, MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::kImageColorSelected);
ExpectSignalStrengthLevelImageIs(
3, MockChooserController::kSignalStrengthLevel2Bar,
MockChooserController::kImageColorSelected);
ExpectSignalStrengthLevelImageIs(
4, MockChooserController::kSignalStrengthLevel3Bar,
MockChooserController::kImageColorUnselected);
ExpectSignalStrengthLevelImageIs(
5, MockChooserController::kSignalStrengthLevel4Bar,
MockChooserController::kImageColorUnselected);
ExpectRowTextColorIs(0, [NSColor whiteColor]);
ExpectRowTextColorIs(1, [NSColor blackColor]);
ExpectRowTextColorIs(2, [NSColor whiteColor]);
ExpectRowTextColorIs(3, [NSColor whiteColor]);
ExpectRowTextColorIs(4, [NSColor blackColor]);
ExpectRowTextColorIs(5, [NSColor blackColor]);
ExpectPairedTextColorIs(
0, skia::SkColorToCalibratedNSColor(gfx::kGoogleGreen300));
EXPECT_TRUE(connect_button_.enabled);
// Remove option "b".
// The options are: [a] [c] [d] e f.
mock_chooser_controller_->OptionRemoved(base::ASCIIToUTF16("b"));
EXPECT_TRUE([table_view_ isRowSelected:0]);
EXPECT_TRUE([table_view_ isRowSelected:1]);
EXPECT_TRUE([table_view_ isRowSelected:2]);
EXPECT_FALSE([table_view_ isRowSelected:3]);
EXPECT_FALSE([table_view_ isRowSelected:4]);
EXPECT_TRUE(connect_button_.enabled);
// Remove option "c".
// The options are: [a] [d] e f.
mock_chooser_controller_->OptionRemoved(base::ASCIIToUTF16("c"));
EXPECT_TRUE([table_view_ isRowSelected:0]);
EXPECT_TRUE([table_view_ isRowSelected:1]);
EXPECT_FALSE([table_view_ isRowSelected:2]);
EXPECT_FALSE([table_view_ isRowSelected:3]);
EXPECT_TRUE(connect_button_.enabled);
// Remove option "a".
// The options are: [d] e f.
mock_chooser_controller_->OptionRemoved(base::ASCIIToUTF16("a"));
EXPECT_TRUE([table_view_ isRowSelected:0]);
EXPECT_FALSE([table_view_ isRowSelected:1]);
EXPECT_FALSE([table_view_ isRowSelected:2]);
EXPECT_TRUE(connect_button_.enabled);
// Remove option "d".
// The options are: e f.
mock_chooser_controller_->OptionRemoved(base::ASCIIToUTF16("d"));
EXPECT_FALSE([table_view_ isRowSelected:0]);
EXPECT_FALSE([table_view_ isRowSelected:1]);
EXPECT_FALSE(connect_button_.enabled);
}
TEST_F(ChooserDialogCocoaControllerTest, PressAdapterOffHelpButton) {
CreateChooserDialog();
EXPECT_CALL(*mock_chooser_controller_, OpenAdapterOffHelpUrl()).Times(1);
[adapter_off_help_button_ performClick:chooser_dialog_controller_];
}
TEST_F(ChooserDialogCocoaControllerTest, PressRescanButton) {
CreateChooserDialog();
EXPECT_CALL(*mock_chooser_controller_, RefreshOptions()).Times(1);
[rescan_button_ performClick:chooser_dialog_controller_];
}
TEST_F(ChooserDialogCocoaControllerTest, PressHelpButton) {
CreateChooserDialog();
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("a"),
MockChooserController::kNoSignalStrengthLevelImage,
MockChooserController::ConnectedPairedStatus::CONNECTED |
MockChooserController::ConnectedPairedStatus::PAIRED);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("b"), MockChooserController::kSignalStrengthLevel0Bar,
MockChooserController::ConnectedPairedStatus::NONE);
mock_chooser_controller_->OptionAdded(
base::ASCIIToUTF16("c"), MockChooserController::kSignalStrengthLevel1Bar,
MockChooserController::ConnectedPairedStatus::NONE);
// Select option 0 and press "Get help" button.
[table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0]
byExtendingSelection:NO];
EXPECT_CALL(*mock_chooser_controller_, Select(testing::_)).Times(0);
EXPECT_CALL(*mock_chooser_controller_, Cancel()).Times(0);
EXPECT_CALL(*mock_chooser_controller_, OpenHelpCenterUrl()).Times(1);
[help_button_ performClick:chooser_dialog_controller_];
}