blob: d7af6292db8e35c5a0c256b7110e4e0115597d2d [file] [log] [blame]
// Copyright 2017 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 "chrome/browser/ui/views/global_error_bubble_view.h"
#include <memory>
#include <vector>
#include "chrome/browser/ui/global_error/global_error.h"
#include "chrome/browser/ui/views/chrome_layout_provider.h"
#include "chrome/test/views/chrome_test_views_delegate.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/codec/png_codec.h"
#include "ui/gfx/image/image.h"
#include "ui/gfx/image/image_png_rep.h"
#include "ui/gfx/image/image_unittest_util.h"
#include "ui/views/controls/button/button.h"
#include "ui/views/controls/button/label_button.h"
using ::testing::_;
using ::testing::Return;
using ::testing::StrictMock;
namespace views {
namespace {
class MockGlobalErrorWithStandardBubble : public GlobalErrorWithStandardBubble {
public:
MockGlobalErrorWithStandardBubble() {}
~MockGlobalErrorWithStandardBubble() override;
MOCK_METHOD0(GetBubbleViewIcon, gfx::Image());
MOCK_METHOD0(GetBubbleViewTitle, base::string16());
MOCK_METHOD0(GetBubbleViewMessage, std::vector<base::string16>());
MOCK_METHOD0(GetBubbleViewAcceptButtonLabel, base::string16());
MOCK_CONST_METHOD0(ShouldShowCloseButton, bool());
MOCK_METHOD0(ShouldAddElevationIconToAcceptButton, bool());
MOCK_METHOD0(GetBubbleViewCancelButtonLabel, base::string16());
MOCK_METHOD1(BubbleViewDidClose, void(Browser* browser));
MOCK_METHOD1(OnBubbleViewDidClose, void(Browser* browser));
MOCK_METHOD1(BubbleViewAcceptButtonPressed, void(Browser* browser));
MOCK_METHOD1(BubbleViewCancelButtonPressed, void(Browser* browser));
MOCK_CONST_METHOD0(ShouldCloseOnDeactivate, bool());
MOCK_METHOD0(HasBubbleView, bool());
MOCK_METHOD0(HasShownBubbleView, bool());
MOCK_METHOD1(ShowBubbleView, void(Browser* browser));
MOCK_METHOD0(GetBubbleView, GlobalErrorBubbleViewBase*());
MOCK_METHOD0(HasMenuItem, bool());
MOCK_METHOD0(MenuItemCommandID, int());
MOCK_METHOD0(MenuItemLabel, base::string16());
MOCK_METHOD1(ExecuteMenuItem, void(Browser* browser));
MOCK_METHOD0(GetBubbleViewMessages, std::vector<base::string16>());
private:
DISALLOW_COPY_AND_ASSIGN(MockGlobalErrorWithStandardBubble);
};
MockGlobalErrorWithStandardBubble::~MockGlobalErrorWithStandardBubble() {}
} // namespace
class GlobalErrorBubbleViewTest : public testing::Test {
public:
GlobalErrorBubbleViewTest()
: mock_global_error_with_standard_bubble_(
std::make_unique<StrictMock<MockGlobalErrorWithStandardBubble>>()),
button_(nullptr, base::string16()),
view_(std::make_unique<GlobalErrorBubbleView>(
&arg_view_,
gfx::Rect(anchor_point_, gfx::Size()),
arrow_,
nullptr,
mock_global_error_with_standard_bubble_->AsWeakPtr())) {}
protected:
ChromeTestViewsDelegate test_views_delegate_;
std::unique_ptr<StrictMock<MockGlobalErrorWithStandardBubble>>
mock_global_error_with_standard_bubble_;
views::View arg_view_;
const gfx::Point anchor_point_;
views::BubbleBorder::Arrow arrow_;
views::LabelButton button_;
std::unique_ptr<GlobalErrorBubbleView> view_;
private:
DISALLOW_COPY_AND_ASSIGN(GlobalErrorBubbleViewTest);
};
TEST_F(GlobalErrorBubbleViewTest, Basic) {
EXPECT_CALL(*mock_global_error_with_standard_bubble_, GetBubbleViewTitle());
view_->GetWindowTitle();
std::vector<gfx::ImagePNGRep> image_png_reps;
image_png_reps.push_back(
gfx::ImagePNGRep(gfx::test::CreatePNGBytes(25), 1.0f));
gfx::Image image = gfx::Image(image_png_reps);
EXPECT_CALL(*mock_global_error_with_standard_bubble_, GetBubbleViewIcon())
.WillOnce(Return(image));
view_->GetWindowIcon();
EXPECT_EQ(ChromeLayoutProvider::Get()->ShouldShowWindowIcon(),
view_->ShouldShowWindowIcon());
EXPECT_CALL(*mock_global_error_with_standard_bubble_,
BubbleViewDidClose(nullptr));
view_->WindowClosing();
EXPECT_CALL(*mock_global_error_with_standard_bubble_,
GetBubbleViewAcceptButtonLabel());
EXPECT_CALL(*mock_global_error_with_standard_bubble_,
ShouldAddElevationIconToAcceptButton())
.WillOnce(Return(false));
view_->UpdateButton(&button_, ui::DIALOG_BUTTON_OK);
EXPECT_CALL(*mock_global_error_with_standard_bubble_,
ShouldShowCloseButton());
view_->ShouldShowCloseButton();
EXPECT_CALL(*mock_global_error_with_standard_bubble_,
GetBubbleViewAcceptButtonLabel());
EXPECT_CALL(*mock_global_error_with_standard_bubble_,
GetBubbleViewCancelButtonLabel());
view_->GetDialogButtonLabel(ui::DIALOG_BUTTON_OK);
view_->GetDialogButtonLabel(ui::DIALOG_BUTTON_CANCEL);
EXPECT_CALL(*mock_global_error_with_standard_bubble_,
GetBubbleViewCancelButtonLabel());
view_->GetDialogButtons();
EXPECT_CALL(*mock_global_error_with_standard_bubble_,
BubbleViewCancelButtonPressed(nullptr));
view_->Cancel();
EXPECT_CALL(*mock_global_error_with_standard_bubble_,
BubbleViewAcceptButtonPressed(nullptr));
view_->Accept();
}
TEST_F(GlobalErrorBubbleViewTest, ErrorIsNull) {
mock_global_error_with_standard_bubble_.reset();
view_->GetWindowTitle();
view_->WindowClosing();
view_->UpdateButton(&button_, ui::DIALOG_BUTTON_OK);
view_->ShouldShowCloseButton();
EXPECT_EQ(base::string16(),
view_->GetDialogButtonLabel(ui::DIALOG_BUTTON_OK));
EXPECT_EQ(base::string16(),
view_->GetDialogButtonLabel(ui::DIALOG_BUTTON_CANCEL));
EXPECT_EQ(ui::DIALOG_BUTTON_NONE, view_->GetDialogButtons());
view_->Cancel();
view_->Accept();
}
} // namespace views