| // 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 "chromeos/ime/ime_keyboard.h" |
| |
| #include <algorithm> |
| #include <set> |
| #include <string> |
| |
| #include "base/logging.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/message_loop/message_loop.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "ui/gfx/x/x11_types.h" |
| |
| #include <X11/Xlib.h> |
| |
| namespace chromeos { |
| namespace input_method { |
| |
| namespace { |
| |
| class ImeKeyboardTest : public testing::Test, |
| public ImeKeyboard::Observer { |
| public: |
| ImeKeyboardTest() { |
| } |
| |
| virtual void SetUp() { |
| xkey_.reset(ImeKeyboard::Create()); |
| xkey_->AddObserver(this); |
| caps_changed_ = false; |
| } |
| |
| virtual void TearDown() { |
| xkey_->RemoveObserver(this); |
| xkey_.reset(); |
| } |
| |
| virtual void OnCapsLockChanged(bool enabled) OVERRIDE { |
| caps_changed_ = true; |
| } |
| |
| void VerifyCapsLockChanged(bool changed) { |
| EXPECT_EQ(changed, caps_changed_); |
| caps_changed_ = false; |
| } |
| |
| scoped_ptr<ImeKeyboard> xkey_; |
| base::MessageLoopForUI message_loop_; |
| bool caps_changed_; |
| }; |
| |
| // Returns true if X display is available. |
| bool DisplayAvailable() { |
| return gfx::GetXDisplay() != NULL; |
| } |
| |
| } // namespace |
| |
| // Tests CheckLayoutName() function. |
| TEST_F(ImeKeyboardTest, TestCheckLayoutName) { |
| // CheckLayoutName should not accept non-alphanumeric characters |
| // except "()-_". |
| EXPECT_FALSE(ImeKeyboard::CheckLayoutNameForTesting("us!")); |
| EXPECT_FALSE(ImeKeyboard::CheckLayoutNameForTesting("us; /bin/sh")); |
| EXPECT_TRUE(ImeKeyboard::CheckLayoutNameForTesting("ab-c_12")); |
| |
| // CheckLayoutName should not accept upper-case ascii characters. |
| EXPECT_FALSE(ImeKeyboard::CheckLayoutNameForTesting("US")); |
| |
| // CheckLayoutName should accept lower-case ascii characters. |
| for (int c = 'a'; c <= 'z'; ++c) { |
| EXPECT_TRUE(ImeKeyboard::CheckLayoutNameForTesting(std::string(3, c))); |
| } |
| |
| // CheckLayoutName should accept numbers. |
| for (int c = '0'; c <= '9'; ++c) { |
| EXPECT_TRUE(ImeKeyboard::CheckLayoutNameForTesting(std::string(3, c))); |
| } |
| |
| // CheckLayoutName should accept a layout with a variant name. |
| EXPECT_TRUE(ImeKeyboard::CheckLayoutNameForTesting("us(dvorak)")); |
| EXPECT_TRUE(ImeKeyboard::CheckLayoutNameForTesting("jp")); |
| } |
| |
| TEST_F(ImeKeyboardTest, TestSetCapsLockEnabled) { |
| if (!DisplayAvailable()) { |
| // Do not fail the test to allow developers to run unit_tests without an X |
| // server (e.g. via ssh). Note that both try bots and waterfall always have |
| // an X server for running browser_tests. |
| DVLOG(1) << "X server is not available. Skip the test."; |
| return; |
| } |
| const bool initial_lock_state = xkey_->CapsLockIsEnabled(); |
| xkey_->SetCapsLockEnabled(true); |
| EXPECT_TRUE(xkey_->CapsLockIsEnabled()); |
| |
| xkey_->SetCapsLockEnabled(false); |
| EXPECT_FALSE(xkey_->CapsLockIsEnabled()); |
| VerifyCapsLockChanged(true); |
| |
| xkey_->SetCapsLockEnabled(true); |
| EXPECT_TRUE(xkey_->CapsLockIsEnabled()); |
| VerifyCapsLockChanged(true); |
| |
| xkey_->SetCapsLockEnabled(false); |
| EXPECT_FALSE(xkey_->CapsLockIsEnabled()); |
| VerifyCapsLockChanged(true); |
| |
| xkey_->SetCapsLockEnabled(false); |
| EXPECT_FALSE(xkey_->CapsLockIsEnabled()); |
| VerifyCapsLockChanged(false); |
| |
| xkey_->SetCapsLockEnabled(initial_lock_state); |
| } |
| |
| TEST_F(ImeKeyboardTest, TestSetAutoRepeatEnabled) { |
| if (!DisplayAvailable()) { |
| DVLOG(1) << "X server is not available. Skip the test."; |
| return; |
| } |
| const bool state = ImeKeyboard::GetAutoRepeatEnabledForTesting(); |
| xkey_->SetAutoRepeatEnabled(!state); |
| EXPECT_EQ(!state, ImeKeyboard::GetAutoRepeatEnabledForTesting()); |
| // Restore the initial state. |
| xkey_->SetAutoRepeatEnabled(state); |
| EXPECT_EQ(state, ImeKeyboard::GetAutoRepeatEnabledForTesting()); |
| } |
| |
| TEST_F(ImeKeyboardTest, TestSetAutoRepeatRate) { |
| if (!DisplayAvailable()) { |
| DVLOG(1) << "X server is not available. Skip the test."; |
| return; |
| } |
| AutoRepeatRate rate; |
| EXPECT_TRUE(ImeKeyboard::GetAutoRepeatRateForTesting(&rate)); |
| |
| AutoRepeatRate tmp(rate); |
| ++tmp.initial_delay_in_ms; |
| ++tmp.repeat_interval_in_ms; |
| EXPECT_TRUE(xkey_->SetAutoRepeatRate(tmp)); |
| EXPECT_TRUE(ImeKeyboard::GetAutoRepeatRateForTesting(&tmp)); |
| EXPECT_EQ(rate.initial_delay_in_ms + 1, tmp.initial_delay_in_ms); |
| EXPECT_EQ(rate.repeat_interval_in_ms + 1, tmp.repeat_interval_in_ms); |
| |
| // Restore the initial state. |
| EXPECT_TRUE(xkey_->SetAutoRepeatRate(rate)); |
| EXPECT_TRUE(ImeKeyboard::GetAutoRepeatRateForTesting(&tmp)); |
| EXPECT_EQ(rate.initial_delay_in_ms, tmp.initial_delay_in_ms); |
| EXPECT_EQ(rate.repeat_interval_in_ms, tmp.repeat_interval_in_ms); |
| } |
| |
| } // namespace input_method |
| } // namespace chromeos |