// 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 "chromeos/ime/mock_xkeyboard.h"

namespace chromeos {
namespace input_method {

MockXKeyboard::MockXKeyboard()
    : set_current_keyboard_layout_by_name_count_(0),
      caps_lock_is_enabled_(false),
      num_lock_is_enabled_(false) {
}

bool MockXKeyboard::SetCurrentKeyboardLayoutByName(
    const std::string& layout_name) {
  ++set_current_keyboard_layout_by_name_count_;
  last_layout_ = layout_name;
  return true;
}

bool MockXKeyboard::ReapplyCurrentKeyboardLayout() {
  return true;
}

void MockXKeyboard::ReapplyCurrentModifierLockStatus() {
}

void MockXKeyboard::SetLockedModifiers(ModifierLockStatus new_caps_lock_status,
                                       ModifierLockStatus new_num_lock_status) {
  if (new_caps_lock_status != kDontChange) {
    caps_lock_is_enabled_ =
        (new_caps_lock_status == kEnableLock) ? true : false;
  }
  if (new_num_lock_status != kDontChange)
    num_lock_is_enabled_ = (new_num_lock_status == kEnableLock) ? true : false;
}

void MockXKeyboard::SetNumLockEnabled(bool enable_num_lock) {
  num_lock_is_enabled_ = enable_num_lock;
}

void MockXKeyboard::SetCapsLockEnabled(bool enable_caps_lock) {
  caps_lock_is_enabled_ = enable_caps_lock;
}

bool MockXKeyboard::NumLockIsEnabled() {
  return num_lock_is_enabled_;
}

bool MockXKeyboard::CapsLockIsEnabled() {
  return caps_lock_is_enabled_;
}

unsigned int MockXKeyboard::GetNumLockMask() {
  return 1;
}

void MockXKeyboard::GetLockedModifiers(bool* out_caps_lock_enabled,
                                       bool* out_num_lock_enabled) {
  *out_caps_lock_enabled = caps_lock_is_enabled_;
  *out_num_lock_enabled = num_lock_is_enabled_;
}

}  // namespace input_method
}  // namespace chromeos
