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..c4a1681ef40224fe7e2ee8f17dbe992050ecb620 |
--- /dev/null |
+++ b/ash/system/tray/tray_info_label_unittest.cc |
@@ -0,0 +1,135 @@ |
+// 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/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 */, 0 /* message_id */); |
+ VerifyClickability(false); |
+ |
+ label_->Update(1 /* message_id */); |
+ VerifyClickability(false); |
+ |
+ label_->Update(2 /* message_id */); |
+ VerifyClickability(false); |
+} |
+ |
+TEST_F(TrayInfoLabelTest, PerformAction) { |
+ const int kClickableMessageId1 = 1; |
+ const int kClickableMessageId2 = 2; |
+ const int kNonClickableMessageId = 0; |
+ |
+ CreateLabel(true /* use_delegate */, kClickableMessageId1); |
+ delegate_->AddClickableMessageId(kClickableMessageId1); |
+ delegate_->AddClickableMessageId(kClickableMessageId2); |
+ VerifyNoClicks(); |
+ |
+ VerifyClickability(true /* expected_clickable */); |
+ ClickOnLabel(true /* expect_click_was_handled */); |
James Cook
2017/07/18 17:26:10
optional: Since ClickOnLabel() is only 2 lines, co
Kyle Horimoto
2017/07/18 17:38:08
This approach is fine as well. I requested Leslie
|
+ 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>( |
Kyle Horimoto
2017/07/18 17:10:05
nit: Remove parentheses around the {}s.
|
+ {kClickableMessageId1, kClickableMessageId1, kClickableMessageId2})); |
+} |
+ |
+} // namespace ash |
James Cook
2017/07/18 17:26:10
Thanks for adding a nice test suite.
|