diff --git a/src/base/util.cc b/src/base/util.cc index 55daee5be..06012b405 100644 --- a/src/base/util.cc +++ b/src/base/util.cc @@ -96,18 +96,38 @@ void ConstChar32ReverseIterator::Next() { bool ConstChar32ReverseIterator::Done() const { return done_; } -void Util::SplitStringToUtf8Chars(absl::string_view str, - std::vector *output) { +namespace { + +template +void AppendUtf8CharsImpl(absl::string_view str, std::vector &output) { const char *begin = str.data(); const char *const end = str.data() + str.size(); while (begin < end) { const size_t mblen = strings::OneCharLen(begin); - output->emplace_back(begin, mblen); + output.emplace_back(begin, mblen); begin += mblen; } DCHECK_EQ(begin, end); } +} // namespace + +std::vector Util::SplitStringToUtf8Chars(absl::string_view str) { + std::vector output; + AppendUtf8Chars(str, output); + return output; +} + +void Util::AppendUtf8Chars(absl::string_view str, + std::vector &output) { + AppendUtf8CharsImpl(str, output); +} + +void Util::AppendUtf8Chars(absl::string_view str, + std::vector &output) { + AppendUtf8CharsImpl(str, output); +} + // Grapheme is user-perceived character. It may contain multiple codepoints // such as modifiers and variation squesnces (e.g. 神︀ = U+795E,U+FE00 [SVS]). // Note, this function does not support full requirements of the grapheme @@ -115,7 +135,7 @@ void Util::SplitStringToUtf8Chars(absl::string_view str, // * https://www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries void Util::SplitStringToUtf8Graphemes(absl::string_view str, std::vector *graphemes) { - Util::SplitStringToUtf8Chars(str, graphemes); + *graphemes = SplitStringToUtf8Chars(str); if (graphemes->size() <= 1) { return; } @@ -908,7 +928,7 @@ Util::ScriptType Util::GetFirstScriptType(absl::string_view str, } const Utf8AsChars32 utf8_as_char32(str); if (mblen) { - *mblen = utf8_as_char32.begin().ok()? utf8_as_char32.begin().size() : 0; + *mblen = utf8_as_char32.begin().ok() ? utf8_as_char32.begin().size() : 0; } return GetScriptType(utf8_as_char32.front()); } diff --git a/src/base/util.h b/src/base/util.h index 1bd5d71e1..99ead65eb 100644 --- a/src/base/util.h +++ b/src/base/util.h @@ -46,9 +46,19 @@ class Util { Util() = delete; ~Util() = delete; - // String utils - static void SplitStringToUtf8Chars(absl::string_view str, - std::vector *output); + // Splits a string into UTF8 chars. + static std::vector SplitStringToUtf8Chars(absl::string_view str); + + // Splits a string into UTF8 chars and appends them to `output`. For example: + // + // std::string str = "あa1"; + // std::vector output = {"漢"}; + // Util::AppendUtf8Chars(str, output); + // EXPECT_THAT(output, ElementsAre("漢", "あ", "a", "1")); + static void AppendUtf8Chars(absl::string_view str, + std::vector &output); + static void AppendUtf8Chars(absl::string_view str, + std::vector &output); // Split `str` to graphemes. // A grapheme may contain multiple characters such as modifiers and variation diff --git a/src/base/util_test.cc b/src/base/util_test.cc index 55079567b..4bcc61251 100644 --- a/src/base/util_test.cc +++ b/src/base/util_test.cc @@ -51,34 +51,52 @@ namespace mozc { namespace { +using ::testing::ElementsAre; using ::testing::ElementsAreArray; -TEST(UtilTest, SplitStringToUtf8Chars) { +template +class TypedUtilTest : public ::testing::Test {}; + +using StrTypes = ::testing::Types; +TYPED_TEST_SUITE(TypedUtilTest, StrTypes); + +TYPED_TEST(TypedUtilTest, AppendUtf8Chars) { + using StrType = TypeParam; { - std::vector output; - Util::SplitStringToUtf8Chars("", &output); + std::vector output; + Util::AppendUtf8Chars("", output); EXPECT_EQ(output.size(), 0); } - { - const std::string kInputs[] = { + constexpr absl::string_view kInputs[] = { "a", "あ", "亜", "\n", "a", }; const std::string joined_string = absl::StrJoin(kInputs, ""); - std::vector output; - Util::SplitStringToUtf8Chars(joined_string, &output); - EXPECT_THAT(output, ElementsAreArray(kInputs)); + std::vector output = {"x", "y", "z"}; + Util::AppendUtf8Chars(joined_string, output); + EXPECT_THAT(output, ElementsAre("x", "y", "z", "a", "あ", "亜", "\n", "a")); } } -TEST(UtilTest, SplitStringToUtf8Graphemes) { +TEST(UtilTest, SplitStringToUtf8Chars) { { - std::vector output; - Util::SplitStringToUtf8Chars("", &output); + const std::vector output = Util::SplitStringToUtf8Chars(""); EXPECT_EQ(output.size(), 0); } + { + const std::string kInputs[] = { + "a", "あ", "亜", "\n", "a", + }; + const std::string joined_string = absl::StrJoin(kInputs, ""); + + const std::vector output = + Util::SplitStringToUtf8Chars(joined_string); + EXPECT_THAT(output, ElementsAreArray(kInputs)); + } +} +TEST(UtilTest, SplitStringToUtf8Graphemes) { { // Single codepoint characters. const std::string kInputs[] = { "a", "あ", "亜", "\n", "a", diff --git a/src/composer/composer_test.cc b/src/composer/composer_test.cc index 4af842343..cb8879209 100644 --- a/src/composer/composer_test.cc +++ b/src/composer/composer_test.cc @@ -2549,10 +2549,8 @@ TEST_F(ComposerTest, InsertCharacterPreedit) { { std::string base; std::set expanded; - std::vector chars; - Util::SplitStringToUtf8Chars(kTestStr, &chars); - for (size_t i = 0; i < chars.size(); ++i) { - composer_->InsertCharacterPreedit(chars[i]); + for (const std::string &c : Util::SplitStringToUtf8Chars(kTestStr)) { + composer_->InsertCharacterPreedit(c); } std::string preedit = composer_->GetStringForPreedit(); std::string conversion_query = composer_->GetQueryForConversion(); diff --git a/src/converter/immutable_converter.cc b/src/converter/immutable_converter.cc index 2e23161ce..e799c1035 100644 --- a/src/converter/immutable_converter.cc +++ b/src/converter/immutable_converter.cc @@ -1333,8 +1333,8 @@ void ImmutableConverter::MakeLatticeNodesForPredictiveNodes( conversion_key += segment.key(); } DCHECK_NE(std::string::npos, key.find(conversion_key)); - std::vector conversion_key_chars; - Util::SplitStringToUtf8Chars(conversion_key, &conversion_key_chars); + const std::vector conversion_key_chars = + Util::SplitStringToUtf8Chars(conversion_key); // *** Current behaviors *** // - Starts suggestion from 6 characters, which is conservative. diff --git a/src/prediction/predictor_test.cc b/src/prediction/predictor_test.cc index fdb8375f6..a550c5fb1 100644 --- a/src/prediction/predictor_test.cc +++ b/src/prediction/predictor_test.cc @@ -162,15 +162,17 @@ class MobilePredictorTest : public ::testing::Test { request_test_util::FillMobileRequest(request_.get()); composer_ = std::make_unique(nullptr, request_.get(), config_.get()); + } - convreq_ = std::make_unique( - composer_.get(), request_.get(), config_.get()); + ConversionRequest CreateConversionRequest() const { + return ConversionRequest(composer_.get(), request_.get(), &context_, + config_.get()); } std::unique_ptr composer_; std::unique_ptr request_; std::unique_ptr config_; - std::unique_ptr convreq_; + commands::Context context_; }; TEST_F(MobilePredictorTest, CallPredictorsForMobileSuggestion) { @@ -183,23 +185,25 @@ TEST_F(MobilePredictorTest, CallPredictorsForMobileSuggestion) { Segment *segment = segments.add_segment(); CHECK(segment); } - convreq_->set_request_type(ConversionRequest::SUGGESTION); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = CreateConversionRequest(); + convreq.set_request_type(ConversionRequest::SUGGESTION); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); } TEST_F(MobilePredictorTest, CallPredictorsForMobilePartialSuggestion) { MockConverter converter; auto predictor = std::make_unique( std::make_unique(20), - // We don't call history predictior + // We don't call history predictor std::make_unique(-1, -1), &converter); Segments segments; { Segment *segment = segments.add_segment(); CHECK(segment); } - convreq_->set_request_type(ConversionRequest::PARTIAL_SUGGESTION); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = CreateConversionRequest(); + convreq.set_request_type(ConversionRequest::PARTIAL_SUGGESTION); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); } TEST_F(MobilePredictorTest, CallPredictorsForMobilePrediction) { @@ -212,8 +216,9 @@ TEST_F(MobilePredictorTest, CallPredictorsForMobilePrediction) { Segment *segment = segments.add_segment(); CHECK(segment); } - convreq_->set_request_type(ConversionRequest::PREDICTION); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = CreateConversionRequest(); + convreq.set_request_type(ConversionRequest::PREDICTION); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); } TEST_F(MobilePredictorTest, CallPredictorsForMobilePartialPrediction) { @@ -229,8 +234,9 @@ TEST_F(MobilePredictorTest, CallPredictorsForMobilePartialPrediction) { Segment *segment = segments.add_segment(); CHECK(segment); } - convreq_->set_request_type(ConversionRequest::PARTIAL_PREDICTION); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = CreateConversionRequest(); + convreq.set_request_type(ConversionRequest::PARTIAL_PREDICTION); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); } TEST_F(MobilePredictorTest, CallPredictForRequestMobile) { @@ -251,8 +257,9 @@ TEST_F(MobilePredictorTest, CallPredictForRequestMobile) { Segment *segment = segments.add_segment(); CHECK(segment); } - convreq_->set_request_type(ConversionRequest::SUGGESTION); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = CreateConversionRequest(); + convreq.set_request_type(ConversionRequest::SUGGESTION); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); } class PredictorTest : public ::testing::Test { @@ -264,14 +271,17 @@ class PredictorTest : public ::testing::Test { request_ = std::make_unique(); composer_ = std::make_unique(nullptr, request_.get(), config_.get()); - convreq_ = std::make_unique( - composer_.get(), request_.get(), config_.get()); + } + + ConversionRequest CreateConversionRequest() const { + return ConversionRequest(composer_.get(), request_.get(), &context_, + config_.get()); } std::unique_ptr composer_; std::unique_ptr request_; std::unique_ptr config_; - std::unique_ptr convreq_; + commands::Context context_; }; TEST_F(PredictorTest, AllPredictorsReturnTrue) { @@ -284,8 +294,9 @@ TEST_F(PredictorTest, AllPredictorsReturnTrue) { Segment *segment = segments.add_segment(); CHECK(segment); } - convreq_->set_request_type(ConversionRequest::SUGGESTION); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = CreateConversionRequest(); + convreq.set_request_type(ConversionRequest::SUGGESTION); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); } TEST_F(PredictorTest, MixedReturnValue) { @@ -298,8 +309,9 @@ TEST_F(PredictorTest, MixedReturnValue) { Segment *segment = segments.add_segment(); CHECK(segment); } - convreq_->set_request_type(ConversionRequest::SUGGESTION); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = CreateConversionRequest(); + convreq.set_request_type(ConversionRequest::SUGGESTION); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); } TEST_F(PredictorTest, AllPredictorsReturnFalse) { @@ -312,8 +324,9 @@ TEST_F(PredictorTest, AllPredictorsReturnFalse) { Segment *segment = segments.add_segment(); CHECK(segment); } - convreq_->set_request_type(ConversionRequest::SUGGESTION); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = CreateConversionRequest(); + convreq.set_request_type(ConversionRequest::SUGGESTION); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } TEST_F(PredictorTest, CallPredictorsForSuggestion) { @@ -330,8 +343,9 @@ TEST_F(PredictorTest, CallPredictorsForSuggestion) { Segment *segment = segments.add_segment(); CHECK(segment); } - convreq_->set_request_type(ConversionRequest::SUGGESTION); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = CreateConversionRequest(); + convreq.set_request_type(ConversionRequest::SUGGESTION); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); } TEST_F(PredictorTest, CallPredictorsForPrediction) { @@ -347,8 +361,9 @@ TEST_F(PredictorTest, CallPredictorsForPrediction) { Segment *segment = segments.add_segment(); CHECK(segment); } - convreq_->set_request_type(ConversionRequest::PREDICTION); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = CreateConversionRequest(); + convreq.set_request_type(ConversionRequest::PREDICTION); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); } TEST_F(PredictorTest, CallPredictForRequest) { @@ -369,8 +384,9 @@ TEST_F(PredictorTest, CallPredictForRequest) { Segment *segment = segments.add_segment(); CHECK(segment); } - convreq_->set_request_type(ConversionRequest::SUGGESTION); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = CreateConversionRequest(); + convreq.set_request_type(ConversionRequest::SUGGESTION); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); } TEST_F(PredictorTest, DisableAllSuggestion) { @@ -386,15 +402,16 @@ TEST_F(PredictorTest, DisableAllSuggestion) { Segment *segment = segments.add_segment(); CHECK(segment); } - convreq_->set_request_type(ConversionRequest::SUGGESTION); + ConversionRequest convreq = CreateConversionRequest(); + convreq.set_request_type(ConversionRequest::SUGGESTION); config_->set_presentation_mode(true); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); EXPECT_FALSE(pred1->predict_called()); EXPECT_FALSE(pred2->predict_called()); config_->set_presentation_mode(false); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(pred1->predict_called()); EXPECT_TRUE(pred2->predict_called()); } @@ -429,7 +446,8 @@ TEST_F(PredictorTest, PopulateReadingOfCommittedCandidateIfMissing) { cand3->value = "群馬"; cand3->content_value = "群馬"; - predictor->Finish(*convreq_, &segments); + ConversionRequest convreq = CreateConversionRequest(); + predictor->Finish(convreq, &segments); EXPECT_EQ(cand1->key, "とうきょう"); EXPECT_EQ(cand1->content_key, "とうきょう"); EXPECT_TRUE(cand2->key.empty()); @@ -454,7 +472,8 @@ TEST_F(PredictorTest, PopulateReadingOfCommittedCandidateIfMissing) { cand3->value = "群馬に"; cand3->content_value = "群馬"; - predictor->Finish(*convreq_, &segments); + ConversionRequest convreq = CreateConversionRequest(); + predictor->Finish(convreq, &segments); EXPECT_EQ(cand1->key, "とうきょうに"); EXPECT_EQ(cand1->content_key, "とうきょう"); EXPECT_TRUE(cand2->key.empty()); @@ -472,7 +491,8 @@ TEST_F(PredictorTest, PopulateReadingOfCommittedCandidateIfMissing) { cand1->value = "東京便"; cand1->content_value = "東京"; - predictor->Finish(*convreq_, &segments); + ConversionRequest convreq = CreateConversionRequest(); + predictor->Finish(convreq, &segments); EXPECT_TRUE(cand1->key.empty()); EXPECT_TRUE(cand1->content_key.empty()); } @@ -485,7 +505,8 @@ TEST_F(PredictorTest, PopulateReadingOfCommittedCandidateIfMissing) { cand1->value = "東京"; cand1->content_value.clear(); - predictor->Finish(*convreq_, &segments); + ConversionRequest convreq = CreateConversionRequest(); + predictor->Finish(convreq, &segments); EXPECT_TRUE(cand1->key.empty()); EXPECT_TRUE(cand1->content_key.empty()); } @@ -528,9 +549,10 @@ TEST_F(MobilePredictorTest, FillPos) { std::move(mock_dictionary_predictor), std::move(mock_history_predictor), &converter); - convreq_->set_request_type(ConversionRequest::SUGGESTION); + ConversionRequest convreq = CreateConversionRequest(); + convreq.set_request_type(ConversionRequest::SUGGESTION); Segments segments; - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.conversion_segments_size(), 1); EXPECT_EQ(segments.conversion_segment(0).candidates_size(), 2); diff --git a/src/prediction/user_history_predictor_test.cc b/src/prediction/user_history_predictor_test.cc index ddca47254..72a1134e9 100644 --- a/src/prediction/user_history_predictor_test.cc +++ b/src/prediction/user_history_predictor_test.cc @@ -98,18 +98,11 @@ using ::testing::Return; class UserHistoryPredictorTest : public testing::TestWithTempUserProfile { protected: void SetUp() override { - request_ = std::make_unique(); - config_ = std::make_unique(); - config::ConfigHandler::GetDefaultConfig(config_.get()); - config_->set_use_typing_correction(true); + request_.Clear(); + config::ConfigHandler::GetDefaultConfig(&config_); + config_.set_use_typing_correction(true); table_ = std::make_unique(); - composer_ = std::make_unique( - table_.get(), request_.get(), config_.get()); - convreq_ = std::make_unique( - composer_.get(), request_.get(), config_.get()); - convreq_->set_max_user_history_prediction_candidates_size(10); - convreq_->set_max_user_history_prediction_candidates_size_for_zero_query( - 10); + composer_ = composer::Composer(table_.get(), &request_, &config_); data_and_predictor_ = CreateDataAndPredictor(); mozc::usage_stats::UsageStats::ClearAllStatsForTest(); @@ -119,6 +112,13 @@ class UserHistoryPredictorTest : public testing::TestWithTempUserProfile { mozc::usage_stats::UsageStats::ClearAllStatsForTest(); } + ConversionRequest CreateConversionRequest() const { + ConversionRequest convreq(&composer_, &request_, &context_, &config_); + convreq.set_max_user_history_prediction_candidates_size(10); + convreq.set_max_user_history_prediction_candidates_size_for_zero_query(10); + return convreq; + } + UserHistoryPredictor *GetUserHistoryPredictor() { return data_and_predictor_->predictor.get(); } @@ -143,7 +143,7 @@ class UserHistoryPredictorTest : public testing::TestWithTempUserProfile { const absl::string_view value) { ConversionRequest conversion_request; Segments segments; - MakeSegmentsForSuggestion(key, &segments); + MakeSegments(key, &segments); conversion_request.set_request_type(ConversionRequest::SUGGESTION); return predictor->PredictForRequest(conversion_request, &segments) && FindCandidateByValue(value, segments); @@ -153,7 +153,7 @@ class UserHistoryPredictorTest : public testing::TestWithTempUserProfile { const absl::string_view value) { ConversionRequest conversion_request; Segments segments; - MakeSegmentsForPrediction(key, &segments); + MakeSegments(key, &segments); conversion_request.set_request_type(ConversionRequest::PREDICTION); return predictor->PredictForRequest(conversion_request, &segments) && FindCandidateByValue(value, segments); @@ -261,31 +261,31 @@ class UserHistoryPredictorTest : public testing::TestWithTempUserProfile { EXPECT_TRUE(IsSuggestedAndPredicted(predictor, "meth", "Method")); } - void AddSegmentForSuggestion(const absl::string_view key, - Segments *segments) { - convreq_->set_request_type(ConversionRequest::SUGGESTION); + static void AddSegment(absl::string_view key, Segments *segments) { Segment *seg = segments->add_segment(); seg->set_key(key); seg->set_segment_type(Segment::FIXED_VALUE); } - void MakeSegmentsForSuggestion(const absl::string_view key, - Segments *segments) { + static void MakeSegments(absl::string_view key, Segments *segments) { segments->Clear(); - AddSegmentForSuggestion(key, segments); + AddSegment(key, segments); } - void SetUpInputForSuggestion(const absl::string_view key, - composer::Composer *composer, - Segments *segments) { + ConversionRequest SetUpInputForSuggestion(absl::string_view key, + composer::Composer *composer, + Segments *segments) const { composer->Reset(); composer->SetPreeditTextForTestOnly(key); - MakeSegmentsForSuggestion(key, segments); + MakeSegments(key, segments); + ConversionRequest convreq = CreateConversionRequest(); + convreq.set_request_type(ConversionRequest::SUGGESTION); + return convreq; } - void PrependHistorySegments(const absl::string_view key, - const absl::string_view value, - Segments *segments) { + static void PrependHistorySegments(absl::string_view key, + absl::string_view value, + Segments *segments) { Segment *seg = segments->push_front_segment(); seg->set_segment_type(Segment::HISTORY); seg->set_key(key); @@ -296,79 +296,60 @@ class UserHistoryPredictorTest : public testing::TestWithTempUserProfile { c->content_value = std::string(value); } - void SetUpInputForSuggestionWithHistory(const absl::string_view key, - const absl::string_view hist_key, - const absl::string_view hist_value, - composer::Composer *composer, - Segments *segments) { - SetUpInputForSuggestion(key, composer, segments); + ConversionRequest SetUpInputForSuggestionWithHistory( + absl::string_view key, absl::string_view hist_key, + absl::string_view hist_value, composer::Composer *composer, + Segments *segments) const { + ConversionRequest convreq = + SetUpInputForSuggestion(key, composer, segments); PrependHistorySegments(hist_key, hist_value, segments); + return convreq; } - void AddSegmentForPrediction(const absl::string_view key, - Segments *segments) { - convreq_->set_request_type(ConversionRequest::PREDICTION); - Segment *seg = segments->add_segment(); - seg->set_key(key); - seg->set_segment_type(Segment::FIXED_VALUE); - } - - void MakeSegmentsForPrediction(const absl::string_view key, - Segments *segments) { - segments->Clear(); - AddSegmentForPrediction(key, segments); - } - - void SetUpInputForPrediction(const absl::string_view key, - composer::Composer *composer, - Segments *segments) { + ConversionRequest SetUpInputForPrediction(absl::string_view key, + composer::Composer *composer, + Segments *segments) const { composer->Reset(); composer->SetPreeditTextForTestOnly(key); - MakeSegmentsForPrediction(key, segments); - } - - void SetUpInputForPredictionWithHistory(const absl::string_view key, - const absl::string_view hist_key, - const absl::string_view hist_value, - composer::Composer *composer, - Segments *segments) { - SetUpInputForPrediction(key, composer, segments); + MakeSegments(key, segments); + ConversionRequest convreq = CreateConversionRequest(); + convreq.set_request_type(ConversionRequest::PREDICTION); + return convreq; + } + + ConversionRequest SetUpInputForPredictionWithHistory( + absl::string_view key, absl::string_view hist_key, + absl::string_view hist_value, composer::Composer *composer, + Segments *segments) const { + ConversionRequest convreq = + SetUpInputForPrediction(key, composer, segments); PrependHistorySegments(hist_key, hist_value, segments); + return convreq; } - void AddSegmentForConversion(const absl::string_view key, - Segments *segments) { - convreq_->set_request_type(ConversionRequest::CONVERSION); - Segment *seg = segments->add_segment(); - seg->set_key(key); - seg->set_segment_type(Segment::FIXED_VALUE); - } - - void MakeSegmentsForConversion(const absl::string_view key, - Segments *segments) { - segments->Clear(); - AddSegmentForConversion(key, segments); - } - - void SetUpInputForConversion(const absl::string_view key, - composer::Composer *composer, - Segments *segments) { + ConversionRequest SetUpInputForConversion(absl::string_view key, + composer::Composer *composer, + Segments *segments) const { composer->Reset(); composer->SetPreeditTextForTestOnly(key); - MakeSegmentsForConversion(key, segments); - } - - void SetUpInputForConversionWithHistory(const absl::string_view key, - const absl::string_view hist_key, - const absl::string_view hist_value, - composer::Composer *composer, - Segments *segments) { - SetUpInputForConversion(key, composer, segments); + MakeSegments(key, segments); + ConversionRequest convreq = CreateConversionRequest(); + convreq.set_request_type(ConversionRequest::CONVERSION); + return convreq; + } + + ConversionRequest SetUpInputForConversionWithHistory( + absl::string_view key, absl::string_view hist_key, + absl::string_view hist_value, composer::Composer *composer, + Segments *segments) const { + ConversionRequest convreq = + SetUpInputForConversion(key, composer, segments); PrependHistorySegments(hist_key, hist_value, segments); + return convreq; } - void AddCandidate(size_t index, const absl::string_view value, - Segments *segments) { + static void AddCandidate(size_t index, absl::string_view value, + Segments *segments) { Segment::Candidate *candidate = segments->mutable_segment(index)->add_candidate(); CHECK(candidate); @@ -378,9 +359,9 @@ class UserHistoryPredictorTest : public testing::TestWithTempUserProfile { candidate->content_key = segments->segment(index).key(); } - void AddCandidateWithDescription(size_t index, const absl::string_view value, - const absl::string_view desc, - Segments *segments) { + static void AddCandidateWithDescription(size_t index, absl::string_view value, + absl::string_view desc, + Segments *segments) { Segment::Candidate *candidate = segments->mutable_segment(index)->add_candidate(); CHECK(candidate); @@ -391,18 +372,18 @@ class UserHistoryPredictorTest : public testing::TestWithTempUserProfile { candidate->description = std::string(desc); } - void AddCandidate(const absl::string_view value, Segments *segments) { + static void AddCandidate(absl::string_view value, Segments *segments) { AddCandidate(0, value, segments); } - void AddCandidateWithDescription(const absl::string_view value, - const absl::string_view desc, - Segments *segments) { + static void AddCandidateWithDescription(absl::string_view value, + absl::string_view desc, + Segments *segments) { AddCandidateWithDescription(0, value, desc, segments); } - std::optional FindCandidateByValue(const absl::string_view value, - const Segments &segments) { + static std::optional FindCandidateByValue(absl::string_view value, + const Segments &segments) { for (size_t i = 0; i < segments.conversion_segment(0).candidates_size(); ++i) { if (segments.conversion_segment(0).candidate(i).value == value) { @@ -417,11 +398,11 @@ class UserHistoryPredictorTest : public testing::TestWithTempUserProfile { data_and_predictor_->modules.SetSupplementalModel(supplemental_model); } - std::unique_ptr composer_; + composer::Composer composer_; std::unique_ptr table_; - std::unique_ptr convreq_; - std::unique_ptr config_; - std::unique_ptr request_; + Config config_; + Request request_; + commands::Context context_; private: struct DataAndPredictor { @@ -451,37 +432,39 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorTest) { // Nothing happen { Segments segments; - SetUpInputForSuggestion("てすと", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("てすと", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidates_size(), 0); } // Nothing happen { Segments segments; - SetUpInputForSuggestion("てすと", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("てすと", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidates_size(), 0); } // Insert two items { Segments segments; - SetUpInputForSuggestion("わたしのなまえはなかのです", composer_.get(), - &segments); + ConversionRequest convreq = SetUpInputForSuggestion( + "わたしのなまえはなかのです", &composer_, &segments); AddCandidate("私の名前は中野です", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("わたしの", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); EXPECT_TRUE(segments.segment(0).candidate(0).source_info & Segment::Candidate::USER_HISTORY_PREDICTOR); segments.Clear(); - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("わたしの", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); EXPECT_TRUE(segments.segment(0).candidate(0).source_info & Segment::Candidate::USER_HISTORY_PREDICTOR); @@ -492,21 +475,21 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorTest) { config::Config::HistoryLearningLevel no_learning_levels[] = { config::Config::READ_ONLY, config::Config::NO_HISTORY}; for (config::Config::HistoryLearningLevel level : no_learning_levels) { - config_->set_history_learning_level(level); + config_.set_history_learning_level(level); Segments segments; - SetUpInputForSuggestion("こんにちはさようなら", composer_.get(), - &segments); + ConversionRequest convreq = SetUpInputForSuggestion( + "こんにちはさようなら", &composer_, &segments); AddCandidate("今日はさようなら", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); - SetUpInputForSuggestion("こんにちは", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); - SetUpInputForSuggestion("こんにちは", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("こんにちは", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); + convreq = SetUpInputForSuggestion("こんにちは", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } - config_->set_history_learning_level(config::Config::DEFAULT_HISTORY); + config_.set_history_learning_level(config::Config::DEFAULT_HISTORY); } // sync @@ -523,70 +506,77 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorTest) { // turn off { Segments segments; - config_->set_use_history_suggest(false); + config_.set_use_history_suggest(false); - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("わたしの", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); - config_->set_use_history_suggest(true); - config_->set_incognito_mode(true); + config_.set_use_history_suggest(true); + config_.set_incognito_mode(true); - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("わたしの", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); - config_->set_incognito_mode(false); - config_->set_history_learning_level(config::Config::NO_HISTORY); + config_.set_incognito_mode(false); + config_.set_history_learning_level(config::Config::NO_HISTORY); - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("わたしの", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } // turn on - { config::ConfigHandler::GetDefaultConfig(config_.get()); } + { + config::ConfigHandler::GetDefaultConfig(&config_); + } // reproduced - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("わたしの", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); segments.Clear(); - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("わたしの", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); // Exact Match segments.Clear(); - SetUpInputForSuggestion("わたしのなまえはなかのです", composer_.get(), - &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("わたしのなまえはなかのです", &composer_, + &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); segments.Clear(); - SetUpInputForSuggestion("わたしのなまえはなかのです", composer_.get(), - &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("わたしのなまえはなかのです", &composer_, + &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); segments.Clear(); - SetUpInputForSuggestion("こんにちはさようなら", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = + SetUpInputForSuggestion("こんにちはさようなら", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("こんにちはさようなら", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = + SetUpInputForSuggestion("こんにちはさようなら", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); // Read only mode should show suggestion. { - config_->set_history_learning_level(config::Config::READ_ONLY); - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + config_.set_history_learning_level(config::Config::READ_ONLY); + ConversionRequest convreq = + SetUpInputForSuggestion("わたしの", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); segments.Clear(); - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("わたしの", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); - config_->set_history_learning_level(config::Config::DEFAULT_HISTORY); + config_.set_history_learning_level(config::Config::DEFAULT_HISTORY); } // clear @@ -601,11 +591,12 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorTest) { Segments segments; // reproduced - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("わたしの", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("わたしの", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } // nothing happen @@ -615,17 +606,18 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorTest) { Segments segments; // reproduced - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("わたしの", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("わたしの", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } } TEST_F(UserHistoryPredictorTest, RemoveUnselectedHistoryPrediction) { - request_test_util::FillMobileRequest(request_.get()); - request_->mutable_decoder_experiment_params() + request_test_util::FillMobileRequest(&request_); + request_.mutable_decoder_experiment_params() ->set_user_history_prediction_min_selected_ratio(0.1); UserHistoryPredictor *predictor = GetUserHistoryPredictorWithClearedHistory(); @@ -633,31 +625,35 @@ TEST_F(UserHistoryPredictorTest, RemoveUnselectedHistoryPrediction) { auto insert_target = [&]() { Segments segments; - SetUpInputForPrediction("わたしの", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForPrediction("わたしの", &composer_, &segments); AddCandidate("私の", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); }; auto find_target = [&]() { Segments segments; - SetUpInputForPrediction("わたしの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForPrediction("わたしの", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); return FindCandidateByValue("私の", segments); }; // Returns true if the target is found. auto select_target = [&]() { Segments segments; - SetUpInputForPrediction("わたしの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForPrediction("わたしの", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("私の", segments)); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); }; auto select_other = [&]() { Segments segments; - SetUpInputForPrediction("わたしの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForPrediction("わたしの", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("私の", segments)); auto find = FindCandidateByValue("わたしの", segments); if (!find) { @@ -666,14 +662,15 @@ TEST_F(UserHistoryPredictorTest, RemoveUnselectedHistoryPrediction) { } else { segments.mutable_segment(0)->move_candidate(find.value(), 0); } - predictor->Finish(*convreq_, &segments); // Select "わたしの" + predictor->Finish(convreq, &segments); // Select "わたしの" }; auto input_other_key = [&]() { Segments segments; - SetUpInputForPrediction("てすと", composer_.get(), &segments); - predictor->PredictForRequest(*convreq_, &segments); - predictor->Finish(*convreq_, &segments); + ConversionRequest convreq = + SetUpInputForPrediction("てすと", &composer_, &segments); + predictor->PredictForRequest(convreq, &segments); + predictor->Finish(convreq, &segments); }; { @@ -720,11 +717,12 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorTestSuggestion) { // Register input histories via Finish method. { Segments segments; - SetUpInputForSuggestion("かまた", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForSuggestion("かまた", &composer_, &segments); AddCandidate(0, "火魔汰", &segments); - AddSegmentForSuggestion("ま", &segments); + AddSegment("ま", &segments); AddCandidate(1, "摩", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); // All added items must be suggestion entries. for (const UserHistoryPredictor::DicCache::Element &element : @@ -741,8 +739,9 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorTestSuggestion) { // Obtain input histories via Predict method. { Segments segments; - SetUpInputForSuggestion("かま", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("かま", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); std::set> expected_candidates; expected_candidates.insert("火魔汰"); // We can get this entry even if Segmtnts's type is not CONVERSION. @@ -762,15 +761,17 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorPreprocessInput) { // Commit can be triggered by space in alphanumeric keyboard layout. // In this case, trailing white space is included to the key and value. Segments segments; - SetUpInputForSuggestion("android ", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForSuggestion("android ", &composer_, &segments); AddCandidate(0, "android ", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } { Segments segments; - SetUpInputForSuggestion("androi", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("androi", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); // Preprocessed value should be learned. EXPECT_TRUE(FindCandidateByValue("android", segments)); EXPECT_FALSE(FindCandidateByValue("android ", segments)); @@ -791,20 +792,20 @@ TEST_F(UserHistoryPredictorTest, DescriptionTest) { // Insert two items { Segments segments; - SetUpInputForConversion("わたしのなまえはなかのです", composer_.get(), - &segments); + ConversionRequest convreq = SetUpInputForConversion( + "わたしのなまえはなかのです", &composer_, &segments); AddCandidateWithDescription("私の名前は中野です", kDescription, &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("わたしの", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); EXPECT_EQ(segments.segment(0).candidate(0).description, kDescription); segments.Clear(); - SetUpInputForPrediction("わたしの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForPrediction("わたしの", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); EXPECT_EQ(segments.segment(0).candidate(0).description, kDescription); } @@ -822,49 +823,51 @@ TEST_F(UserHistoryPredictorTest, DescriptionTest) { // turn off { Segments segments; - config_->set_use_history_suggest(false); + config_.set_use_history_suggest(false); WaitForSyncer(predictor); - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("わたしの", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); - config_->set_use_history_suggest(true); - config_->set_incognito_mode(true); + config_.set_use_history_suggest(true); + config_.set_incognito_mode(true); - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("わたしの", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } // turn on { - config::ConfigHandler::GetDefaultConfig(config_.get()); + config::ConfigHandler::GetDefaultConfig(&config_); WaitForSyncer(predictor); } // reproduced - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("わたしの", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); EXPECT_EQ(segments.segment(0).candidate(0).description, kDescription); segments.Clear(); - SetUpInputForPrediction("わたしの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForPrediction("わたしの", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); EXPECT_EQ(segments.segment(0).candidate(0).description, kDescription); // Exact Match segments.Clear(); - SetUpInputForSuggestion("わたしのなまえはなかのです", composer_.get(), - &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("わたしのなまえはなかのです", &composer_, + &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); EXPECT_EQ(segments.segment(0).candidate(0).description, kDescription); segments.Clear(); - SetUpInputForSuggestion("わたしのなまえはなかのです", composer_.get(), - &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("わたしのなまえはなかのです", &composer_, + &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); EXPECT_EQ(segments.segment(0).candidate(0).description, kDescription); @@ -880,11 +883,12 @@ TEST_F(UserHistoryPredictorTest, DescriptionTest) { Segments segments; // reproduced - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("わたしの", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); - SetUpInputForPrediction("わたしの", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForPrediction("わたしの", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } // nothing happen @@ -894,11 +898,12 @@ TEST_F(UserHistoryPredictorTest, DescriptionTest) { Segments segments; // reproduced - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("わたしの", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); - SetUpInputForPrediction("わたしの", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForPrediction("わたしの", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } } @@ -908,19 +913,20 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorUnusedHistoryTest) { WaitForSyncer(predictor); Segments segments; - SetUpInputForSuggestion("わたしのなまえはなかのです", composer_.get(), - &segments); + ConversionRequest convreq = SetUpInputForSuggestion( + "わたしのなまえはなかのです", &composer_, &segments); AddCandidate("私の名前は中野です", &segments); // once - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); - SetUpInputForConversion("ひろすえりょうこ", composer_.get(), &segments); + convreq = + SetUpInputForConversion("ひろすえりょうこ", &composer_, &segments); AddCandidate("広末涼子", &segments); // conversion - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); // sync predictor->Sync(); @@ -931,26 +937,27 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorUnusedHistoryTest) { WaitForSyncer(predictor); Segments segments; - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("わたしの", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); segments.Clear(); - SetUpInputForSuggestion("ひろすえ", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("ひろすえ", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "広末涼子"); predictor->ClearUnusedHistory(); WaitForSyncer(predictor); segments.Clear(); - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("わたしの", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); segments.Clear(); - SetUpInputForSuggestion("ひろすえ", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("ひろすえ", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); predictor->Sync(); } @@ -960,13 +967,14 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorUnusedHistoryTest) { WaitForSyncer(predictor); Segments segments; - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("わたしの", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); segments.Clear(); - SetUpInputForSuggestion("ひろすえ", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("ひろすえ", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } } @@ -974,27 +982,27 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorRevertTest) { UserHistoryPredictor *predictor = GetUserHistoryPredictorWithClearedHistory(); Segments segments, segments2; - SetUpInputForConversion("わたしのなまえはなかのです", composer_.get(), - &segments); + ConversionRequest convreq = SetUpInputForConversion( + "わたしのなまえはなかのです", &composer_, &segments); AddCandidate("私の名前は中野です", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); // Before Revert, Suggest works - SetUpInputForSuggestion("わたしの", composer_.get(), &segments2); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments2)); + convreq = SetUpInputForSuggestion("わたしの", &composer_, &segments2); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments2)); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); // Call revert here predictor->Revert(&segments); segments.Clear(); - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("わたしの", &composer_, &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidates_size(), 0); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidates_size(), 0); } @@ -1005,9 +1013,10 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorClearTest) { // input "testtest" 10 times for (int i = 0; i < 10; ++i) { Segments segments; - SetUpInputForConversion("testtest", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("testtest", &composer_, &segments); AddCandidate("テストテスト", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } predictor->ClearAllHistory(); @@ -1016,20 +1025,22 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorClearTest) { // input "testtest" 1 time for (int i = 0; i < 1; ++i) { Segments segments; - SetUpInputForConversion("testtest", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("testtest", &composer_, &segments); AddCandidate("テストテスト", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } // frequency is cleared as well. { Segments segments; - SetUpInputForSuggestion("t", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("t", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("testte", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("testte", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); } } @@ -1038,27 +1049,27 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorTrailingPunctuation) { Segments segments; - SetUpInputForConversion("わたしのなまえはなかのです", composer_.get(), - &segments); + ConversionRequest convreq = SetUpInputForConversion( + "わたしのなまえはなかのです", &composer_, &segments); AddCandidate(0, "私の名前は中野です", &segments); - AddSegmentForConversion("。", &segments); + AddSegment("。", &segments); AddCandidate(1, "。", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); - SetUpInputForPrediction("わたしの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForPrediction("わたしの", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidates_size(), 2); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); EXPECT_EQ(segments.segment(0).candidate(1).value, "私の名前は中野です。"); segments.Clear(); - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("わたしの", &composer_, &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidates_size(), 2); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); EXPECT_EQ(segments.segment(0).candidate(1).value, "私の名前は中野です。"); @@ -1066,19 +1077,20 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorTrailingPunctuation) { TEST_F(UserHistoryPredictorTest, TrailingPunctuationMobile) { UserHistoryPredictor *predictor = GetUserHistoryPredictorWithClearedHistory(); - request_test_util::FillMobileRequest(request_.get()); + request_test_util::FillMobileRequest(&request_); Segments segments; - SetUpInputForConversion("です。", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("です。", &composer_, &segments); AddCandidate(0, "です。", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); - SetUpInputForPrediction("です", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForPrediction("です", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } TEST_F(UserHistoryPredictorTest, HistoryToPunctuation) { @@ -1088,18 +1100,19 @@ TEST_F(UserHistoryPredictorTest, HistoryToPunctuation) { // Scenario 1: A user have committed "亜" by prediction and then commit "。". // Then, the unigram "亜" is learned but the bigram "亜。" shouldn't. - SetUpInputForPrediction("あ", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForPrediction("あ", &composer_, &segments); AddCandidate(0, "亜", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); - AddSegmentForPrediction("。", &segments); + AddSegment("。", &segments); AddCandidate(1, "。", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); - SetUpInputForPrediction("あ", composer_.get(), &segments); // "あ" - ASSERT_TRUE(predictor->PredictForRequest(*convreq_, &segments)) + convreq = SetUpInputForPrediction("あ", &composer_, &segments); // "あ" + ASSERT_TRUE(predictor->PredictForRequest(convreq, &segments)) << segments.DebugString(); EXPECT_EQ(segments.segment(0).candidate(0).value, "亜"); @@ -1107,36 +1120,36 @@ TEST_F(UserHistoryPredictorTest, HistoryToPunctuation) { // Scenario 2: the opposite case to Scenario 1, i.e., "。亜". Nothing is // suggested from symbol "。". - SetUpInputForPrediction("。", composer_.get(), &segments); + convreq = SetUpInputForPrediction("。", &composer_, &segments); AddCandidate(0, "。", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); - AddSegmentForPrediction("あ", &segments); + AddSegment("あ", &segments); AddCandidate(1, "亜", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); - SetUpInputForPrediction("。", composer_.get(), &segments); // "。" - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)) + convreq = SetUpInputForPrediction("。", &composer_, &segments); // "。" + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)) << segments.DebugString(); segments.Clear(); // Scenario 3: If the history segment looks like a sentence and committed // value is a punctuation, the concatenated entry is also learned. - SetUpInputForPrediction("おつかれさまです", composer_.get(), &segments); + convreq = SetUpInputForPrediction("おつかれさまです", &composer_, &segments); AddCandidate(0, "お疲れ様です", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); - AddSegmentForPrediction("。", &segments); + AddSegment("。", &segments); AddCandidate(1, "。", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); - SetUpInputForPrediction("おつかれ", composer_.get(), &segments); - ASSERT_TRUE(predictor->PredictForRequest(*convreq_, &segments)) + convreq = SetUpInputForPrediction("おつかれ", &composer_, &segments); + ASSERT_TRUE(predictor->PredictForRequest(convreq, &segments)) << segments.DebugString(); EXPECT_EQ(segments.segment(0).candidate(0).value, "お疲れ様です"); EXPECT_EQ(segments.segment(0).candidate(1).value, "お疲れ様です。"); @@ -1147,25 +1160,26 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorPrecedingPunctuation) { Segments segments; - SetUpInputForConversion("。", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("。", &composer_, &segments); AddCandidate(0, "。", &segments); - AddSegmentForConversion("わたしのなまえはなかのです", &segments); + AddSegment("わたしのなまえはなかのです", &segments); AddCandidate(1, "私の名前は中野です", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); - SetUpInputForPrediction("わたしの", composer_.get(), &segments); + convreq = SetUpInputForPrediction("わたしの", &composer_, &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidates_size(), 1); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); segments.Clear(); - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("わたしの", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidates_size(), 1); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); } @@ -1193,34 +1207,37 @@ TEST_F(UserHistoryPredictorTest, StartsWithPunctuations) { const std::string first_char = kTestCases[i].first_character; { // Learn from two segments - SetUpInputForConversion(first_char, composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion(first_char, &composer_, &segments); AddCandidate(0, first_char, &segments); - AddSegmentForConversion("てすとぶんしょう", &segments); + AddSegment("てすとぶんしょう", &segments); AddCandidate(1, "テスト文章", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } segments.Clear(); { // Learn from one segment - SetUpInputForConversion(first_char + "てすとぶんしょう", composer_.get(), - &segments); + ConversionRequest convreq = SetUpInputForConversion( + first_char + "てすとぶんしょう", &composer_, &segments); AddCandidate(0, first_char + "テスト文章", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } segments.Clear(); { // Suggestion - SetUpInputForSuggestion(first_char, composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForSuggestion(first_char, &composer_, &segments); AddCandidate(0, first_char, &segments); - EXPECT_EQ(predictor->PredictForRequest(*convreq_, &segments), + EXPECT_EQ(predictor->PredictForRequest(convreq, &segments), kTestCases[i].expected_result) << "Suggest from " << first_char; } segments.Clear(); { // Prediction - SetUpInputForPrediction(first_char, composer_.get(), &segments); - EXPECT_EQ(predictor->PredictForRequest(*convreq_, &segments), + ConversionRequest convreq = + SetUpInputForPrediction(first_char, &composer_, &segments); + EXPECT_EQ(predictor->PredictForRequest(convreq, &segments), kTestCases[i].expected_result) << "Predict from " << first_char; } @@ -1230,53 +1247,55 @@ TEST_F(UserHistoryPredictorTest, StartsWithPunctuations) { TEST_F(UserHistoryPredictorTest, ZeroQuerySuggestionTest) { UserHistoryPredictor *predictor = GetUserHistoryPredictorWithClearedHistory(); - request_->set_zero_query_suggestion(true); + request_.set_zero_query_suggestion(true); commands::Request non_zero_query_request; non_zero_query_request.set_zero_query_suggestion(false); ConversionRequest non_zero_query_conversion_request( - composer_.get(), &non_zero_query_request, config_.get()); + &composer_, &non_zero_query_request, &config_); Segments segments; // No history segments segments.Clear(); - SetUpInputForSuggestion("", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); { segments.Clear(); - SetUpInputForConversion("たろうは", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("たろうは", &composer_, &segments); AddCandidate(0, "太郎は", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); - SetUpInputForConversionWithHistory("はなこに", "たろうは", "太郎は", - composer_.get(), &segments); + convreq = SetUpInputForConversionWithHistory( + "はなこに", "たろうは", "太郎は", &composer_, &segments); AddCandidate(1, "花子に", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); - SetUpInputForConversionWithHistory("きょうと", "たろうは", "太郎は", - composer_.get(), &segments); + convreq = SetUpInputForConversionWithHistory( + "きょうと", "たろうは", "太郎は", &composer_, &segments); AddCandidate(1, "京都", &segments); absl::SleepFor(absl::Seconds(2)); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); - SetUpInputForConversionWithHistory("おおさか", "たろうは", "太郎は", - composer_.get(), &segments); + convreq = SetUpInputForConversionWithHistory( + "おおさか", "たろうは", "太郎は", &composer_, &segments); AddCandidate(1, "大阪", &segments); absl::SleepFor(absl::Seconds(2)); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); // Zero query suggestion is disabled. - SetUpInputForSuggestionWithHistory("", "たろうは", "太郎は", - composer_.get(), &segments); + convreq = SetUpInputForSuggestionWithHistory("", "たろうは", "太郎は", + &composer_, &segments); EXPECT_FALSE(predictor->PredictForRequest(non_zero_query_conversion_request, &segments)); - SetUpInputForSuggestionWithHistory("", "たろうは", "太郎は", - composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestionWithHistory("", "たろうは", "太郎は", + &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); ASSERT_EQ(2, segments.segments_size()); // last-pushed segment is "大阪" EXPECT_EQ(segments.segment(1).candidate(0).value, "大阪"); @@ -1285,9 +1304,9 @@ TEST_F(UserHistoryPredictorTest, ZeroQuerySuggestionTest) { Segment::Candidate::USER_HISTORY_PREDICTOR); for (const char *key : {"は", "た", "き", "お"}) { - SetUpInputForSuggestionWithHistory(key, "たろうは", "太郎は", - composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = SetUpInputForSuggestionWithHistory( + key, "たろうは", "太郎は", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); } } @@ -1296,34 +1315,36 @@ TEST_F(UserHistoryPredictorTest, ZeroQuerySuggestionTest) { { segments.Clear(); - SetUpInputForConversion("たろうは", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("たろうは", &composer_, &segments); AddCandidate(0, "太郎は", &segments); - AddSegmentForConversion("はなこに", &segments); + AddSegment("はなこに", &segments); AddCandidate(1, "花子に", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); - SetUpInputForConversion("たろうは", composer_.get(), &segments); + convreq = SetUpInputForConversion("たろうは", &composer_, &segments); AddCandidate(0, "太郎は", &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); // Zero query suggestion is disabled. - AddSegmentForSuggestion("", &segments); // empty request + convreq.set_request_type(ConversionRequest::SUGGESTION); + AddSegment("", &segments); // empty request EXPECT_FALSE(predictor->PredictForRequest(non_zero_query_conversion_request, &segments)); segments.pop_back_segment(); - AddSegmentForSuggestion("", &segments); // empty request - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + AddSegment("", &segments); // empty request + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.pop_back_segment(); - AddSegmentForSuggestion("は", &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + AddSegment("は", &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.pop_back_segment(); - AddSegmentForSuggestion("た", &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + AddSegment("た", &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); } } @@ -1332,82 +1353,84 @@ TEST_F(UserHistoryPredictorTest, MultiSegmentsMultiInput) { Segments segments; - SetUpInputForConversion("たろうは", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("たろうは", &composer_, &segments); AddCandidate(0, "太郎は", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); - AddSegmentForConversion("はなこに", &segments); + AddSegment("はなこに", &segments); AddCandidate(1, "花子に", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.mutable_segment(1)->set_segment_type(Segment::HISTORY); segments.clear_conversion_segments(); - AddSegmentForConversion("むずかしい", &segments); + AddSegment("むずかしい", &segments); AddCandidate(2, "難しい", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.mutable_segment(2)->set_segment_type(Segment::HISTORY); segments.clear_conversion_segments(); - AddSegmentForConversion("ほんを", &segments); + AddSegment("ほんを", &segments); AddCandidate(3, "本を", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.mutable_segment(3)->set_segment_type(Segment::HISTORY); segments.clear_conversion_segments(); - AddSegmentForConversion("よませた", &segments); + AddSegment("よませた", &segments); AddCandidate(4, "読ませた", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); - SetUpInputForSuggestion("た", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("た", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("たろうは", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("たろうは", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("ろうは", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("ろうは", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("たろうははな", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("たろうははな", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("はなこにむ", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("はなこにむ", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("むずかし", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("むずかし", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("はなこにむずかしいほ", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = + SetUpInputForSuggestion("はなこにむずかしいほ", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("ほんをよま", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("ほんをよま", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); absl::SleepFor(absl::Seconds(1)); // Add new entry "たろうはよしこに/太郎は良子に" segments.Clear(); - SetUpInputForConversion("たろうは", composer_.get(), &segments); + convreq = SetUpInputForConversion("たろうは", &composer_, &segments); AddCandidate(0, "太郎は", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); - AddSegmentForConversion("よしこに", &segments); + AddSegment("よしこに", &segments); AddCandidate(1, "良子に", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.mutable_segment(1)->set_segment_type(Segment::HISTORY); segments.Clear(); - SetUpInputForSuggestion("たろうは", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("たろうは", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "太郎は良子に"); EXPECT_TRUE(segments.segment(0).candidate(0).source_info & Segment::Candidate::USER_HISTORY_PREDICTOR); @@ -1418,72 +1441,74 @@ TEST_F(UserHistoryPredictorTest, MultiSegmentsSingleInput) { Segments segments; - SetUpInputForConversion("たろうは", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("たろうは", &composer_, &segments); AddCandidate(0, "太郎は", &segments); - AddSegmentForConversion("はなこに", &segments); + AddSegment("はなこに", &segments); AddCandidate(1, "花子に", &segments); - AddSegmentForConversion("むずかしい", &segments); + AddSegment("むずかしい", &segments); AddCandidate(2, "難しい", &segments); - AddSegmentForConversion("ほんを", &segments); + AddSegment("ほんを", &segments); AddCandidate(3, "本を", &segments); - AddSegmentForConversion("よませた", &segments); + AddSegment("よませた", &segments); AddCandidate(4, "読ませた", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); - SetUpInputForSuggestion("たろうは", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("たろうは", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("た", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("た", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("たろうははな", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("たろうははな", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("ろうははな", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("ろうははな", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("はなこにむ", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("はなこにむ", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("むずかし", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("むずかし", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("はなこにむずかしいほ", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = + SetUpInputForSuggestion("はなこにむずかしいほ", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("ほんをよま", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("ほんをよま", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); absl::SleepFor(absl::Seconds(1)); // Add new entry "たろうはよしこに/太郎は良子に" segments.Clear(); - SetUpInputForConversion("たろうは", composer_.get(), &segments); + convreq = SetUpInputForConversion("たろうは", &composer_, &segments); AddCandidate(0, "太郎は", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); - AddSegmentForConversion("よしこに", &segments); + AddSegment("よしこに", &segments); AddCandidate(1, "良子に", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.mutable_segment(1)->set_segment_type(Segment::HISTORY); segments.Clear(); - SetUpInputForSuggestion("たろうは", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("たろうは", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "太郎は良子に"); EXPECT_TRUE(segments.segment(0).candidate(0).source_info & Segment::Candidate::USER_HISTORY_PREDICTOR); @@ -1494,42 +1519,43 @@ TEST_F(UserHistoryPredictorTest, Regression2843371Case1) { Segments segments; - SetUpInputForConversion("とうきょうは", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("とうきょうは", &composer_, &segments); AddCandidate(0, "東京は", &segments); - AddSegmentForConversion("、", &segments); + AddSegment("、", &segments); AddCandidate(1, "、", &segments); - AddSegmentForConversion("にほんです", &segments); + AddSegment("にほんです", &segments); AddCandidate(2, "日本です", &segments); - AddSegmentForConversion("。", &segments); + AddSegment("。", &segments); AddCandidate(3, "。", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); absl::SleepFor(absl::Seconds(1)); - SetUpInputForConversion("らーめんは", composer_.get(), &segments); + convreq = SetUpInputForConversion("らーめんは", &composer_, &segments); AddCandidate(0, "ラーメンは", &segments); - AddSegmentForConversion("、", &segments); + AddSegment("、", &segments); AddCandidate(1, "、", &segments); - AddSegmentForConversion("めんるいです", &segments); + AddSegment("めんるいです", &segments); AddCandidate(2, "麺類です", &segments); - AddSegmentForConversion("。", &segments); + AddSegment("。", &segments); AddCandidate(3, "。", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); - SetUpInputForSuggestion("とうきょうは、", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("とうきょうは、", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "東京は、日本です"); EXPECT_TRUE(segments.segment(0).candidate(0).source_info & @@ -1541,50 +1567,51 @@ TEST_F(UserHistoryPredictorTest, Regression2843371Case2) { Segments segments; - SetUpInputForConversion("えど", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("えど", &composer_, &segments); AddCandidate(0, "江戸", &segments); - AddSegmentForConversion("(", &segments); + AddSegment("(", &segments); AddCandidate(1, "(", &segments); - AddSegmentForConversion("とうきょう", &segments); + AddSegment("とうきょう", &segments); AddCandidate(2, "東京", &segments); - AddSegmentForConversion(")", &segments); + AddSegment(")", &segments); AddCandidate(3, ")", &segments); - AddSegmentForConversion("は", &segments); + AddSegment("は", &segments); AddCandidate(4, "は", &segments); - AddSegmentForConversion("えぞ", &segments); + AddSegment("えぞ", &segments); AddCandidate(5, "蝦夷", &segments); - AddSegmentForConversion("(", &segments); + AddSegment("(", &segments); AddCandidate(6, "(", &segments); - AddSegmentForConversion("ほっかいどう", &segments); + AddSegment("ほっかいどう", &segments); AddCandidate(7, "北海道", &segments); - AddSegmentForConversion(")", &segments); + AddSegment(")", &segments); AddCandidate(8, ")", &segments); - AddSegmentForConversion("ではない", &segments); + AddSegment("ではない", &segments); AddCandidate(9, "ではない", &segments); - AddSegmentForConversion("。", &segments); + AddSegment("。", &segments); AddCandidate(10, "。", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); - SetUpInputForSuggestion("えど(", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("えど(", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "江戸(東京"); EXPECT_TRUE(segments.segment(0).candidate(0).source_info & Segment::Candidate::USER_HISTORY_PREDICTOR); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "江戸(東京"); EXPECT_TRUE(segments.segment(0).candidate(0).source_info & @@ -1596,54 +1623,55 @@ TEST_F(UserHistoryPredictorTest, Regression2843371Case3) { Segments segments; - SetUpInputForConversion("「", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("「", &composer_, &segments); AddCandidate(0, "「", &segments); - AddSegmentForConversion("やま", &segments); + AddSegment("やま", &segments); AddCandidate(1, "山", &segments); - AddSegmentForConversion("」", &segments); + AddSegment("」", &segments); AddCandidate(2, "」", &segments); - AddSegmentForConversion("は", &segments); + AddSegment("は", &segments); AddCandidate(3, "は", &segments); - AddSegmentForConversion("たかい", &segments); + AddSegment("たかい", &segments); AddCandidate(4, "高い", &segments); - AddSegmentForConversion("。", &segments); + AddSegment("。", &segments); AddCandidate(5, "。", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); absl::SleepFor(absl::Seconds(2)); segments.Clear(); - SetUpInputForConversion("「", composer_.get(), &segments); + convreq = SetUpInputForConversion("「", &composer_, &segments); AddCandidate(0, "「", &segments); - AddSegmentForConversion("うみ", &segments); + AddSegment("うみ", &segments); AddCandidate(1, "海", &segments); - AddSegmentForConversion("」", &segments); + AddSegment("」", &segments); AddCandidate(2, "」", &segments); - AddSegmentForConversion("は", &segments); + AddSegment("は", &segments); AddCandidate(3, "は", &segments); - AddSegmentForConversion("ふかい", &segments); + AddSegment("ふかい", &segments); AddCandidate(4, "深い", &segments); - AddSegmentForConversion("。", &segments); + AddSegment("。", &segments); AddCandidate(5, "。", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); - SetUpInputForSuggestion("「やま」は", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("「やま」は", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "「山」は高い"); EXPECT_TRUE(segments.segment(0).candidate(0).source_info & @@ -1655,18 +1683,19 @@ TEST_F(UserHistoryPredictorTest, Regression2843775) { Segments segments; - SetUpInputForConversion("そうです", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("そうです", &composer_, &segments); AddCandidate(0, "そうです", &segments); - AddSegmentForConversion("。よろしくおねがいします", &segments); + AddSegment("。よろしくおねがいします", &segments); AddCandidate(1, "。よろしくお願いします", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); - SetUpInputForSuggestion("そうです", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("そうです", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "そうです。よろしくお願いします"); @@ -1679,36 +1708,37 @@ TEST_F(UserHistoryPredictorTest, DuplicateString) { Segments segments; - SetUpInputForConversion("らいおん", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("らいおん", &composer_, &segments); AddCandidate(0, "ライオン", &segments); - AddSegmentForConversion("(", &segments); + AddSegment("(", &segments); AddCandidate(1, "(", &segments); - AddSegmentForConversion("もうじゅう", &segments); + AddSegment("もうじゅう", &segments); AddCandidate(2, "猛獣", &segments); - AddSegmentForConversion(")と", &segments); + AddSegment(")と", &segments); AddCandidate(3, ")と", &segments); - AddSegmentForConversion("ぞうりむし", &segments); + AddSegment("ぞうりむし", &segments); AddCandidate(4, "ゾウリムシ", &segments); - AddSegmentForConversion("(", &segments); + AddSegment("(", &segments); AddCandidate(5, "(", &segments); - AddSegmentForConversion("びせいぶつ", &segments); + AddSegment("びせいぶつ", &segments); AddCandidate(6, "微生物", &segments); - AddSegmentForConversion(")", &segments); + AddSegment(")", &segments); AddCandidate(7, ")", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); - SetUpInputForSuggestion("ぞうりむし", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("ぞうりむし", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); for (int i = 0; i < segments.segment(0).candidates_size(); ++i) { EXPECT_EQ(segments.segment(0).candidate(i).value.find("猛獣"), @@ -1717,8 +1747,8 @@ TEST_F(UserHistoryPredictorTest, DuplicateString) { segments.Clear(); - SetUpInputForSuggestion("らいおん", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("らいおん", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); for (int i = 0; i < segments.segment(0).candidates_size(); ++i) { EXPECT_EQ(segments.segment(0).candidate(i).value.find("ライオン(微生物"), @@ -1770,17 +1800,21 @@ TEST_F(UserHistoryPredictorTest, SyncTest) { case Command::WAIT: WaitForSyncer(predictor); break; - case Command::INSERT: + case Command::INSERT: { segments.Clear(); - SetUpInputForConversion(commands[i].key, composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion(commands[i].key, &composer_, &segments); AddCandidate(commands[i].value, &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); break; - case Command::LOOKUP: + } + case Command::LOOKUP: { segments.Clear(); - SetUpInputForSuggestion(commands[i].key, composer_.get(), &segments); - predictor->PredictForRequest(*convreq_, &segments); + ConversionRequest convreq = + SetUpInputForSuggestion(commands[i].key, &composer_, &segments); + predictor->PredictForRequest(convreq, &segments); break; + } default: break; } @@ -2212,9 +2246,10 @@ TEST_F(UserHistoryPredictorTest, PrivacySensitiveTest) { // Initial commit. { Segments segments; - SetUpInputForConversion(input, composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion(input, &composer_, &segments); AddCandidate(0, output, &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } // TODO(yukawa): Refactor the scenario runner below by making @@ -2223,21 +2258,22 @@ TEST_F(UserHistoryPredictorTest, PrivacySensitiveTest) { // Check suggestion { Segments segments; - SetUpInputForSuggestion(partial_input, composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForSuggestion(partial_input, &composer_, &segments); if (expect_sensitive) { - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)) + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)) << description << " input: " << input << " output: " << output; } else { - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)) + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)) << description << " input: " << input << " output: " << output; } segments.Clear(); - SetUpInputForPrediction(input, composer_.get(), &segments); + convreq = SetUpInputForPrediction(input, &composer_, &segments); if (expect_sensitive) { - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)) + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)) << description << " input: " << input << " output: " << output; } else { - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)) + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)) << description << " input: " << input << " output: " << output; } } @@ -2245,21 +2281,22 @@ TEST_F(UserHistoryPredictorTest, PrivacySensitiveTest) { // Check Prediction { Segments segments; - SetUpInputForPrediction(partial_input, composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForPrediction(partial_input, &composer_, &segments); if (expect_sensitive) { - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)) + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)) << description << " input: " << input << " output: " << output; } else { - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)) + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)) << description << " input: " << input << " output: " << output; } segments.Clear(); - SetUpInputForPrediction(input, composer_.get(), &segments); + convreq = SetUpInputForPrediction(input, &composer_, &segments); if (expect_sensitive) { - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)) + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)) << description << " input: " << input << " output: " << output; } else { - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)) + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)) << description << " input: " << input << " output: " << output; } } @@ -2275,29 +2312,32 @@ TEST_F(UserHistoryPredictorTest, PrivacySensitiveMultiSegmentsTest) { // Currently this is a known issue. { Segments segments; - SetUpInputForConversion("123", composer_.get(), &segments); - AddSegmentForConversion("abc!", &segments); + ConversionRequest convreq = + SetUpInputForConversion("123", &composer_, &segments); + AddSegment("abc!", &segments); AddCandidate(0, "123", &segments); AddCandidate(1, "abc!", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } { Segments segments; - SetUpInputForSuggestion("123abc", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("123abc", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("123abc!", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("123abc!", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); } { Segments segments; - SetUpInputForPrediction("123abc", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForPrediction("123abc", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForPrediction("123abc!", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForPrediction("123abc!", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); } } @@ -2499,29 +2539,26 @@ TEST_F(UserHistoryPredictorTest, GetRomanMisspelledKey) { Segment::Candidate *candidate = seg->add_candidate(); candidate->value = "test"; - config_->set_preedit_method(config::Config::ROMAN); + ConversionRequest convreq = CreateConversionRequest(); + config_.set_preedit_method(config::Config::ROMAN); seg->set_key(""); - EXPECT_EQ(UserHistoryPredictor::GetRomanMisspelledKey(*convreq_, segments), - ""); + EXPECT_EQ(UserHistoryPredictor::GetRomanMisspelledKey(convreq, segments), ""); seg->set_key("おねがいしまうs"); - EXPECT_EQ(UserHistoryPredictor::GetRomanMisspelledKey(*convreq_, segments), + EXPECT_EQ(UserHistoryPredictor::GetRomanMisspelledKey(convreq, segments), "onegaisimaus"); seg->set_key("おねがいします"); - EXPECT_EQ(UserHistoryPredictor::GetRomanMisspelledKey(*convreq_, segments), - ""); + EXPECT_EQ(UserHistoryPredictor::GetRomanMisspelledKey(convreq, segments), ""); - config_->set_preedit_method(config::Config::KANA); + config_.set_preedit_method(config::Config::KANA); seg->set_key("おねがいしまうs"); - EXPECT_EQ(UserHistoryPredictor::GetRomanMisspelledKey(*convreq_, segments), - ""); + EXPECT_EQ(UserHistoryPredictor::GetRomanMisspelledKey(convreq, segments), ""); seg->set_key("おねがいします"); - EXPECT_EQ(UserHistoryPredictor::GetRomanMisspelledKey(*convreq_, segments), - ""); + EXPECT_EQ(UserHistoryPredictor::GetRomanMisspelledKey(convreq, segments), ""); } TEST_F(UserHistoryPredictorTest, RomanFuzzyLookupEntry) { @@ -2802,15 +2839,15 @@ void InitSegmentsFromInputSequence(const absl::string_view text, TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegmentsRoman) { table_->LoadFromFile("system://romanji-hiragana.tsv"); - composer_->SetTable(table_.get()); + composer_.SetTable(table_.get()); Segments segments; - InitSegmentsFromInputSequence("gu-g", composer_.get(), convreq_.get(), - &segments); + ConversionRequest convreq = CreateConversionRequest(); + InitSegmentsFromInputSequence("gu-g", &composer_, &convreq, &segments); std::string input_key; std::string base; std::unique_ptr> expanded; - UserHistoryPredictor::GetInputKeyFromSegments(*convreq_, segments, &input_key, + UserHistoryPredictor::GetInputKeyFromSegments(convreq, segments, &input_key, &base, &expanded); EXPECT_EQ(input_key, "ぐーg"); EXPECT_EQ(base, "ぐー"); @@ -2824,20 +2861,20 @@ TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegmentsRoman) { TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegmentsRomanRandom) { table_->LoadFromFile("system://romanji-hiragana.tsv"); - composer_->SetTable(table_.get()); + composer_.SetTable(table_.get()); Segments segments; Random random; for (size_t i = 0; i < 1000; ++i) { - composer_->Reset(); + composer_.Reset(); const std::string input = random.Utf8StringRandomLen(4, ' ', '~'); - InitSegmentsFromInputSequence(input, composer_.get(), convreq_.get(), - &segments); + ConversionRequest convreq = CreateConversionRequest(); + InitSegmentsFromInputSequence(input, &composer_, &convreq, &segments); std::string input_key; std::string base; std::unique_ptr> expanded; - UserHistoryPredictor::GetInputKeyFromSegments(*convreq_, segments, - &input_key, &base, &expanded); + UserHistoryPredictor::GetInputKeyFromSegments(convreq, segments, &input_key, + &base, &expanded); } } @@ -2845,33 +2882,33 @@ TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegmentsRomanRandom) { // input_key != base by composer modification. TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegmentsShouldNotCrash) { table_->LoadFromFile("system://romanji-hiragana.tsv"); - composer_->SetTable(table_.get()); + composer_.SetTable(table_.get()); Segments segments; { - InitSegmentsFromInputSequence("8,+", composer_.get(), convreq_.get(), - &segments); + ConversionRequest convreq = CreateConversionRequest(); + InitSegmentsFromInputSequence("8,+", &composer_, &convreq, &segments); std::string input_key; std::string base; std::unique_ptr> expanded; - UserHistoryPredictor::GetInputKeyFromSegments(*convreq_, segments, - &input_key, &base, &expanded); + UserHistoryPredictor::GetInputKeyFromSegments(convreq, segments, &input_key, + &base, &expanded); } } TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegmentsRomanN) { table_->LoadFromFile("system://romanji-hiragana.tsv"); - composer_->SetTable(table_.get()); + composer_.SetTable(table_.get()); Segments segments; { - InitSegmentsFromInputSequence("n", composer_.get(), convreq_.get(), - &segments); + ConversionRequest convreq = CreateConversionRequest(); + InitSegmentsFromInputSequence("n", &composer_, &convreq, &segments); std::string input_key; std::string base; std::unique_ptr> expanded; - UserHistoryPredictor::GetInputKeyFromSegments(*convreq_, segments, - &input_key, &base, &expanded); + UserHistoryPredictor::GetInputKeyFromSegments(convreq, segments, &input_key, + &base, &expanded); EXPECT_EQ(input_key, "n"); EXPECT_EQ(base, ""); EXPECT_TRUE(expanded != nullptr); @@ -2883,46 +2920,46 @@ TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegmentsRomanN) { EXPECT_EQ(value, "な"); } - composer_->Reset(); + composer_.Reset(); segments.Clear(); { - InitSegmentsFromInputSequence("nn", composer_.get(), convreq_.get(), - &segments); + ConversionRequest convreq = CreateConversionRequest(); + InitSegmentsFromInputSequence("nn", &composer_, &convreq, &segments); std::string input_key; std::string base; std::unique_ptr> expanded; - UserHistoryPredictor::GetInputKeyFromSegments(*convreq_, segments, - &input_key, &base, &expanded); + UserHistoryPredictor::GetInputKeyFromSegments(convreq, segments, &input_key, + &base, &expanded); EXPECT_EQ(input_key, "ん"); EXPECT_EQ(base, "ん"); EXPECT_TRUE(expanded == nullptr); } - composer_->Reset(); + composer_.Reset(); segments.Clear(); { - InitSegmentsFromInputSequence("n'", composer_.get(), convreq_.get(), - &segments); + ConversionRequest convreq = CreateConversionRequest(); + InitSegmentsFromInputSequence("n'", &composer_, &convreq, &segments); std::string input_key; std::string base; std::unique_ptr> expanded; - UserHistoryPredictor::GetInputKeyFromSegments(*convreq_, segments, - &input_key, &base, &expanded); + UserHistoryPredictor::GetInputKeyFromSegments(convreq, segments, &input_key, + &base, &expanded); EXPECT_EQ(input_key, "ん"); EXPECT_EQ(base, "ん"); EXPECT_TRUE(expanded == nullptr); } - composer_->Reset(); + composer_.Reset(); segments.Clear(); { - InitSegmentsFromInputSequence("n'n", composer_.get(), convreq_.get(), - &segments); + ConversionRequest convreq = CreateConversionRequest(); + InitSegmentsFromInputSequence("n'n", &composer_, &convreq, &segments); std::string input_key; std::string base; std::unique_ptr> expanded; - UserHistoryPredictor::GetInputKeyFromSegments(*convreq_, segments, - &input_key, &base, &expanded); + UserHistoryPredictor::GetInputKeyFromSegments(convreq, segments, &input_key, + &base, &expanded); EXPECT_EQ(input_key, "んn"); EXPECT_EQ(base, "ん"); EXPECT_TRUE(expanded != nullptr); @@ -2937,17 +2974,17 @@ TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegmentsRomanN) { TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegmentsFlickN) { table_->LoadFromFile("system://flick-hiragana.tsv"); - composer_->SetTable(table_.get()); + composer_.SetTable(table_.get()); Segments segments; { - InitSegmentsFromInputSequence("/", composer_.get(), convreq_.get(), - &segments); + ConversionRequest convreq = CreateConversionRequest(); + InitSegmentsFromInputSequence("/", &composer_, &convreq, &segments); std::string input_key; std::string base; std::unique_ptr> expanded; - UserHistoryPredictor::GetInputKeyFromSegments(*convreq_, segments, - &input_key, &base, &expanded); + UserHistoryPredictor::GetInputKeyFromSegments(convreq, segments, &input_key, + &base, &expanded); EXPECT_EQ(input_key, "ん"); EXPECT_EQ(base, ""); EXPECT_TRUE(expanded != nullptr); @@ -2962,17 +2999,17 @@ TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegmentsFlickN) { TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegments12KeyN) { table_->LoadFromFile("system://12keys-hiragana.tsv"); - composer_->SetTable(table_.get()); + composer_.SetTable(table_.get()); Segments segments; { - InitSegmentsFromInputSequence("わ00", composer_.get(), convreq_.get(), - &segments); + ConversionRequest convreq = CreateConversionRequest(); + InitSegmentsFromInputSequence("わ00", &composer_, &convreq, &segments); std::string input_key; std::string base; std::unique_ptr> expanded; - UserHistoryPredictor::GetInputKeyFromSegments(*convreq_, segments, - &input_key, &base, &expanded); + UserHistoryPredictor::GetInputKeyFromSegments(convreq, segments, &input_key, + &base, &expanded); EXPECT_EQ(input_key, "ん"); EXPECT_EQ(base, ""); EXPECT_TRUE(expanded != nullptr); @@ -2987,18 +3024,18 @@ TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegments12KeyN) { TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegmentsKana) { table_->LoadFromFile("system://kana.tsv"); - composer_->SetTable(table_.get()); + composer_.SetTable(table_.get()); Segments segments; - InitSegmentsFromInputSequence("あか", composer_.get(), convreq_.get(), - &segments); + ConversionRequest convreq = CreateConversionRequest(); + InitSegmentsFromInputSequence("あか", &composer_, &convreq, &segments); { std::string input_key; std::string base; std::unique_ptr> expanded; - UserHistoryPredictor::GetInputKeyFromSegments(*convreq_, segments, - &input_key, &base, &expanded); + UserHistoryPredictor::GetInputKeyFromSegments(convreq, segments, &input_key, + &base, &expanded); EXPECT_EQ(input_key, "あか"); EXPECT_EQ(base, "あ"); EXPECT_TRUE(expanded != nullptr); @@ -3015,10 +3052,11 @@ TEST_F(UserHistoryPredictorTest, RealtimeConversionInnerSegment) { UserHistoryPredictor *predictor = GetUserHistoryPredictorWithClearedHistory(); Segments segments; + ConversionRequest convreq; { constexpr char kKey[] = "わたしのなまえはなかのです"; constexpr char kValue[] = "私の名前は中野です"; - SetUpInputForPrediction(kKey, composer_.get(), &segments); + convreq = SetUpInputForPrediction(kKey, &composer_, &segments); Segment::Candidate *candidate = segments.mutable_segment(0)->add_candidate(); CHECK(candidate); @@ -3033,16 +3071,16 @@ TEST_F(UserHistoryPredictorTest, RealtimeConversionInnerSegment) { // "なかのです, 中野です", "なかの, 中野" candidate->PushBackInnerSegmentBoundary(15, 12, 9, 6); } - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); - SetUpInputForPrediction("なかの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForPrediction("なかの", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("中野です", segments)); segments.Clear(); - SetUpInputForPrediction("なまえ", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForPrediction("なまえ", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("名前は", segments)); EXPECT_TRUE(FindCandidateByValue("名前は中野です", segments)); } @@ -3051,10 +3089,11 @@ TEST_F(UserHistoryPredictorTest, ZeroQueryFromRealtimeConversion) { UserHistoryPredictor *predictor = GetUserHistoryPredictorWithClearedHistory(); Segments segments; + ConversionRequest convreq; { constexpr char kKey[] = "わたしのなまえはなかのです"; constexpr char kValue[] = "私の名前は中野です"; - SetUpInputForPrediction(kKey, composer_.get(), &segments); + convreq = SetUpInputForPrediction(kKey, &composer_, &segments); Segment::Candidate *candidate = segments.mutable_segment(0)->add_candidate(); CHECK(candidate); @@ -3069,32 +3108,33 @@ TEST_F(UserHistoryPredictorTest, ZeroQueryFromRealtimeConversion) { // "なかのです, 中野です", "なかの, 中野" candidate->PushBackInnerSegmentBoundary(15, 12, 9, 6); } - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); - SetUpInputForConversion("わたしの", composer_.get(), &segments); + convreq = SetUpInputForConversion("わたしの", &composer_, &segments); AddCandidate(0, "私の", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); - SetUpInputForSuggestionWithHistory("", "わたしの", "私の", composer_.get(), - &segments); + convreq = SetUpInputForSuggestionWithHistory("", "わたしの", "私の", + &composer_, &segments); commands::Request request; - request_->set_zero_query_suggestion(true); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + request_.set_zero_query_suggestion(true); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("名前は", segments)); } TEST_F(UserHistoryPredictorTest, LongCandidateForMobile) { UserHistoryPredictor *predictor = GetUserHistoryPredictorWithClearedHistory(); - request_test_util::FillMobileRequest(request_.get()); + request_test_util::FillMobileRequest(&request_); Segments segments; for (size_t i = 0; i < 3; ++i) { constexpr char kKey[] = "よろしくおねがいします"; constexpr char kValue[] = "よろしくお願いします"; - SetUpInputForPrediction(kKey, composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForPrediction(kKey, &composer_, &segments); Segment::Candidate *candidate = segments.mutable_segment(0)->add_candidate(); CHECK(candidate); @@ -3102,12 +3142,13 @@ TEST_F(UserHistoryPredictorTest, LongCandidateForMobile) { candidate->content_value = kValue; candidate->key = kKey; candidate->content_key = kKey; - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); } - SetUpInputForPrediction("よろ", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForPrediction("よろ", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("よろしくお願いします", segments)); } @@ -3696,9 +3737,10 @@ TEST_F(UserHistoryPredictorTest, ClearHistoryEntryScenario1) { // case that a user accidentally input incomplete sequence. for (int i = 0; i < 3; ++i) { Segments segments; - SetUpInputForConversion("ぐーぐr", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("ぐーぐr", &composer_, &segments); AddCandidate("グーグr", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } // Test if the predictor learned "グーグr". @@ -3722,6 +3764,7 @@ TEST_F(UserHistoryPredictorTest, ClearHistoryEntryScenario2) { // Set up history. Convert "きょうもいいてんき!" to "今日もいい天気!" 3 times // so that the predictor learns the sentence. We assume that this sentence // consists of three segments: "今日も|いい天気|!". + ConversionRequest convreq = CreateConversionRequest(); for (int i = 0; i < 3; ++i) { Segments segments; @@ -3755,7 +3798,7 @@ TEST_F(UserHistoryPredictorTest, ClearHistoryEntryScenario2) { candidate->key = seg->key(); candidate->content_key = seg->key(); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } // Check if the predictor learned the sentence. Since the symbol is contained @@ -3785,7 +3828,8 @@ TEST_F(UserHistoryPredictorTest, ContentWordLearningFromInnerSegmentBoundary) { { constexpr char kKey[] = "とうきょうかなごやにいきたい"; constexpr char kValue[] = "東京か名古屋に行きたい"; - SetUpInputForPrediction(kKey, composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForPrediction(kKey, &composer_, &segments); Segment::Candidate *candidate = segments.mutable_segment(0)->add_candidate(); candidate->key = kKey; @@ -3795,59 +3839,61 @@ TEST_F(UserHistoryPredictorTest, ContentWordLearningFromInnerSegmentBoundary) { candidate->PushBackInnerSegmentBoundary(18, 9, 15, 6); candidate->PushBackInnerSegmentBoundary(12, 12, 9, 9); candidate->PushBackInnerSegmentBoundary(12, 12, 12, 12); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } segments.Clear(); - SetUpInputForPrediction("と", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForPrediction("と", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("東京", segments)); EXPECT_TRUE(FindCandidateByValue("東京か", segments)); segments.Clear(); - SetUpInputForPrediction("な", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForPrediction("な", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("名古屋", segments)); EXPECT_TRUE(FindCandidateByValue("名古屋に", segments)); segments.Clear(); - SetUpInputForPrediction("い", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForPrediction("い", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("行きたい", segments)); } TEST_F(UserHistoryPredictorTest, JoinedSegmentsTestMobile) { UserHistoryPredictor *predictor = GetUserHistoryPredictorWithClearedHistory(); - request_test_util::FillMobileRequest(request_.get()); + request_test_util::FillMobileRequest(&request_); Segments segments; - SetUpInputForConversion("わたしの", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("わたしの", &composer_, &segments); AddCandidate(0, "私の", &segments); - AddSegmentForConversion("なまえは", &segments); + AddSegment("なまえは", &segments); AddCandidate(1, "名前は", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); - SetUpInputForSuggestion("わたし", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("わたし", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidates_size(), 1); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の"); EXPECT_TRUE(segments.segment(0).candidate(0).source_info & Segment::Candidate::USER_HISTORY_PREDICTOR); segments.Clear(); - SetUpInputForPrediction("わたしの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForPrediction("わたしの", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidates_size(), 1); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の"); EXPECT_TRUE(segments.segment(0).candidate(0).source_info & Segment::Candidate::USER_HISTORY_PREDICTOR); segments.Clear(); - SetUpInputForPrediction("わたしのな", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForPrediction("わたしのな", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidates_size(), 1); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は"); EXPECT_TRUE(segments.segment(0).candidate(0).source_info & @@ -3860,18 +3906,19 @@ TEST_F(UserHistoryPredictorTest, JoinedSegmentsTestDesktop) { Segments segments; - SetUpInputForConversion("わたしの", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("わたしの", &composer_, &segments); AddCandidate(0, "私の", &segments); - AddSegmentForConversion("なまえは", &segments); + AddSegment("なまえは", &segments); AddCandidate(1, "名前は", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); - SetUpInputForSuggestion("わたし", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("わたし", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidates_size(), 2); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の"); EXPECT_TRUE(segments.segment(0).candidate(0).source_info & @@ -3881,16 +3928,16 @@ TEST_F(UserHistoryPredictorTest, JoinedSegmentsTestDesktop) { Segment::Candidate::USER_HISTORY_PREDICTOR); segments.Clear(); - SetUpInputForPrediction("わたしの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForPrediction("わたしの", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidates_size(), 1); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は"); EXPECT_TRUE(segments.segment(0).candidate(0).source_info & Segment::Candidate::USER_HISTORY_PREDICTOR); segments.Clear(); - SetUpInputForPrediction("わたしのな", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForPrediction("わたしのな", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidates_size(), 1); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は"); EXPECT_TRUE(segments.segment(0).candidate(0).source_info & @@ -3905,11 +3952,12 @@ TEST_F(UserHistoryPredictorTest, UsageStats) { EXPECT_COUNT_STATS("CommitUserHistoryPredictor", 0); EXPECT_COUNT_STATS("CommitUserHistoryPredictorZeroQuery", 0); - SetUpInputForConversion("なまえは", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("なまえは", &composer_, &segments); AddCandidate(0, "名前は", &segments); segments.mutable_conversion_segment(0)->mutable_candidate(0)->source_info |= Segment::Candidate::USER_HISTORY_PREDICTOR; - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); EXPECT_COUNT_STATS("CommitUserHistoryPredictor", 1); EXPECT_COUNT_STATS("CommitUserHistoryPredictorZeroQuery", 0); @@ -3917,11 +3965,11 @@ TEST_F(UserHistoryPredictorTest, UsageStats) { segments.Clear(); // Zero query - SetUpInputForConversion("", composer_.get(), &segments); + convreq = SetUpInputForConversion("", &composer_, &segments); AddCandidate(0, "名前は", &segments); segments.mutable_conversion_segment(0)->mutable_candidate(0)->source_info |= Segment::Candidate::USER_HISTORY_PREDICTOR; - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); // UserHistoryPredictor && ZeroQuery EXPECT_COUNT_STATS("CommitUserHistoryPredictor", 2); @@ -3930,31 +3978,32 @@ TEST_F(UserHistoryPredictorTest, UsageStats) { TEST_F(UserHistoryPredictorTest, PunctuationLinkMobile) { UserHistoryPredictor *predictor = GetUserHistoryPredictorWithClearedHistory(); - request_test_util::FillMobileRequest(request_.get()); + request_test_util::FillMobileRequest(&request_); Segments segments; { - SetUpInputForConversion("ございます", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("ございます", &composer_, &segments); AddCandidate(0, "ございます", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); - SetUpInputForConversionWithHistory("!", "ございます", "ございます", - composer_.get(), &segments); + convreq = SetUpInputForConversionWithHistory( + "!", "ございます", "ございます", &composer_, &segments); AddCandidate(1, "!", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); - SetUpInputForSuggestion("ございま", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("ございま", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.conversion_segment(0).candidate(0).value, "ございます"); EXPECT_FALSE(FindCandidateByValue("ございます!", segments)); // Zero query from "ございます" -> "!" segments.Clear(); - SetUpInputForConversion("ございます", composer_.get(), &segments); + convreq = SetUpInputForConversion("ございます", &composer_, &segments); AddCandidate(0, "ございます", &segments); - SetUpInputForSuggestionWithHistory("", "ございます", "ございます", - composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestionWithHistory("", "ございます", "ございます", + &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.conversion_segment(0).candidate(0).value, "!"); } @@ -3962,79 +4011,82 @@ TEST_F(UserHistoryPredictorTest, PunctuationLinkMobile) { WaitForSyncer(predictor); { - SetUpInputForConversion("!", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("!", &composer_, &segments); AddCandidate(0, "!", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); - SetUpInputForSuggestionWithHistory("ございます", "!", "!", composer_.get(), - &segments); + convreq = SetUpInputForSuggestionWithHistory("ございます", "!", "!", + &composer_, &segments); AddCandidate(1, "ございます", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); // Zero query from "!" -> no suggestion segments.Clear(); - SetUpInputForSuggestionWithHistory("", "!", "!", composer_.get(), - &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestionWithHistory("", "!", "!", &composer_, + &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } predictor->ClearAllHistory(); WaitForSyncer(predictor); { - SetUpInputForConversion("ございます!", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("ございます!", &composer_, &segments); AddCandidate(0, "ございます!", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); - AddSegmentForConversion("よろしくおねがいします", &segments); + AddSegment("よろしくおねがいします", &segments); AddCandidate(1, "よろしくお願いします", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); // Zero query from "!" -> no suggestion segments.Clear(); - SetUpInputForConversion("!", composer_.get(), &segments); + convreq = SetUpInputForConversion("!", &composer_, &segments); AddCandidate(0, "!", &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); - AddSegmentForSuggestion("", &segments); // empty request - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + AddSegment("", &segments); // empty request + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); // Zero query from "ございます!" -> no suggestion segments.Clear(); - SetUpInputForConversion("ございます!", composer_.get(), &segments); + convreq = SetUpInputForConversion("ございます!", &composer_, &segments); AddCandidate(0, "ございます!", &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); - AddSegmentForSuggestion("", &segments); // empty request - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + AddSegment("", &segments); // empty request + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } predictor->ClearAllHistory(); WaitForSyncer(predictor); { - SetUpInputForConversion("ございます", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("ございます", &composer_, &segments); AddCandidate(0, "ございます", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); - SetUpInputForConversionWithHistory("!よろしくおねがいします", "ございます", - "ございます", composer_.get(), - &segments); + convreq = SetUpInputForConversionWithHistory("!よろしくおねがいします", + "ございます", "ございます", + &composer_, &segments); AddCandidate(1, "!よろしくお願いします", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); - SetUpInputForSuggestion("ございま", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("ございま", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.conversion_segment(0).candidate(0).value, "ございます"); EXPECT_FALSE( FindCandidateByValue("ございます!よろしくお願いします", segments)); // Zero query from "ございます" -> no suggestion - SetUpInputForConversionWithHistory("", "ございます", "ございます", - composer_.get(), &segments); - AddSegmentForSuggestion("", &segments); // empty request - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForConversionWithHistory("", "ございます", "ございます", + &composer_, &segments); + AddSegment("", &segments); // empty request + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } } @@ -4042,25 +4094,26 @@ TEST_F(UserHistoryPredictorTest, PunctuationLinkDesktop) { UserHistoryPredictor *predictor = GetUserHistoryPredictorWithClearedHistory(); Segments segments; { - SetUpInputForConversion("ございます", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("ございます", &composer_, &segments); AddCandidate(0, "ございます", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); - AddSegmentForConversion("!", &segments); + AddSegment("!", &segments); AddCandidate(1, "!", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); - SetUpInputForSuggestion("ございま", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("ございま", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.conversion_segment(0).candidate(0).value, "ございます"); EXPECT_FALSE(FindCandidateByValue("ございます!", segments)); segments.Clear(); - SetUpInputForSuggestion("ございます", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("ございます", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.conversion_segment(0).candidate(0).value, "ございます"); EXPECT_FALSE(FindCandidateByValue("ございます!", segments)); } @@ -4069,46 +4122,48 @@ TEST_F(UserHistoryPredictorTest, PunctuationLinkDesktop) { WaitForSyncer(predictor); { - SetUpInputForConversion("!", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("!", &composer_, &segments); AddCandidate(0, "!", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); - AddSegmentForConversion("よろしくおねがいします", &segments); + AddSegment("よろしくおねがいします", &segments); AddCandidate(1, "よろしくお願いします", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); - SetUpInputForSuggestion("!", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("!", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } predictor->ClearAllHistory(); WaitForSyncer(predictor); { - SetUpInputForConversion("ございます!", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("ございます!", &composer_, &segments); AddCandidate(0, "ございます!", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); - AddSegmentForConversion("よろしくおねがいします", &segments); + AddSegment("よろしくおねがいします", &segments); AddCandidate(1, "よろしくお願いします", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); - SetUpInputForSuggestion("ございます", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("ございます", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.conversion_segment(0).candidate(0).value, "ございます!"); EXPECT_FALSE( FindCandidateByValue("ございます!よろしくお願いします", segments)); segments.Clear(); - SetUpInputForSuggestion("ございます!", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("ございます!", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.conversion_segment(0).candidate(0).value, "ございます!"); EXPECT_FALSE( @@ -4119,19 +4174,20 @@ TEST_F(UserHistoryPredictorTest, PunctuationLinkDesktop) { WaitForSyncer(predictor); { - SetUpInputForConversion("ございます", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("ございます", &composer_, &segments); AddCandidate(0, "ございます", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); - AddSegmentForConversion("!よろしくおねがいします", &segments); + AddSegment("!よろしくおねがいします", &segments); AddCandidate(1, "!よろしくお願いします", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); - SetUpInputForSuggestion("ございます", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("ございます", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.conversion_segment(0).candidate(0).value, "ございます"); EXPECT_FALSE(FindCandidateByValue("ございます!", segments)); EXPECT_FALSE( @@ -4144,21 +4200,21 @@ TEST_F(UserHistoryPredictorTest, PunctuationLinkDesktop) { { // Note that "よろしくお願いします:よろしくおねがいします" is the sentence // like candidate. Please refer to user_history_predictor.cc - SetUpInputForConversion("よろしくおねがいします", composer_.get(), - &segments); + ConversionRequest convreq = SetUpInputForConversion( + "よろしくおねがいします", &composer_, &segments); AddCandidate(0, "よろしくお願いします", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); - AddSegmentForConversion("!", &segments); + AddSegment("!", &segments); AddCandidate(1, "!", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); - SetUpInputForSuggestion("よろしくおねがいします", composer_.get(), - &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("よろしくおねがいします", &composer_, + &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("よろしくお願いします!", segments)); } } @@ -4170,15 +4226,15 @@ TEST_F(UserHistoryPredictorTest, 62DayOldEntriesAreDeletedAtSync) { // Let the predictor learn "私の名前は中野です". Segments segments; - SetUpInputForConversion("わたしのなまえはなかのです", composer_.get(), - &segments); + ConversionRequest convreq = SetUpInputForConversion( + "わたしのなまえはなかのです", &composer_, &segments); AddCandidate("私の名前は中野です", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); // Verify that "私の名前は中野です" is predicted. segments.Clear(); - SetUpInputForPrediction("わたしの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForPrediction("わたしの", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("私の名前は中野です", segments)); // Now, simulate the case where 63 days passed. @@ -4186,17 +4242,17 @@ TEST_F(UserHistoryPredictorTest, 62DayOldEntriesAreDeletedAtSync) { // Let the predictor learn "私の名前は高橋です". segments.Clear(); - SetUpInputForConversion("わたしのなまえはたかはしです", composer_.get(), - &segments); + convreq = SetUpInputForConversion("わたしのなまえはたかはしです", &composer_, + &segments); AddCandidate("私の名前は高橋です", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); // Verify that "私の名前は高橋です" is predicted but "私の名前は中野です" is // not. The latter one is still in on-memory data structure but lookup is // prevented. The entry is removed when the data is written to disk. segments.Clear(); - SetUpInputForPrediction("わたしの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForPrediction("わたしの", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("私の名前は高橋です", segments)); EXPECT_FALSE(FindCandidateByValue("私の名前は中野です", segments)); @@ -4207,8 +4263,8 @@ TEST_F(UserHistoryPredictorTest, 62DayOldEntriesAreDeletedAtSync) { // Verify that "私の名前は中野です" is no longer predicted because it was // learned 63 days before. segments.Clear(); - SetUpInputForPrediction("わたしの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForPrediction("わたしの", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("私の名前は高橋です", segments)); EXPECT_FALSE(FindCandidateByValue("私の名前は中野です", segments)); @@ -4231,15 +4287,15 @@ TEST_F(UserHistoryPredictorTest, FutureTimestamp) { // Let the predictor learn "私の名前は中野です". Segments segments; - SetUpInputForConversion("わたしのなまえはなかのです", composer_.get(), - &segments); + ConversionRequest convreq = SetUpInputForConversion( + "わたしのなまえはなかのです", &composer_, &segments); AddCandidate("私の名前は中野です", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); // Verify that "私の名前は中野です" is predicted. segments.Clear(); - SetUpInputForPrediction("わたしの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForPrediction("わたしの", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("私の名前は中野です", segments)); // Now, go back to the past. @@ -4247,8 +4303,8 @@ TEST_F(UserHistoryPredictorTest, FutureTimestamp) { // Verify that "私の名前は中野です" is predicted without crash. segments.Clear(); - SetUpInputForPrediction("わたしの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForPrediction("わたしの", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("私の名前は中野です", segments)); } @@ -4256,55 +4312,66 @@ TEST_F(UserHistoryPredictorTest, MaxPredictionCandidatesSize) { UserHistoryPredictor *predictor = GetUserHistoryPredictorWithClearedHistory(); Segments segments; { - SetUpInputForPrediction("てすと", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForPrediction("てすと", &composer_, &segments); AddCandidate(0, "てすと", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } { - SetUpInputForPrediction("てすと", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForPrediction("てすと", &composer_, &segments); AddCandidate(0, "テスト", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } { - SetUpInputForPrediction("てすと", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForPrediction("てすと", &composer_, &segments); AddCandidate(0, "Test", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } { - convreq_->set_max_user_history_prediction_candidates_size(2); - MakeSegmentsForSuggestion("てすと", &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = CreateConversionRequest(); + convreq.set_max_user_history_prediction_candidates_size(2); + convreq.set_request_type(ConversionRequest::SUGGESTION); + MakeSegments("てすと", &segments); + + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segments_size(), 1); EXPECT_EQ(segments.segment(0).candidates_size(), 2); - MakeSegmentsForPrediction("てすと", &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq.set_request_type(ConversionRequest::PREDICTION); + MakeSegments("てすと", &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segments_size(), 1); EXPECT_EQ(segments.segment(0).candidates_size(), 2); } { - convreq_->set_max_user_history_prediction_candidates_size(3); - SetUpInputForSuggestion("てすと", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("てすと", &composer_, &segments); + convreq.set_max_user_history_prediction_candidates_size(3); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segments_size(), 1); EXPECT_EQ(segments.segment(0).candidates_size(), 3); - SetUpInputForPrediction("てすと", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForPrediction("てすと", &composer_, &segments); + convreq.set_max_user_history_prediction_candidates_size(3); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segments_size(), 1); EXPECT_EQ(segments.segment(0).candidates_size(), 3); } { // Only 3 candidates in user history - convreq_->set_max_user_history_prediction_candidates_size(4); - SetUpInputForSuggestion("てすと", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("てすと", &composer_, &segments); + convreq.set_max_user_history_prediction_candidates_size(4); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segments_size(), 1); EXPECT_EQ(segments.segment(0).candidates_size(), 3); - SetUpInputForPrediction("てすと", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForPrediction("てすと", &composer_, &segments); + convreq.set_max_user_history_prediction_candidates_size(4); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segments_size(), 1); EXPECT_EQ(segments.segment(0).candidates_size(), 3); } @@ -4312,60 +4379,69 @@ TEST_F(UserHistoryPredictorTest, MaxPredictionCandidatesSize) { TEST_F(UserHistoryPredictorTest, MaxPredictionCandidatesSizeForZeroQuery) { UserHistoryPredictor *predictor = GetUserHistoryPredictorWithClearedHistory(); - request_test_util::FillMobileRequest(request_.get()); + request_test_util::FillMobileRequest(&request_); Segments segments; + ConversionRequest convreq; + { - SetUpInputForPrediction("てすと", composer_.get(), &segments); + convreq = SetUpInputForPrediction("てすと", &composer_, &segments); AddCandidate(0, "てすと", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); } { - AddSegmentForPrediction("かお", &segments); + AddSegment("かお", &segments); AddCandidate(1, "😀", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } { Segment::Candidate *candidate = segments.mutable_segment(1)->mutable_candidate(0); candidate->value = "😎"; candidate->content_value = candidate->value; - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } { Segment::Candidate *candidate = segments.mutable_segment(1)->mutable_candidate(0); candidate->value = "😂"; candidate->content_value = candidate->value; - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } - convreq_->set_max_user_history_prediction_candidates_size(2); - convreq_->set_max_user_history_prediction_candidates_size_for_zero_query(3); // normal prediction candidates size { - SetUpInputForSuggestion("かお", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("かお", &composer_, &segments); + convreq.set_max_user_history_prediction_candidates_size(2); + convreq.set_max_user_history_prediction_candidates_size_for_zero_query(3); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segments_size(), 1); EXPECT_EQ(segments.segment(0).candidates_size(), 2); - SetUpInputForPrediction("かお", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForPrediction("かお", &composer_, &segments); + convreq.set_max_user_history_prediction_candidates_size(2); + convreq.set_max_user_history_prediction_candidates_size_for_zero_query(3); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segments_size(), 1); EXPECT_EQ(segments.segment(0).candidates_size(), 2); } // prediction candidates for zero query { - SetUpInputForSuggestionWithHistory("", "てすと", "てすと", composer_.get(), - &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = SetUpInputForSuggestionWithHistory( + "", "てすと", "てすと", &composer_, &segments); + convreq.set_max_user_history_prediction_candidates_size(2); + convreq.set_max_user_history_prediction_candidates_size_for_zero_query(3); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.conversion_segments_size(), 1); EXPECT_EQ(segments.conversion_segment(0).candidates_size(), 3); - SetUpInputForPredictionWithHistory("", "てすと", "てすと", composer_.get(), - &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForPredictionWithHistory("", "てすと", "てすと", + &composer_, &segments); + convreq.set_max_user_history_prediction_candidates_size(2); + convreq.set_max_user_history_prediction_candidates_size_for_zero_query(3); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.conversion_segments_size(), 1); EXPECT_EQ(segments.conversion_segment(0).candidates_size(), 3); } @@ -4378,34 +4454,38 @@ TEST_F(UserHistoryPredictorTest, TypingCorrection) { Segments segments; { clock->Advance(absl::Hours(1)); - SetUpInputForPrediction("がっこう", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForPrediction("がっこう", &composer_, &segments); AddCandidate(0, "学校", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } { clock->Advance(absl::Hours(1)); - SetUpInputForPrediction("がっこう", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForPrediction("がっこう", &composer_, &segments); AddCandidate(0, "ガッコウ", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } { clock->Advance(absl::Hours(1)); - SetUpInputForPrediction("かっこう", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForPrediction("かっこう", &composer_, &segments); AddCandidate(0, "格好", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } - request_->mutable_decoder_experiment_params() + request_.mutable_decoder_experiment_params() ->set_typing_correction_apply_user_history_size(1); - SetUpInputForSuggestion("がっこ", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("がっこ", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); // No typing correction. - SetUpInputForSuggestion("かつこ", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("かつこ", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); std::vector expected; auto add_expected = [&](const std::string &key) { @@ -4421,26 +4501,26 @@ TEST_F(UserHistoryPredictorTest, TypingCorrection) { SetSupplementalModel(&mock); // set_typing_correction_apply_user_history_size=0 - request_->mutable_decoder_experiment_params() + request_.mutable_decoder_experiment_params() ->set_typing_correction_apply_user_history_size(0); - SetUpInputForSuggestion("かつこ", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("かつこ", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); // set_typing_correction_apply_user_history_size=1 - request_->mutable_decoder_experiment_params() + request_.mutable_decoder_experiment_params() ->set_typing_correction_apply_user_history_size(1); - SetUpInputForSuggestion("かつこ", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("かつこ", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); ASSERT_EQ(segments.segments_size(), 1); ASSERT_EQ(segments.segment(0).candidates_size(), 2); EXPECT_EQ(segments.segment(0).candidate(0).value, "ガッコウ"); EXPECT_EQ(segments.segment(0).candidate(1).value, "学校"); // set_typing_correction_apply_user_history_size=2 - request_->mutable_decoder_experiment_params() + request_.mutable_decoder_experiment_params() ->set_typing_correction_apply_user_history_size(2); - SetUpInputForSuggestion("かつこ", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("かつこ", &composer_, &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); ASSERT_EQ(segments.segments_size(), 1); ASSERT_EQ(segments.segment(0).candidates_size(), 3); EXPECT_EQ(segments.segment(0).candidate(0).value, "格好"); @@ -4448,8 +4528,8 @@ TEST_F(UserHistoryPredictorTest, TypingCorrection) { EXPECT_EQ(segments.segment(0).candidate(2).value, "学校"); SetSupplementalModel(nullptr); - SetUpInputForSuggestion("かつこ", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("かつこ", &composer_, &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } TEST_F(UserHistoryPredictorTest, MaxCharCoverage) { @@ -4457,19 +4537,22 @@ TEST_F(UserHistoryPredictorTest, MaxCharCoverage) { Segments segments; { - SetUpInputForPrediction("てすと", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForPrediction("てすと", &composer_, &segments); AddCandidate(0, "てすと", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } { - SetUpInputForPrediction("てすと", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForPrediction("てすと", &composer_, &segments); AddCandidate(0, "テスト", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } { - SetUpInputForPrediction("てすと", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForPrediction("てすと", &composer_, &segments); AddCandidate(0, "Test", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } // [max_char_coverage, expected_candidate_size] @@ -4478,10 +4561,13 @@ TEST_F(UserHistoryPredictorTest, MaxCharCoverage) { {7, 2}, {8, 2}, {9, 2}, {10, 3}, {11, 3}}; for (const auto &[coverage, candidates_size] : kTestCases) { - request_->mutable_decoder_experiment_params() + request_.mutable_decoder_experiment_params() ->set_user_history_prediction_max_char_coverage(coverage); - MakeSegmentsForSuggestion("てすと", &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + MakeSegments("てすと", &segments); + ConversionRequest convreq = CreateConversionRequest(); + convreq.set_request_type(ConversionRequest::SUGGESTION); + + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segments_size(), 1); EXPECT_EQ(segments.segment(0).candidates_size(), candidates_size); } @@ -4499,16 +4585,19 @@ TEST_F(UserHistoryPredictorTest, RemoveRedundantCandidates) { // Insert in reverse order to emulate LRU. for (auto it = candidates.rbegin(); it != candidates.rend(); ++it) { clock->Advance(absl::Hours(1)); - SetUpInputForPrediction("とうき", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForPrediction("とうき", &composer_, &segments); AddCandidate(0, *it, &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } - convreq_->set_max_user_history_prediction_candidates_size(10); - request_->mutable_decoder_experiment_params() + request_.mutable_decoder_experiment_params() ->set_user_history_prediction_filter_redundant_candidates_mode( filter_mode); - MakeSegmentsForSuggestion("とうき", &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + MakeSegments("とうき", &segments); + ConversionRequest convreq = CreateConversionRequest(); + convreq.set_request_type(ConversionRequest::SUGGESTION); + convreq.set_max_user_history_prediction_candidates_size(10); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segments_size(), 1); ASSERT_EQ(expected.size(), segments.segment(0).candidates_size()); for (int i = 0; i < expected.size(); ++i) { @@ -4586,7 +4675,7 @@ TEST_F(UserHistoryPredictorTest, RemoveRedundantCandidates) { TEST_F(UserHistoryPredictorTest, ContentValueZeroQuery) { UserHistoryPredictor *predictor = GetUserHistoryPredictorWithClearedHistory(); - request_->mutable_decoder_experiment_params() + request_.mutable_decoder_experiment_params() ->set_user_history_prediction_aggressive_bigram(true); // Remember 私の名前は中野です @@ -4594,7 +4683,8 @@ TEST_F(UserHistoryPredictorTest, ContentValueZeroQuery) { { constexpr absl::string_view kKey = "わたしのなまえはなかのです"; constexpr absl::string_view kValue = "私の名前は中野です"; - SetUpInputForPrediction(kKey, composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForPrediction(kKey, &composer_, &segments); Segment::Candidate *candidate = segments.mutable_segment(0)->add_candidate(); CHECK(candidate); @@ -4608,7 +4698,7 @@ TEST_F(UserHistoryPredictorTest, ContentValueZeroQuery) { candidate->PushBackInnerSegmentBoundary(12, 9, 9, 6); // "なかのです, 中野です", "なかの, 中野" candidate->PushBackInnerSegmentBoundary(15, 12, 9, 6); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } // Zero query from content values. suffix is suggested. @@ -4621,32 +4711,34 @@ TEST_F(UserHistoryPredictorTest, ContentValueZeroQuery) { {"なまえは", "名前は", "中野"}}; for (const auto &[hist_key, hist_value, suggestion] : kZeroQueryTest) { segments.Clear(); - SetUpInputForConversion(hist_key, composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion(hist_key, &composer_, &segments); AddCandidate(0, hist_value, &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); - SetUpInputForSuggestionWithHistory("", hist_key, hist_value, - composer_.get(), &segments); - request_->set_zero_query_suggestion(true); - ASSERT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestionWithHistory("", hist_key, hist_value, + &composer_, &segments); + request_.set_zero_query_suggestion(true); + ASSERT_TRUE(predictor->PredictForRequest(convreq, &segments)); } // Bigram History. { segments.Clear(); - SetUpInputForSuggestion("", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForSuggestion("", &composer_, &segments); PrependHistorySegments("の", "の", &segments); PrependHistorySegments("わたし", "私", &segments); - request_->set_zero_query_suggestion(true); - ASSERT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + request_.set_zero_query_suggestion(true); + ASSERT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.conversion_segment(0).candidate(0).value, "名前"); segments.Clear(); - SetUpInputForSuggestion("", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("", &composer_, &segments); PrependHistorySegments("は", "は", &segments); PrependHistorySegments("なまえ", "名前", &segments); - request_->set_zero_query_suggestion(true); - ASSERT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + request_.set_zero_query_suggestion(true); + ASSERT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.conversion_segment(0).candidate(0).value, "中野"); } } diff --git a/src/rewriter/user_segment_history_rewriter_test.cc b/src/rewriter/user_segment_history_rewriter_test.cc index 520bf266e..7601d2f37 100644 --- a/src/rewriter/user_segment_history_rewriter_test.cc +++ b/src/rewriter/user_segment_history_rewriter_test.cc @@ -133,9 +133,6 @@ class UserSegmentHistoryRewriterTest : public testing::TestWithTempUserProfile { request_ = std::make_unique(); config_ = std::make_unique(); ConfigHandler::GetDefaultConfig(config_.get()); - convreq_ = std::make_unique(); - convreq_->set_config(config_.get()); - convreq_->set_request(request_.get()); for (int i = 0; i < config_->character_form_rules_size(); ++i) { Config::CharacterFormRule *rule = config_->mutable_character_form_rules(i); @@ -186,6 +183,13 @@ class UserSegmentHistoryRewriterTest : public testing::TestWithTempUserProfile { form); } + ConversionRequest CreateConversionRequest() const { + ConversionRequest convreq; + convreq.set_config(config_.get()); + convreq.set_request(request_.get()); + return convreq; + } + std::unique_ptr convreq_; std::unique_ptr config_; std::unique_ptr request_; @@ -209,8 +213,10 @@ TEST_F(UserSegmentHistoryRewriterTest, InvalidInputsTest) { std::unique_ptr rewriter( CreateUserSegmentHistoryRewriter()); segments.Clear(); - EXPECT_FALSE(rewriter->Rewrite(*convreq_, &segments)); - rewriter->Finish(*convreq_, &segments); + + ConversionRequest convreq = CreateConversionRequest(); + EXPECT_FALSE(rewriter->Rewrite(convreq, &segments)); + rewriter->Finish(convreq, &segments); } TEST_F(UserSegmentHistoryRewriterTest, IncognitoModeTest) { @@ -219,24 +225,26 @@ TEST_F(UserSegmentHistoryRewriterTest, IncognitoModeTest) { CreateUserSegmentHistoryRewriter()); { + ConversionRequest convreq = CreateConversionRequest(); config_->set_incognito_mode(false); InitSegments(&segments, 1); segments.mutable_segment(0)->move_candidate(2, 0); segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate2"); config_->set_incognito_mode(true); InitSegments(&segments, 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate0"); } { + ConversionRequest convreq = CreateConversionRequest(); rewriter->Clear(); // clear history config_->set_incognito_mode(true); InitSegments(&segments, 1); @@ -244,9 +252,9 @@ TEST_F(UserSegmentHistoryRewriterTest, IncognitoModeTest) { segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate0"); } } @@ -257,38 +265,40 @@ TEST_F(UserSegmentHistoryRewriterTest, ConfigTest) { CreateUserSegmentHistoryRewriter()); { + ConversionRequest convreq = CreateConversionRequest(); config_->set_history_learning_level(Config::DEFAULT_HISTORY); InitSegments(&segments, 1); segments.mutable_segment(0)->move_candidate(2, 0); segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate2"); config_->set_history_learning_level(Config::NO_HISTORY); InitSegments(&segments, 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate0"); config_->set_history_learning_level(Config::READ_ONLY); InitSegments(&segments, 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate2"); } { + ConversionRequest convreq = CreateConversionRequest(); config_->set_history_learning_level(Config::NO_HISTORY); InitSegments(&segments, 1); segments.mutable_segment(0)->move_candidate(2, 0); segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate0"); } } @@ -297,7 +307,7 @@ TEST_F(UserSegmentHistoryRewriterTest, DisableTest) { Segments segments; std::unique_ptr rewriter( CreateUserSegmentHistoryRewriter()); - ConversionRequest conversion_request(*convreq_); + ConversionRequest conversion_request = CreateConversionRequest(); { InitSegments(&segments, 1); @@ -344,15 +354,16 @@ TEST_F(UserSegmentHistoryRewriterTest, BasicTest) { rewriter->Clear(); { + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 2); segments.mutable_segment(0)->move_candidate(2, 0); segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 2); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate2"); EXPECT_TRUE(segments.segment(0).candidate(0).attributes & @@ -362,7 +373,7 @@ TEST_F(UserSegmentHistoryRewriterTest, BasicTest) { Segment::Candidate::USER_SEGMENT_HISTORY_REWRITER); InitSegments(&segments, 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate2"); EXPECT_TRUE(segments.segment(0).candidate(0).attributes & Segment::Candidate::USER_SEGMENT_HISTORY_REWRITER); @@ -370,17 +381,17 @@ TEST_F(UserSegmentHistoryRewriterTest, BasicTest) { segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate0"); EXPECT_FALSE(segments.segment(0).candidate(0).attributes & Segment::Candidate::USER_SEGMENT_HISTORY_REWRITER); InitSegments(&segments, 2); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate2"); EXPECT_TRUE(segments.segment(0).candidate(0).attributes & Segment::Candidate::USER_SEGMENT_HISTORY_REWRITER); @@ -391,10 +402,10 @@ TEST_F(UserSegmentHistoryRewriterTest, BasicTest) { segments.mutable_segment(1)->mutable_candidate(0)->attributes |= Segment::Candidate::RERANKED; segments.mutable_segment(1)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 2); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate2"); EXPECT_TRUE(segments.segment(0).candidate(0).attributes & Segment::Candidate::USER_SEGMENT_HISTORY_REWRITER); @@ -405,15 +416,16 @@ TEST_F(UserSegmentHistoryRewriterTest, BasicTest) { rewriter->Clear(); { + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 2); segments.mutable_segment(0)->move_candidate(2, 0); segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 2); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate2"); EXPECT_TRUE(segments.segment(0).candidate(0).attributes & @@ -423,7 +435,7 @@ TEST_F(UserSegmentHistoryRewriterTest, BasicTest) { Segment::Candidate::USER_SEGMENT_HISTORY_REWRITER); InitSegments(&segments, 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate2"); EXPECT_TRUE(segments.segment(0).candidate(0).attributes & Segment::Candidate::USER_SEGMENT_HISTORY_REWRITER); @@ -433,10 +445,10 @@ TEST_F(UserSegmentHistoryRewriterTest, BasicTest) { segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate0"); EXPECT_FALSE(segments.segment(0).candidate(0).attributes & Segment::Candidate::USER_SEGMENT_HISTORY_REWRITER); @@ -455,6 +467,7 @@ TEST_F(UserSegmentHistoryRewriterTest, SequenceTest) { Clock::SetClockForUnitTest(&clock); { + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 1); segments.mutable_segment(0)->move_candidate(2, 0); @@ -462,7 +475,7 @@ TEST_F(UserSegmentHistoryRewriterTest, SequenceTest) { Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate2"); - rewriter->Finish(*convreq_, &segments); // learn "candidate2" + rewriter->Finish(convreq, &segments); // learn "candidate2" // Next timestamp of learning should be newer than previous learning. clock.Advance(absl::Seconds(1)); @@ -472,7 +485,7 @@ TEST_F(UserSegmentHistoryRewriterTest, SequenceTest) { segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); segments.mutable_segment(1)->set_key(segments.segment(0).key()); EXPECT_EQ(segments.history_segments_size(), 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate2"); EXPECT_EQ(segments.segment(1).candidate(0).value, "candidate2"); @@ -483,7 +496,7 @@ TEST_F(UserSegmentHistoryRewriterTest, SequenceTest) { Segment::Candidate::RERANKED; segments.mutable_segment(1)->set_segment_type(Segment::FIXED_VALUE); EXPECT_EQ(segments.segment(1).candidate(0).value, "candidate3"); - rewriter->Finish(*convreq_, &segments); // learn "candidate3" + rewriter->Finish(convreq, &segments); // learn "candidate3" clock.Advance(absl::Seconds(1)); @@ -495,7 +508,7 @@ TEST_F(UserSegmentHistoryRewriterTest, SequenceTest) { segments.mutable_segment(1)->set_key(segments.segment(0).key()); segments.mutable_segment(2)->set_key(segments.segment(0).key()); EXPECT_EQ(segments.history_segments_size(), 2); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate2"); EXPECT_EQ(segments.segment(1).candidate(0).value, "candidate3"); @@ -507,7 +520,7 @@ TEST_F(UserSegmentHistoryRewriterTest, SequenceTest) { Segment::Candidate::RERANKED; segments.mutable_segment(2)->set_segment_type(Segment::FIXED_VALUE); EXPECT_EQ(segments.segment(2).candidate(0).value, "candidate2"); - rewriter->Finish(*convreq_, &segments); // learn "candidate2" + rewriter->Finish(convreq, &segments); // learn "candidate2" clock.Advance(absl::Seconds(1)); @@ -522,7 +535,7 @@ TEST_F(UserSegmentHistoryRewriterTest, SequenceTest) { segments.mutable_segment(2)->set_key(segments.segment(0).key()); segments.mutable_segment(3)->set_key(segments.segment(0).key()); EXPECT_EQ(segments.history_segments_size(), 3); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate2"); EXPECT_EQ(segments.segment(1).candidate(0).value, "candidate3"); @@ -545,14 +558,15 @@ TEST_F(UserSegmentHistoryRewriterTest, DupTest) { Clock::SetClockForUnitTest(&clock); { + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 1); segments.mutable_segment(0)->move_candidate(4, 0); segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); // restored // 4,0,1,2,3,5,... @@ -562,9 +576,9 @@ TEST_F(UserSegmentHistoryRewriterTest, DupTest) { Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); clock.Advance(absl::Seconds(1)); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); // 3,4,0,1,2,5 EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate3"); @@ -574,9 +588,9 @@ TEST_F(UserSegmentHistoryRewriterTest, DupTest) { Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); clock.Advance(absl::Seconds(1)); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate2"); EXPECT_EQ(segments.segment(0).candidate(1).value, "candidate3"); @@ -592,6 +606,7 @@ TEST_F(UserSegmentHistoryRewriterTest, LearningType) { CreateUserSegmentHistoryRewriter()); { + ConversionRequest convreq = CreateConversionRequest(); rewriter->Clear(); InitSegments(&segments, 1); segments.mutable_segment(0)->move_candidate(2, 0); @@ -600,13 +615,14 @@ TEST_F(UserSegmentHistoryRewriterTest, LearningType) { segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::NO_LEARNING; - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate0"); } { + ConversionRequest convreq = CreateConversionRequest(); rewriter->Clear(); InitSegments(&segments, 1); segments.mutable_segment(0)->move_candidate(2, 0); @@ -615,13 +631,14 @@ TEST_F(UserSegmentHistoryRewriterTest, LearningType) { segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::NO_HISTORY_LEARNING; - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate0"); } { + ConversionRequest convreq = CreateConversionRequest(); rewriter->Clear(); InitSegments(&segments, 1); segments.mutable_segment(0)->move_candidate(2, 0); @@ -630,9 +647,9 @@ TEST_F(UserSegmentHistoryRewriterTest, LearningType) { segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::NO_SUGGEST_LEARNING; - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate2"); } } @@ -644,6 +661,7 @@ TEST_F(UserSegmentHistoryRewriterTest, ContextSensitive) { rewriter->Clear(); { + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 2); segments.mutable_segment(0)->move_candidate(2, 0); segments.mutable_segment(0)->mutable_candidate(0)->attributes |= @@ -651,20 +669,21 @@ TEST_F(UserSegmentHistoryRewriterTest, ContextSensitive) { segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::CONTEXT_SENSITIVE; - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 2); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); // fire if two segments EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate2"); // not fire if single segment InitSegments(&segments, 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate0"); } rewriter->Clear(); { + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 1); segments.mutable_segment(0)->move_candidate(2, 0); segments.mutable_segment(0)->mutable_candidate(0)->attributes |= @@ -672,16 +691,16 @@ TEST_F(UserSegmentHistoryRewriterTest, ContextSensitive) { segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::CONTEXT_SENSITIVE; - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); // fire if even in single segment InitSegments(&segments, 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate2"); // not fire if two segments InitSegments(&segments, 2); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate0"); } } @@ -693,6 +712,7 @@ TEST_F(UserSegmentHistoryRewriterTest, ContentValueLearning) { rewriter->Clear(); { + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 1); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 0, ":all", 0); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 2, ":all", 0); @@ -701,19 +721,19 @@ TEST_F(UserSegmentHistoryRewriterTest, ContentValueLearning) { Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 1); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 0, ":all", 0); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 2, ":all", 0); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); // exact match EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate2:all"); InitSegments(&segments, 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); // content value only: // in both learning/applying phase, lid and suffix are the same @@ -724,7 +744,7 @@ TEST_F(UserSegmentHistoryRewriterTest, ContentValueLearning) { AppendCandidateSuffixWithLid(segments.mutable_segment(0), 0, ":other", 0); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 2, ":other", 0); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate2:other"); } @@ -732,6 +752,7 @@ TEST_F(UserSegmentHistoryRewriterTest, ContentValueLearning) { // In learning phase, lid is different rewriter->Clear(); { + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 1); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 0, ":all", 0); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 2, ":all", 1); @@ -739,15 +760,16 @@ TEST_F(UserSegmentHistoryRewriterTest, ContentValueLearning) { segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate0"); } // In learning phase, suffix (functional value) is different rewriter->Clear(); { + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 1); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 0, "", 0); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 2, ":other", 1); @@ -755,15 +777,16 @@ TEST_F(UserSegmentHistoryRewriterTest, ContentValueLearning) { segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate0"); } // In apply phase, lid is different rewriter->Clear(); { + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 1); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 0, ":all", 0); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 2, ":all", 0); @@ -771,17 +794,18 @@ TEST_F(UserSegmentHistoryRewriterTest, ContentValueLearning) { segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 1); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 0, ":other", 0); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 2, ":other", 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate0:other"); } // In apply phase, suffix (functional value) is different rewriter->Clear(); { + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 1); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 0, ":all", 0); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 2, ":all", 0); @@ -789,11 +813,11 @@ TEST_F(UserSegmentHistoryRewriterTest, ContentValueLearning) { segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 1); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 0, "", 0); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 2, ":other", 0); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate0"); } } @@ -805,6 +829,7 @@ TEST_F(UserSegmentHistoryRewriterTest, ReplaceableTest) { rewriter->Clear(); { + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 2); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 0, ":all", 0); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 2, ":all", 0); @@ -813,22 +838,23 @@ TEST_F(UserSegmentHistoryRewriterTest, ReplaceableTest) { Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 1); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 0, ":all", 0); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 2, ":all", 0); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate2:all"); InitSegments(&segments, 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); } rewriter->Clear(); { + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 1); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 0, ":all", 0); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 2, ":all", 0); @@ -837,22 +863,23 @@ TEST_F(UserSegmentHistoryRewriterTest, ReplaceableTest) { Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 2); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 0, ":all", 0); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 2, ":all", 0); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate2:all"); InitSegments(&segments, 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); } rewriter->Clear(); { + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 2); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 0, ":all", 0); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 2, ":all", 1); @@ -860,16 +887,17 @@ TEST_F(UserSegmentHistoryRewriterTest, ReplaceableTest) { segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 1); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 0, ":all", 0); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 2, ":all", 0); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate0:all"); } rewriter->Clear(); { + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 2); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 0, ":all", 0); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 2, ":all", 0); @@ -877,16 +905,17 @@ TEST_F(UserSegmentHistoryRewriterTest, ReplaceableTest) { segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 1); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 0, ":all", 0); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 2, ":all", 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate0:all"); } rewriter->Clear(); { + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 1); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 0, ":all", 0); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 2, ":all", 1); @@ -894,16 +923,17 @@ TEST_F(UserSegmentHistoryRewriterTest, ReplaceableTest) { segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 2); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 0, ":all", 0); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 2, ":all", 0); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate0:all"); } rewriter->Clear(); { + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 1); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 0, ":all", 0); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 2, ":all", 0); @@ -911,11 +941,11 @@ TEST_F(UserSegmentHistoryRewriterTest, ReplaceableTest) { segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 2); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 0, ":all", 0); AppendCandidateSuffixWithLid(segments.mutable_segment(0), 2, ":all", 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate0:all"); } } @@ -927,6 +957,7 @@ TEST_F(UserSegmentHistoryRewriterTest, NotReplaceableForDifferentId) { rewriter->Clear(); { + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 2); AppendCandidateSuffix(segments.mutable_segment(0), 0, ":all", 1, 1); AppendCandidateSuffix(segments.mutable_segment(0), 2, ":all", 200, 300); @@ -935,7 +966,7 @@ TEST_F(UserSegmentHistoryRewriterTest, NotReplaceableForDifferentId) { Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 2); AppendCandidateSuffix(segments.mutable_segment(0), 0, ":all", 1, 1); @@ -943,7 +974,7 @@ TEST_F(UserSegmentHistoryRewriterTest, NotReplaceableForDifferentId) { segments.mutable_segment(1)->mutable_candidate(0)->value = "not_same_as_before"; - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_NE(segments.segment(0).candidate(0).value, "candidate2:all"); } @@ -956,6 +987,7 @@ TEST_F(UserSegmentHistoryRewriterTest, ReplaceableForSameId) { rewriter->Clear(); { + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 2); AppendCandidateSuffix(segments.mutable_segment(0), 0, ":all", 1, 1); AppendCandidateSuffix(segments.mutable_segment(0), 2, ":all", 1, 1); @@ -964,7 +996,7 @@ TEST_F(UserSegmentHistoryRewriterTest, ReplaceableForSameId) { Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 2); AppendCandidateSuffix(segments.mutable_segment(0), 0, ":all", 1, 1); @@ -972,7 +1004,7 @@ TEST_F(UserSegmentHistoryRewriterTest, ReplaceableForSameId) { segments.mutable_segment(1)->mutable_candidate(0)->value = "not_same_as_before"; - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate2:all"); } @@ -985,6 +1017,7 @@ TEST_F(UserSegmentHistoryRewriterTest, ReplaceableT13NTest) { rewriter->Clear(); { + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 2); AppendCandidateSuffix(segments.mutable_segment(0), 0, ":all", 1, 1); // Prepare candidate2 as T13N candidate. @@ -994,7 +1027,7 @@ TEST_F(UserSegmentHistoryRewriterTest, ReplaceableT13NTest) { Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 2); AppendCandidateSuffix(segments.mutable_segment(0), 0, ":all", 1, 1); @@ -1002,7 +1035,7 @@ TEST_F(UserSegmentHistoryRewriterTest, ReplaceableT13NTest) { segments.mutable_segment(1)->mutable_candidate(0)->value = "not_same_as_before"; - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate2:all"); } @@ -1022,6 +1055,7 @@ TEST_F(UserSegmentHistoryRewriterTest, ReplaceableT13NTest) { c->rid = 10; } }; + ConversionRequest convreq = CreateConversionRequest(); set_up_segments(); segments.mutable_segment(0)->move_candidate(2, 0); @@ -1029,13 +1063,13 @@ TEST_F(UserSegmentHistoryRewriterTest, ReplaceableT13NTest) { Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); set_up_segments(); segments.mutable_segment(1)->mutable_candidate(0)->value = "not_same_as_before"; - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "ひらがな"); } @@ -1049,6 +1083,7 @@ TEST_F(UserSegmentHistoryRewriterTest, LeftRightNumber) { rewriter->Clear(); { + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 2); segments.mutable_segment(0)->mutable_candidate(0)->value = "1234"; @@ -1058,19 +1093,20 @@ TEST_F(UserSegmentHistoryRewriterTest, LeftRightNumber) { segments.mutable_segment(1)->mutable_candidate(0)->attributes |= Segment::Candidate::CONTEXT_SENSITIVE; segments.mutable_segment(1)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "1234"); EXPECT_EQ(segments.segment(1).candidate(0).value, "candidate2"); InitSegments(&segments, 2); // different num. segments.mutable_segment(0)->mutable_candidate(0)->value = "5678"; - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "5678"); EXPECT_EQ(segments.segment(1).candidate(0).value, "candidate2"); } { + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 2); segments.mutable_segment(1)->mutable_candidate(0)->value = "1234"; @@ -1080,14 +1116,14 @@ TEST_F(UserSegmentHistoryRewriterTest, LeftRightNumber) { segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::CONTEXT_SENSITIVE; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate2"); EXPECT_EQ(segments.segment(1).candidate(0).value, "1234"); InitSegments(&segments, 2); // different num. segments.mutable_segment(1)->mutable_candidate(0)->value = "5678"; - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate2"); EXPECT_EQ(segments.segment(1).candidate(0).value, "5678"); } @@ -1101,6 +1137,7 @@ TEST_F(UserSegmentHistoryRewriterTest, BacketMatching) { rewriter->Clear(); { + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 1); Segment::Candidate *candidate = segments.mutable_segment(0)->insert_candidate(2); @@ -1111,10 +1148,11 @@ TEST_F(UserSegmentHistoryRewriterTest, BacketMatching) { segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); } { + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 1); Segment::Candidate *candidate = segments.mutable_segment(0)->insert_candidate(2); @@ -1122,7 +1160,7 @@ TEST_F(UserSegmentHistoryRewriterTest, BacketMatching) { candidate->content_value = ")"; candidate->content_key = ")"; - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, ")"); } @@ -1137,6 +1175,7 @@ TEST_F(UserSegmentHistoryRewriterTest, MultipleLearning) { rewriter->Clear(); { + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 1); segments.mutable_segment(0)->set_key("key1"); Segment::Candidate *candidate = @@ -1148,10 +1187,11 @@ TEST_F(UserSegmentHistoryRewriterTest, MultipleLearning) { segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); } { + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 1); segments.mutable_segment(0)->set_key("key2"); Segment::Candidate *candidate = @@ -1163,10 +1203,11 @@ TEST_F(UserSegmentHistoryRewriterTest, MultipleLearning) { segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); } { + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 1); segments.mutable_segment(0)->set_key("key1"); Segment::Candidate *candidate = @@ -1179,7 +1220,7 @@ TEST_F(UserSegmentHistoryRewriterTest, MultipleLearning) { candidate->content_value = "value1"; candidate->content_key = "key1"; - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "value1"); } @@ -1194,6 +1235,7 @@ TEST_F(UserSegmentHistoryRewriterTest, NumberSpecial) { rewriter->Clear(); { + ConversionRequest convreq = CreateConversionRequest(); segments.Clear(); segments.add_segment(); segments.mutable_segment(0)->set_key("12"); @@ -1208,10 +1250,11 @@ TEST_F(UserSegmentHistoryRewriterTest, NumberSpecial) { segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); } { + ConversionRequest convreq = CreateConversionRequest(); segments.Clear(); segments.add_segment(); segments.mutable_segment(0)->set_key("14"); @@ -1224,8 +1267,8 @@ TEST_F(UserSegmentHistoryRewriterTest, NumberSpecial) { candidate->lid = pos_matcher().GetNumberId(); candidate->rid = pos_matcher().GetNumberId(); } - EXPECT_TRUE(number_rewriter->Rewrite(*convreq_, &segments)); - rewriter->Rewrite(*convreq_, &segments); + EXPECT_TRUE(number_rewriter->Rewrite(convreq, &segments)); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "⑭"); } @@ -1241,6 +1284,7 @@ TEST_F(UserSegmentHistoryRewriterTest, NumberHalfWidth) { rewriter->Clear(); { + ConversionRequest convreq = CreateConversionRequest(); segments.Clear(); segments.add_segment(); segments.mutable_segment(0)->set_key("1234"); @@ -1254,10 +1298,11 @@ TEST_F(UserSegmentHistoryRewriterTest, NumberHalfWidth) { candidate->style = NumberUtil::NumberString::NUMBER_SEPARATED_ARABIC_FULLWIDTH; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); // full-width for separated number + rewriter->Finish(convreq, &segments); // full-width for separated number } { + ConversionRequest convreq = CreateConversionRequest(); segments.Clear(); segments.add_segment(); segments.mutable_segment(0)->set_key("1234"); @@ -1271,8 +1316,8 @@ TEST_F(UserSegmentHistoryRewriterTest, NumberHalfWidth) { candidate->rid = pos_matcher().GetNumberId(); } - EXPECT_TRUE(number_rewriter->Rewrite(*convreq_, &segments)); - rewriter->Rewrite(*convreq_, &segments); + EXPECT_TRUE(number_rewriter->Rewrite(convreq, &segments)); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ("1,234", segments.segment(0).candidate(0).value); } @@ -1288,6 +1333,7 @@ TEST_F(UserSegmentHistoryRewriterTest, NumberFullWidth) { rewriter->Clear(); { + ConversionRequest convreq = CreateConversionRequest(); segments.Clear(); segments.add_segment(); segments.mutable_segment(0)->set_key("1234"); @@ -1301,10 +1347,11 @@ TEST_F(UserSegmentHistoryRewriterTest, NumberFullWidth) { candidate->style = NumberUtil::NumberString::NUMBER_SEPARATED_ARABIC_HALFWIDTH; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); // half-width for separated number + rewriter->Finish(convreq, &segments); // half-width for separated number } { + ConversionRequest convreq = CreateConversionRequest(); segments.Clear(); segments.add_segment(); { @@ -1317,8 +1364,8 @@ TEST_F(UserSegmentHistoryRewriterTest, NumberFullWidth) { candidate->lid = pos_matcher().GetNumberId(); candidate->rid = pos_matcher().GetNumberId(); } - EXPECT_TRUE(number_rewriter->Rewrite(*convreq_, &segments)); - rewriter->Rewrite(*convreq_, &segments); + EXPECT_TRUE(number_rewriter->Rewrite(convreq, &segments)); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "1,234"); } @@ -1344,7 +1391,8 @@ INSTANTIATE_TEST_SUITE_P( TEST_P(UserSegmentHistoryNumberTest, UserSegmentHistoryRewriterTest) { const commands::Request request = GetParam(); - convreq_->set_request(&request); + ConversionRequest convreq = CreateConversionRequest(); + convreq.set_request(&request); SetNumberForm(Config::FULL_WIDTH); Segments segments; @@ -1368,7 +1416,7 @@ TEST_P(UserSegmentHistoryNumberTest, UserSegmentHistoryRewriterTest) { candidate->style = NumberUtil::NumberString::NUMBER_SEPARATED_ARABIC_HALFWIDTH; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); // half-width for separated number + rewriter->Finish(convreq, &segments); // half-width for separated number } { @@ -1385,8 +1433,8 @@ TEST_P(UserSegmentHistoryNumberTest, UserSegmentHistoryRewriterTest) { candidate->lid = pos_matcher().GetNumberId(); candidate->rid = pos_matcher().GetNumberId(); } - EXPECT_TRUE(number_rewriter->Rewrite(*convreq_, &segments)); - rewriter->Rewrite(*convreq_, &segments); + EXPECT_TRUE(number_rewriter->Rewrite(convreq, &segments)); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "1234"); } @@ -1402,6 +1450,7 @@ TEST_F(UserSegmentHistoryRewriterTest, NumberNoSeparated) { rewriter->Clear(); { + ConversionRequest convreq = CreateConversionRequest(); segments.Clear(); segments.add_segment(); segments.mutable_segment(0)->set_key("10"); @@ -1414,9 +1463,10 @@ TEST_F(UserSegmentHistoryRewriterTest, NumberNoSeparated) { candidate->rid = pos_matcher().GetNumberId(); candidate->style = NumberUtil::NumberString::NUMBER_KANJI; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); // learn kanji + rewriter->Finish(convreq, &segments); // learn kanji } { + ConversionRequest convreq = CreateConversionRequest(); segments.Clear(); segments.add_segment(); segments.mutable_segment(0)->set_key("1234"); @@ -1430,10 +1480,11 @@ TEST_F(UserSegmentHistoryRewriterTest, NumberNoSeparated) { candidate->style = NumberUtil::NumberString::NUMBER_SEPARATED_ARABIC_HALFWIDTH; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); // learn kanji + rewriter->Finish(convreq, &segments); // learn kanji } { + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 1); segments.mutable_segment(0)->set_key("9"); { @@ -1445,8 +1496,8 @@ TEST_F(UserSegmentHistoryRewriterTest, NumberNoSeparated) { candidate->lid = pos_matcher().GetNumberId(); candidate->rid = pos_matcher().GetNumberId(); } - EXPECT_TRUE(number_rewriter->Rewrite(*convreq_, &segments)); - rewriter->Rewrite(*convreq_, &segments); + EXPECT_TRUE(number_rewriter->Rewrite(convreq, &segments)); + rewriter->Rewrite(convreq, &segments); // 9, not "九" EXPECT_EQ(segments.segment(0).candidate(0).value, "9"); @@ -1463,15 +1514,16 @@ TEST_F(UserSegmentHistoryRewriterTest, Regression2459519) { ClockMock clock(absl::UnixEpoch()); Clock::SetClockForUnitTest(&clock); + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 1); segments.mutable_segment(0)->move_candidate(2, 0); segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate2"); EXPECT_EQ(segments.segment(0).candidate(1).value, "candidate0"); @@ -1480,10 +1532,10 @@ TEST_F(UserSegmentHistoryRewriterTest, Regression2459519) { Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); clock.Advance(absl::Seconds(1)); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate0"); EXPECT_EQ(segments.segment(0).candidate(1).value, "candidate2"); @@ -1492,10 +1544,10 @@ TEST_F(UserSegmentHistoryRewriterTest, Regression2459519) { Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); clock.Advance(absl::Seconds(1)); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate2"); EXPECT_EQ(segments.segment(0).candidate(1).value, "candidate0"); @@ -1509,6 +1561,7 @@ TEST_F(UserSegmentHistoryRewriterTest, Regression2459520) { rewriter->Clear(); + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 2); segments.mutable_segment(0)->move_candidate(2, 0); segments.mutable_segment(0)->mutable_candidate(0)->attributes |= @@ -1519,10 +1572,10 @@ TEST_F(UserSegmentHistoryRewriterTest, Regression2459520) { segments.mutable_segment(1)->mutable_candidate(0)->attributes |= Segment::Candidate::RERANKED; segments.mutable_segment(1)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 2); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate2"); EXPECT_EQ(segments.segment(1).candidate(0).value, "candidate3"); } @@ -1536,6 +1589,7 @@ TEST_F(UserSegmentHistoryRewriterTest, PuntuationsTest) { rewriter->Clear(); + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 2); segments.mutable_segment(1)->set_key("."); for (int i = 1; i < kCandidatesSize; ++i) { @@ -1547,7 +1601,7 @@ TEST_F(UserSegmentHistoryRewriterTest, PuntuationsTest) { segments.mutable_segment(1)->mutable_candidate(0)->attributes |= Segment::Candidate::RERANKED; segments.mutable_segment(1)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 2); segments.mutable_segment(1)->set_key("."); @@ -1558,7 +1612,7 @@ TEST_F(UserSegmentHistoryRewriterTest, PuntuationsTest) { } // Punctuation is not remembered - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(1).candidate(0).value, "candidate0"); } @@ -1568,14 +1622,15 @@ TEST_F(UserSegmentHistoryRewriterTest, Regression3264619) { CreateUserSegmentHistoryRewriter()); // Too big candidates + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 2, 1024); segments.mutable_segment(0)->move_candidate(512, 0); segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 2, 1024); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, "candidate512"); EXPECT_EQ(segments.segment(1).candidate(0).value, "candidate0"); @@ -1592,6 +1647,7 @@ TEST_F(UserSegmentHistoryRewriterTest, RandomTest) { rewriter->Clear(); absl::BitGen gen; for (int i = 0; i < 5; ++i) { + ConversionRequest convreq = CreateConversionRequest(); InitSegments(&segments, 1); const int n = absl::Uniform(gen, 0, 10); const std::string expected = segments.segment(0).candidate(n).value; @@ -1600,9 +1656,9 @@ TEST_F(UserSegmentHistoryRewriterTest, RandomTest) { Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); EXPECT_EQ(segments.segment(0).candidate(0).value, expected); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); InitSegments(&segments, 1); - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).value, expected); clock.Advance(absl::Seconds(1)); // update LRU timer } @@ -1616,6 +1672,7 @@ TEST_F(UserSegmentHistoryRewriterTest, AnnotationAfterLearning) { CreateUserSegmentHistoryRewriter()); { + ConversionRequest convreq = CreateConversionRequest(); segments.Clear(); InitSegments(&segments, 1, 2); segments.mutable_segment(0)->set_key("abc"); @@ -1629,10 +1686,11 @@ TEST_F(UserSegmentHistoryRewriterTest, AnnotationAfterLearning) { segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); } { + ConversionRequest convreq = CreateConversionRequest(); segments.Clear(); InitSegments(&segments, 1, 2); segments.mutable_segment(0)->set_key("abc"); @@ -1643,12 +1701,12 @@ TEST_F(UserSegmentHistoryRewriterTest, AnnotationAfterLearning) { candidate->content_key = "abc"; candidate->description = "[全]アルファベット"; candidate->content_key = "abc"; - rewriter->Rewrite(*convreq_, &segments); + rewriter->Rewrite(convreq, &segments); EXPECT_EQ(segments.segment(0).candidate(0).content_value, "abc"); // "アルファベット" EXPECT_EQ(VariantsRewriter::kAlphabet, segments.segment(0).candidate(0).description); - rewriter->Finish(*convreq_, &segments); + rewriter->Finish(convreq, &segments); } } @@ -1725,7 +1783,8 @@ TEST_F(UserSegmentHistoryRewriterTest, SupportInnerSegmentsOnLearning) { Segment::FIXED_VALUE); } - rewriter->Finish(*convreq_, &segments); + ConversionRequest convreq = CreateConversionRequest(); + rewriter->Finish(convreq, &segments); } { @@ -1745,7 +1804,8 @@ TEST_F(UserSegmentHistoryRewriterTest, SupportInnerSegmentsOnLearning) { candidate->content_key = "なかの"; candidate->content_key = "なかの"; - EXPECT_TRUE(rewriter->Rewrite(*convreq_, &segments)); + ConversionRequest convreq = CreateConversionRequest(); + EXPECT_TRUE(rewriter->Rewrite(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "中野"); } } @@ -1767,7 +1827,8 @@ TEST_F(UserSegmentHistoryRewriterTest, Revert) { segments.mutable_segment(0)->mutable_candidate(0)->attributes |= Segment::Candidate::RERANKED; segments.mutable_segment(0)->set_segment_type(Segment::FIXED_VALUE); - rewriter->Finish(*convreq_, &segments); + ConversionRequest convreq = CreateConversionRequest(); + rewriter->Finish(convreq, &segments); } rewriter->Revert(&segments); @@ -1782,7 +1843,8 @@ TEST_F(UserSegmentHistoryRewriterTest, Revert) { candidate->content_value = "abc"; candidate->content_key = "abc"; candidate->content_key = "abc"; - EXPECT_FALSE(rewriter->Rewrite(*convreq_, &segments)); + ConversionRequest convreq = CreateConversionRequest(); + EXPECT_FALSE(rewriter->Rewrite(convreq, &segments)); } }