Index: ash/sticky_keys/sticky_keys_overlay_unittest.cc |
diff --git a/ash/sticky_keys/sticky_keys_overlay_unittest.cc b/ash/sticky_keys/sticky_keys_overlay_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..de2d980e931f97346a13c597fb2b1f1593d0d37d |
--- /dev/null |
+++ b/ash/sticky_keys/sticky_keys_overlay_unittest.cc |
@@ -0,0 +1,206 @@ |
+// Copyright 2014 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/sticky_keys/sticky_keys_overlay.h" |
+ |
+#include "ash/shell.h" |
+#include "ash/sticky_keys/sticky_keys_controller.h" |
+#include "ash/test/ash_test_base.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "ui/aura/root_window.h" |
+#include "ui/aura/window_tree_host_delegate.h" |
+#include "ui/events/event.h" |
+ |
+namespace ash { |
+ |
+class StickyKeysOverlayTest : public test::AshTestBase { |
+ public: |
+ StickyKeysOverlayTest() : |
+ controller_(NULL), |
+ overlay_(NULL) {} |
+ |
+ virtual ~StickyKeysOverlayTest() {} |
+ |
+ virtual void SetUp() OVERRIDE { |
+ test::AshTestBase::SetUp(); |
+ |
+ controller_ = Shell::GetInstance()->sticky_keys_controller(); |
+ controller_->Enable(true); |
+ overlay_ = controller_->GetOverlayForTest(); |
+ ASSERT_TRUE(overlay_); |
+ } |
+ |
+ void PressAndReleaseKey(ui::KeyboardCode code) { |
+ SendKeyEvent(ui::ET_KEY_PRESSED, code); |
+ SendKeyEvent(ui::ET_KEY_RELEASED, code); |
+ } |
+ |
+ void SendKeyEvent(ui::EventType type, ui::KeyboardCode code) { |
+ ui::KeyEvent event(type, code, 0, false); |
+ ui::Event::DispatcherApi dispatcher(&event); |
+ dispatcher.set_target(Shell::GetInstance()->GetPrimaryRootWindow()); |
+ |
+ aura::WindowTreeHostDelegate* delegate = Shell::GetPrimaryRootWindow() |
+ ->GetDispatcher()->AsWindowTreeHostDelegate(); |
+ delegate->OnHostKeyEvent(&event); |
+ } |
+ |
+ StickyKeysController* controller_; |
+ StickyKeysOverlay* overlay_; |
+}; |
+ |
+TEST_F(StickyKeysOverlayTest, OverlayVisibility) { |
+ StickyKeysOverlay overlay; |
+ EXPECT_FALSE(overlay.is_visible()); |
+ overlay.Show(true); |
+ EXPECT_TRUE(overlay.is_visible()); |
+} |
+ |
+TEST_F(StickyKeysOverlayTest, ModifierKeyState) { |
+ StickyKeysOverlay overlay; |
+ overlay.SetModifierKeyState(ui::EF_SHIFT_DOWN, STICKY_KEY_STATE_DISABLED); |
+ overlay.SetModifierKeyState(ui::EF_ALT_DOWN, STICKY_KEY_STATE_LOCKED); |
+ overlay.SetModifierKeyState(ui::EF_CONTROL_DOWN, STICKY_KEY_STATE_ENABLED); |
+ |
+ EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
+ overlay.GetModifierKeyState(ui::EF_SHIFT_DOWN)); |
+ EXPECT_EQ(STICKY_KEY_STATE_LOCKED, |
+ overlay.GetModifierKeyState(ui::EF_ALT_DOWN)); |
+ EXPECT_EQ(STICKY_KEY_STATE_ENABLED, |
+ overlay.GetModifierKeyState(ui::EF_CONTROL_DOWN)); |
+} |
+ |
+TEST_F(StickyKeysOverlayTest, OneModifierEnabled) { |
+ EXPECT_FALSE(overlay_->is_visible()); |
+ EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
+ overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); |
+ |
+ // Pressing modifier key should show overlay. |
+ PressAndReleaseKey(ui::VKEY_CONTROL); |
+ EXPECT_TRUE(overlay_->is_visible()); |
+ EXPECT_EQ(STICKY_KEY_STATE_ENABLED, |
+ overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); |
+ |
+ // Pressing a normal key should hide overlay. |
+ PressAndReleaseKey(ui::VKEY_T); |
+ EXPECT_FALSE(overlay_->is_visible()); |
+ EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
+ overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); |
+} |
+ |
+TEST_F(StickyKeysOverlayTest, TwoModifiersEnabled) { |
+ EXPECT_FALSE(overlay_->is_visible()); |
+ EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
+ overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); |
+ EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
+ overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); |
+ |
+ // Pressing two modifiers should show overlay. |
+ PressAndReleaseKey(ui::VKEY_SHIFT); |
+ PressAndReleaseKey(ui::VKEY_CONTROL); |
+ EXPECT_TRUE(overlay_->is_visible()); |
+ EXPECT_EQ(STICKY_KEY_STATE_ENABLED, |
+ overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); |
+ EXPECT_EQ(STICKY_KEY_STATE_ENABLED, |
+ overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); |
+ |
+ // Pressing a normal key should hide overlay. |
+ PressAndReleaseKey(ui::VKEY_N); |
+ EXPECT_FALSE(overlay_->is_visible()); |
+ EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
+ overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); |
+ EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
+ overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); |
+} |
+ |
+TEST_F(StickyKeysOverlayTest, LockedModifier) { |
+ EXPECT_FALSE(overlay_->is_visible()); |
+ EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
+ overlay_->GetModifierKeyState(ui::EF_ALT_DOWN)); |
+ |
+ // Pressing a modifier key twice should lock modifier and show overlay. |
+ PressAndReleaseKey(ui::VKEY_LMENU); |
+ PressAndReleaseKey(ui::VKEY_LMENU); |
+ EXPECT_TRUE(overlay_->is_visible()); |
+ EXPECT_EQ(STICKY_KEY_STATE_LOCKED, |
+ overlay_->GetModifierKeyState(ui::EF_ALT_DOWN)); |
+ |
+ // Pressing a normal key should not hide overlay. |
+ PressAndReleaseKey(ui::VKEY_D); |
+ EXPECT_TRUE(overlay_->is_visible()); |
+ EXPECT_EQ(STICKY_KEY_STATE_LOCKED, |
+ overlay_->GetModifierKeyState(ui::EF_ALT_DOWN)); |
+} |
+ |
+TEST_F(StickyKeysOverlayTest, LockedAndNormalModifier) { |
+ EXPECT_FALSE(overlay_->is_visible()); |
+ EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
+ overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); |
+ EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
+ overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); |
+ |
+ // Pressing a modifier key twice should lock modifier and show overlay. |
+ PressAndReleaseKey(ui::VKEY_CONTROL); |
+ PressAndReleaseKey(ui::VKEY_CONTROL); |
+ EXPECT_TRUE(overlay_->is_visible()); |
+ EXPECT_EQ(STICKY_KEY_STATE_LOCKED, |
+ overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); |
+ |
+ // Pressing another modifier key should still show overlay. |
+ PressAndReleaseKey(ui::VKEY_SHIFT); |
+ EXPECT_TRUE(overlay_->is_visible()); |
+ EXPECT_EQ(STICKY_KEY_STATE_LOCKED, |
+ overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); |
+ EXPECT_EQ(STICKY_KEY_STATE_ENABLED, |
+ overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); |
+ |
+ // Pressing a normal key should not hide overlay but disable normal modifier. |
+ PressAndReleaseKey(ui::VKEY_D); |
+ EXPECT_TRUE(overlay_->is_visible()); |
+ EXPECT_EQ(STICKY_KEY_STATE_LOCKED, |
+ overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); |
+ EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
+ overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); |
+} |
+ |
+TEST_F(StickyKeysOverlayTest, ModifiersDisabled) { |
+ EXPECT_FALSE(overlay_->is_visible()); |
+ EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
+ overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); |
+ EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
+ overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); |
+ EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
+ overlay_->GetModifierKeyState(ui::EF_ALT_DOWN)); |
+ |
+ // Enable modifiers. |
+ PressAndReleaseKey(ui::VKEY_CONTROL); |
+ PressAndReleaseKey(ui::VKEY_SHIFT); |
+ PressAndReleaseKey(ui::VKEY_SHIFT); |
+ PressAndReleaseKey(ui::VKEY_LMENU); |
+ |
+ EXPECT_TRUE(overlay_->is_visible()); |
+ EXPECT_EQ(STICKY_KEY_STATE_ENABLED, |
+ overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); |
+ EXPECT_EQ(STICKY_KEY_STATE_LOCKED, |
+ overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); |
+ EXPECT_EQ(STICKY_KEY_STATE_ENABLED, |
+ overlay_->GetModifierKeyState(ui::EF_ALT_DOWN)); |
+ |
+ // Disable modifiers and overlay should be hidden. |
+ PressAndReleaseKey(ui::VKEY_CONTROL); |
+ PressAndReleaseKey(ui::VKEY_CONTROL); |
+ PressAndReleaseKey(ui::VKEY_SHIFT); |
+ PressAndReleaseKey(ui::VKEY_LMENU); |
+ PressAndReleaseKey(ui::VKEY_LMENU); |
+ |
+ EXPECT_FALSE(overlay_->is_visible()); |
+ EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
+ overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); |
+ EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
+ overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); |
+ EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
+ overlay_->GetModifierKeyState(ui::EF_ALT_DOWN)); |
+} |
+ |
+} // namespace ash |