blob: f5795eb3e13bcebac586274bdb4cbeef19edea41 [file] [log] [blame]
// Copyright 2018 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/media_router/cast_dialog_sink_button.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/ui/media_router/ui_media_sink.h"
#include "chrome/browser/ui/views/chrome_layout_provider.h"
#include "chrome/grit/generated_resources.h"
#include "chrome/test/views/chrome_views_test_base.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/views/controls/button/button.h"
#include "ui/views/controls/styled_label.h"
namespace media_router {
class CastDialogSinkButtonTest : public ChromeViewsTestBase {
public:
CastDialogSinkButtonTest() = default;
~CastDialogSinkButtonTest() override = default;
private:
DISALLOW_COPY_AND_ASSIGN(CastDialogSinkButtonTest);
};
TEST_F(CastDialogSinkButtonTest, SetTitleLabel) {
UIMediaSink sink;
sink.friendly_name = base::UTF8ToUTF16("sink name");
CastDialogSinkButton button(nullptr, sink, 0);
EXPECT_EQ(sink.friendly_name, button.title()->text());
}
TEST_F(CastDialogSinkButtonTest, SetStatusLabelForAvailableSink) {
UIMediaSink sink;
sink.state = UIMediaSinkState::AVAILABLE;
CastDialogSinkButton button(nullptr, sink, 0);
EXPECT_EQ(l10n_util::GetStringUTF16(IDS_MEDIA_ROUTER_SINK_AVAILABLE),
button.subtitle()->text());
// Disabling an AVAILABLE sink button should change its label to "Source not
// supported".
button.SetEnabled(false);
EXPECT_EQ(l10n_util::GetStringUTF16(IDS_MEDIA_ROUTER_SOURCE_NOT_SUPPORTED),
button.subtitle()->text());
// Re-enabling it should make set the label to "Available" again.
button.SetEnabled(true);
EXPECT_EQ(l10n_util::GetStringUTF16(IDS_MEDIA_ROUTER_SINK_AVAILABLE),
button.subtitle()->text());
}
TEST_F(CastDialogSinkButtonTest, SetStatusLabelForActiveSink) {
UIMediaSink sink;
sink.state = UIMediaSinkState::CONNECTING;
CastDialogSinkButton button1(nullptr, sink, 0);
EXPECT_EQ(l10n_util::GetStringUTF16(IDS_MEDIA_ROUTER_SINK_CONNECTING),
button1.subtitle()->text());
sink.state = UIMediaSinkState::CONNECTED;
sink.status_text = base::UTF8ToUTF16("status text");
CastDialogSinkButton button2(nullptr, sink, 1);
EXPECT_EQ(sink.status_text, button2.subtitle()->text());
// The status label should be "Disconnecting..." even if |status_text| is set.
sink.state = UIMediaSinkState::DISCONNECTING;
CastDialogSinkButton button3(nullptr, sink, 2);
EXPECT_EQ(l10n_util::GetStringUTF16(IDS_MEDIA_ROUTER_SINK_DISCONNECTING),
button3.subtitle()->text());
}
TEST_F(CastDialogSinkButtonTest, SetStatusLabelForSinkWithIssue) {
UIMediaSink sink;
sink.issue = Issue(IssueInfo("issue", IssueInfo::Action::DISMISS,
IssueInfo::Severity::WARNING));
// Issue info should be the status text regardless of the sink state.
sink.state = UIMediaSinkState::AVAILABLE;
CastDialogSinkButton button1(nullptr, sink, 0);
EXPECT_EQ(base::UTF8ToUTF16(sink.issue->info().title),
button1.subtitle()->text());
sink.state = UIMediaSinkState::CONNECTED;
CastDialogSinkButton button2(nullptr, sink, 1);
EXPECT_EQ(base::UTF8ToUTF16(sink.issue->info().title),
button2.subtitle()->text());
}
TEST_F(CastDialogSinkButtonTest, OverrideStatusText) {
UIMediaSink sink;
CastDialogSinkButton button(nullptr, sink, 0);
base::string16 status0 = base::ASCIIToUTF16("status0");
base::string16 status1 = base::ASCIIToUTF16("status1");
base::string16 status2 = base::ASCIIToUTF16("status2");
// Calling RestoreStatusText does nothing when status has not been overridden.
button.subtitle()->SetText(status0);
ASSERT_EQ(button.subtitle()->text(), status0);
button.RestoreStatusText();
EXPECT_EQ(button.subtitle()->text(), status0);
// OverrideStatusText replaces status text.
button.OverrideStatusText(status1);
EXPECT_EQ(button.subtitle()->text(), status1);
// Additional calls to OverrideStatusText change the text.
button.OverrideStatusText(status2);
EXPECT_EQ(button.subtitle()->text(), status2);
// RestoreStatusText restores the saved status text.
button.RestoreStatusText();
EXPECT_EQ(button.subtitle()->text(), status0);
// Additional calls to RestoreStatusText don't change the text.
button.subtitle()->SetText(status1);
ASSERT_EQ(button.subtitle()->text(), status1);
button.RestoreStatusText();
EXPECT_EQ(button.subtitle()->text(), status1);
}
} // namespace media_router