Index: ash/system/tray/tray_info_label_unittest.cc |
diff --git a/ash/system/tray/tray_info_label_unittest.cc b/ash/system/tray/tray_info_label_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2564044bf7d433df455879d687d27fe5b6bc10a7 |
--- /dev/null |
+++ b/ash/system/tray/tray_info_label_unittest.cc |
@@ -0,0 +1,136 @@ |
+// 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 "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" |
+ |
+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() {} |
+ |
+ 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 TearDown() override { |
+ AshTestBase::TearDown(); |
+ label_.reset(); |
+ delegate_.reset(); |
+ } |
+ |
+ void CreateLabel(bool use_delegate, int message_id) { |
+ if (use_delegate) |
+ delegate_ = base::MakeUnique<TestDelegate>(); |
+ |
+ label_ = base::MakeUnique<TrayInfoLabel>(delegate_.get(), message_id); |
+ } |
+ |
+ 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()); |
+ |
+ ui::AXNodeData node_data; |
+ label_->GetAccessibleNodeData(&node_data); |
+ |
+ if (expected_clickable) |
+ EXPECT_EQ(ui::AX_ROLE_BUTTON, node_data.role); |
+ else |
+ EXPECT_EQ(ui::AX_ROLE_LABEL_TEXT, node_data.role); |
+ } |
+ |
+ void VerifyClicks(const std::vector<int>& expected_clicked_message_ids) { |
+ if (!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_; |
+}; |
+ |
+TEST_F(TrayInfoLabelTest, NoDelegate) { |
+ CreateLabel(false /* use_delegate */, IDS_ASH_STATUS_TRAY_BLUETOOTH_ENABLED); |
+ VerifyClickability(false /* expected_clickable */); |
+ |
+ label_->Update(IDS_ASH_STATUS_TRAY_BLUETOOTH_DISABLED); |
+ VerifyClickability(false /* expected_clickable */); |
+ |
+ label_->Update(IDS_ASH_STATUS_TRAY_BLUETOOTH_DISCOVERING); |
+ 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; |
+ |
+ CreateLabel(true /* use_delegate */, kClickableMessageId1); |
+ delegate_->AddClickableMessageId(kClickableMessageId1); |
+ delegate_->AddClickableMessageId(kClickableMessageId2); |
+ VerifyNoClicks(); |
+ |
+ 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); |
+ VerifyClickability(false /* expected_clickable */); |
+ ClickOnLabel(false /* expect_click_was_handled */); |
+ VerifyClicks(std::vector<int>{kClickableMessageId1, kClickableMessageId1}); |
+ |
+ label_->Update(kClickableMessageId2); |
+ VerifyClickability(true /* expected_clickable */); |
+ ClickOnLabel(true /* expect_click_was_handled */); |
+ VerifyClicks(std::vector<int>{kClickableMessageId1, kClickableMessageId1, |
+ kClickableMessageId2}); |
+} |
+ |
+} // namespace ash |