// 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.

#include "rewriter/emoji_rewriter.h"

#include <cstddef>
#include <string>

#include "base/logging.h"
#include "base/number_util.h"
#include "base/system_util.h"
#include "base/util.h"
#include "config/config.pb.h"
#include "config/config_handler.h"
#include "converter/conversion_request.h"
#include "converter/segments.h"
#include "data_manager/user_pos_manager.h"
#include "dictionary/pos_matcher.h"
#include "rewriter/variants_rewriter.h"
#include "session/commands.pb.h"
#include "testing/base/public/gunit.h"
#include "usage_stats/usage_stats.h"
#include "usage_stats/usage_stats_testing_util.h"

DECLARE_string(test_tmpdir);

namespace mozc {

using mozc::commands::Request;

namespace {

// "えもじ"
const char kEmoji[] = "\xE3\x81\x88\xE3\x82\x82\xE3\x81\x98";

// Makes |segments| to have only a segment with a key-value paired candidate.
void SetSegment(const string &key, const string &value, Segments *segments) {
  segments->Clear();
  Segment *seg = segments->push_back_segment();
  seg->set_key(key);
  Segment::Candidate *candidate = seg->add_candidate();
  candidate->Init();
  candidate->value = key;
  candidate->content_key = key;
  candidate->content_value = value;
}

// Counts the number of enumerated emoji candidates in the segments.
int CountEmojiCandidates(const Segments &segments) {
  int emoji_size = 0;
  for (size_t i = 0; i < segments.segments_size(); ++i) {
    const Segment &segment = segments.segment(i);
    for (size_t j = 0; j < segment.candidates_size(); ++j) {
      if (EmojiRewriter::IsEmojiCandidate(segment.candidate(j))) {
        ++emoji_size;
      }
    }
  }
  return emoji_size;
}

// Checks if the first segment has a specific candidate.
bool HasExpectedCandidate(const Segments &segments,
                          const string &expect_value) {
  CHECK_LE(1, segments.segments_size());
  const Segment &segment = segments.segment(0);
  for (size_t i = 0; i < segment.candidates_size(); ++i) {
    const Segment::Candidate &candidate = segment.candidate(i);
    LOG(ERROR) << "[i]" << candidate.value;
    if (candidate.value == expect_value) {
      return true;
    }
  }
  return false;
}

// Replaces an emoji candidate into the 0-th index, as the Mozc converter
// does with a commited candidate.
void ChooseEmojiCandidate(Segments *segments) {
  CHECK_LE(1, segments->segments_size());
  Segment *segment = segments->mutable_segment(0);
  for (size_t i = 0; i < segment->candidates_size(); ++i) {
    if (EmojiRewriter::IsEmojiCandidate(segment->candidate(i))) {
      segment->move_candidate(i, 0);
      break;
    }
  }
  segment->set_segment_type(Segment::FIXED_VALUE);
}

// Dictionary data set for tests.
const EmojiRewriter::EmojiData kTestEmojiData[] = {
  // An actual emoji character
  {"\xF0\x9F\x90\xAD", 0, "nezumi picture", NULL, NULL, NULL},

  // Meta candidates.
  {"DOG", 0, "inu", NULL, NULL, NULL},
  {"CAT", 0, "neko", NULL, NULL, NULL},
  {"MOUSE", 0, "nezumi", NULL, NULL, NULL},
  {"RAT", 0, "nezumi", NULL, NULL, NULL},

  // Test data for carrier.
  {"COW", 0xFE001, "ushi", NULL, NULL, NULL},
  {"TIGER", 0xFE002, "tora", "docomo", NULL, NULL},
  {"RABIT", 0xFE003, "usagi", NULL, "softbank", NULL},
  {"DRAGON", 0xFE004, "ryu", NULL, NULL, "kddi"},

  // No unicode available.
  {NULL, 0xFE011, NULL, "docomo", NULL, NULL},
  {NULL, 0xFE012, NULL, NULL, "softbank", NULL},
  {NULL, 0xFE013, NULL, NULL, NULL, "kddi"},

  // Multiple carriers available.
  {NULL, 0xFE021, NULL, "docomo", "softbank", NULL},
  {NULL, 0xFE022, NULL, "docomo", NULL, "kddi"},
  {NULL, 0xFE023, NULL, NULL, "softbank", "kddi"},
  {NULL, 0xFE024, NULL, "docomo", "softbank", "kddi"},
};

const uint16 kValueList[] = {0,
                             1, 2, 3, 4,
                             5, 6, 7, 8,
                             9, 10, 11,
                             12, 13, 14, 15};
const EmojiRewriter::Token kTestToken[] = {
  // Keys (the first string of each element) must be sorted lexicographically.
  {"Emoji", kValueList, 1},  // value is ""
  {"Inu", kValueList + 1, 1},  // value is "DOG"
  {"Neko", kValueList + 2, 1},  // value is "CAT"
  {"Nezumi", kValueList + 3, 2},  // values are "MOUSE" and "RAT"
  {"X", kValueList + 5, 11},  // values for carrier test.
};

string ToAndroidPuaString(int pua) {
  string str;
  Util::UCS4ToUTF8(pua, &str);
  return str;
}

}  // namespace

class EmojiRewriterTest : public ::testing::Test {
 protected:
  // This empty constructor is written to avoid bugs of Visual Studio.
  EmojiRewriterTest() {}

  virtual void SetUp() {
    original_profile_directory_ = SystemUtil::GetUserProfileDirectory();
    SystemUtil::SetUserProfileDirectory(FLAGS_test_tmpdir);

    // Enable emoji conversion
    config::ConfigHandler::GetConfig(&original_config_);
    config::Config config(original_config_);
    config.set_use_emoji_conversion(true);
    config::ConfigHandler::SetConfig(config);

    mozc::usage_stats::UsageStats::ClearAllStatsForTest();

    rewriter_.reset(new EmojiRewriter(
        kTestEmojiData, arraysize(kTestEmojiData),
        kTestToken, arraysize(kTestToken),
        kValueList));
  }

  virtual void TearDown() {
    mozc::usage_stats::UsageStats::ClearAllStatsForTest();

    config::ConfigHandler::SetConfig(original_config_);
    SystemUtil::SetUserProfileDirectory(original_profile_directory_);
  }

  const ConversionRequest request_;
  scoped_ptr<EmojiRewriter> rewriter_;

 private:
  string original_profile_directory_;
  config::Config original_config_;
  usage_stats::scoped_usage_stats_enabler usage_stats_enabler_;
};

TEST_F(EmojiRewriterTest, Capability) {
  Request request;
  ConversionRequest conversion_request(NULL, &request);

  request.set_emoji_rewriter_capability(Request::NOT_AVAILABLE);
  EXPECT_EQ(RewriterInterface::NOT_AVAILABLE,
            rewriter_->capability(conversion_request));

  request.set_emoji_rewriter_capability(Request::CONVERSION);
  EXPECT_EQ(RewriterInterface::CONVERSION,
            rewriter_->capability(conversion_request));

  request.set_emoji_rewriter_capability(Request::PREDICTION);
  EXPECT_EQ(RewriterInterface::PREDICTION,
            rewriter_->capability(conversion_request));

  request.set_emoji_rewriter_capability(Request::SUGGESTION);
  EXPECT_EQ(RewriterInterface::SUGGESTION,
            rewriter_->capability(conversion_request));

  request.set_emoji_rewriter_capability(Request::ALL);
  EXPECT_EQ(RewriterInterface::ALL,
            rewriter_->capability(conversion_request));
}

TEST_F(EmojiRewriterTest, ConvertedSegmentsHasEmoji) {
  // This test runs an EmojiRewriter with a few strings, and checks
  //   - no conversion occur with unknown string,
  //   - expected characters are added in a conversion with a string,
  //   - all emojis are added with a specific string.

  Segments segments;
  SetSegment("neko", "test", &segments);
  EXPECT_FALSE(rewriter_->Rewrite(request_, &segments));
  EXPECT_EQ(0, CountEmojiCandidates(segments));

  SetSegment("Neko", "test", &segments);
  EXPECT_TRUE(rewriter_->Rewrite(request_, &segments));
  EXPECT_EQ(1, CountEmojiCandidates(segments));
  EXPECT_TRUE(HasExpectedCandidate(segments, "CAT"));

  SetSegment("Nezumi", "test", &segments);
  EXPECT_TRUE(rewriter_->Rewrite(request_, &segments));
  EXPECT_EQ(2, CountEmojiCandidates(segments));
  EXPECT_TRUE(HasExpectedCandidate(segments, "MOUSE"));
  EXPECT_TRUE(HasExpectedCandidate(segments, "RAT"));

  SetSegment(kEmoji, "test", &segments);
  EXPECT_TRUE(rewriter_->Rewrite(request_, &segments));
  EXPECT_EQ(9, CountEmojiCandidates(segments));
}

TEST_F(EmojiRewriterTest, CarrierEmojiSelectionEmpty) {
  Request request;
  ConversionRequest conversion_request(NULL, &request);

  Segments segments;
  SetSegment("X", "test", &segments);
  request.set_available_emoji_carrier(0);  // Disable emoji rewriting.
  ASSERT_FALSE(rewriter_->Rewrite(conversion_request, &segments));
  ASSERT_EQ(0, CountEmojiCandidates(segments));
}

TEST_F(EmojiRewriterTest, CarrierEmojiSelectionUnicode) {
  Request request;
  ConversionRequest conversion_request(NULL, &request);

  Segments segments;
  SetSegment("X", "test", &segments);
  request.set_available_emoji_carrier(Request::UNICODE_EMOJI);
  ASSERT_TRUE(rewriter_->Rewrite(conversion_request, &segments));
  ASSERT_EQ(4, CountEmojiCandidates(segments));
  EXPECT_TRUE(HasExpectedCandidate(segments, "COW"));
  EXPECT_TRUE(HasExpectedCandidate(segments, "TIGER"));
  EXPECT_TRUE(HasExpectedCandidate(segments, "RABIT"));
  EXPECT_TRUE(HasExpectedCandidate(segments, "DRAGON"));
}

TEST_F(EmojiRewriterTest, CarrierEmojiSelectionDocomo) {
  Request request;
  ConversionRequest conversion_request(NULL, &request);

  Segments segments;
  SetSegment("X", "test", &segments);
  request.set_available_emoji_carrier(Request::DOCOMO_EMOJI);
  ASSERT_TRUE(rewriter_->Rewrite(conversion_request, &segments));
  ASSERT_EQ(5, CountEmojiCandidates(segments));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE002)));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE011)));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE021)));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE022)));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE024)));
}

TEST_F(EmojiRewriterTest, CarrierEmojiSelectionSoftbank) {
  Request request;
  ConversionRequest conversion_request(NULL, &request);

  Segments segments;
  SetSegment("X", "test", &segments);
  request.set_available_emoji_carrier(Request::SOFTBANK_EMOJI);
  ASSERT_TRUE(rewriter_->Rewrite(conversion_request, &segments));
  ASSERT_EQ(5, CountEmojiCandidates(segments));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE003)));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE012)));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE021)));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE023)));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE024)));
}

TEST_F(EmojiRewriterTest, CarrierEmojiSelectionKddi) {
  Request request;
  ConversionRequest conversion_request(NULL, &request);

  Segments segments;
  SetSegment("X", "test", &segments);
  request.set_available_emoji_carrier(Request::KDDI_EMOJI);
  ASSERT_TRUE(rewriter_->Rewrite(conversion_request, &segments));
  ASSERT_EQ(5, CountEmojiCandidates(segments));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE004)));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE013)));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE022)));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE023)));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE024)));
}

// The combination of unicode and android carrier dependent emoji.
TEST_F(EmojiRewriterTest, CarrierEmojiSelectionDocomoUnicode) {
  Request request;
  ConversionRequest conversion_request(NULL, &request);

  Segments segments;
  SetSegment("X", "test", &segments);
  request.set_available_emoji_carrier(
      Request::DOCOMO_EMOJI | Request::UNICODE_EMOJI);
  ASSERT_TRUE(rewriter_->Rewrite(conversion_request, &segments));
  ASSERT_EQ(9, CountEmojiCandidates(segments));
  EXPECT_TRUE(HasExpectedCandidate(segments, "COW"));
  EXPECT_TRUE(HasExpectedCandidate(segments, "TIGER"));
  EXPECT_TRUE(HasExpectedCandidate(segments, "RABIT"));
  EXPECT_TRUE(HasExpectedCandidate(segments, "DRAGON"));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE002)));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE011)));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE021)));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE022)));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE024)));
}

TEST_F(EmojiRewriterTest, CarrierEmojiSelectionSoftbankUnicode) {
  Request request;
  ConversionRequest conversion_request(NULL, &request);

  Segments segments;
  SetSegment("X", "test", &segments);
  request.set_available_emoji_carrier(
      Request::SOFTBANK_EMOJI | Request::UNICODE_EMOJI);
  ASSERT_TRUE(rewriter_->Rewrite(conversion_request, &segments));
  ASSERT_EQ(9, CountEmojiCandidates(segments));
  EXPECT_TRUE(HasExpectedCandidate(segments, "COW"));
  EXPECT_TRUE(HasExpectedCandidate(segments, "TIGER"));
  EXPECT_TRUE(HasExpectedCandidate(segments, "RABIT"));
  EXPECT_TRUE(HasExpectedCandidate(segments, "DRAGON"));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE003)));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE012)));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE021)));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE023)));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE024)));
}

TEST_F(EmojiRewriterTest, CarrierEmojiSelectionKddiUnicode) {
  Request request;
  ConversionRequest conversion_request(NULL, &request);

  Segments segments;
  SetSegment("X", "test", &segments);
  request.set_available_emoji_carrier(
      Request::KDDI_EMOJI | Request::UNICODE_EMOJI);
  ASSERT_TRUE(rewriter_->Rewrite(conversion_request, &segments));
  ASSERT_EQ(9, CountEmojiCandidates(segments));
  EXPECT_TRUE(HasExpectedCandidate(segments, "COW"));
  EXPECT_TRUE(HasExpectedCandidate(segments, "TIGER"));
  EXPECT_TRUE(HasExpectedCandidate(segments, "RABIT"));
  EXPECT_TRUE(HasExpectedCandidate(segments, "DRAGON"));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE004)));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE013)));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE022)));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE023)));
  EXPECT_TRUE(HasExpectedCandidate(segments, ToAndroidPuaString(0xFE024)));
}

TEST_F(EmojiRewriterTest, NoConversionWithDisabledSettings) {
  // This test checks no emoji conversion occur if emoji convrsion is disabled
  // in settings. Same segments are tested with ConvertedSegmentsHasEmoji test.

  // Disable emoji conversion in settings
  config::Config config;
  config::ConfigHandler::GetConfig(&config);
  config.set_use_emoji_conversion(false);
  config::ConfigHandler::SetConfig(config);

  Segments segments;
  SetSegment("test", "test", &segments);
  EXPECT_FALSE(rewriter_->Rewrite(request_, &segments));
  EXPECT_EQ(0, CountEmojiCandidates(segments));

  SetSegment("Neko", "test", &segments);
  EXPECT_FALSE(rewriter_->Rewrite(request_, &segments));
  EXPECT_EQ(0, CountEmojiCandidates(segments));
  EXPECT_FALSE(HasExpectedCandidate(segments, "CAT"));

  SetSegment("Nezumi", "test", &segments);
  EXPECT_FALSE(rewriter_->Rewrite(request_, &segments));
  EXPECT_EQ(0, CountEmojiCandidates(segments));
  EXPECT_FALSE(HasExpectedCandidate(segments, "MOUSE"));
  EXPECT_FALSE(HasExpectedCandidate(segments, "RAT"));

  SetSegment(kEmoji, "test", &segments);
  EXPECT_FALSE(rewriter_->Rewrite(request_, &segments));
  EXPECT_EQ(0, CountEmojiCandidates(segments));
}

TEST_F(EmojiRewriterTest, CheckDescription) {
  Segments segments;
  VariantsRewriter variants_rewriter(
      UserPosManager::GetUserPosManager()->GetPOSMatcher());

  SetSegment("Emoji", "test", &segments);
  EXPECT_TRUE(rewriter_->Rewrite(request_, &segments));
  EXPECT_TRUE(variants_rewriter.Rewrite(request_, &segments));
  ASSERT_LT(0, CountEmojiCandidates(segments));
  const Segment &segment = segments.segment(0);
  for (int i = 0; i < segment.candidates_size(); ++i) {
    const Segment::Candidate &candidate = segment.candidate(i);
    const string &description = candidate.description;
    // Skip non emoji candidates.
    if (!EmojiRewriter::IsEmojiCandidate(candidate)) {
      continue;
    }
    // "<機種依存文字>"
    EXPECT_NE(string::npos, description.find("<"
        "\xE6\xA9\x9F\xE7\xA8\xAE\xE4\xBE\x9D\xE5\xAD\x98"
        "\xE6\x96\x87\xE5\xAD\x97" ">"))
        << "for \"" << candidate.value << "\" : \"" << description << "\"";
    // "[全]"
    EXPECT_EQ(string::npos, description.find("[" "\xE5\x85\xA8" "]"))
        << "for \"" << candidate.value << "\" : \"" << description << "\"";
  }
}

TEST_F(EmojiRewriterTest, CheckInsertPosition) {
  // This test checks if emoji candidates are inserted into the expected
  // position.

  // |kExpectPosition| has the same number with |kDefaultInsertPos| defined in
  // emoji_rewriter.cc.
  const int kExpectPosition = 6;

  Segments segments;
  {
    Segment *segment = segments.push_back_segment();
    segment->set_key("Neko");
    for (int i = 0; i < kExpectPosition * 2; ++i) {
      string value = "candidate" + NumberUtil::SimpleItoa(i);
      Segment::Candidate *candidate = segment->add_candidate();
      candidate->Init();
      candidate->value = value;
      candidate->content_key = "Neko";
      candidate->content_value = value;
    }
  }
  EXPECT_TRUE(rewriter_->Rewrite(request_, &segments));

  ASSERT_EQ(1, segments.segments_size());
  const Segment& segment = segments.segment(0);
  ASSERT_LE(kExpectPosition, segment.candidates_size());
  for (int i = 0; i < kExpectPosition; ++i) {
    EXPECT_FALSE(EmojiRewriter::IsEmojiCandidate(segment.candidate(i)));
  }
  const Segment::Candidate &candidate = segment.candidate(kExpectPosition);
  EXPECT_TRUE(EmojiRewriter::IsEmojiCandidate(candidate));
  EXPECT_EQ("CAT", candidate.value);
}

TEST_F(EmojiRewriterTest, CheckUsageStats) {
  // This test checks the data stored in usage stats for EmojiRewriter.

  const char kStatsKey[] = "CommitEmoji";
  Segments segments;

  // No use, no registered keys
  EXPECT_STATS_NOT_EXIST(kStatsKey);

  // Converting non-emoji candidates does not matter.
  SetSegment("test", "test", &segments);
  EXPECT_FALSE(rewriter_->Rewrite(request_, &segments));
  rewriter_->Finish(request_, &segments);
  EXPECT_STATS_NOT_EXIST(kStatsKey);

  // Converting an emoji candidate.
  SetSegment("Nezumi", "test", &segments);
  EXPECT_TRUE(rewriter_->Rewrite(request_, &segments));
  ChooseEmojiCandidate(&segments);
  rewriter_->Finish(request_, &segments);
  EXPECT_COUNT_STATS(kStatsKey, 1);
  SetSegment(kEmoji, "test", &segments);
  EXPECT_TRUE(rewriter_->Rewrite(request_, &segments));
  ChooseEmojiCandidate(&segments);
  rewriter_->Finish(request_, &segments);
  EXPECT_COUNT_STATS(kStatsKey, 2);

  // Converting non-emoji keeps the previous usage stats.
  SetSegment("test", "test", &segments);
  EXPECT_FALSE(rewriter_->Rewrite(request_, &segments));
  rewriter_->Finish(request_, &segments);
  EXPECT_COUNT_STATS(kStatsKey, 2);
}

}  // namespace mozc
