// Copyright 2010-2015, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//     * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#if defined(OS_WIN)
#include <windows.h>
#include <imm.h>
#endif  // OS_WIN

#include "session/commands.pb.h"
#include "testing/base/public/googletest.h"
#include "testing/base/public/gunit.h"
#include "win32/base/conversion_mode_util.h"

namespace mozc {
namespace win32 {
#if !defined(OS_WIN)
// Use the same naming convention to emulate imm32.h.
const uint32 IME_CMODE_ALPHANUMERIC = 0x0;
const uint32 IME_CMODE_NATIVE = 0x1;
const uint32 IME_CMODE_KATAKANA = 0x2;
const uint32 IME_CMODE_LANGUAGE = 0x3;
const uint32 IME_CMODE_FULLSHAPE = 0x8;
const uint32 IME_CMODE_ROMAN = 0x10;
const uint32 IME_CMODE_CHARCODE = 0x20;
const uint32 IME_CMODE_HANJACONVERT = 0x40;
const uint32 IME_CMODE_SOFTKBD = 0x80;
const uint32 IME_CMODE_NOCONVERSION = 0x100;
const uint32 IME_CMODE_EUDC = 0x200;
const uint32 IME_CMODE_SYMBOL = 0x400;
const uint32 IME_CMODE_SYMBOL = 0x800;
#endif  // !OS_WIN

TEST(ConversionModeUtilTest, ToNativeMode) {
  uint32 native_code = 0;

  native_code = 0;
  EXPECT_TRUE(ConversionModeUtil::ToNativeMode(
      mozc::commands::DIRECT, false, &native_code));
  EXPECT_EQ(IME_CMODE_ALPHANUMERIC | IME_CMODE_ROMAN, native_code);

  native_code = 0;
  EXPECT_TRUE(ConversionModeUtil::ToNativeMode(
      mozc::commands::HIRAGANA, false, &native_code));
  EXPECT_EQ(
      IME_CMODE_NATIVE | IME_CMODE_FULLSHAPE | IME_CMODE_ROMAN, native_code);

  native_code = 0;
  EXPECT_TRUE(ConversionModeUtil::ToNativeMode(
      mozc::commands::HALF_KATAKANA, false, &native_code));
  EXPECT_EQ(
      IME_CMODE_NATIVE | IME_CMODE_KATAKANA | IME_CMODE_ROMAN, native_code);

  native_code = 0;
  EXPECT_TRUE(ConversionModeUtil::ToNativeMode(
      mozc::commands::HALF_ASCII, false, &native_code));
  EXPECT_EQ(IME_CMODE_ALPHANUMERIC | IME_CMODE_ROMAN, native_code);

  native_code = 0;
  EXPECT_TRUE(ConversionModeUtil::ToNativeMode(
      mozc::commands::FULL_ASCII, false, &native_code));
  EXPECT_EQ(IME_CMODE_ALPHANUMERIC | IME_CMODE_FULLSHAPE |
            IME_CMODE_ROMAN, native_code);

  native_code = 0;
  EXPECT_TRUE(ConversionModeUtil::ToNativeMode(
      mozc::commands::FULL_KATAKANA, false, &native_code));
  EXPECT_EQ(IME_CMODE_NATIVE | IME_CMODE_KATAKANA |
            IME_CMODE_FULLSHAPE | IME_CMODE_ROMAN, native_code);
}

TEST(ConversionModeUtilTest, ToNativeModeWithKanaLocked) {
  uint32 native_code = 0;

  native_code = 0;
  EXPECT_TRUE(ConversionModeUtil::ToNativeMode(
      mozc::commands::DIRECT, true, &native_code));
  EXPECT_EQ(IME_CMODE_ALPHANUMERIC, native_code);

  native_code = 0;
  EXPECT_TRUE(ConversionModeUtil::ToNativeMode(
      mozc::commands::HIRAGANA, true, &native_code));
  EXPECT_EQ(IME_CMODE_NATIVE | IME_CMODE_FULLSHAPE, native_code);

  native_code = 0;
  EXPECT_TRUE(ConversionModeUtil::ToNativeMode(
      mozc::commands::HALF_KATAKANA, true, &native_code));
  EXPECT_EQ(IME_CMODE_NATIVE | IME_CMODE_KATAKANA, native_code);

  native_code = 0;
  EXPECT_TRUE(ConversionModeUtil::ToNativeMode(
      mozc::commands::HALF_ASCII, true, &native_code));
  EXPECT_EQ(IME_CMODE_ALPHANUMERIC, native_code);

  native_code = 0;
  EXPECT_TRUE(ConversionModeUtil::ToNativeMode(
      mozc::commands::FULL_ASCII, true, &native_code));
  EXPECT_EQ(IME_CMODE_ALPHANUMERIC | IME_CMODE_FULLSHAPE, native_code);

  native_code = 0;
  EXPECT_TRUE(ConversionModeUtil::ToNativeMode(
      mozc::commands::FULL_KATAKANA, true, &native_code));
  EXPECT_EQ(IME_CMODE_NATIVE | IME_CMODE_KATAKANA |
            IME_CMODE_FULLSHAPE, native_code);
}

TEST(ConversionModeUtilTest, ToMozcMode) {
  mozc::commands::CompositionMode mode = mozc::commands::DIRECT;

  // Check for HALF_ASCII
  // NOTE: IME_CMODE_ALPHANUMERIC will be converted to HALF_ASCII, not DIRECT.
  mode = mozc::commands::DIRECT;
  EXPECT_TRUE(ConversionModeUtil::ToMozcMode(IME_CMODE_ALPHANUMERIC, &mode));
  EXPECT_EQ(mozc::commands::HALF_ASCII, mode);

  // IME_CMODE_ROMAN has no effect in this conversion.
  mode = mozc::commands::DIRECT;
  EXPECT_TRUE(ConversionModeUtil::ToMozcMode(
      IME_CMODE_ALPHANUMERIC | IME_CMODE_ROMAN, &mode));
  EXPECT_EQ(mozc::commands::HALF_ASCII, mode);

  // Check for FULL_ASCII
  mode = mozc::commands::DIRECT;
  EXPECT_TRUE(ConversionModeUtil::ToMozcMode(
      IME_CMODE_ALPHANUMERIC | IME_CMODE_FULLSHAPE, &mode));
  EXPECT_EQ(mozc::commands::FULL_ASCII, mode);

  // IME_CMODE_ROMAN has no effect in this conversion.
  mode = mozc::commands::DIRECT;
  EXPECT_TRUE(ConversionModeUtil::ToMozcMode(
      IME_CMODE_ALPHANUMERIC | IME_CMODE_FULLSHAPE | IME_CMODE_ROMAN, &mode));
  EXPECT_EQ(mozc::commands::FULL_ASCII, mode);

  // Check for HIRAGANA
  mode = mozc::commands::DIRECT;
  EXPECT_TRUE(ConversionModeUtil::ToMozcMode(
      IME_CMODE_NATIVE | IME_CMODE_FULLSHAPE, &mode));
  EXPECT_EQ(mozc::commands::HIRAGANA, mode);

  // IME_CMODE_ROMAN has no effect in this conversion.
  mode = mozc::commands::DIRECT;
  EXPECT_TRUE(ConversionModeUtil::ToMozcMode(
      IME_CMODE_NATIVE | IME_CMODE_FULLSHAPE | IME_CMODE_ROMAN, &mode));
  EXPECT_EQ(mozc::commands::HIRAGANA, mode);

  // There is no "HALF_HIRAGANA"
  mode = mozc::commands::DIRECT;
  EXPECT_FALSE(ConversionModeUtil::ToMozcMode(
      IME_CMODE_NATIVE | IME_CMODE_ROMAN, &mode));

  // IME_CMODE_ROMAN has no effect in this conversion.
  mode = mozc::commands::DIRECT;
  EXPECT_FALSE(ConversionModeUtil::ToMozcMode(
      IME_CMODE_NATIVE, &mode));

  // Check for FULL_KATAKANA
  mode = mozc::commands::DIRECT;
  EXPECT_TRUE(ConversionModeUtil::ToMozcMode(
      IME_CMODE_NATIVE | IME_CMODE_FULLSHAPE | IME_CMODE_KATAKANA, &mode));
  EXPECT_EQ(mozc::commands::FULL_KATAKANA, mode);

  // IME_CMODE_ROMAN has no effect in this conversion.
  mode = mozc::commands::DIRECT;
  EXPECT_TRUE(ConversionModeUtil::ToMozcMode(
      IME_CMODE_NATIVE | IME_CMODE_FULLSHAPE |
      IME_CMODE_KATAKANA | IME_CMODE_ROMAN, &mode));
  EXPECT_EQ(mozc::commands::FULL_KATAKANA, mode);

  // Check for HALF_KATAKANA
  mode = mozc::commands::DIRECT;
  EXPECT_TRUE(ConversionModeUtil::ToMozcMode(
      IME_CMODE_NATIVE | IME_CMODE_KATAKANA, &mode));
  EXPECT_EQ(mozc::commands::HALF_KATAKANA, mode);

  // IME_CMODE_ROMAN has no effect in this conversion.
  mode = mozc::commands::DIRECT;
  EXPECT_TRUE(ConversionModeUtil::ToMozcMode(
      IME_CMODE_NATIVE | IME_CMODE_KATAKANA | IME_CMODE_ROMAN, &mode));
  EXPECT_EQ(mozc::commands::HALF_KATAKANA, mode);
}

TEST(ConversionModeUtilTest, ToMozcModeUnsupportedModes) {
  mozc::commands::CompositionMode mode = mozc::commands::DIRECT;

  // IME_CMODE_KATAKANA should be used with IME_CMODE_NATIVE.
  mode = mozc::commands::DIRECT;
  EXPECT_FALSE(ConversionModeUtil::ToMozcMode(IME_CMODE_KATAKANA, &mode));

  // IME_CMODE_CHARCODE is not supported yet.
  mode = mozc::commands::DIRECT;
  EXPECT_FALSE(ConversionModeUtil::ToMozcMode(IME_CMODE_CHARCODE, &mode));

  // IME_CMODE_HANJACONVERT is not supported yet.
  mode = mozc::commands::DIRECT;
  EXPECT_FALSE(ConversionModeUtil::ToMozcMode(IME_CMODE_HANJACONVERT, &mode));

  // IME_CMODE_SOFTKBD is not supported yet.
  mode = mozc::commands::DIRECT;
  EXPECT_FALSE(ConversionModeUtil::ToMozcMode(IME_CMODE_SOFTKBD, &mode));

  // IME_CMODE_NOCONVERSION is not supported yet.
  mode = mozc::commands::DIRECT;
  EXPECT_FALSE(ConversionModeUtil::ToMozcMode(IME_CMODE_NOCONVERSION, &mode));

  // IME_CMODE_EUDC is not supported yet.
  mode = mozc::commands::DIRECT;
  EXPECT_FALSE(ConversionModeUtil::ToMozcMode(IME_CMODE_EUDC, &mode));

  // IME_CMODE_SYMBOL is not supported yet.
  mode = mozc::commands::DIRECT;
  EXPECT_FALSE(ConversionModeUtil::ToMozcMode(IME_CMODE_SYMBOL, &mode));
}

TEST(ConversionModeUtilTest, ConvertStatusFromMozcToNative) {
  bool is_open = false;
  DWORD logical_mode = 0;
  DWORD visible_mode = 0;
  mozc::commands::Status status;

  // Should succeeds only when |status| has all the fields.
  is_open = false;
  logical_mode = 0;
  status.Clear();
  EXPECT_FALSE(ConversionModeUtil::ConvertStatusFromMozcToNative(
      status, false, &is_open, &logical_mode, &visible_mode));

  // Should succeeds only when |status| has all the fields.
  is_open = false;
  logical_mode = 0;
  visible_mode = 0;
  status.Clear();
  status.set_activated(true);
  EXPECT_FALSE(ConversionModeUtil::ConvertStatusFromMozcToNative(
      status, false, &is_open, &logical_mode, &visible_mode));

  // Should succeeds only when |status| has all the fields.
  is_open = false;
  logical_mode = 0;
  visible_mode = 0;
  status.Clear();
  status.set_mode(commands::HIRAGANA);
  EXPECT_FALSE(ConversionModeUtil::ConvertStatusFromMozcToNative(
      status, false, &is_open, &logical_mode, &visible_mode));

  // Should succeeds only when |status| has all the fields.
  is_open = false;
  logical_mode = 0;
  visible_mode = 0;
  status.Clear();
  status.set_comeback_mode(commands::HIRAGANA);
  EXPECT_FALSE(ConversionModeUtil::ConvertStatusFromMozcToNative(
      status, false, &is_open, &logical_mode, &visible_mode));

  // commands::DIRECT should not be used in |status|.
  is_open = false;
  logical_mode = 0;
  visible_mode = 0;
  status.Clear();
  status.set_activated(false);
  status.set_mode(commands::DIRECT);
  EXPECT_FALSE(ConversionModeUtil::ConvertStatusFromMozcToNative(
      status, false, &is_open, &logical_mode, &visible_mode));

  // The mode conversion should always be done regardless of open/close status.
  is_open = false;
  logical_mode = 0;
  visible_mode = 0;
  status.Clear();
  status.set_activated(false);
  status.set_comeback_mode(commands::HIRAGANA);
  status.set_mode(commands::HALF_ASCII);
  EXPECT_TRUE(ConversionModeUtil::ConvertStatusFromMozcToNative(
      status, false, &is_open, &logical_mode, &visible_mode));
  EXPECT_EQ(IME_CMODE_NATIVE | IME_CMODE_FULLSHAPE | IME_CMODE_ROMAN,
      logical_mode);
  EXPECT_EQ(IME_CMODE_ALPHANUMERIC | IME_CMODE_ROMAN, visible_mode);

  // The mode conversion should always be done regardless of open/close status.
  is_open = false;
  logical_mode = 0;
  visible_mode = 0;
  status.Clear();
  status.set_activated(true);
  status.set_comeback_mode(commands::HIRAGANA);
  status.set_mode(commands::HALF_ASCII);
  EXPECT_TRUE(ConversionModeUtil::ConvertStatusFromMozcToNative(
      status, false, &is_open, &logical_mode, &visible_mode));
  EXPECT_EQ(IME_CMODE_NATIVE | IME_CMODE_FULLSHAPE | IME_CMODE_ROMAN,
      logical_mode);
  EXPECT_EQ(IME_CMODE_ALPHANUMERIC | IME_CMODE_ROMAN, visible_mode);
}

TEST(ConversionModeUtilTest, GetMozcModeFromNativeMode) {
  // The mode conversion should always be done regardless of open/close status,
  // that is, we no longer rely on |mozc::commands::DIRECT|.
  bool open = false;
  commands::CompositionMode mozc_mode = commands::HIRAGANA;
  EXPECT_TRUE(ConversionModeUtil::GetMozcModeFromNativeMode(
      IME_CMODE_NATIVE | IME_CMODE_FULLSHAPE | IME_CMODE_ROMAN, &mozc_mode));
  EXPECT_EQ(commands::HIRAGANA, mozc_mode);

  // The mode conversion should always be done regardless of open/close status,
  // that is, we no longer rely on |mozc::commands::DIRECT|.
  EXPECT_TRUE(ConversionModeUtil::GetMozcModeFromNativeMode(
      IME_CMODE_NATIVE | IME_CMODE_FULLSHAPE | IME_CMODE_ROMAN, &mozc_mode));
  EXPECT_EQ(commands::HIRAGANA, mozc_mode);
}
}  // namespace win32
}  // namespace mozc
