// 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/single_kanji_rewriter.h"

#include <cstddef>
#include <string>

#include "base/scoped_ptr.h"
#include "base/system_util.h"
#include "base/util.h"
#include "config/config_handler.h"
#include "config/config.pb.h"
#include "converter/conversion_request.h"
#include "converter/segments.h"
#include "data_manager/testing/mock_data_manager.h"
#include "dictionary/pos_matcher.h"
#include "session/commands.pb.h"
#include "testing/base/public/gunit.h"

DECLARE_string(test_tmpdir);

using mozc::dictionary::POSMatcher;

namespace mozc {

class SingleKanjiRewriterTest : public ::testing::Test {
 protected:
  SingleKanjiRewriterTest() {
    data_manager_.reset(new testing::MockDataManager);
    pos_matcher_ = data_manager_->GetPOSMatcher();
  }

  virtual ~SingleKanjiRewriterTest() {}

  virtual void SetUp() {
    SystemUtil::SetUserProfileDirectory(FLAGS_test_tmpdir);
    config::Config default_config;
    config::ConfigHandler::GetDefaultConfig(&default_config);
    config::ConfigHandler::SetConfig(default_config);
  }

  SingleKanjiRewriter *CreateSingleKanjiRewriter() const {
    return new SingleKanjiRewriter(*pos_matcher_);
  }

  const POSMatcher &pos_matcher() {
    return *pos_matcher_;
  }

  const ConversionRequest default_request_;

 private:
  scoped_ptr<testing::MockDataManager> data_manager_;
  const POSMatcher *pos_matcher_;
};

TEST_F(SingleKanjiRewriterTest, CapabilityTest) {
  scoped_ptr<SingleKanjiRewriter> rewriter(CreateSingleKanjiRewriter());

  commands::Request client_request;
  client_request.set_mixed_conversion(false);
  const ConversionRequest request(NULL, &client_request);
  EXPECT_EQ(RewriterInterface::CONVERSION, rewriter->capability(request));
}

TEST_F(SingleKanjiRewriterTest, SetKeyTest) {
  scoped_ptr<SingleKanjiRewriter> rewriter(CreateSingleKanjiRewriter());

  Segments segments;
  Segment *segment = segments.add_segment();
  // "あ"
  const string kKey = "\xe3\x81\x82";
  segment->set_key(kKey);
  Segment::Candidate *candidate = segment->add_candidate();
  // First candidate may be inserted by other rewriters.
  candidate->Init();
  candidate->key = "strange key";
  candidate->content_key = "starnge key";
  candidate->value = "starnge value";
  candidate->content_value = "strange value";

  EXPECT_EQ(1, segment->candidates_size());
  rewriter->Rewrite(default_request_, &segments);
  EXPECT_GT(segment->candidates_size(), 1);
  for (size_t i = 1; i < segment->candidates_size(); ++i) {
    EXPECT_EQ(kKey, segment->candidate(i).key);
  }
}

TEST_F(SingleKanjiRewriterTest, MobileEnvironmentTest) {
  commands::Request client_request;
  scoped_ptr<SingleKanjiRewriter> rewriter(CreateSingleKanjiRewriter());

  {
    client_request.set_mixed_conversion(true);
    const ConversionRequest request(NULL, &client_request);
    EXPECT_EQ(RewriterInterface::ALL, rewriter->capability(request));
  }

  {
    client_request.set_mixed_conversion(false);
    const ConversionRequest request(NULL, &client_request);
    EXPECT_EQ(RewriterInterface::CONVERSION, rewriter->capability(request));
  }
}

TEST_F(SingleKanjiRewriterTest, NounPrefixTest) {
  SingleKanjiRewriter rewriter(pos_matcher());
  Segments segments;
  Segment *segment1 = segments.add_segment();

  // "み"
  segment1->set_key("\xE3\x81\xBF");
  Segment::Candidate *candidate1 = segment1->add_candidate();

  candidate1->Init();
  // candidate1->key = "み";
  // candidate1->content_key = "見";
  // candidate1->value = "見";
  // candidate1->content_value = "見";
  candidate1->key = "\xE3\x81\xBF";
  candidate1->content_key = "\xE8\xA6\x8B";
  candidate1->value = "\xE8\xA6\x8B";
  candidate1->content_value = "\xE8\xA6\x8B";

  EXPECT_EQ(1, segment1->candidates_size());
  rewriter.Rewrite(default_request_, &segments);

  // "未"
  EXPECT_EQ("\xE6\x9C\xAA", segment1->candidate(0).value);

  Segment *segment2 = segments.add_segment();

  // segment2->set_key("こうたい");
  segment2->set_key("\xE3\x81\x93\xE3\x81\x86\xE3\x81\x9F\xE3\x81\x84");
  Segment::Candidate *candidate2 = segment2->add_candidate();

  candidate2->Init();
  // candidate2->key = "こうたい";
  // candidate2->content_key = "後退";
  // candidate2->value = "後退";
  candidate2->key = "\xE3\x81\x93\xE3\x81\x86\xE3\x81\x9F\xE3\x81\x84";
  candidate2->content_key = "\xE5\xBE\x8C\xE9\x80\x80";
  candidate2->value = "\xE5\xBE\x8C\xE9\x80\x80";

  candidate2->lid = pos_matcher().GetContentWordWithConjugationId();
  candidate2->rid = pos_matcher().GetContentWordWithConjugationId();

  candidate1 = segment1->mutable_candidate(0);
  candidate1->Init();
  // candidate1->key = "み";
  // candidate1->content_key = "見";
  // candidate1->value = "見";
  // candidate1->content_value = "見";
  candidate1->key = "\xE3\x81\xBF";
  candidate1->content_key = "\xE8\xA6\x8B";
  candidate1->value = "\xE8\xA6\x8B";
  candidate1->content_value = "\xE8\xA6\x8B";

  rewriter.Rewrite(default_request_, &segments);
  // "見"
  EXPECT_EQ("\xE8\xA6\x8B", segment1->candidate(0).value);

  // Only applied when right word's POS is noun.
  candidate2->lid = pos_matcher().GetContentNounId();
  candidate2->rid = pos_matcher().GetContentNounId();

  rewriter.Rewrite(default_request_, &segments);
  // "未"
  EXPECT_EQ("\xE6\x9C\xAA", segment1->candidate(0).value);

  EXPECT_EQ(pos_matcher().GetNounPrefixId(), segment1->candidate(0).lid);
  EXPECT_EQ(pos_matcher().GetNounPrefixId(), segment1->candidate(0).rid);
}

TEST_F(SingleKanjiRewriterTest, InsertionPositionTest) {
  SingleKanjiRewriter rewriter(pos_matcher());
  Segments segments;
  Segment *segment = segments.add_segment();

  // "あ"
  segment->set_key("\xe3\x81\x82");
  for (int i = 0; i < 10; ++i) {
    Segment::Candidate *candidate = segment->add_candidate();
    candidate->Init();
    candidate->key = segment->key();
    candidate->content_key = segment->key();
    candidate->value = Util::StringPrintf("cand%d", i);
    candidate->content_value = candidate->value;
  }

  EXPECT_EQ(10, segment->candidates_size());
  EXPECT_TRUE(rewriter.Rewrite(default_request_, &segments));
  EXPECT_LT(10, segment->candidates_size());  // Some candidates were inserted.

  for (int i = 0; i < 10; ++i) {
    // First 10 candidates have not changed.
    const Segment::Candidate &candidate = segment->candidate(i);
    EXPECT_EQ(Util::StringPrintf("cand%d", i), candidate.value);
  }
}

TEST_F(SingleKanjiRewriterTest, AddDescriptionTest) {
  SingleKanjiRewriter rewriter(pos_matcher());
  Segments segments;
  Segment *segment = segments.add_segment();

  // "あ"
  segment->set_key("\xe3\x81\x82");
  {
    Segment::Candidate *candidate = segment->add_candidate();
    candidate->Init();
    candidate->key = segment->key();
    candidate->content_key = segment->key();
    // "亞"
    candidate->value = "\xe4\xba\x9e";  // variant of "亜".
    candidate->content_value = candidate->value;
  }

  EXPECT_EQ(1, segment->candidates_size());
  EXPECT_TRUE(segment->candidate(0).description.empty());
  EXPECT_TRUE(rewriter.Rewrite(default_request_, &segments));
  EXPECT_LT(1, segment->candidates_size());  // Some candidates were inserted.
  // "亜の旧字体"
  EXPECT_EQ("\xe4\xba\x9c\xe3\x81\xae\xe6\x97\xa7\xe5\xad\x97\xe4\xbd\x93",
            segment->candidate(0).description);
}
}  // namespace mozc
