Chromium Code Reviews| 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..56029fbc9731cd3f31a09849455a25900eaf7c3a |
| --- /dev/null |
| +++ b/ash/sticky_keys/sticky_keys_overlay_unittest.cc |
| @@ -0,0 +1,222 @@ |
| +// 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 { |
| + protected: |
|
James Cook
2014/01/15 22:53:53
public is OK here
Tim Song
2014/01/16 00:01:59
Done.
|
| + 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 PressAndReleaseModifierKey(StickyKeyModifier modifier) { |
| + switch (modifier) { |
| + case STICKY_KEY_ALT: |
| + PressAndReleaseKey(ui::VKEY_LMENU); |
| + break; |
| + case STICKY_KEY_SHIFT: |
| + PressAndReleaseKey(ui::VKEY_SHIFT); |
| + break; |
| + case STICKY_KEY_CONTROL: |
| + PressAndReleaseKey(ui::VKEY_CONTROL); |
| + break; |
| + default: |
| + NOTREACHED(); |
| + } |
| + } |
| + |
| + 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_showing()); |
| + overlay.Show(true); |
| + EXPECT_TRUE(overlay.is_showing()); |
| +} |
| + |
| +TEST_F(StickyKeysOverlayTest, ModifierKeyState) { |
| + StickyKeysOverlay overlay; |
| + overlay.SetModifierKeyState(STICKY_KEY_SHIFT, STICKY_KEY_STATE_DISABLED); |
| + overlay.SetModifierKeyState(STICKY_KEY_ALT, STICKY_KEY_STATE_LOCKED); |
| + overlay.SetModifierKeyState(STICKY_KEY_CONTROL, STICKY_KEY_STATE_ENABLED); |
| + |
| + EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
| + overlay.GetModifierKeyState(STICKY_KEY_SHIFT)); |
| + EXPECT_EQ(STICKY_KEY_STATE_LOCKED, |
| + overlay.GetModifierKeyState(STICKY_KEY_ALT)); |
| + EXPECT_EQ(STICKY_KEY_STATE_ENABLED, |
| + overlay.GetModifierKeyState(STICKY_KEY_CONTROL)); |
| +} |
| + |
| +TEST_F(StickyKeysOverlayTest, OneModifierEnabled) { |
| + EXPECT_FALSE(overlay_->is_showing()); |
| + EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
| + overlay_->GetModifierKeyState(STICKY_KEY_CONTROL)); |
| + |
| + // Pressing modifier key should show overlay. |
| + PressAndReleaseModifierKey(STICKY_KEY_CONTROL); |
| + EXPECT_TRUE(overlay_->is_showing()); |
| + EXPECT_EQ(STICKY_KEY_STATE_ENABLED, |
| + overlay_->GetModifierKeyState(STICKY_KEY_CONTROL)); |
| + |
| + // Pressing a normal key should hide overlay. |
| + PressAndReleaseKey(ui::VKEY_T); |
| + EXPECT_FALSE(overlay_->is_showing()); |
| + EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
| + overlay_->GetModifierKeyState(STICKY_KEY_CONTROL)); |
| +} |
| + |
| +TEST_F(StickyKeysOverlayTest, TwoModifiersEnabled) { |
| + EXPECT_FALSE(overlay_->is_showing()); |
| + EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
| + overlay_->GetModifierKeyState(STICKY_KEY_CONTROL)); |
| + EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
| + overlay_->GetModifierKeyState(STICKY_KEY_SHIFT)); |
| + |
| + // Pressing two modifiers should show overlay. |
| + PressAndReleaseModifierKey(STICKY_KEY_SHIFT); |
| + PressAndReleaseModifierKey(STICKY_KEY_CONTROL); |
| + EXPECT_TRUE(overlay_->is_showing()); |
| + EXPECT_EQ(STICKY_KEY_STATE_ENABLED, |
| + overlay_->GetModifierKeyState(STICKY_KEY_SHIFT)); |
| + EXPECT_EQ(STICKY_KEY_STATE_ENABLED, |
| + overlay_->GetModifierKeyState(STICKY_KEY_CONTROL)); |
| + |
| + // Pressing a normal key should hide overlay. |
| + PressAndReleaseKey(ui::VKEY_N); |
| + EXPECT_FALSE(overlay_->is_showing()); |
| + EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
| + overlay_->GetModifierKeyState(STICKY_KEY_CONTROL)); |
| + EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
| + overlay_->GetModifierKeyState(STICKY_KEY_SHIFT)); |
| +} |
| + |
| +TEST_F(StickyKeysOverlayTest, LockedModifier) { |
| + EXPECT_FALSE(overlay_->is_showing()); |
| + EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
| + overlay_->GetModifierKeyState(STICKY_KEY_ALT)); |
| + |
| + // Pressing a modifier key twice should lock modifier and show overlay. |
| + PressAndReleaseModifierKey(STICKY_KEY_ALT); |
| + PressAndReleaseModifierKey(STICKY_KEY_ALT); |
| + EXPECT_TRUE(overlay_->is_showing()); |
| + EXPECT_EQ(STICKY_KEY_STATE_LOCKED, |
| + overlay_->GetModifierKeyState(STICKY_KEY_ALT)); |
| + |
| + // Pressing a normal key should not hide overlay. |
| + PressAndReleaseKey(ui::VKEY_D); |
| + EXPECT_TRUE(overlay_->is_showing()); |
| + EXPECT_EQ(STICKY_KEY_STATE_LOCKED, |
| + overlay_->GetModifierKeyState(STICKY_KEY_ALT)); |
| +} |
| + |
| +TEST_F(StickyKeysOverlayTest, LockedAndNormalModifier) { |
| + EXPECT_FALSE(overlay_->is_showing()); |
| + EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
| + overlay_->GetModifierKeyState(STICKY_KEY_CONTROL)); |
| + EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
| + overlay_->GetModifierKeyState(STICKY_KEY_SHIFT)); |
| + |
| + // Pressing a modifier key twice should lock modifier and show overlay. |
| + PressAndReleaseModifierKey(STICKY_KEY_CONTROL); |
| + PressAndReleaseModifierKey(STICKY_KEY_CONTROL); |
| + EXPECT_TRUE(overlay_->is_showing()); |
| + EXPECT_EQ(STICKY_KEY_STATE_LOCKED, |
| + overlay_->GetModifierKeyState(STICKY_KEY_CONTROL)); |
| + |
| + // Pressing another modifier key should still show overlay. |
| + PressAndReleaseModifierKey(STICKY_KEY_SHIFT); |
| + EXPECT_TRUE(overlay_->is_showing()); |
| + EXPECT_EQ(STICKY_KEY_STATE_LOCKED, |
| + overlay_->GetModifierKeyState(STICKY_KEY_CONTROL)); |
| + EXPECT_EQ(STICKY_KEY_STATE_ENABLED, |
| + overlay_->GetModifierKeyState(STICKY_KEY_SHIFT)); |
| + |
| + // Pressing a normal key should not hide overlay but disable normal modifier. |
| + PressAndReleaseKey(ui::VKEY_D); |
| + EXPECT_TRUE(overlay_->is_showing()); |
| + EXPECT_EQ(STICKY_KEY_STATE_LOCKED, |
| + overlay_->GetModifierKeyState(STICKY_KEY_CONTROL)); |
| + EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
| + overlay_->GetModifierKeyState(STICKY_KEY_SHIFT)); |
| +} |
| + |
| +TEST_F(StickyKeysOverlayTest, ModifiersDisabled) { |
| + EXPECT_FALSE(overlay_->is_showing()); |
| + EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
| + overlay_->GetModifierKeyState(STICKY_KEY_CONTROL)); |
| + EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
| + overlay_->GetModifierKeyState(STICKY_KEY_SHIFT)); |
| + EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
| + overlay_->GetModifierKeyState(STICKY_KEY_ALT)); |
| + |
| + // Enable modifiers. |
| + PressAndReleaseModifierKey(STICKY_KEY_CONTROL); |
| + PressAndReleaseModifierKey(STICKY_KEY_SHIFT); |
| + PressAndReleaseModifierKey(STICKY_KEY_SHIFT); |
| + PressAndReleaseModifierKey(STICKY_KEY_ALT); |
| + |
| + EXPECT_TRUE(overlay_->is_showing()); |
| + EXPECT_EQ(STICKY_KEY_STATE_ENABLED, |
| + overlay_->GetModifierKeyState(STICKY_KEY_CONTROL)); |
| + EXPECT_EQ(STICKY_KEY_STATE_LOCKED, |
| + overlay_->GetModifierKeyState(STICKY_KEY_SHIFT)); |
| + EXPECT_EQ(STICKY_KEY_STATE_ENABLED, |
| + overlay_->GetModifierKeyState(STICKY_KEY_ALT)); |
| + |
| + // Disable modifiers and overlay should be hidden. |
| + PressAndReleaseModifierKey(STICKY_KEY_CONTROL); |
| + PressAndReleaseModifierKey(STICKY_KEY_CONTROL); |
| + PressAndReleaseModifierKey(STICKY_KEY_SHIFT); |
| + PressAndReleaseModifierKey(STICKY_KEY_ALT); |
| + PressAndReleaseModifierKey(STICKY_KEY_ALT); |
| + |
| + EXPECT_FALSE(overlay_->is_showing()); |
| + EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
| + overlay_->GetModifierKeyState(STICKY_KEY_CONTROL)); |
| + EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
| + overlay_->GetModifierKeyState(STICKY_KEY_SHIFT)); |
| + EXPECT_EQ(STICKY_KEY_STATE_DISABLED, |
| + overlay_->GetModifierKeyState(STICKY_KEY_ALT)); |
| +} |
|
James Cook
2014/01/15 22:53:53
Nice test suite! Very thorough.
Tim Song
2014/01/16 00:01:59
Thanks!
|
| + |
| +} // ash |
|
James Cook
2014/01/15 22:53:53
namespace ash
Tim Song
2014/01/16 00:01:59
Done.
|