blob: 0b6efca48096ddb82437e3b6ec28ae65896ea349 [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 "ash/system/tray/tray_info_label.h"
#include <memory>
#include "ash/strings/grit/ash_strings.h"
#include "ash/test/ash_test_base.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/accessibility/ax_node_data.h"
#include "ui/base/l10n/l10n_util.h"
namespace ash {
namespace {
class TestClickEvent : public ui::Event {
public:
TestClickEvent() : ui::Event(ui::ET_MOUSE_PRESSED, base::TimeTicks(), 0) {}
};
class TestDelegate : public TrayInfoLabel::Delegate {
public:
TestDelegate() = default;
const std::vector<int>& clicked_message_ids() { return clicked_message_ids_; }
void AddClickableMessageId(int message_id) {
clickable_message_ids_.insert(message_id);
}
// TrayInfoLabel::Delegate:
void OnLabelClicked(int message_id) override {
clicked_message_ids_.push_back(message_id);
}
bool IsLabelClickable(int message_id) const override {
return clickable_message_ids_.find(message_id) !=
clickable_message_ids_.end();
}
private:
std::unordered_set<int> clickable_message_ids_;
std::vector<int> clicked_message_ids_;
};
} // namespace
class TrayInfoLabelTest : public AshTestBase {
public:
void SetUp() override {
AshTestBase::SetUp();
delegate_ = std::make_unique<TestDelegate>();
}
void TearDown() override {
AshTestBase::TearDown();
label_.reset();
delegate_.reset();
}
void CreateLabel(bool use_delegate, int message_id) {
label_ = std::make_unique<TrayInfoLabel>(
use_delegate ? delegate_.get() : nullptr, message_id);
use_delegate_ = use_delegate;
}
void ClickOnLabel(bool expect_click_was_handled) {
bool click_was_handled = label_->PerformAction(TestClickEvent());
EXPECT_EQ(expect_click_was_handled, click_was_handled);
}
void VerifyClickability(bool expected_clickable) {
EXPECT_EQ(expected_clickable, label_->IsClickable());
EXPECT_EQ(expected_clickable ? views::View::FocusBehavior::ALWAYS
: views::View::FocusBehavior::NEVER,
label_->focus_behavior());
ui::AXNodeData node_data;
label_->GetAccessibleNodeData(&node_data);
if (expected_clickable)
EXPECT_EQ(ax::mojom::Role::kButton, node_data.role);
else
EXPECT_EQ(ax::mojom::Role::kLabelText, node_data.role);
}
void VerifyClicks(const std::vector<int>& expected_clicked_message_ids) {
if (!use_delegate_) {
EXPECT_TRUE(expected_clicked_message_ids.empty());
return;
}
EXPECT_EQ(expected_clicked_message_ids, delegate_->clicked_message_ids());
}
void VerifyNoClicks() { VerifyClicks(std::vector<int>()); }
protected:
std::unique_ptr<TrayInfoLabel> label_;
std::unique_ptr<TestDelegate> delegate_;
bool use_delegate_;
};
TEST_F(TrayInfoLabelTest, NoDelegate) {
CreateLabel(false /* use_delegate */, IDS_ASH_STATUS_TRAY_BLUETOOTH_ENABLED);
EXPECT_EQ(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_BLUETOOTH_ENABLED),
label_->GetAccessibleName());
VerifyClickability(false /* expected_clickable */);
label_->Update(IDS_ASH_STATUS_TRAY_BLUETOOTH_DISABLED);
EXPECT_EQ(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_BLUETOOTH_DISABLED),
label_->GetAccessibleName());
VerifyClickability(false /* expected_clickable */);
label_->Update(IDS_ASH_STATUS_TRAY_BLUETOOTH_DISCOVERING);
EXPECT_EQ(
l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_BLUETOOTH_DISCOVERING),
label_->GetAccessibleName());
VerifyClickability(false /* expected_clickable */);
}
TEST_F(TrayInfoLabelTest, PerformAction) {
const int kClickableMessageId1 = IDS_ASH_STATUS_TRAY_BLUETOOTH_ENABLED;
const int kClickableMessageId2 = IDS_ASH_STATUS_TRAY_BLUETOOTH_DISABLED;
const int kNonClickableMessageId = IDS_ASH_STATUS_TRAY_BLUETOOTH_DISCOVERING;
delegate_->AddClickableMessageId(kClickableMessageId1);
delegate_->AddClickableMessageId(kClickableMessageId2);
CreateLabel(true /* use_delegate */, kClickableMessageId1);
VerifyNoClicks();
EXPECT_EQ(l10n_util::GetStringUTF16(kClickableMessageId1),
label_->GetAccessibleName());
VerifyClickability(true /* expected_clickable */);
ClickOnLabel(true /* expect_click_was_handled */);
VerifyClicks(std::vector<int>{kClickableMessageId1});
ClickOnLabel(true /* expect_click_was_handled */);
VerifyClicks(std::vector<int>{kClickableMessageId1, kClickableMessageId1});
label_->Update(kNonClickableMessageId);
EXPECT_EQ(l10n_util::GetStringUTF16(kNonClickableMessageId),
label_->GetAccessibleName());
VerifyClickability(false /* expected_clickable */);
ClickOnLabel(false /* expect_click_was_handled */);
VerifyClicks(std::vector<int>{kClickableMessageId1, kClickableMessageId1});
label_->Update(kClickableMessageId2);
EXPECT_EQ(l10n_util::GetStringUTF16(kClickableMessageId2),
label_->GetAccessibleName());
VerifyClickability(true /* expected_clickable */);
ClickOnLabel(true /* expect_click_was_handled */);
VerifyClicks(std::vector<int>{kClickableMessageId1, kClickableMessageId1,
kClickableMessageId2});
}
} // namespace ash