| Index: chromeos/ime/ime_keyboard_x11_unittest.cc
|
| diff --git a/chromeos/ime/ime_keyboard_x11_unittest.cc b/chromeos/ime/ime_keyboard_x11_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..cdf195f8bd8eb6e932e38f3f35cfe4ffc645479f
|
| --- /dev/null
|
| +++ b/chromeos/ime/ime_keyboard_x11_unittest.cc
|
| @@ -0,0 +1,156 @@
|
| +// 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
|
|
|