blob: 06216954db0c4aaa07527377f8f1f94427d6bdbe [file] [log] [blame]
// Copyright (c) 2012 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.
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/media_galleries/media_galleries_dialog_controller_mock.h"
#include "chrome/browser/ui/cocoa/extensions/media_galleries_dialog_cocoa.h"
#include "components/storage_monitor/storage_info.h"
#include "extensions/common/extension.h"
#include "extensions/common/test_util.h"
#include "testing/gtest/include/gtest/gtest.h"
using ::testing::_;
using ::testing::AnyNumber;
using ::testing::Mock;
using ::testing::NiceMock;
using ::testing::Return;
using ::testing::ReturnPointee;
using ::testing::ReturnRef;
@interface MediaGalleryListEntry (testing)
- (NSInteger)state;
- (void)performClick:(id)sender;
@end
@implementation MediaGalleryListEntry (testing)
- (NSInteger)state {
return [checkbox_ state];
}
- (void)performClick:(id)sender {
[checkbox_ performClick:sender];
}
@end
MediaGalleryPrefInfo MakePrefInfoForTesting(MediaGalleryPrefId pref_id) {
MediaGalleryPrefInfo gallery;
gallery.pref_id = pref_id;
gallery.device_id = storage_monitor::StorageInfo::MakeDeviceId(
storage_monitor::StorageInfo::FIXED_MASS_STORAGE,
base::Int64ToString(pref_id));
gallery.display_name = base::ASCIIToUTF16("name");
return gallery;
}
class MediaGalleriesDialogTest : public testing::Test {
public:
MediaGalleriesDialogTest() {}
~MediaGalleriesDialogTest() override {}
void SetUp() override {
std::vector<base::string16> headers;
headers.push_back(base::string16());
headers.push_back(base::ASCIIToUTF16("header2"));
ON_CALL(controller_, GetSectionHeaders()).
WillByDefault(Return(headers));
EXPECT_CALL(controller_, GetSectionEntries(_)).
Times(AnyNumber());
}
void TearDown() override {
Mock::VerifyAndClearExpectations(&controller_);
dialog_.reset();
}
NiceMock<MediaGalleriesDialogControllerMock>* controller() {
return &controller_;
}
MediaGalleriesDialogCocoa* GetOrCreateDialog() {
if (!dialog_.get()) {
dialog_.reset(static_cast<MediaGalleriesDialogCocoa*>(
MediaGalleriesDialog::Create(&controller_)));
}
return dialog_.get();
}
private:
NiceMock<MediaGalleriesDialogControllerMock> controller_;
scoped_ptr<MediaGalleriesDialogCocoa> dialog_;
DISALLOW_COPY_AND_ASSIGN(MediaGalleriesDialogTest);
};
// Tests that checkboxes are initialized according to the contents of
// permissions().
TEST_F(MediaGalleriesDialogTest, InitializeCheckboxes) {
MediaGalleriesDialogController::Entries attached_permissions;
attached_permissions.push_back(
MediaGalleriesDialogController::Entry(MakePrefInfoForTesting(1), true));
attached_permissions.push_back(
MediaGalleriesDialogController::Entry(MakePrefInfoForTesting(2), false));
EXPECT_CALL(*controller(), GetSectionEntries(0)).
WillRepeatedly(Return(attached_permissions));
// Initializing checkboxes should not cause them to be toggled.
EXPECT_CALL(*controller(), DidToggleEntry(_, _)).
Times(0);
EXPECT_EQ(2U, [[GetOrCreateDialog()->checkbox_container_ subviews] count]);
NSButton* checkbox1 =
[[GetOrCreateDialog()->checkbox_container_ subviews] objectAtIndex:0];
EXPECT_EQ([checkbox1 state], NSOnState);
NSButton* checkbox2 =
[[GetOrCreateDialog()->checkbox_container_ subviews] objectAtIndex:1];
EXPECT_EQ([checkbox2 state], NSOffState);
}
// Tests that toggling checkboxes updates the controller.
TEST_F(MediaGalleriesDialogTest, ToggleCheckboxes) {
MediaGalleriesDialogController::Entries attached_permissions;
attached_permissions.push_back(
MediaGalleriesDialogController::Entry(MakePrefInfoForTesting(1), true));
EXPECT_CALL(*controller(), GetSectionEntries(0)).
WillRepeatedly(Return(attached_permissions));
EXPECT_EQ(1U, [[GetOrCreateDialog()->checkbox_container_ subviews] count]);
NSButton* checkbox =
[[GetOrCreateDialog()->checkbox_container_ subviews] objectAtIndex:0];
EXPECT_EQ([checkbox state], NSOnState);
EXPECT_CALL(*controller(), DidToggleEntry(1, false));
[checkbox performClick:nil];
EXPECT_EQ([checkbox state], NSOffState);
EXPECT_CALL(*controller(), DidToggleEntry(1, true));
[checkbox performClick:nil];
EXPECT_EQ([checkbox state], NSOnState);
}
// Tests that UpdateGalleries will add a new checkbox, but only if it refers to
// a gallery that the dialog hasn't seen before.
TEST_F(MediaGalleriesDialogTest, UpdateAdds) {
MediaGalleriesDialogController::Entries attached_permissions;
EXPECT_CALL(*controller(), GetSectionEntries(0)).
WillRepeatedly(ReturnPointee(&attached_permissions));
EXPECT_EQ(0U, [[GetOrCreateDialog()->checkbox_container_ subviews] count]);
CGFloat old_container_height =
NSHeight([GetOrCreateDialog()->checkbox_container_ frame]);
attached_permissions.push_back(
MediaGalleriesDialogController::Entry(MakePrefInfoForTesting(1), true));
GetOrCreateDialog()->UpdateGalleries();
EXPECT_EQ(1U, [[GetOrCreateDialog()->checkbox_container_ subviews] count]);
// The checkbox container should be taller.
CGFloat new_container_height =
NSHeight([GetOrCreateDialog()->checkbox_container_ frame]);
EXPECT_GT(new_container_height, old_container_height);
old_container_height = new_container_height;
attached_permissions.push_back(
MediaGalleriesDialogController::Entry(MakePrefInfoForTesting(2), true));
GetOrCreateDialog()->UpdateGalleries();
EXPECT_EQ(2U, [[GetOrCreateDialog()->checkbox_container_ subviews] count]);
// The checkbox container should be taller.
new_container_height =
NSHeight([GetOrCreateDialog()->checkbox_container_ frame]);
EXPECT_GT(new_container_height, old_container_height);
old_container_height = new_container_height;
attached_permissions[1].selected = false;
GetOrCreateDialog()->UpdateGalleries();
EXPECT_EQ(2U, [[GetOrCreateDialog()->checkbox_container_ subviews] count]);
// The checkbox container height should not have changed.
new_container_height =
NSHeight([GetOrCreateDialog()->checkbox_container_ frame]);
EXPECT_EQ(new_container_height, old_container_height);
}
TEST_F(MediaGalleriesDialogTest, ForgetDeletes) {
MediaGalleriesDialogController::Entries attached_permissions;
EXPECT_CALL(*controller(), GetSectionEntries(0)).
WillRepeatedly(ReturnPointee(&attached_permissions));
GetOrCreateDialog();
// Add a couple of galleries.
attached_permissions.push_back(
MediaGalleriesDialogController::Entry(MakePrefInfoForTesting(1), true));
GetOrCreateDialog()->UpdateGalleries();
attached_permissions.push_back(
MediaGalleriesDialogController::Entry(MakePrefInfoForTesting(2), true));
GetOrCreateDialog()->UpdateGalleries();
EXPECT_EQ(2U, [[GetOrCreateDialog()->checkbox_container_ subviews] count]);
CGFloat old_container_height =
NSHeight([GetOrCreateDialog()->checkbox_container_ frame]);
// Remove a gallery.
attached_permissions.erase(attached_permissions.begin());
GetOrCreateDialog()->UpdateGalleries();
EXPECT_EQ(1U, [[GetOrCreateDialog()->checkbox_container_ subviews] count]);
// The checkbox container should be shorter.
CGFloat new_container_height =
NSHeight([GetOrCreateDialog()->checkbox_container_ frame]);
EXPECT_LT(new_container_height, old_container_height);
}