diff options
Diffstat (limited to 'chromium/ash/system/chromeos/tray_display_unittest.cc')
-rw-r--r-- | chromium/ash/system/chromeos/tray_display_unittest.cc | 460 |
1 files changed, 460 insertions, 0 deletions
diff --git a/chromium/ash/system/chromeos/tray_display_unittest.cc b/chromium/ash/system/chromeos/tray_display_unittest.cc new file mode 100644 index 00000000000..c6fa9e949cb --- /dev/null +++ b/chromium/ash/system/chromeos/tray_display_unittest.cc @@ -0,0 +1,460 @@ +// Copyright 2013 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/chromeos/tray_display.h" + +#include "ash/display/display_manager.h" +#include "ash/root_window_controller.h" +#include "ash/screen_ash.h" +#include "ash/shell.h" +#include "ash/system/tray/system_tray.h" +#include "ash/system/tray/test_system_tray_delegate.h" +#include "ash/test/ash_test_base.h" +#include "base/strings/string16.h" +#include "base/strings/utf_string_conversions.h" +#include "grit/ash_strings.h" +#include "ui/base/l10n/l10n_util.h" +#include "ui/gfx/display.h" +#include "ui/views/controls/label.h" + +namespace ash { +namespace internal { + +base::string16 GetTooltipText(const base::string16& headline, + const base::string16& name1, + const std::string& data1, + const base::string16& name2, + const std::string& data2) { + std::vector<base::string16> lines; + lines.push_back(headline); + lines.push_back(l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_SINGLE_DISPLAY, + name1, UTF8ToUTF16(data1))); + if (!name2.empty()) { + lines.push_back(l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_SINGLE_DISPLAY, + name2, UTF8ToUTF16(data2))); + } + return JoinString(lines, '\n'); +} + +base::string16 GetMirroredTooltipText(const base::string16& headline, + const base::string16& name, + const std::string& data) { + return GetTooltipText(headline, name, data, base::string16(), ""); +} + +base::string16 GetFirstDisplayName() { + DisplayManager* display_manager = Shell::GetInstance()->display_manager(); + return UTF8ToUTF16(display_manager->GetDisplayNameForId( + display_manager->first_display_id())); +} + +base::string16 GetSecondDisplayName() { + return UTF8ToUTF16( + Shell::GetInstance()->display_manager()->GetDisplayNameForId( + ScreenAsh::GetSecondaryDisplay().id())); +} + +base::string16 GetMirroredDisplayName() { + DisplayManager* display_manager = Shell::GetInstance()->display_manager(); + return UTF8ToUTF16(display_manager->GetDisplayNameForId( + display_manager->mirrored_display().id())); +} + +class TrayDisplayTest : public ash::test::AshTestBase { + public: + TrayDisplayTest(); + virtual ~TrayDisplayTest(); + + virtual void SetUp() OVERRIDE; + + protected: + SystemTray* tray() { return tray_; } + TrayDisplay* tray_display() { return tray_display_; } + + void CloseNotification(); + bool IsDisplayVisibleInTray(); + base::string16 GetTrayDisplayText(); + base::string16 GetTrayDisplayTooltipText(); + base::string16 GetDisplayNotificationText(); + + private: + // Weak reference, owned by Shell. + SystemTray* tray_; + + // Weak reference, owned by |tray_|. + TrayDisplay* tray_display_; + + DISALLOW_COPY_AND_ASSIGN(TrayDisplayTest); +}; + +TrayDisplayTest::TrayDisplayTest() : tray_(NULL), tray_display_(NULL) { +} + +TrayDisplayTest::~TrayDisplayTest() { +} + +void TrayDisplayTest::SetUp() { + ash::test::AshTestBase::SetUp(); + tray_ = Shell::GetPrimaryRootWindowController()->GetSystemTray(); + tray_display_ = new TrayDisplay(tray_); + tray_->AddTrayItem(tray_display_); +} + +void TrayDisplayTest::CloseNotification() { + tray_display_->CloseNotificationForTest(); + RunAllPendingInMessageLoop(); +} + +bool TrayDisplayTest::IsDisplayVisibleInTray() { + return tray_display_->default_view() && + tray_display_->default_view()->visible(); +} + +base::string16 TrayDisplayTest::GetTrayDisplayText() { + return tray_display_->GetDefaultViewMessage(); +} + +base::string16 TrayDisplayTest::GetTrayDisplayTooltipText() { + if (!tray_display_->default_view()) + return base::string16(); + + base::string16 tooltip; + if (!tray_display_->default_view()->GetTooltipText(gfx::Point(), &tooltip)) + return base::string16(); + return tooltip; +} + +base::string16 TrayDisplayTest::GetDisplayNotificationText() { + return tray_display_->GetNotificationMessage(); +} + +TEST_F(TrayDisplayTest, NoInternalDisplay) { + UpdateDisplay("400x400"); + tray()->ShowDefaultView(BUBBLE_USE_EXISTING); + EXPECT_FALSE(IsDisplayVisibleInTray()); + + UpdateDisplay("400x400,200x200"); + tray()->ShowDefaultView(BUBBLE_USE_EXISTING); + EXPECT_TRUE(IsDisplayVisibleInTray()); + base::string16 expected = l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED_NO_INTERNAL); + base::string16 first_name = GetFirstDisplayName(); + EXPECT_EQ(expected, GetTrayDisplayText()); + EXPECT_EQ(GetTooltipText(expected, GetFirstDisplayName(), "400x400", + GetSecondDisplayName(), "200x200"), + GetTrayDisplayTooltipText()); + + // mirroring + Shell::GetInstance()->display_manager()->SetSoftwareMirroring(true); + UpdateDisplay("400x400,200x200"); + tray()->ShowDefaultView(BUBBLE_USE_EXISTING); + EXPECT_TRUE(IsDisplayVisibleInTray()); + expected = l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING_NO_INTERNAL); + EXPECT_EQ(expected, GetTrayDisplayText()); + EXPECT_EQ(GetMirroredTooltipText(expected, GetFirstDisplayName(), "400x400"), + GetTrayDisplayTooltipText()); +} + +TEST_F(TrayDisplayTest, InternalDisplay) { + UpdateDisplay("400x400"); + DisplayManager* display_manager = Shell::GetInstance()->display_manager(); + gfx::Display::SetInternalDisplayId(display_manager->first_display_id()); + + tray()->ShowDefaultView(BUBBLE_USE_EXISTING); + EXPECT_FALSE(IsDisplayVisibleInTray()); + + // Extended + UpdateDisplay("400x400,200x200"); + string16 expected = l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED, GetSecondDisplayName()); + tray()->ShowDefaultView(BUBBLE_USE_EXISTING); + EXPECT_TRUE(IsDisplayVisibleInTray()); + EXPECT_EQ(expected, GetTrayDisplayText()); + EXPECT_EQ(GetTooltipText(expected, GetFirstDisplayName(), "400x400", + GetSecondDisplayName(), "200x200"), + GetTrayDisplayTooltipText()); + + // Mirroring + display_manager->SetSoftwareMirroring(true); + UpdateDisplay("400x400,200x200"); + tray()->ShowDefaultView(BUBBLE_USE_EXISTING); + EXPECT_TRUE(IsDisplayVisibleInTray()); + + expected = l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING, GetMirroredDisplayName()); + EXPECT_EQ(expected, GetTrayDisplayText()); + EXPECT_EQ(GetMirroredTooltipText(expected, GetFirstDisplayName(), "400x400"), + GetTrayDisplayTooltipText()); + + // TODO(mukai): add test case for docked mode here. +} + +TEST_F(TrayDisplayTest, InternalDisplayResized) { + UpdateDisplay("400x400@1.5"); + DisplayManager* display_manager = Shell::GetInstance()->display_manager(); + gfx::Display::SetInternalDisplayId(display_manager->first_display_id()); + + // Shows the tray_display even though there's a single-display. + tray()->ShowDefaultView(BUBBLE_USE_EXISTING); + EXPECT_TRUE(IsDisplayVisibleInTray()); + base::string16 internal_info = l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_SINGLE_DISPLAY, + GetFirstDisplayName(), UTF8ToUTF16("600x600")); + EXPECT_EQ(internal_info, GetTrayDisplayText()); + EXPECT_EQ(GetTooltipText(base::string16(), GetFirstDisplayName(), "600x600", + base::string16(), std::string()), + GetTrayDisplayTooltipText()); + + // Extended + UpdateDisplay("400x400@1.5,200x200"); + tray()->ShowDefaultView(BUBBLE_USE_EXISTING); + EXPECT_TRUE(IsDisplayVisibleInTray()); + base::string16 expected = l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED, GetSecondDisplayName()); + EXPECT_EQ(expected, GetTrayDisplayText()); + EXPECT_EQ(GetTooltipText(expected, GetFirstDisplayName(), "600x600", + GetSecondDisplayName(), "200x200"), + GetTrayDisplayTooltipText()); + + // Mirroring + display_manager->SetSoftwareMirroring(true); + UpdateDisplay("400x400@1.5,200x200"); + tray()->ShowDefaultView(BUBBLE_USE_EXISTING); + EXPECT_TRUE(IsDisplayVisibleInTray()); + expected = l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING, GetMirroredDisplayName()); + EXPECT_EQ(expected, GetTrayDisplayText()); + EXPECT_EQ(GetMirroredTooltipText(expected, GetFirstDisplayName(), "600x600"), + GetTrayDisplayTooltipText()); +} + +TEST_F(TrayDisplayTest, ExternalDisplayResized) { + UpdateDisplay("400x400"); + DisplayManager* display_manager = Shell::GetInstance()->display_manager(); + gfx::Display::SetInternalDisplayId(display_manager->first_display_id()); + + // Shows the tray_display even though there's a single-display. + tray()->ShowDefaultView(BUBBLE_USE_EXISTING); + EXPECT_FALSE(IsDisplayVisibleInTray()); + + // Extended + UpdateDisplay("400x400,200x200@1.5"); + const gfx::Display& secondary_display = ScreenAsh::GetSecondaryDisplay(); + + tray()->ShowDefaultView(BUBBLE_USE_EXISTING); + EXPECT_TRUE(IsDisplayVisibleInTray()); + base::string16 expected = l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED, + l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATED_NAME, + GetSecondDisplayName(), + UTF8ToUTF16(secondary_display.size().ToString()))); + EXPECT_EQ(expected, GetTrayDisplayText()); + EXPECT_EQ(GetTooltipText(expected, GetFirstDisplayName(), "400x400", + GetSecondDisplayName(), "300x300"), + GetTrayDisplayTooltipText()); + + // Mirroring + display_manager->SetSoftwareMirroring(true); + UpdateDisplay("400x400,200x200@1.5"); + base::string16 mirror_name = l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATED_NAME, + GetMirroredDisplayName(), UTF8ToUTF16("300x300")); + tray()->ShowDefaultView(BUBBLE_USE_EXISTING); + EXPECT_TRUE(IsDisplayVisibleInTray()); + expected = l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING, mirror_name); + EXPECT_EQ(expected, GetTrayDisplayText()); + EXPECT_EQ(GetMirroredTooltipText(expected, GetFirstDisplayName(), "400x400"), + GetTrayDisplayTooltipText()); +} + +TEST_F(TrayDisplayTest, OverscanDisplay) { + UpdateDisplay("400x400,300x300/o"); + DisplayManager* display_manager = Shell::GetInstance()->display_manager(); + gfx::Display::SetInternalDisplayId(display_manager->first_display_id()); + + tray()->ShowDefaultView(BUBBLE_USE_EXISTING); + EXPECT_TRUE(IsDisplayVisibleInTray()); + + // /o creates the default overscan, and if overscan is set, the annotation + // should be the size. + base::string16 overscan = l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATION_OVERSCAN); + base::string16 headline = l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED, + l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATED_NAME, + GetSecondDisplayName(), UTF8ToUTF16("286x286"))); + std::string second_data = l10n_util::GetStringFUTF8( + IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATION, + UTF8ToUTF16("286x286"), overscan); + EXPECT_EQ(GetTooltipText(headline, GetFirstDisplayName(), "400x400", + GetSecondDisplayName(), second_data), + GetTrayDisplayTooltipText()); + + // reset the overscan. + display_manager->SetOverscanInsets( + ScreenAsh::GetSecondaryDisplay().id(), gfx::Insets()); + headline = l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED, + l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATED_NAME, + GetSecondDisplayName(), overscan)); + second_data = l10n_util::GetStringFUTF8( + IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATION, + UTF8ToUTF16("300x300"), overscan); + EXPECT_EQ(GetTooltipText(headline, GetFirstDisplayName(), "400x400", + GetSecondDisplayName(), second_data), + GetTrayDisplayTooltipText()); +} + +TEST_F(TrayDisplayTest, DisplayNotifications) { + test::TestSystemTrayDelegate* tray_delegate = + static_cast<test::TestSystemTrayDelegate*>( + Shell::GetInstance()->system_tray_delegate()); + tray_delegate->set_should_show_display_notification(true); + + UpdateDisplay("400x400"); + DisplayManager* display_manager = Shell::GetInstance()->display_manager(); + gfx::Display::SetInternalDisplayId(display_manager->first_display_id()); + EXPECT_TRUE(GetDisplayNotificationText().empty()); + + // rotation. + UpdateDisplay("400x400/r"); + EXPECT_EQ( + l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_ROTATED, GetFirstDisplayName(), + l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_ORIENTATION_90)), + GetDisplayNotificationText()); + + CloseNotification(); + UpdateDisplay("400x400"); + EXPECT_EQ( + l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_ROTATED, GetFirstDisplayName(), + l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_STANDARD_ORIENTATION)), + GetDisplayNotificationText()); + + // UI-scale + CloseNotification(); + UpdateDisplay("400x400@1.5"); + EXPECT_EQ( + l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_RESOLUTION_CHANGED, + GetFirstDisplayName(), UTF8ToUTF16("600x600")), + GetDisplayNotificationText()); + + // UI-scale to 1.0 + CloseNotification(); + UpdateDisplay("400x400"); + EXPECT_EQ( + l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_RESOLUTION_CHANGED, + GetFirstDisplayName(), UTF8ToUTF16("400x400")), + GetDisplayNotificationText()); + + // No-update + CloseNotification(); + UpdateDisplay("400x400"); + EXPECT_TRUE(GetDisplayNotificationText().empty()); + + // Extended. + CloseNotification(); + UpdateDisplay("400x400,200x200"); + EXPECT_EQ( + l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED, GetSecondDisplayName()), + GetDisplayNotificationText()); + + // Mirroring. + CloseNotification(); + display_manager->SetSoftwareMirroring(true); + UpdateDisplay("400x400,200x200"); + EXPECT_EQ( + l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING, GetMirroredDisplayName()), + GetDisplayNotificationText()); + + // Back to extended. + CloseNotification(); + display_manager->SetSoftwareMirroring(false); + UpdateDisplay("400x400,200x200"); + EXPECT_EQ( + l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED, GetSecondDisplayName()), + GetDisplayNotificationText()); + + // Resize the first display. + UpdateDisplay("400x400@1.5,200x200"); + EXPECT_EQ( + l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_RESOLUTION_CHANGED, + GetFirstDisplayName(), UTF8ToUTF16("600x600")), + GetDisplayNotificationText()); + + // rotate the second. + UpdateDisplay("400x400@1.5,200x200/r"); + EXPECT_EQ( + l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_ROTATED, + GetSecondDisplayName(), + l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_ORIENTATION_90)), + GetDisplayNotificationText()); +} + +TEST_F(TrayDisplayTest, DisplayConfigurationChangedTwice) { + test::TestSystemTrayDelegate* tray_delegate = + static_cast<test::TestSystemTrayDelegate*>( + Shell::GetInstance()->system_tray_delegate()); + tray_delegate->set_should_show_display_notification(true); + + UpdateDisplay("400x400,200x200"); + EXPECT_EQ( + l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED_NO_INTERNAL), + GetDisplayNotificationText()); + + // OnDisplayConfigurationChanged() may be called more than once for a single + // update display in case of primary is swapped or recovered from dock mode. + // Should not remove the notification in such case. + tray_display()->OnDisplayConfigurationChanged(); + EXPECT_EQ( + l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED_NO_INTERNAL), + GetDisplayNotificationText()); + + // Back to the single display. It SHOULD remove the notification since the + // information is stale. + UpdateDisplay("400x400"); + EXPECT_TRUE(GetDisplayNotificationText().empty()); +} + +TEST_F(TrayDisplayTest, UpdateAfterSuppressDisplayNotification) { + UpdateDisplay("400x400,200x200"); + + test::TestSystemTrayDelegate* tray_delegate = + static_cast<test::TestSystemTrayDelegate*>( + Shell::GetInstance()->system_tray_delegate()); + tray_delegate->set_should_show_display_notification(true); + + // rotate the second. + UpdateDisplay("400x400,200x200/r"); + EXPECT_EQ( + l10n_util::GetStringFUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_ROTATED, + GetSecondDisplayName(), + l10n_util::GetStringUTF16( + IDS_ASH_STATUS_TRAY_DISPLAY_ORIENTATION_90)), + GetDisplayNotificationText()); +} + +} // namespace internal +} // namespace ash |