From 75da2f6866e622be9caa16cc73a4833e67444f55 Mon Sep 17 00:00:00 2001 From: Hiroyuki Komatsu Date: Wed, 9 Oct 2024 06:20:32 +0000 Subject: [PATCH 1/5] Remove convreq_ from predictor_test.cc #codehealth PiperOrigin-RevId: 683902627 --- src/prediction/predictor_test.cc | 98 +++++++++++++++++++------------- 1 file changed, 60 insertions(+), 38 deletions(-) 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); From db46f7e559c8a99628c6a875fb1dff677fcd8b13 Mon Sep 17 00:00:00 2001 From: Hiroyuki Komatsu Date: Wed, 9 Oct 2024 06:22:25 +0000 Subject: [PATCH 2/5] Replace the `convreq_` instance variable with a local variable in each test. * Modify SetUpInputFor* methods to return ConversionRequest. * This is a preparation to remove Composer from ConversionRequest. #codehealth PiperOrigin-RevId: 683903128 --- src/prediction/user_history_predictor_test.cc | 1565 +++++++++-------- 1 file changed, 833 insertions(+), 732 deletions(-) diff --git a/src/prediction/user_history_predictor_test.cc b/src/prediction/user_history_predictor_test.cc index ddca47254..5d3d39e0a 100644 --- a/src/prediction/user_history_predictor_test.cc +++ b/src/prediction/user_history_predictor_test.cc @@ -105,11 +105,6 @@ class UserHistoryPredictorTest : public testing::TestWithTempUserProfile { 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); data_and_predictor_ = CreateDataAndPredictor(); mozc::usage_stats::UsageStats::ClearAllStatsForTest(); @@ -119,6 +114,14 @@ class UserHistoryPredictorTest : public testing::TestWithTempUserProfile { mozc::usage_stats::UsageStats::ClearAllStatsForTest(); } + ConversionRequest CreateConversionRequest() const { + ConversionRequest convreq(composer_.get(), request_.get(), &context_, + config_.get()); + 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 +146,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 +156,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 +264,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 +299,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 +362,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 +375,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) { @@ -419,9 +403,9 @@ class UserHistoryPredictorTest : public testing::TestWithTempUserProfile { std::unique_ptr composer_; std::unique_ptr table_; - std::unique_ptr convreq_; std::unique_ptr config_; std::unique_ptr request_; + commands::Context context_; private: struct DataAndPredictor { @@ -451,37 +435,39 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorTest) { // Nothing happen { Segments segments; - SetUpInputForSuggestion("てすと", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("てすと", composer_.get(), &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_.get(), &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_.get(), &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_.get(), &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_.get(), &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); @@ -495,16 +481,18 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorTest) { config_->set_history_learning_level(level); Segments segments; - SetUpInputForSuggestion("こんにちはさようなら", composer_.get(), - &segments); + ConversionRequest convreq = SetUpInputForSuggestion( + "こんにちはさようなら", composer_.get(), &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_.get(), &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); + convreq = + SetUpInputForSuggestion("こんにちは", composer_.get(), &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } config_->set_history_learning_level(config::Config::DEFAULT_HISTORY); } @@ -525,66 +513,73 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorTest) { Segments segments; config_->set_use_history_suggest(false); - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("わたしの", composer_.get(), &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); config_->set_use_history_suggest(true); config_->set_incognito_mode(true); - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("わたしの", composer_.get(), &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); 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_.get(), &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } // turn on - { config::ConfigHandler::GetDefaultConfig(config_.get()); } + { + config::ConfigHandler::GetDefaultConfig(config_.get()); + } // reproduced - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("わたしの", composer_.get(), &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_.get(), &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_.get(), &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_.get(), &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_.get(), + &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("こんにちはさようなら", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("こんにちはさようなら", composer_.get(), + &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)); + ConversionRequest convreq = + SetUpInputForSuggestion("わたしの", composer_.get(), &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_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); config_->set_history_learning_level(config::Config::DEFAULT_HISTORY); } @@ -601,11 +596,12 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorTest) { Segments segments; // reproduced - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("わたしの", composer_.get(), &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("わたしの", composer_.get(), &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } // nothing happen @@ -615,11 +611,12 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorTest) { Segments segments; // reproduced - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("わたしの", composer_.get(), &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("わたしの", composer_.get(), &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } } @@ -633,31 +630,35 @@ TEST_F(UserHistoryPredictorTest, RemoveUnselectedHistoryPrediction) { auto insert_target = [&]() { Segments segments; - SetUpInputForPrediction("わたしの", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForPrediction("わたしの", composer_.get(), &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_.get(), &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_.get(), &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_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("私の", segments)); auto find = FindCandidateByValue("わたしの", segments); if (!find) { @@ -666,14 +667,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_.get(), &segments); + predictor->PredictForRequest(convreq, &segments); + predictor->Finish(convreq, &segments); }; { @@ -720,11 +722,12 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorTestSuggestion) { // Register input histories via Finish method. { Segments segments; - SetUpInputForSuggestion("かまた", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForSuggestion("かまた", composer_.get(), &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 +744,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_.get(), &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 +766,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_.get(), &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_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); // Preprocessed value should be learned. EXPECT_TRUE(FindCandidateByValue("android", segments)); EXPECT_FALSE(FindCandidateByValue("android ", segments)); @@ -791,20 +797,20 @@ TEST_F(UserHistoryPredictorTest, DescriptionTest) { // Insert two items { Segments segments; - SetUpInputForConversion("わたしのなまえはなかのです", composer_.get(), - &segments); + ConversionRequest convreq = SetUpInputForConversion( + "わたしのなまえはなかのです", composer_.get(), &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_.get(), &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_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); EXPECT_EQ(segments.segment(0).candidate(0).description, kDescription); } @@ -825,14 +831,15 @@ TEST_F(UserHistoryPredictorTest, DescriptionTest) { config_->set_use_history_suggest(false); WaitForSyncer(predictor); - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("わたしの", composer_.get(), &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); config_->set_use_history_suggest(true); config_->set_incognito_mode(true); - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("わたしの", composer_.get(), &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } // turn on @@ -842,29 +849,30 @@ TEST_F(UserHistoryPredictorTest, DescriptionTest) { } // reproduced - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("わたしの", composer_.get(), &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_.get(), &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_.get(), &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_.get(), &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 +888,12 @@ TEST_F(UserHistoryPredictorTest, DescriptionTest) { Segments segments; // reproduced - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("わたしの", composer_.get(), &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); - SetUpInputForPrediction("わたしの", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForPrediction("わたしの", composer_.get(), &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } // nothing happen @@ -894,11 +903,12 @@ TEST_F(UserHistoryPredictorTest, DescriptionTest) { Segments segments; // reproduced - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("わたしの", composer_.get(), &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); - SetUpInputForPrediction("わたしの", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForPrediction("わたしの", composer_.get(), &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } } @@ -908,19 +918,20 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorUnusedHistoryTest) { WaitForSyncer(predictor); Segments segments; - SetUpInputForSuggestion("わたしのなまえはなかのです", composer_.get(), - &segments); + ConversionRequest convreq = SetUpInputForSuggestion( + "わたしのなまえはなかのです", composer_.get(), &segments); AddCandidate("私の名前は中野です", &segments); // once - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); segments.Clear(); - SetUpInputForConversion("ひろすえりょうこ", composer_.get(), &segments); + convreq = + SetUpInputForConversion("ひろすえりょうこ", composer_.get(), &segments); AddCandidate("広末涼子", &segments); // conversion - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); // sync predictor->Sync(); @@ -931,26 +942,27 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorUnusedHistoryTest) { WaitForSyncer(predictor); Segments segments; - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("わたしの", composer_.get(), &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_.get(), &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_.get(), &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_.get(), &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); predictor->Sync(); } @@ -960,13 +972,14 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorUnusedHistoryTest) { WaitForSyncer(predictor); Segments segments; - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("わたしの", composer_.get(), &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_.get(), &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } } @@ -974,27 +987,27 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorRevertTest) { UserHistoryPredictor *predictor = GetUserHistoryPredictorWithClearedHistory(); Segments segments, segments2; - SetUpInputForConversion("わたしのなまえはなかのです", composer_.get(), - &segments); + ConversionRequest convreq = SetUpInputForConversion( + "わたしのなまえはなかのです", composer_.get(), &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_.get(), &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_.get(), &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 +1018,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_.get(), &segments); AddCandidate("テストテスト", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } predictor->ClearAllHistory(); @@ -1016,20 +1030,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_.get(), &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_.get(), &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("testte", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("testte", composer_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); } } @@ -1038,27 +1054,27 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorTrailingPunctuation) { Segments segments; - SetUpInputForConversion("わたしのなまえはなかのです", composer_.get(), - &segments); + ConversionRequest convreq = SetUpInputForConversion( + "わたしのなまえはなかのです", composer_.get(), &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_.get(), &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_.get(), &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, "私の名前は中野です。"); @@ -1069,16 +1085,17 @@ TEST_F(UserHistoryPredictorTest, TrailingPunctuationMobile) { request_test_util::FillMobileRequest(request_.get()); Segments segments; - SetUpInputForConversion("です。", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("です。", composer_.get(), &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_.get(), &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } TEST_F(UserHistoryPredictorTest, HistoryToPunctuation) { @@ -1088,18 +1105,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_.get(), &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_.get(), &segments); // "あ" + ASSERT_TRUE(predictor->PredictForRequest(convreq, &segments)) << segments.DebugString(); EXPECT_EQ(segments.segment(0).candidate(0).value, "亜"); @@ -1107,36 +1125,37 @@ 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_.get(), &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_.get(), &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_.get(), &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_.get(), &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 +1166,26 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorPrecedingPunctuation) { Segments segments; - SetUpInputForConversion("。", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("。", composer_.get(), &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_.get(), &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_.get(), &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 +1213,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_.get(), &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_.get(), &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_.get(), &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_.get(), &segments); + EXPECT_EQ(predictor->PredictForRequest(convreq, &segments), kTestCases[i].expected_result) << "Predict from " << first_char; } @@ -1241,42 +1264,44 @@ TEST_F(UserHistoryPredictorTest, ZeroQuerySuggestionTest) { // No history segments segments.Clear(); - SetUpInputForSuggestion("", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + ConversionRequest convreq = + SetUpInputForSuggestion("", composer_.get(), &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); { segments.Clear(); - SetUpInputForConversion("たろうは", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("たろうは", composer_.get(), &segments); AddCandidate(0, "太郎は", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); - SetUpInputForConversionWithHistory("はなこに", "たろうは", "太郎は", - composer_.get(), &segments); + convreq = SetUpInputForConversionWithHistory( + "はなこに", "たろうは", "太郎は", composer_.get(), &segments); AddCandidate(1, "花子に", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); - SetUpInputForConversionWithHistory("きょうと", "たろうは", "太郎は", - composer_.get(), &segments); + convreq = SetUpInputForConversionWithHistory( + "きょうと", "たろうは", "太郎は", composer_.get(), &segments); AddCandidate(1, "京都", &segments); absl::SleepFor(absl::Seconds(2)); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); - SetUpInputForConversionWithHistory("おおさか", "たろうは", "太郎は", - composer_.get(), &segments); + convreq = SetUpInputForConversionWithHistory( + "おおさか", "たろうは", "太郎は", composer_.get(), &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_.get(), &segments); EXPECT_FALSE(predictor->PredictForRequest(non_zero_query_conversion_request, &segments)); - SetUpInputForSuggestionWithHistory("", "たろうは", "太郎は", - composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestionWithHistory("", "たろうは", "太郎は", + composer_.get(), &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 +1310,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_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); } } @@ -1296,34 +1321,36 @@ TEST_F(UserHistoryPredictorTest, ZeroQuerySuggestionTest) { { segments.Clear(); - SetUpInputForConversion("たろうは", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("たろうは", composer_.get(), &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_.get(), &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 +1359,84 @@ TEST_F(UserHistoryPredictorTest, MultiSegmentsMultiInput) { Segments segments; - SetUpInputForConversion("たろうは", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("たろうは", composer_.get(), &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_.get(), &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("たろうは", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("たろうは", composer_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("ろうは", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("ろうは", composer_.get(), &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("たろうははな", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("たろうははな", composer_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("はなこにむ", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("はなこにむ", composer_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("むずかし", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("むずかし", composer_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("はなこにむずかしいほ", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("はなこにむずかしいほ", composer_.get(), + &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("ほんをよま", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("ほんをよま", composer_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); absl::SleepFor(absl::Seconds(1)); // Add new entry "たろうはよしこに/太郎は良子に" segments.Clear(); - SetUpInputForConversion("たろうは", composer_.get(), &segments); + convreq = SetUpInputForConversion("たろうは", composer_.get(), &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_.get(), &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 +1447,74 @@ TEST_F(UserHistoryPredictorTest, MultiSegmentsSingleInput) { Segments segments; - SetUpInputForConversion("たろうは", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("たろうは", composer_.get(), &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_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("た", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("た", composer_.get(), &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("たろうははな", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("たろうははな", composer_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("ろうははな", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("ろうははな", composer_.get(), &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("はなこにむ", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("はなこにむ", composer_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("むずかし", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("むずかし", composer_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("はなこにむずかしいほ", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("はなこにむずかしいほ", composer_.get(), + &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("ほんをよま", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("ほんをよま", composer_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); absl::SleepFor(absl::Seconds(1)); // Add new entry "たろうはよしこに/太郎は良子に" segments.Clear(); - SetUpInputForConversion("たろうは", composer_.get(), &segments); + convreq = SetUpInputForConversion("たろうは", composer_.get(), &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_.get(), &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 +1525,44 @@ TEST_F(UserHistoryPredictorTest, Regression2843371Case1) { Segments segments; - SetUpInputForConversion("とうきょうは", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("とうきょうは", composer_.get(), &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_.get(), &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_.get(), &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 +1574,51 @@ TEST_F(UserHistoryPredictorTest, Regression2843371Case2) { Segments segments; - SetUpInputForConversion("えど", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("えど", composer_.get(), &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_.get(), &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 +1630,55 @@ TEST_F(UserHistoryPredictorTest, Regression2843371Case3) { Segments segments; - SetUpInputForConversion("「", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("「", composer_.get(), &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_.get(), &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_.get(), &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 +1690,19 @@ TEST_F(UserHistoryPredictorTest, Regression2843775) { Segments segments; - SetUpInputForConversion("そうです", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("そうです", composer_.get(), &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_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "そうです。よろしくお願いします"); @@ -1679,36 +1715,37 @@ TEST_F(UserHistoryPredictorTest, DuplicateString) { Segments segments; - SetUpInputForConversion("らいおん", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("らいおん", composer_.get(), &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_.get(), &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 +1754,8 @@ TEST_F(UserHistoryPredictorTest, DuplicateString) { segments.Clear(); - SetUpInputForSuggestion("らいおん", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("らいおん", composer_.get(), &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 +1807,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_.get(), &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_.get(), &segments); + predictor->PredictForRequest(convreq, &segments); break; + } default: break; } @@ -2212,9 +2253,10 @@ TEST_F(UserHistoryPredictorTest, PrivacySensitiveTest) { // Initial commit. { Segments segments; - SetUpInputForConversion(input, composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion(input, composer_.get(), &segments); AddCandidate(0, output, &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } // TODO(yukawa): Refactor the scenario runner below by making @@ -2223,21 +2265,22 @@ TEST_F(UserHistoryPredictorTest, PrivacySensitiveTest) { // Check suggestion { Segments segments; - SetUpInputForSuggestion(partial_input, composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForSuggestion(partial_input, composer_.get(), &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_.get(), &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 +2288,22 @@ TEST_F(UserHistoryPredictorTest, PrivacySensitiveTest) { // Check Prediction { Segments segments; - SetUpInputForPrediction(partial_input, composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForPrediction(partial_input, composer_.get(), &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_.get(), &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 +2319,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_.get(), &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_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForSuggestion("123abc!", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("123abc!", composer_.get(), &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_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - SetUpInputForPrediction("123abc!", composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForPrediction("123abc!", composer_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); } } @@ -2499,29 +2546,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); 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) { @@ -2805,12 +2849,12 @@ TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegmentsRoman) { composer_->SetTable(table_.get()); Segments segments; - InitSegmentsFromInputSequence("gu-g", composer_.get(), convreq_.get(), - &segments); + ConversionRequest convreq = CreateConversionRequest(); + InitSegmentsFromInputSequence("gu-g", composer_.get(), &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, "ぐー"); @@ -2831,13 +2875,13 @@ TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegmentsRomanRandom) { for (size_t i = 0; i < 1000; ++i) { composer_->Reset(); const std::string input = random.Utf8StringRandomLen(4, ' ', '~'); - InitSegmentsFromInputSequence(input, composer_.get(), convreq_.get(), - &segments); + ConversionRequest convreq = CreateConversionRequest(); + InitSegmentsFromInputSequence(input, composer_.get(), &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); } } @@ -2849,13 +2893,13 @@ TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegmentsShouldNotCrash) { Segments segments; { - InitSegmentsFromInputSequence("8,+", composer_.get(), convreq_.get(), - &segments); + ConversionRequest convreq = CreateConversionRequest(); + InitSegmentsFromInputSequence("8,+", composer_.get(), &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); } } @@ -2865,13 +2909,13 @@ TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegmentsRomanN) { Segments segments; { - InitSegmentsFromInputSequence("n", composer_.get(), convreq_.get(), - &segments); + ConversionRequest convreq = CreateConversionRequest(); + InitSegmentsFromInputSequence("n", composer_.get(), &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); @@ -2886,13 +2930,13 @@ TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegmentsRomanN) { composer_->Reset(); segments.Clear(); { - InitSegmentsFromInputSequence("nn", composer_.get(), convreq_.get(), - &segments); + ConversionRequest convreq = CreateConversionRequest(); + InitSegmentsFromInputSequence("nn", composer_.get(), &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); @@ -2901,13 +2945,13 @@ TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegmentsRomanN) { composer_->Reset(); segments.Clear(); { - InitSegmentsFromInputSequence("n'", composer_.get(), convreq_.get(), - &segments); + ConversionRequest convreq = CreateConversionRequest(); + InitSegmentsFromInputSequence("n'", composer_.get(), &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); @@ -2916,13 +2960,13 @@ TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegmentsRomanN) { composer_->Reset(); segments.Clear(); { - InitSegmentsFromInputSequence("n'n", composer_.get(), convreq_.get(), - &segments); + ConversionRequest convreq = CreateConversionRequest(); + InitSegmentsFromInputSequence("n'n", composer_.get(), &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); @@ -2941,13 +2985,13 @@ TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegmentsFlickN) { Segments segments; { - InitSegmentsFromInputSequence("/", composer_.get(), convreq_.get(), - &segments); + ConversionRequest convreq = CreateConversionRequest(); + InitSegmentsFromInputSequence("/", composer_.get(), &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); @@ -2966,13 +3010,13 @@ TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegments12KeyN) { Segments segments; { - InitSegmentsFromInputSequence("わ00", composer_.get(), convreq_.get(), - &segments); + ConversionRequest convreq = CreateConversionRequest(); + InitSegmentsFromInputSequence("わ00", composer_.get(), &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); @@ -2990,15 +3034,15 @@ TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegmentsKana) { composer_->SetTable(table_.get()); Segments segments; - InitSegmentsFromInputSequence("あか", composer_.get(), convreq_.get(), - &segments); + ConversionRequest convreq = CreateConversionRequest(); + InitSegmentsFromInputSequence("あか", composer_.get(), &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 +3059,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_.get(), &segments); Segment::Candidate *candidate = segments.mutable_segment(0)->add_candidate(); CHECK(candidate); @@ -3033,16 +3078,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_.get(), &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_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("名前は", segments)); EXPECT_TRUE(FindCandidateByValue("名前は中野です", segments)); } @@ -3051,10 +3096,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_.get(), &segments); Segment::Candidate *candidate = segments.mutable_segment(0)->add_candidate(); CHECK(candidate); @@ -3069,19 +3115,19 @@ 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_.get(), &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_.get(), &segments); commands::Request request; request_->set_zero_query_suggestion(true); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("名前は", segments)); } @@ -3094,7 +3140,8 @@ TEST_F(UserHistoryPredictorTest, LongCandidateForMobile) { for (size_t i = 0; i < 3; ++i) { constexpr char kKey[] = "よろしくおねがいします"; constexpr char kValue[] = "よろしくお願いします"; - SetUpInputForPrediction(kKey, composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForPrediction(kKey, composer_.get(), &segments); Segment::Candidate *candidate = segments.mutable_segment(0)->add_candidate(); CHECK(candidate); @@ -3102,12 +3149,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_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("よろしくお願いします", segments)); } @@ -3696,9 +3744,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_.get(), &segments); AddCandidate("グーグr", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } // Test if the predictor learned "グーグr". @@ -3722,6 +3771,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 +3805,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 +3835,8 @@ TEST_F(UserHistoryPredictorTest, ContentWordLearningFromInnerSegmentBoundary) { { constexpr char kKey[] = "とうきょうかなごやにいきたい"; constexpr char kValue[] = "東京か名古屋に行きたい"; - SetUpInputForPrediction(kKey, composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForPrediction(kKey, composer_.get(), &segments); Segment::Candidate *candidate = segments.mutable_segment(0)->add_candidate(); candidate->key = kKey; @@ -3795,24 +3846,25 @@ 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_.get(), &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_.get(), &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_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("行きたい", segments)); } @@ -3821,33 +3873,34 @@ TEST_F(UserHistoryPredictorTest, JoinedSegmentsTestMobile) { request_test_util::FillMobileRequest(request_.get()); Segments segments; - SetUpInputForConversion("わたしの", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("わたしの", composer_.get(), &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_.get(), &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_.get(), &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_.get(), &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 +3913,19 @@ TEST_F(UserHistoryPredictorTest, JoinedSegmentsTestDesktop) { Segments segments; - SetUpInputForConversion("わたしの", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("わたしの", composer_.get(), &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_.get(), &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 +3935,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_.get(), &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_.get(), &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 +3959,12 @@ TEST_F(UserHistoryPredictorTest, UsageStats) { EXPECT_COUNT_STATS("CommitUserHistoryPredictor", 0); EXPECT_COUNT_STATS("CommitUserHistoryPredictorZeroQuery", 0); - SetUpInputForConversion("なまえは", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("なまえは", composer_.get(), &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 +3972,11 @@ TEST_F(UserHistoryPredictorTest, UsageStats) { segments.Clear(); // Zero query - SetUpInputForConversion("", composer_.get(), &segments); + convreq = SetUpInputForConversion("", composer_.get(), &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); @@ -3933,28 +3988,29 @@ TEST_F(UserHistoryPredictorTest, PunctuationLinkMobile) { request_test_util::FillMobileRequest(request_.get()); Segments segments; { - SetUpInputForConversion("ございます", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("ございます", composer_.get(), &segments); AddCandidate(0, "ございます", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); - SetUpInputForConversionWithHistory("!", "ございます", "ございます", - composer_.get(), &segments); + convreq = SetUpInputForConversionWithHistory( + "!", "ございます", "ございます", composer_.get(), &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_.get(), &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_.get(), &segments); AddCandidate(0, "ございます", &segments); - SetUpInputForSuggestionWithHistory("", "ございます", "ございます", - composer_.get(), &segments); - EXPECT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestionWithHistory("", "ございます", "ございます", + composer_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.conversion_segment(0).candidate(0).value, "!"); } @@ -3962,79 +4018,83 @@ TEST_F(UserHistoryPredictorTest, PunctuationLinkMobile) { WaitForSyncer(predictor); { - SetUpInputForConversion("!", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("!", composer_.get(), &segments); AddCandidate(0, "!", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); - SetUpInputForSuggestionWithHistory("ございます", "!", "!", composer_.get(), - &segments); + convreq = SetUpInputForSuggestionWithHistory("ございます", "!", "!", + composer_.get(), &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_.get(), + &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } predictor->ClearAllHistory(); WaitForSyncer(predictor); { - SetUpInputForConversion("ございます!", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("ございます!", composer_.get(), &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_.get(), &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_.get(), &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_.get(), &segments); AddCandidate(0, "ございます", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); - SetUpInputForConversionWithHistory("!よろしくおねがいします", "ございます", - "ございます", composer_.get(), - &segments); + convreq = SetUpInputForConversionWithHistory("!よろしくおねがいします", + "ございます", "ございます", + composer_.get(), &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_.get(), &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_.get(), &segments); + AddSegment("", &segments); // empty request + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } } @@ -4042,25 +4102,26 @@ TEST_F(UserHistoryPredictorTest, PunctuationLinkDesktop) { UserHistoryPredictor *predictor = GetUserHistoryPredictorWithClearedHistory(); Segments segments; { - SetUpInputForConversion("ございます", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("ございます", composer_.get(), &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_.get(), &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_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.conversion_segment(0).candidate(0).value, "ございます"); EXPECT_FALSE(FindCandidateByValue("ございます!", segments)); } @@ -4069,46 +4130,49 @@ TEST_F(UserHistoryPredictorTest, PunctuationLinkDesktop) { WaitForSyncer(predictor); { - SetUpInputForConversion("!", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("!", composer_.get(), &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_.get(), &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } predictor->ClearAllHistory(); WaitForSyncer(predictor); { - SetUpInputForConversion("ございます!", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("ございます!", composer_.get(), &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_.get(), &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_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.conversion_segment(0).candidate(0).value, "ございます!"); EXPECT_FALSE( @@ -4119,19 +4183,20 @@ TEST_F(UserHistoryPredictorTest, PunctuationLinkDesktop) { WaitForSyncer(predictor); { - SetUpInputForConversion("ございます", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion("ございます", composer_.get(), &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_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.conversion_segment(0).candidate(0).value, "ございます"); EXPECT_FALSE(FindCandidateByValue("ございます!", segments)); EXPECT_FALSE( @@ -4144,21 +4209,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_.get(), &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_.get(), + &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("よろしくお願いします!", segments)); } } @@ -4170,15 +4235,15 @@ TEST_F(UserHistoryPredictorTest, 62DayOldEntriesAreDeletedAtSync) { // Let the predictor learn "私の名前は中野です". Segments segments; - SetUpInputForConversion("わたしのなまえはなかのです", composer_.get(), - &segments); + ConversionRequest convreq = SetUpInputForConversion( + "わたしのなまえはなかのです", composer_.get(), &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_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("私の名前は中野です", segments)); // Now, simulate the case where 63 days passed. @@ -4186,17 +4251,17 @@ TEST_F(UserHistoryPredictorTest, 62DayOldEntriesAreDeletedAtSync) { // Let the predictor learn "私の名前は高橋です". segments.Clear(); - SetUpInputForConversion("わたしのなまえはたかはしです", composer_.get(), - &segments); + convreq = SetUpInputForConversion("わたしのなまえはたかはしです", + composer_.get(), &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_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("私の名前は高橋です", segments)); EXPECT_FALSE(FindCandidateByValue("私の名前は中野です", segments)); @@ -4207,8 +4272,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_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("私の名前は高橋です", segments)); EXPECT_FALSE(FindCandidateByValue("私の名前は中野です", segments)); @@ -4231,15 +4296,15 @@ TEST_F(UserHistoryPredictorTest, FutureTimestamp) { // Let the predictor learn "私の名前は中野です". Segments segments; - SetUpInputForConversion("わたしのなまえはなかのです", composer_.get(), - &segments); + ConversionRequest convreq = SetUpInputForConversion( + "わたしのなまえはなかのです", composer_.get(), &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_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("私の名前は中野です", segments)); // Now, go back to the past. @@ -4247,8 +4312,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_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("私の名前は中野です", segments)); } @@ -4256,55 +4321,66 @@ TEST_F(UserHistoryPredictorTest, MaxPredictionCandidatesSize) { UserHistoryPredictor *predictor = GetUserHistoryPredictorWithClearedHistory(); Segments segments; { - SetUpInputForPrediction("てすと", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForPrediction("てすと", composer_.get(), &segments); AddCandidate(0, "てすと", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } { - SetUpInputForPrediction("てすと", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForPrediction("てすと", composer_.get(), &segments); AddCandidate(0, "テスト", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } { - SetUpInputForPrediction("てすと", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForPrediction("てすと", composer_.get(), &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_.get(), &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_.get(), &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_.get(), &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_.get(), &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); } @@ -4314,58 +4390,67 @@ TEST_F(UserHistoryPredictorTest, MaxPredictionCandidatesSizeForZeroQuery) { UserHistoryPredictor *predictor = GetUserHistoryPredictorWithClearedHistory(); request_test_util::FillMobileRequest(request_.get()); Segments segments; + ConversionRequest convreq; + { - SetUpInputForPrediction("てすと", composer_.get(), &segments); + convreq = SetUpInputForPrediction("てすと", composer_.get(), &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_.get(), &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_.get(), &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_.get(), &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_.get(), &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 +4463,38 @@ TEST_F(UserHistoryPredictorTest, TypingCorrection) { Segments segments; { clock->Advance(absl::Hours(1)); - SetUpInputForPrediction("がっこう", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForPrediction("がっこう", composer_.get(), &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_.get(), &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_.get(), &segments); AddCandidate(0, "格好", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } 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_.get(), &segments); + EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); // No typing correction. - SetUpInputForSuggestion("かつこ", composer_.get(), &segments); - EXPECT_FALSE(predictor->PredictForRequest(*convreq_, &segments)); + convreq = SetUpInputForSuggestion("かつこ", composer_.get(), &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); std::vector expected; auto add_expected = [&](const std::string &key) { @@ -4423,14 +4512,14 @@ TEST_F(UserHistoryPredictorTest, TypingCorrection) { // set_typing_correction_apply_user_history_size=0 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_.get(), &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); // set_typing_correction_apply_user_history_size=1 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_.get(), &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, "ガッコウ"); @@ -4439,8 +4528,8 @@ TEST_F(UserHistoryPredictorTest, TypingCorrection) { // set_typing_correction_apply_user_history_size=2 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_.get(), &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 +4537,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_.get(), &segments); + EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } TEST_F(UserHistoryPredictorTest, MaxCharCoverage) { @@ -4457,19 +4546,22 @@ TEST_F(UserHistoryPredictorTest, MaxCharCoverage) { Segments segments; { - SetUpInputForPrediction("てすと", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForPrediction("てすと", composer_.get(), &segments); AddCandidate(0, "てすと", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } { - SetUpInputForPrediction("てすと", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForPrediction("てすと", composer_.get(), &segments); AddCandidate(0, "テスト", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } { - SetUpInputForPrediction("てすと", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForPrediction("てすと", composer_.get(), &segments); AddCandidate(0, "Test", &segments); - predictor->Finish(*convreq_, &segments); + predictor->Finish(convreq, &segments); } // [max_char_coverage, expected_candidate_size] @@ -4480,8 +4572,11 @@ TEST_F(UserHistoryPredictorTest, MaxCharCoverage) { for (const auto &[coverage, candidates_size] : kTestCases) { 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 +4594,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_.get(), &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() ->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) { @@ -4594,7 +4692,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_.get(), &segments); Segment::Candidate *candidate = segments.mutable_segment(0)->add_candidate(); CHECK(candidate); @@ -4608,7 +4707,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 +4720,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_.get(), &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); + convreq = SetUpInputForSuggestionWithHistory("", hist_key, hist_value, + composer_.get(), &segments); request_->set_zero_query_suggestion(true); - ASSERT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ASSERT_TRUE(predictor->PredictForRequest(convreq, &segments)); } // Bigram History. { segments.Clear(); - SetUpInputForSuggestion("", composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForSuggestion("", composer_.get(), &segments); PrependHistorySegments("の", "の", &segments); PrependHistorySegments("わたし", "私", &segments); request_->set_zero_query_suggestion(true); - ASSERT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ASSERT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.conversion_segment(0).candidate(0).value, "名前"); segments.Clear(); - SetUpInputForSuggestion("", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("", composer_.get(), &segments); PrependHistorySegments("は", "は", &segments); PrependHistorySegments("なまえ", "名前", &segments); request_->set_zero_query_suggestion(true); - ASSERT_TRUE(predictor->PredictForRequest(*convreq_, &segments)); + ASSERT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.conversion_segment(0).candidate(0).value, "中野"); } } From 12e9c291664555559bded3ef32f4dfff48b66f6a Mon Sep 17 00:00:00 2001 From: Hiroyuki Komatsu Date: Wed, 9 Oct 2024 06:27:26 +0000 Subject: [PATCH 3/5] Use stack objects instead of heap obojects. #codehealth PiperOrigin-RevId: 683904345 --- src/prediction/user_history_predictor_test.cc | 607 +++++++++--------- 1 file changed, 299 insertions(+), 308 deletions(-) diff --git a/src/prediction/user_history_predictor_test.cc b/src/prediction/user_history_predictor_test.cc index 5d3d39e0a..72a1134e9 100644 --- a/src/prediction/user_history_predictor_test.cc +++ b/src/prediction/user_history_predictor_test.cc @@ -98,13 +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()); + composer_ = composer::Composer(table_.get(), &request_, &config_); data_and_predictor_ = CreateDataAndPredictor(); mozc::usage_stats::UsageStats::ClearAllStatsForTest(); @@ -115,8 +113,7 @@ class UserHistoryPredictorTest : public testing::TestWithTempUserProfile { } ConversionRequest CreateConversionRequest() const { - ConversionRequest convreq(composer_.get(), request_.get(), &context_, - config_.get()); + 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; @@ -401,10 +398,10 @@ 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 config_; - std::unique_ptr request_; + Config config_; + Request request_; commands::Context context_; private: @@ -436,7 +433,7 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorTest) { { Segments segments; ConversionRequest convreq = - SetUpInputForSuggestion("てすと", composer_.get(), &segments); + SetUpInputForSuggestion("てすと", &composer_, &segments); EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidates_size(), 0); } @@ -445,7 +442,7 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorTest) { { Segments segments; ConversionRequest convreq = - SetUpInputForSuggestion("てすと", composer_.get(), &segments); + SetUpInputForSuggestion("てすと", &composer_, &segments); EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidates_size(), 0); } @@ -454,19 +451,19 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorTest) { { Segments segments; ConversionRequest convreq = SetUpInputForSuggestion( - "わたしのなまえはなかのです", composer_.get(), &segments); + "わたしのなまえはなかのです", &composer_, &segments); AddCandidate("私の名前は中野です", &segments); predictor->Finish(convreq, &segments); segments.Clear(); - convreq = SetUpInputForSuggestion("わたしの", composer_.get(), &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(); - convreq = SetUpInputForSuggestion("わたしの", composer_.get(), &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 & @@ -478,23 +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; ConversionRequest convreq = SetUpInputForSuggestion( - "こんにちはさようなら", composer_.get(), &segments); + "こんにちはさようなら", &composer_, &segments); AddCandidate("今日はさようなら", &segments); predictor->Finish(convreq, &segments); segments.Clear(); - convreq = - SetUpInputForSuggestion("こんにちは", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("こんにちは", &composer_, &segments); EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); - convreq = - SetUpInputForSuggestion("こんにちは", composer_.get(), &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 @@ -511,77 +506,77 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorTest) { // turn off { Segments segments; - config_->set_use_history_suggest(false); + config_.set_use_history_suggest(false); ConversionRequest convreq = - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); + 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); - convreq = SetUpInputForSuggestion("わたしの", composer_.get(), &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); - convreq = SetUpInputForSuggestion("わたしの", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("わたしの", &composer_, &segments); EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } // turn on { - config::ConfigHandler::GetDefaultConfig(config_.get()); + config::ConfigHandler::GetDefaultConfig(&config_); } // reproduced ConversionRequest convreq = - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); + SetUpInputForSuggestion("わたしの", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); segments.Clear(); - convreq = SetUpInputForSuggestion("わたしの", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("わたしの", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); // Exact Match segments.Clear(); - convreq = SetUpInputForSuggestion("わたしのなまえはなかのです", - composer_.get(), &segments); + convreq = SetUpInputForSuggestion("わたしのなまえはなかのです", &composer_, + &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); segments.Clear(); - convreq = SetUpInputForSuggestion("わたしのなまえはなかのです", - composer_.get(), &segments); + convreq = SetUpInputForSuggestion("わたしのなまえはなかのです", &composer_, + &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); segments.Clear(); - convreq = SetUpInputForSuggestion("こんにちはさようなら", composer_.get(), - &segments); + convreq = + SetUpInputForSuggestion("こんにちはさようなら", &composer_, &segments); EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - convreq = SetUpInputForSuggestion("こんにちはさようなら", composer_.get(), - &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); + config_.set_history_learning_level(config::Config::READ_ONLY); ConversionRequest convreq = - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); + SetUpInputForSuggestion("わたしの", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); segments.Clear(); - convreq = SetUpInputForSuggestion("わたしの", composer_.get(), &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 @@ -597,10 +592,10 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorTest) { // reproduced ConversionRequest convreq = - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); + SetUpInputForSuggestion("わたしの", &composer_, &segments); EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); - convreq = SetUpInputForSuggestion("わたしの", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("わたしの", &composer_, &segments); EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } @@ -612,17 +607,17 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorTest) { // reproduced ConversionRequest convreq = - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); + SetUpInputForSuggestion("わたしの", &composer_, &segments); EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); - convreq = SetUpInputForSuggestion("わたしの", composer_.get(), &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(); @@ -631,7 +626,7 @@ TEST_F(UserHistoryPredictorTest, RemoveUnselectedHistoryPrediction) { auto insert_target = [&]() { Segments segments; ConversionRequest convreq = - SetUpInputForPrediction("わたしの", composer_.get(), &segments); + SetUpInputForPrediction("わたしの", &composer_, &segments); AddCandidate("私の", &segments); predictor->Finish(convreq, &segments); }; @@ -639,7 +634,7 @@ TEST_F(UserHistoryPredictorTest, RemoveUnselectedHistoryPrediction) { auto find_target = [&]() { Segments segments; ConversionRequest convreq = - SetUpInputForPrediction("わたしの", composer_.get(), &segments); + SetUpInputForPrediction("わたしの", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); return FindCandidateByValue("私の", segments); }; @@ -648,7 +643,7 @@ TEST_F(UserHistoryPredictorTest, RemoveUnselectedHistoryPrediction) { auto select_target = [&]() { Segments segments; ConversionRequest convreq = - SetUpInputForPrediction("わたしの", composer_.get(), &segments); + SetUpInputForPrediction("わたしの", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("私の", segments)); predictor->Finish(convreq, &segments); @@ -657,7 +652,7 @@ TEST_F(UserHistoryPredictorTest, RemoveUnselectedHistoryPrediction) { auto select_other = [&]() { Segments segments; ConversionRequest convreq = - SetUpInputForPrediction("わたしの", composer_.get(), &segments); + SetUpInputForPrediction("わたしの", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("私の", segments)); auto find = FindCandidateByValue("わたしの", segments); @@ -673,7 +668,7 @@ TEST_F(UserHistoryPredictorTest, RemoveUnselectedHistoryPrediction) { auto input_other_key = [&]() { Segments segments; ConversionRequest convreq = - SetUpInputForPrediction("てすと", composer_.get(), &segments); + SetUpInputForPrediction("てすと", &composer_, &segments); predictor->PredictForRequest(convreq, &segments); predictor->Finish(convreq, &segments); }; @@ -723,7 +718,7 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorTestSuggestion) { { Segments segments; ConversionRequest convreq = - SetUpInputForSuggestion("かまた", composer_.get(), &segments); + SetUpInputForSuggestion("かまた", &composer_, &segments); AddCandidate(0, "火魔汰", &segments); AddSegment("ま", &segments); AddCandidate(1, "摩", &segments); @@ -745,7 +740,7 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorTestSuggestion) { { Segments segments; ConversionRequest convreq = - SetUpInputForSuggestion("かま", composer_.get(), &segments); + SetUpInputForSuggestion("かま", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); std::set> expected_candidates; expected_candidates.insert("火魔汰"); @@ -767,7 +762,7 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorPreprocessInput) { // In this case, trailing white space is included to the key and value. Segments segments; ConversionRequest convreq = - SetUpInputForSuggestion("android ", composer_.get(), &segments); + SetUpInputForSuggestion("android ", &composer_, &segments); AddCandidate(0, "android ", &segments); predictor->Finish(convreq, &segments); } @@ -775,7 +770,7 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorPreprocessInput) { { Segments segments; ConversionRequest convreq = - SetUpInputForSuggestion("androi", composer_.get(), &segments); + SetUpInputForSuggestion("androi", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); // Preprocessed value should be learned. EXPECT_TRUE(FindCandidateByValue("android", segments)); @@ -798,18 +793,18 @@ TEST_F(UserHistoryPredictorTest, DescriptionTest) { { Segments segments; ConversionRequest convreq = SetUpInputForConversion( - "わたしのなまえはなかのです", composer_.get(), &segments); + "わたしのなまえはなかのです", &composer_, &segments); AddCandidateWithDescription("私の名前は中野です", kDescription, &segments); predictor->Finish(convreq, &segments); - convreq = SetUpInputForSuggestion("わたしの", composer_.get(), &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(); - convreq = SetUpInputForPrediction("わたしの", composer_.get(), &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); @@ -828,50 +823,50 @@ TEST_F(UserHistoryPredictorTest, DescriptionTest) { // turn off { Segments segments; - config_->set_use_history_suggest(false); + config_.set_use_history_suggest(false); WaitForSyncer(predictor); ConversionRequest convreq = - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); + 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); - convreq = SetUpInputForSuggestion("わたしの", composer_.get(), &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 ConversionRequest convreq = - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); + 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(); - convreq = SetUpInputForPrediction("わたしの", composer_.get(), &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(); - convreq = SetUpInputForSuggestion("わたしのなまえはなかのです", - composer_.get(), &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(); - convreq = SetUpInputForSuggestion("わたしのなまえはなかのです", - composer_.get(), &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); @@ -889,10 +884,10 @@ TEST_F(UserHistoryPredictorTest, DescriptionTest) { // reproduced ConversionRequest convreq = - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); + SetUpInputForSuggestion("わたしの", &composer_, &segments); EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); - convreq = SetUpInputForPrediction("わたしの", composer_.get(), &segments); + convreq = SetUpInputForPrediction("わたしの", &composer_, &segments); EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } @@ -904,10 +899,10 @@ TEST_F(UserHistoryPredictorTest, DescriptionTest) { // reproduced ConversionRequest convreq = - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); + SetUpInputForSuggestion("わたしの", &composer_, &segments); EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); - convreq = SetUpInputForPrediction("わたしの", composer_.get(), &segments); + convreq = SetUpInputForPrediction("わたしの", &composer_, &segments); EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } } @@ -919,7 +914,7 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorUnusedHistoryTest) { Segments segments; ConversionRequest convreq = SetUpInputForSuggestion( - "わたしのなまえはなかのです", composer_.get(), &segments); + "わたしのなまえはなかのです", &composer_, &segments); AddCandidate("私の名前は中野です", &segments); // once @@ -927,7 +922,7 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorUnusedHistoryTest) { segments.Clear(); convreq = - SetUpInputForConversion("ひろすえりょうこ", composer_.get(), &segments); + SetUpInputForConversion("ひろすえりょうこ", &composer_, &segments); AddCandidate("広末涼子", &segments); // conversion @@ -943,12 +938,12 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorUnusedHistoryTest) { Segments segments; ConversionRequest convreq = - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); + SetUpInputForSuggestion("わたしの", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); segments.Clear(); - convreq = SetUpInputForSuggestion("ひろすえ", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("ひろすえ", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "広末涼子"); @@ -956,12 +951,12 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorUnusedHistoryTest) { WaitForSyncer(predictor); segments.Clear(); - convreq = SetUpInputForSuggestion("わたしの", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("わたしの", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); segments.Clear(); - convreq = SetUpInputForSuggestion("ひろすえ", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("ひろすえ", &composer_, &segments); EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); predictor->Sync(); @@ -973,12 +968,12 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorUnusedHistoryTest) { Segments segments; ConversionRequest convreq = - SetUpInputForSuggestion("わたしの", composer_.get(), &segments); + SetUpInputForSuggestion("わたしの", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); segments.Clear(); - convreq = SetUpInputForSuggestion("ひろすえ", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("ひろすえ", &composer_, &segments); EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } } @@ -988,13 +983,13 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorRevertTest) { Segments segments, segments2; ConversionRequest convreq = SetUpInputForConversion( - "わたしのなまえはなかのです", composer_.get(), &segments); + "わたしのなまえはなかのです", &composer_, &segments); AddCandidate("私の名前は中野です", &segments); predictor->Finish(convreq, &segments); // Before Revert, Suggest works - convreq = SetUpInputForSuggestion("わたしの", composer_.get(), &segments2); + convreq = SetUpInputForSuggestion("わたしの", &composer_, &segments2); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments2)); EXPECT_EQ(segments.segment(0).candidate(0).value, "私の名前は中野です"); @@ -1002,7 +997,7 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorRevertTest) { predictor->Revert(&segments); segments.Clear(); - convreq = SetUpInputForSuggestion("わたしの", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("わたしの", &composer_, &segments); EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidates_size(), 0); @@ -1019,7 +1014,7 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorClearTest) { for (int i = 0; i < 10; ++i) { Segments segments; ConversionRequest convreq = - SetUpInputForConversion("testtest", composer_.get(), &segments); + SetUpInputForConversion("testtest", &composer_, &segments); AddCandidate("テストテスト", &segments); predictor->Finish(convreq, &segments); } @@ -1031,7 +1026,7 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorClearTest) { for (int i = 0; i < 1; ++i) { Segments segments; ConversionRequest convreq = - SetUpInputForConversion("testtest", composer_.get(), &segments); + SetUpInputForConversion("testtest", &composer_, &segments); AddCandidate("テストテスト", &segments); predictor->Finish(convreq, &segments); } @@ -1040,11 +1035,11 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorClearTest) { { Segments segments; ConversionRequest convreq = - SetUpInputForSuggestion("t", composer_.get(), &segments); + SetUpInputForSuggestion("t", &composer_, &segments); EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - convreq = SetUpInputForSuggestion("testte", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("testte", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); } } @@ -1055,7 +1050,7 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorTrailingPunctuation) { Segments segments; ConversionRequest convreq = SetUpInputForConversion( - "わたしのなまえはなかのです", composer_.get(), &segments); + "わたしのなまえはなかのです", &composer_, &segments); AddCandidate(0, "私の名前は中野です", &segments); @@ -1065,14 +1060,14 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorTrailingPunctuation) { predictor->Finish(convreq, &segments); segments.Clear(); - convreq = SetUpInputForPrediction("わたしの", composer_.get(), &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(); - convreq = SetUpInputForSuggestion("わたしの", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("わたしの", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidates_size(), 2); @@ -1082,11 +1077,11 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorTrailingPunctuation) { TEST_F(UserHistoryPredictorTest, TrailingPunctuationMobile) { UserHistoryPredictor *predictor = GetUserHistoryPredictorWithClearedHistory(); - request_test_util::FillMobileRequest(request_.get()); + request_test_util::FillMobileRequest(&request_); Segments segments; ConversionRequest convreq = - SetUpInputForConversion("です。", composer_.get(), &segments); + SetUpInputForConversion("です。", &composer_, &segments); AddCandidate(0, "です。", &segments); @@ -1094,7 +1089,7 @@ TEST_F(UserHistoryPredictorTest, TrailingPunctuationMobile) { segments.Clear(); - convreq = SetUpInputForPrediction("です", composer_.get(), &segments); + convreq = SetUpInputForPrediction("です", &composer_, &segments); EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } @@ -1106,7 +1101,7 @@ 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. ConversionRequest convreq = - SetUpInputForPrediction("あ", composer_.get(), &segments); + SetUpInputForPrediction("あ", &composer_, &segments); AddCandidate(0, "亜", &segments); predictor->Finish(convreq, &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); @@ -1116,7 +1111,7 @@ TEST_F(UserHistoryPredictorTest, HistoryToPunctuation) { predictor->Finish(convreq, &segments); segments.Clear(); - convreq = SetUpInputForPrediction("あ", composer_.get(), &segments); // "あ" + convreq = SetUpInputForPrediction("あ", &composer_, &segments); // "あ" ASSERT_TRUE(predictor->PredictForRequest(convreq, &segments)) << segments.DebugString(); EXPECT_EQ(segments.segment(0).candidate(0).value, "亜"); @@ -1125,7 +1120,7 @@ TEST_F(UserHistoryPredictorTest, HistoryToPunctuation) { // Scenario 2: the opposite case to Scenario 1, i.e., "。亜". Nothing is // suggested from symbol "。". - convreq = SetUpInputForPrediction("。", composer_.get(), &segments); + convreq = SetUpInputForPrediction("。", &composer_, &segments); AddCandidate(0, "。", &segments); predictor->Finish(convreq, &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); @@ -1135,7 +1130,7 @@ TEST_F(UserHistoryPredictorTest, HistoryToPunctuation) { predictor->Finish(convreq, &segments); segments.Clear(); - convreq = SetUpInputForPrediction("。", composer_.get(), &segments); // "。" + convreq = SetUpInputForPrediction("。", &composer_, &segments); // "。" EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)) << segments.DebugString(); @@ -1143,8 +1138,7 @@ TEST_F(UserHistoryPredictorTest, HistoryToPunctuation) { // Scenario 3: If the history segment looks like a sentence and committed // value is a punctuation, the concatenated entry is also learned. - convreq = - SetUpInputForPrediction("おつかれさまです", composer_.get(), &segments); + convreq = SetUpInputForPrediction("おつかれさまです", &composer_, &segments); AddCandidate(0, "お疲れ様です", &segments); predictor->Finish(convreq, &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); @@ -1154,7 +1148,7 @@ TEST_F(UserHistoryPredictorTest, HistoryToPunctuation) { predictor->Finish(convreq, &segments); segments.Clear(); - convreq = SetUpInputForPrediction("おつかれ", composer_.get(), &segments); + convreq = SetUpInputForPrediction("おつかれ", &composer_, &segments); ASSERT_TRUE(predictor->PredictForRequest(convreq, &segments)) << segments.DebugString(); EXPECT_EQ(segments.segment(0).candidate(0).value, "お疲れ様です"); @@ -1167,7 +1161,7 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorPrecedingPunctuation) { Segments segments; ConversionRequest convreq = - SetUpInputForConversion("。", composer_.get(), &segments); + SetUpInputForConversion("。", &composer_, &segments); AddCandidate(0, "。", &segments); AddSegment("わたしのなまえはなかのです", &segments); @@ -1177,14 +1171,14 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorPrecedingPunctuation) { predictor->Finish(convreq, &segments); segments.Clear(); - convreq = SetUpInputForPrediction("わたしの", composer_.get(), &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, "私の名前は中野です"); segments.Clear(); - convreq = SetUpInputForSuggestion("わたしの", composer_.get(), &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, "私の名前は中野です"); @@ -1214,7 +1208,7 @@ TEST_F(UserHistoryPredictorTest, StartsWithPunctuations) { { // Learn from two segments ConversionRequest convreq = - SetUpInputForConversion(first_char, composer_.get(), &segments); + SetUpInputForConversion(first_char, &composer_, &segments); AddCandidate(0, first_char, &segments); AddSegment("てすとぶんしょう", &segments); AddCandidate(1, "テスト文章", &segments); @@ -1224,7 +1218,7 @@ TEST_F(UserHistoryPredictorTest, StartsWithPunctuations) { { // Learn from one segment ConversionRequest convreq = SetUpInputForConversion( - first_char + "てすとぶんしょう", composer_.get(), &segments); + first_char + "てすとぶんしょう", &composer_, &segments); AddCandidate(0, first_char + "テスト文章", &segments); predictor->Finish(convreq, &segments); } @@ -1232,7 +1226,7 @@ TEST_F(UserHistoryPredictorTest, StartsWithPunctuations) { { // Suggestion ConversionRequest convreq = - SetUpInputForSuggestion(first_char, composer_.get(), &segments); + SetUpInputForSuggestion(first_char, &composer_, &segments); AddCandidate(0, first_char, &segments); EXPECT_EQ(predictor->PredictForRequest(convreq, &segments), kTestCases[i].expected_result) @@ -1242,7 +1236,7 @@ TEST_F(UserHistoryPredictorTest, StartsWithPunctuations) { { // Prediction ConversionRequest convreq = - SetUpInputForPrediction(first_char, composer_.get(), &segments); + SetUpInputForPrediction(first_char, &composer_, &segments); EXPECT_EQ(predictor->PredictForRequest(convreq, &segments), kTestCases[i].expected_result) << "Predict from " << first_char; @@ -1253,54 +1247,54 @@ 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(); ConversionRequest convreq = - SetUpInputForSuggestion("", composer_.get(), &segments); + SetUpInputForSuggestion("", &composer_, &segments); EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); { segments.Clear(); ConversionRequest convreq = - SetUpInputForConversion("たろうは", composer_.get(), &segments); + SetUpInputForConversion("たろうは", &composer_, &segments); AddCandidate(0, "太郎は", &segments); predictor->Finish(convreq, &segments); convreq = SetUpInputForConversionWithHistory( - "はなこに", "たろうは", "太郎は", composer_.get(), &segments); + "はなこに", "たろうは", "太郎は", &composer_, &segments); AddCandidate(1, "花子に", &segments); predictor->Finish(convreq, &segments); convreq = SetUpInputForConversionWithHistory( - "きょうと", "たろうは", "太郎は", composer_.get(), &segments); + "きょうと", "たろうは", "太郎は", &composer_, &segments); AddCandidate(1, "京都", &segments); absl::SleepFor(absl::Seconds(2)); predictor->Finish(convreq, &segments); convreq = SetUpInputForConversionWithHistory( - "おおさか", "たろうは", "太郎は", composer_.get(), &segments); + "おおさか", "たろうは", "太郎は", &composer_, &segments); AddCandidate(1, "大阪", &segments); absl::SleepFor(absl::Seconds(2)); predictor->Finish(convreq, &segments); // Zero query suggestion is disabled. convreq = SetUpInputForSuggestionWithHistory("", "たろうは", "太郎は", - composer_.get(), &segments); + &composer_, &segments); EXPECT_FALSE(predictor->PredictForRequest(non_zero_query_conversion_request, &segments)); convreq = SetUpInputForSuggestionWithHistory("", "たろうは", "太郎は", - composer_.get(), &segments); + &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); ASSERT_EQ(2, segments.segments_size()); // last-pushed segment is "大阪" @@ -1311,7 +1305,7 @@ TEST_F(UserHistoryPredictorTest, ZeroQuerySuggestionTest) { for (const char *key : {"は", "た", "き", "お"}) { ConversionRequest convreq = SetUpInputForSuggestionWithHistory( - key, "たろうは", "太郎は", composer_.get(), &segments); + key, "たろうは", "太郎は", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); } } @@ -1322,7 +1316,7 @@ TEST_F(UserHistoryPredictorTest, ZeroQuerySuggestionTest) { { segments.Clear(); ConversionRequest convreq = - SetUpInputForConversion("たろうは", composer_.get(), &segments); + SetUpInputForConversion("たろうは", &composer_, &segments); AddCandidate(0, "太郎は", &segments); AddSegment("はなこに", &segments); @@ -1330,7 +1324,7 @@ TEST_F(UserHistoryPredictorTest, ZeroQuerySuggestionTest) { predictor->Finish(convreq, &segments); segments.Clear(); - convreq = SetUpInputForConversion("たろうは", composer_.get(), &segments); + convreq = SetUpInputForConversion("たろうは", &composer_, &segments); AddCandidate(0, "太郎は", &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); @@ -1360,7 +1354,7 @@ TEST_F(UserHistoryPredictorTest, MultiSegmentsMultiInput) { Segments segments; ConversionRequest convreq = - SetUpInputForConversion("たろうは", composer_.get(), &segments); + SetUpInputForConversion("たろうは", &composer_, &segments); AddCandidate(0, "太郎は", &segments); predictor->Finish(convreq, &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); @@ -1388,43 +1382,43 @@ TEST_F(UserHistoryPredictorTest, MultiSegmentsMultiInput) { predictor->Finish(convreq, &segments); segments.Clear(); - convreq = SetUpInputForSuggestion("た", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("た", &composer_, &segments); EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - convreq = SetUpInputForSuggestion("たろうは", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("たろうは", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - convreq = SetUpInputForSuggestion("ろうは", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("ろうは", &composer_, &segments); EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - convreq = SetUpInputForSuggestion("たろうははな", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("たろうははな", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - convreq = SetUpInputForSuggestion("はなこにむ", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("はなこにむ", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - convreq = SetUpInputForSuggestion("むずかし", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("むずかし", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - convreq = SetUpInputForSuggestion("はなこにむずかしいほ", composer_.get(), - &segments); + convreq = + SetUpInputForSuggestion("はなこにむずかしいほ", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - convreq = SetUpInputForSuggestion("ほんをよま", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("ほんをよま", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); absl::SleepFor(absl::Seconds(1)); // Add new entry "たろうはよしこに/太郎は良子に" segments.Clear(); - convreq = SetUpInputForConversion("たろうは", composer_.get(), &segments); + convreq = SetUpInputForConversion("たろうは", &composer_, &segments); AddCandidate(0, "太郎は", &segments); predictor->Finish(convreq, &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); @@ -1435,7 +1429,7 @@ TEST_F(UserHistoryPredictorTest, MultiSegmentsMultiInput) { segments.mutable_segment(1)->set_segment_type(Segment::HISTORY); segments.Clear(); - convreq = SetUpInputForSuggestion("たろうは", composer_.get(), &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 & @@ -1448,7 +1442,7 @@ TEST_F(UserHistoryPredictorTest, MultiSegmentsSingleInput) { Segments segments; ConversionRequest convreq = - SetUpInputForConversion("たろうは", composer_.get(), &segments); + SetUpInputForConversion("たろうは", &composer_, &segments); AddCandidate(0, "太郎は", &segments); AddSegment("はなこに", &segments); @@ -1466,43 +1460,43 @@ TEST_F(UserHistoryPredictorTest, MultiSegmentsSingleInput) { predictor->Finish(convreq, &segments); segments.Clear(); - convreq = SetUpInputForSuggestion("たろうは", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("たろうは", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - convreq = SetUpInputForSuggestion("た", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("た", &composer_, &segments); EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - convreq = SetUpInputForSuggestion("たろうははな", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("たろうははな", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - convreq = SetUpInputForSuggestion("ろうははな", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("ろうははな", &composer_, &segments); EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - convreq = SetUpInputForSuggestion("はなこにむ", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("はなこにむ", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - convreq = SetUpInputForSuggestion("むずかし", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("むずかし", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - convreq = SetUpInputForSuggestion("はなこにむずかしいほ", composer_.get(), - &segments); + convreq = + SetUpInputForSuggestion("はなこにむずかしいほ", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - convreq = SetUpInputForSuggestion("ほんをよま", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("ほんをよま", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); absl::SleepFor(absl::Seconds(1)); // Add new entry "たろうはよしこに/太郎は良子に" segments.Clear(); - convreq = SetUpInputForConversion("たろうは", composer_.get(), &segments); + convreq = SetUpInputForConversion("たろうは", &composer_, &segments); AddCandidate(0, "太郎は", &segments); predictor->Finish(convreq, &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); @@ -1513,7 +1507,7 @@ TEST_F(UserHistoryPredictorTest, MultiSegmentsSingleInput) { segments.mutable_segment(1)->set_segment_type(Segment::HISTORY); segments.Clear(); - convreq = SetUpInputForSuggestion("たろうは", composer_.get(), &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 & @@ -1526,7 +1520,7 @@ TEST_F(UserHistoryPredictorTest, Regression2843371Case1) { Segments segments; ConversionRequest convreq = - SetUpInputForConversion("とうきょうは", composer_.get(), &segments); + SetUpInputForConversion("とうきょうは", &composer_, &segments); AddCandidate(0, "東京は", &segments); AddSegment("、", &segments); @@ -1544,7 +1538,7 @@ TEST_F(UserHistoryPredictorTest, Regression2843371Case1) { absl::SleepFor(absl::Seconds(1)); - convreq = SetUpInputForConversion("らーめんは", composer_.get(), &segments); + convreq = SetUpInputForConversion("らーめんは", &composer_, &segments); AddCandidate(0, "ラーメンは", &segments); AddSegment("、", &segments); @@ -1560,8 +1554,7 @@ TEST_F(UserHistoryPredictorTest, Regression2843371Case1) { segments.Clear(); - convreq = - SetUpInputForSuggestion("とうきょうは、", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("とうきょうは、", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "東京は、日本です"); @@ -1575,7 +1568,7 @@ TEST_F(UserHistoryPredictorTest, Regression2843371Case2) { Segments segments; ConversionRequest convreq = - SetUpInputForConversion("えど", composer_.get(), &segments); + SetUpInputForConversion("えど", &composer_, &segments); AddCandidate(0, "江戸", &segments); AddSegment("(", &segments); @@ -1612,7 +1605,7 @@ TEST_F(UserHistoryPredictorTest, Regression2843371Case2) { segments.Clear(); - convreq = SetUpInputForSuggestion("えど(", composer_.get(), &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 & @@ -1631,7 +1624,7 @@ TEST_F(UserHistoryPredictorTest, Regression2843371Case3) { Segments segments; ConversionRequest convreq = - SetUpInputForConversion("「", composer_.get(), &segments); + SetUpInputForConversion("「", &composer_, &segments); AddCandidate(0, "「", &segments); AddSegment("やま", &segments); @@ -1655,7 +1648,7 @@ TEST_F(UserHistoryPredictorTest, Regression2843371Case3) { segments.Clear(); - convreq = SetUpInputForConversion("「", composer_.get(), &segments); + convreq = SetUpInputForConversion("「", &composer_, &segments); AddCandidate(0, "「", &segments); AddSegment("うみ", &segments); @@ -1677,7 +1670,7 @@ TEST_F(UserHistoryPredictorTest, Regression2843371Case3) { segments.Clear(); - convreq = SetUpInputForSuggestion("「やま」は", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("「やま」は", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, "「山」は高い"); @@ -1691,7 +1684,7 @@ TEST_F(UserHistoryPredictorTest, Regression2843775) { Segments segments; ConversionRequest convreq = - SetUpInputForConversion("そうです", composer_.get(), &segments); + SetUpInputForConversion("そうです", &composer_, &segments); AddCandidate(0, "そうです", &segments); AddSegment("。よろしくおねがいします", &segments); @@ -1701,7 +1694,7 @@ TEST_F(UserHistoryPredictorTest, Regression2843775) { segments.Clear(); - convreq = SetUpInputForSuggestion("そうです", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("そうです", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.segment(0).candidate(0).value, @@ -1716,7 +1709,7 @@ TEST_F(UserHistoryPredictorTest, DuplicateString) { Segments segments; ConversionRequest convreq = - SetUpInputForConversion("らいおん", composer_.get(), &segments); + SetUpInputForConversion("らいおん", &composer_, &segments); AddCandidate(0, "ライオン", &segments); AddSegment("(", &segments); @@ -1744,7 +1737,7 @@ TEST_F(UserHistoryPredictorTest, DuplicateString) { segments.Clear(); - convreq = SetUpInputForSuggestion("ぞうりむし", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("ぞうりむし", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); for (int i = 0; i < segments.segment(0).candidates_size(); ++i) { @@ -1754,7 +1747,7 @@ TEST_F(UserHistoryPredictorTest, DuplicateString) { segments.Clear(); - convreq = SetUpInputForSuggestion("らいおん", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("らいおん", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); for (int i = 0; i < segments.segment(0).candidates_size(); ++i) { @@ -1809,16 +1802,16 @@ TEST_F(UserHistoryPredictorTest, SyncTest) { break; case Command::INSERT: { segments.Clear(); - ConversionRequest convreq = SetUpInputForConversion( - commands[i].key, composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForConversion(commands[i].key, &composer_, &segments); AddCandidate(commands[i].value, &segments); predictor->Finish(convreq, &segments); break; } case Command::LOOKUP: { segments.Clear(); - ConversionRequest convreq = SetUpInputForSuggestion( - commands[i].key, composer_.get(), &segments); + ConversionRequest convreq = + SetUpInputForSuggestion(commands[i].key, &composer_, &segments); predictor->PredictForRequest(convreq, &segments); break; } @@ -2254,7 +2247,7 @@ TEST_F(UserHistoryPredictorTest, PrivacySensitiveTest) { { Segments segments; ConversionRequest convreq = - SetUpInputForConversion(input, composer_.get(), &segments); + SetUpInputForConversion(input, &composer_, &segments); AddCandidate(0, output, &segments); predictor->Finish(convreq, &segments); } @@ -2266,7 +2259,7 @@ TEST_F(UserHistoryPredictorTest, PrivacySensitiveTest) { { Segments segments; ConversionRequest convreq = - SetUpInputForSuggestion(partial_input, composer_.get(), &segments); + SetUpInputForSuggestion(partial_input, &composer_, &segments); if (expect_sensitive) { EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)) << description << " input: " << input << " output: " << output; @@ -2275,7 +2268,7 @@ TEST_F(UserHistoryPredictorTest, PrivacySensitiveTest) { << description << " input: " << input << " output: " << output; } segments.Clear(); - convreq = SetUpInputForPrediction(input, composer_.get(), &segments); + convreq = SetUpInputForPrediction(input, &composer_, &segments); if (expect_sensitive) { EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)) << description << " input: " << input << " output: " << output; @@ -2289,7 +2282,7 @@ TEST_F(UserHistoryPredictorTest, PrivacySensitiveTest) { { Segments segments; ConversionRequest convreq = - SetUpInputForPrediction(partial_input, composer_.get(), &segments); + SetUpInputForPrediction(partial_input, &composer_, &segments); if (expect_sensitive) { EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)) << description << " input: " << input << " output: " << output; @@ -2298,7 +2291,7 @@ TEST_F(UserHistoryPredictorTest, PrivacySensitiveTest) { << description << " input: " << input << " output: " << output; } segments.Clear(); - convreq = SetUpInputForPrediction(input, composer_.get(), &segments); + convreq = SetUpInputForPrediction(input, &composer_, &segments); if (expect_sensitive) { EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)) << description << " input: " << input << " output: " << output; @@ -2320,7 +2313,7 @@ TEST_F(UserHistoryPredictorTest, PrivacySensitiveMultiSegmentsTest) { { Segments segments; ConversionRequest convreq = - SetUpInputForConversion("123", composer_.get(), &segments); + SetUpInputForConversion("123", &composer_, &segments); AddSegment("abc!", &segments); AddCandidate(0, "123", &segments); AddCandidate(1, "abc!", &segments); @@ -2330,20 +2323,20 @@ TEST_F(UserHistoryPredictorTest, PrivacySensitiveMultiSegmentsTest) { { Segments segments; ConversionRequest convreq = - SetUpInputForSuggestion("123abc", composer_.get(), &segments); + SetUpInputForSuggestion("123abc", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - convreq = SetUpInputForSuggestion("123abc!", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("123abc!", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); } { Segments segments; ConversionRequest convreq = - SetUpInputForPrediction("123abc", composer_.get(), &segments); + SetUpInputForPrediction("123abc", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); segments.Clear(); - convreq = SetUpInputForPrediction("123abc!", composer_.get(), &segments); + convreq = SetUpInputForPrediction("123abc!", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); } } @@ -2548,7 +2541,7 @@ TEST_F(UserHistoryPredictorTest, GetRomanMisspelledKey) { ConversionRequest convreq = CreateConversionRequest(); - config_->set_preedit_method(config::Config::ROMAN); + config_.set_preedit_method(config::Config::ROMAN); seg->set_key(""); EXPECT_EQ(UserHistoryPredictor::GetRomanMisspelledKey(convreq, segments), ""); @@ -2559,7 +2552,7 @@ TEST_F(UserHistoryPredictorTest, GetRomanMisspelledKey) { seg->set_key("おねがいします"); 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), ""); @@ -2846,11 +2839,11 @@ 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; ConversionRequest convreq = CreateConversionRequest(); - InitSegmentsFromInputSequence("gu-g", composer_.get(), &convreq, &segments); + InitSegmentsFromInputSequence("gu-g", &composer_, &convreq, &segments); std::string input_key; std::string base; std::unique_ptr> expanded; @@ -2868,15 +2861,15 @@ 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, ' ', '~'); ConversionRequest convreq = CreateConversionRequest(); - InitSegmentsFromInputSequence(input, composer_.get(), &convreq, &segments); + InitSegmentsFromInputSequence(input, &composer_, &convreq, &segments); std::string input_key; std::string base; std::unique_ptr> expanded; @@ -2889,12 +2882,12 @@ 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; { ConversionRequest convreq = CreateConversionRequest(); - InitSegmentsFromInputSequence("8,+", composer_.get(), &convreq, &segments); + InitSegmentsFromInputSequence("8,+", &composer_, &convreq, &segments); std::string input_key; std::string base; std::unique_ptr> expanded; @@ -2905,12 +2898,12 @@ TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegmentsShouldNotCrash) { TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegmentsRomanN) { table_->LoadFromFile("system://romanji-hiragana.tsv"); - composer_->SetTable(table_.get()); + composer_.SetTable(table_.get()); Segments segments; { ConversionRequest convreq = CreateConversionRequest(); - InitSegmentsFromInputSequence("n", composer_.get(), &convreq, &segments); + InitSegmentsFromInputSequence("n", &composer_, &convreq, &segments); std::string input_key; std::string base; std::unique_ptr> expanded; @@ -2927,11 +2920,11 @@ TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegmentsRomanN) { EXPECT_EQ(value, "な"); } - composer_->Reset(); + composer_.Reset(); segments.Clear(); { ConversionRequest convreq = CreateConversionRequest(); - InitSegmentsFromInputSequence("nn", composer_.get(), &convreq, &segments); + InitSegmentsFromInputSequence("nn", &composer_, &convreq, &segments); std::string input_key; std::string base; std::unique_ptr> expanded; @@ -2942,11 +2935,11 @@ TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegmentsRomanN) { EXPECT_TRUE(expanded == nullptr); } - composer_->Reset(); + composer_.Reset(); segments.Clear(); { ConversionRequest convreq = CreateConversionRequest(); - InitSegmentsFromInputSequence("n'", composer_.get(), &convreq, &segments); + InitSegmentsFromInputSequence("n'", &composer_, &convreq, &segments); std::string input_key; std::string base; std::unique_ptr> expanded; @@ -2957,11 +2950,11 @@ TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegmentsRomanN) { EXPECT_TRUE(expanded == nullptr); } - composer_->Reset(); + composer_.Reset(); segments.Clear(); { ConversionRequest convreq = CreateConversionRequest(); - InitSegmentsFromInputSequence("n'n", composer_.get(), &convreq, &segments); + InitSegmentsFromInputSequence("n'n", &composer_, &convreq, &segments); std::string input_key; std::string base; std::unique_ptr> expanded; @@ -2981,12 +2974,12 @@ TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegmentsRomanN) { TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegmentsFlickN) { table_->LoadFromFile("system://flick-hiragana.tsv"); - composer_->SetTable(table_.get()); + composer_.SetTable(table_.get()); Segments segments; { ConversionRequest convreq = CreateConversionRequest(); - InitSegmentsFromInputSequence("/", composer_.get(), &convreq, &segments); + InitSegmentsFromInputSequence("/", &composer_, &convreq, &segments); std::string input_key; std::string base; std::unique_ptr> expanded; @@ -3006,12 +2999,12 @@ TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegmentsFlickN) { TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegments12KeyN) { table_->LoadFromFile("system://12keys-hiragana.tsv"); - composer_->SetTable(table_.get()); + composer_.SetTable(table_.get()); Segments segments; { ConversionRequest convreq = CreateConversionRequest(); - InitSegmentsFromInputSequence("わ00", composer_.get(), &convreq, &segments); + InitSegmentsFromInputSequence("わ00", &composer_, &convreq, &segments); std::string input_key; std::string base; std::unique_ptr> expanded; @@ -3031,11 +3024,11 @@ TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegments12KeyN) { TEST_F(UserHistoryPredictorTest, GetInputKeyFromSegmentsKana) { table_->LoadFromFile("system://kana.tsv"); - composer_->SetTable(table_.get()); + composer_.SetTable(table_.get()); Segments segments; ConversionRequest convreq = CreateConversionRequest(); - InitSegmentsFromInputSequence("あか", composer_.get(), &convreq, &segments); + InitSegmentsFromInputSequence("あか", &composer_, &convreq, &segments); { std::string input_key; @@ -3063,7 +3056,7 @@ TEST_F(UserHistoryPredictorTest, RealtimeConversionInnerSegment) { { constexpr char kKey[] = "わたしのなまえはなかのです"; constexpr char kValue[] = "私の名前は中野です"; - convreq = SetUpInputForPrediction(kKey, composer_.get(), &segments); + convreq = SetUpInputForPrediction(kKey, &composer_, &segments); Segment::Candidate *candidate = segments.mutable_segment(0)->add_candidate(); CHECK(candidate); @@ -3081,12 +3074,12 @@ TEST_F(UserHistoryPredictorTest, RealtimeConversionInnerSegment) { predictor->Finish(convreq, &segments); segments.Clear(); - convreq = SetUpInputForPrediction("なかの", composer_.get(), &segments); + convreq = SetUpInputForPrediction("なかの", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("中野です", segments)); segments.Clear(); - convreq = SetUpInputForPrediction("なまえ", composer_.get(), &segments); + convreq = SetUpInputForPrediction("なまえ", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("名前は", segments)); EXPECT_TRUE(FindCandidateByValue("名前は中野です", segments)); @@ -3100,7 +3093,7 @@ TEST_F(UserHistoryPredictorTest, ZeroQueryFromRealtimeConversion) { { constexpr char kKey[] = "わたしのなまえはなかのです"; constexpr char kValue[] = "私の名前は中野です"; - convreq = SetUpInputForPrediction(kKey, composer_.get(), &segments); + convreq = SetUpInputForPrediction(kKey, &composer_, &segments); Segment::Candidate *candidate = segments.mutable_segment(0)->add_candidate(); CHECK(candidate); @@ -3118,15 +3111,15 @@ TEST_F(UserHistoryPredictorTest, ZeroQueryFromRealtimeConversion) { predictor->Finish(convreq, &segments); segments.Clear(); - convreq = SetUpInputForConversion("わたしの", composer_.get(), &segments); + convreq = SetUpInputForConversion("わたしの", &composer_, &segments); AddCandidate(0, "私の", &segments); predictor->Finish(convreq, &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); convreq = SetUpInputForSuggestionWithHistory("", "わたしの", "私の", - composer_.get(), &segments); + &composer_, &segments); commands::Request request; - request_->set_zero_query_suggestion(true); + request_.set_zero_query_suggestion(true); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("名前は", segments)); } @@ -3134,14 +3127,14 @@ TEST_F(UserHistoryPredictorTest, ZeroQueryFromRealtimeConversion) { 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[] = "よろしくお願いします"; ConversionRequest convreq = - SetUpInputForPrediction(kKey, composer_.get(), &segments); + SetUpInputForPrediction(kKey, &composer_, &segments); Segment::Candidate *candidate = segments.mutable_segment(0)->add_candidate(); CHECK(candidate); @@ -3154,7 +3147,7 @@ TEST_F(UserHistoryPredictorTest, LongCandidateForMobile) { } ConversionRequest convreq = - SetUpInputForPrediction("よろ", composer_.get(), &segments); + SetUpInputForPrediction("よろ", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("よろしくお願いします", segments)); } @@ -3745,7 +3738,7 @@ TEST_F(UserHistoryPredictorTest, ClearHistoryEntryScenario1) { for (int i = 0; i < 3; ++i) { Segments segments; ConversionRequest convreq = - SetUpInputForConversion("ぐーぐr", composer_.get(), &segments); + SetUpInputForConversion("ぐーぐr", &composer_, &segments); AddCandidate("グーグr", &segments); predictor->Finish(convreq, &segments); } @@ -3836,7 +3829,7 @@ TEST_F(UserHistoryPredictorTest, ContentWordLearningFromInnerSegmentBoundary) { constexpr char kKey[] = "とうきょうかなごやにいきたい"; constexpr char kValue[] = "東京か名古屋に行きたい"; ConversionRequest convreq = - SetUpInputForPrediction(kKey, composer_.get(), &segments); + SetUpInputForPrediction(kKey, &composer_, &segments); Segment::Candidate *candidate = segments.mutable_segment(0)->add_candidate(); candidate->key = kKey; @@ -3851,30 +3844,30 @@ TEST_F(UserHistoryPredictorTest, ContentWordLearningFromInnerSegmentBoundary) { segments.Clear(); ConversionRequest convreq = - SetUpInputForPrediction("と", composer_.get(), &segments); + SetUpInputForPrediction("と", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("東京", segments)); EXPECT_TRUE(FindCandidateByValue("東京か", segments)); segments.Clear(); - convreq = SetUpInputForPrediction("な", composer_.get(), &segments); + convreq = SetUpInputForPrediction("な", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("名古屋", segments)); EXPECT_TRUE(FindCandidateByValue("名古屋に", segments)); segments.Clear(); - convreq = SetUpInputForPrediction("い", composer_.get(), &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; ConversionRequest convreq = - SetUpInputForConversion("わたしの", composer_.get(), &segments); + SetUpInputForConversion("わたしの", &composer_, &segments); AddCandidate(0, "私の", &segments); AddSegment("なまえは", &segments); @@ -3883,7 +3876,7 @@ TEST_F(UserHistoryPredictorTest, JoinedSegmentsTestMobile) { predictor->Finish(convreq, &segments); segments.Clear(); - convreq = SetUpInputForSuggestion("わたし", composer_.get(), &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, "私の"); @@ -3891,7 +3884,7 @@ TEST_F(UserHistoryPredictorTest, JoinedSegmentsTestMobile) { Segment::Candidate::USER_HISTORY_PREDICTOR); segments.Clear(); - convreq = SetUpInputForPrediction("わたしの", composer_.get(), &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, "私の"); @@ -3899,7 +3892,7 @@ TEST_F(UserHistoryPredictorTest, JoinedSegmentsTestMobile) { Segment::Candidate::USER_HISTORY_PREDICTOR); segments.Clear(); - convreq = SetUpInputForPrediction("わたしのな", composer_.get(), &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, "私の名前は"); @@ -3914,7 +3907,7 @@ TEST_F(UserHistoryPredictorTest, JoinedSegmentsTestDesktop) { Segments segments; ConversionRequest convreq = - SetUpInputForConversion("わたしの", composer_.get(), &segments); + SetUpInputForConversion("わたしの", &composer_, &segments); AddCandidate(0, "私の", &segments); AddSegment("なまえは", &segments); @@ -3924,7 +3917,7 @@ TEST_F(UserHistoryPredictorTest, JoinedSegmentsTestDesktop) { segments.Clear(); - convreq = SetUpInputForSuggestion("わたし", composer_.get(), &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, "私の"); @@ -3935,7 +3928,7 @@ TEST_F(UserHistoryPredictorTest, JoinedSegmentsTestDesktop) { Segment::Candidate::USER_HISTORY_PREDICTOR); segments.Clear(); - convreq = SetUpInputForPrediction("わたしの", composer_.get(), &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, "私の名前は"); @@ -3943,7 +3936,7 @@ TEST_F(UserHistoryPredictorTest, JoinedSegmentsTestDesktop) { Segment::Candidate::USER_HISTORY_PREDICTOR); segments.Clear(); - convreq = SetUpInputForPrediction("わたしのな", composer_.get(), &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, "私の名前は"); @@ -3960,7 +3953,7 @@ TEST_F(UserHistoryPredictorTest, UsageStats) { EXPECT_COUNT_STATS("CommitUserHistoryPredictorZeroQuery", 0); ConversionRequest convreq = - SetUpInputForConversion("なまえは", composer_.get(), &segments); + SetUpInputForConversion("なまえは", &composer_, &segments); AddCandidate(0, "名前は", &segments); segments.mutable_conversion_segment(0)->mutable_candidate(0)->source_info |= Segment::Candidate::USER_HISTORY_PREDICTOR; @@ -3972,7 +3965,7 @@ TEST_F(UserHistoryPredictorTest, UsageStats) { segments.Clear(); // Zero query - convreq = 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; @@ -3985,31 +3978,31 @@ TEST_F(UserHistoryPredictorTest, UsageStats) { TEST_F(UserHistoryPredictorTest, PunctuationLinkMobile) { UserHistoryPredictor *predictor = GetUserHistoryPredictorWithClearedHistory(); - request_test_util::FillMobileRequest(request_.get()); + request_test_util::FillMobileRequest(&request_); Segments segments; { ConversionRequest convreq = - SetUpInputForConversion("ございます", composer_.get(), &segments); + SetUpInputForConversion("ございます", &composer_, &segments); AddCandidate(0, "ございます", &segments); predictor->Finish(convreq, &segments); convreq = SetUpInputForConversionWithHistory( - "!", "ございます", "ございます", composer_.get(), &segments); + "!", "ございます", "ございます", &composer_, &segments); AddCandidate(1, "!", &segments); predictor->Finish(convreq, &segments); segments.Clear(); - convreq = SetUpInputForSuggestion("ございま", composer_.get(), &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(); - convreq = SetUpInputForConversion("ございます", composer_.get(), &segments); + convreq = SetUpInputForConversion("ございます", &composer_, &segments); AddCandidate(0, "ございます", &segments); convreq = SetUpInputForSuggestionWithHistory("", "ございます", "ございます", - composer_.get(), &segments); + &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.conversion_segment(0).candidate(0).value, "!"); } @@ -4019,18 +4012,18 @@ TEST_F(UserHistoryPredictorTest, PunctuationLinkMobile) { { ConversionRequest convreq = - SetUpInputForConversion("!", composer_.get(), &segments); + SetUpInputForConversion("!", &composer_, &segments); AddCandidate(0, "!", &segments); predictor->Finish(convreq, &segments); convreq = SetUpInputForSuggestionWithHistory("ございます", "!", "!", - composer_.get(), &segments); + &composer_, &segments); AddCandidate(1, "ございます", &segments); predictor->Finish(convreq, &segments); // Zero query from "!" -> no suggestion segments.Clear(); - convreq = SetUpInputForSuggestionWithHistory("", "!", "!", composer_.get(), + convreq = SetUpInputForSuggestionWithHistory("", "!", "!", &composer_, &segments); EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } @@ -4040,7 +4033,7 @@ TEST_F(UserHistoryPredictorTest, PunctuationLinkMobile) { { ConversionRequest convreq = - SetUpInputForConversion("ございます!", composer_.get(), &segments); + SetUpInputForConversion("ございます!", &composer_, &segments); AddCandidate(0, "ございます!", &segments); predictor->Finish(convreq, &segments); @@ -4052,7 +4045,7 @@ TEST_F(UserHistoryPredictorTest, PunctuationLinkMobile) { // Zero query from "!" -> no suggestion segments.Clear(); - convreq = SetUpInputForConversion("!", composer_.get(), &segments); + convreq = SetUpInputForConversion("!", &composer_, &segments); AddCandidate(0, "!", &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); AddSegment("", &segments); // empty request @@ -4060,8 +4053,7 @@ TEST_F(UserHistoryPredictorTest, PunctuationLinkMobile) { // Zero query from "ございます!" -> no suggestion segments.Clear(); - convreq = - SetUpInputForConversion("ございます!", composer_.get(), &segments); + convreq = SetUpInputForConversion("ございます!", &composer_, &segments); AddCandidate(0, "ございます!", &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); AddSegment("", &segments); // empty request @@ -4073,18 +4065,18 @@ TEST_F(UserHistoryPredictorTest, PunctuationLinkMobile) { { ConversionRequest convreq = - SetUpInputForConversion("ございます", composer_.get(), &segments); + SetUpInputForConversion("ございます", &composer_, &segments); AddCandidate(0, "ございます", &segments); predictor->Finish(convreq, &segments); convreq = SetUpInputForConversionWithHistory("!よろしくおねがいします", "ございます", "ございます", - composer_.get(), &segments); + &composer_, &segments); AddCandidate(1, "!よろしくお願いします", &segments); predictor->Finish(convreq, &segments); segments.Clear(); - convreq = SetUpInputForSuggestion("ございま", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("ございま", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.conversion_segment(0).candidate(0).value, "ございます"); EXPECT_FALSE( @@ -4092,7 +4084,7 @@ TEST_F(UserHistoryPredictorTest, PunctuationLinkMobile) { // Zero query from "ございます" -> no suggestion convreq = SetUpInputForConversionWithHistory("", "ございます", "ございます", - composer_.get(), &segments); + &composer_, &segments); AddSegment("", &segments); // empty request EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } @@ -4103,7 +4095,7 @@ TEST_F(UserHistoryPredictorTest, PunctuationLinkDesktop) { Segments segments; { ConversionRequest convreq = - SetUpInputForConversion("ございます", composer_.get(), &segments); + SetUpInputForConversion("ございます", &composer_, &segments); AddCandidate(0, "ございます", &segments); predictor->Finish(convreq, &segments); @@ -4114,13 +4106,13 @@ TEST_F(UserHistoryPredictorTest, PunctuationLinkDesktop) { predictor->Finish(convreq, &segments); segments.Clear(); - convreq = SetUpInputForSuggestion("ございま", composer_.get(), &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(); - convreq = SetUpInputForSuggestion("ございます", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("ございます", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.conversion_segment(0).candidate(0).value, "ございます"); EXPECT_FALSE(FindCandidateByValue("ございます!", segments)); @@ -4131,7 +4123,7 @@ TEST_F(UserHistoryPredictorTest, PunctuationLinkDesktop) { { ConversionRequest convreq = - SetUpInputForConversion("!", composer_.get(), &segments); + SetUpInputForConversion("!", &composer_, &segments); AddCandidate(0, "!", &segments); predictor->Finish(convreq, &segments); @@ -4142,7 +4134,7 @@ TEST_F(UserHistoryPredictorTest, PunctuationLinkDesktop) { predictor->Finish(convreq, &segments); segments.Clear(); - convreq = SetUpInputForSuggestion("!", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("!", &composer_, &segments); EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } @@ -4151,7 +4143,7 @@ TEST_F(UserHistoryPredictorTest, PunctuationLinkDesktop) { { ConversionRequest convreq = - SetUpInputForConversion("ございます!", composer_.get(), &segments); + SetUpInputForConversion("ございます!", &composer_, &segments); AddCandidate(0, "ございます!", &segments); predictor->Finish(convreq, &segments); @@ -4162,7 +4154,7 @@ TEST_F(UserHistoryPredictorTest, PunctuationLinkDesktop) { predictor->Finish(convreq, &segments); segments.Clear(); - convreq = SetUpInputForSuggestion("ございます", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("ございます", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.conversion_segment(0).candidate(0).value, "ございます!"); @@ -4170,8 +4162,7 @@ TEST_F(UserHistoryPredictorTest, PunctuationLinkDesktop) { FindCandidateByValue("ございます!よろしくお願いします", segments)); segments.Clear(); - convreq = - SetUpInputForSuggestion("ございます!", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("ございます!", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.conversion_segment(0).candidate(0).value, "ございます!"); @@ -4184,7 +4175,7 @@ TEST_F(UserHistoryPredictorTest, PunctuationLinkDesktop) { { ConversionRequest convreq = - SetUpInputForConversion("ございます", composer_.get(), &segments); + SetUpInputForConversion("ございます", &composer_, &segments); AddCandidate(0, "ございます", &segments); predictor->Finish(convreq, &segments); @@ -4195,7 +4186,7 @@ TEST_F(UserHistoryPredictorTest, PunctuationLinkDesktop) { predictor->Finish(convreq, &segments); segments.Clear(); - convreq = SetUpInputForSuggestion("ございます", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("ございます", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.conversion_segment(0).candidate(0).value, "ございます"); EXPECT_FALSE(FindCandidateByValue("ございます!", segments)); @@ -4210,7 +4201,7 @@ TEST_F(UserHistoryPredictorTest, PunctuationLinkDesktop) { // Note that "よろしくお願いします:よろしくおねがいします" is the sentence // like candidate. Please refer to user_history_predictor.cc ConversionRequest convreq = SetUpInputForConversion( - "よろしくおねがいします", composer_.get(), &segments); + "よろしくおねがいします", &composer_, &segments); AddCandidate(0, "よろしくお願いします", &segments); predictor->Finish(convreq, &segments); @@ -4221,7 +4212,7 @@ TEST_F(UserHistoryPredictorTest, PunctuationLinkDesktop) { predictor->Finish(convreq, &segments); segments.Clear(); - convreq = SetUpInputForSuggestion("よろしくおねがいします", composer_.get(), + convreq = SetUpInputForSuggestion("よろしくおねがいします", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("よろしくお願いします!", segments)); @@ -4236,13 +4227,13 @@ TEST_F(UserHistoryPredictorTest, 62DayOldEntriesAreDeletedAtSync) { // Let the predictor learn "私の名前は中野です". Segments segments; ConversionRequest convreq = SetUpInputForConversion( - "わたしのなまえはなかのです", composer_.get(), &segments); + "わたしのなまえはなかのです", &composer_, &segments); AddCandidate("私の名前は中野です", &segments); predictor->Finish(convreq, &segments); // Verify that "私の名前は中野です" is predicted. segments.Clear(); - convreq = SetUpInputForPrediction("わたしの", composer_.get(), &segments); + convreq = SetUpInputForPrediction("わたしの", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("私の名前は中野です", segments)); @@ -4251,8 +4242,8 @@ TEST_F(UserHistoryPredictorTest, 62DayOldEntriesAreDeletedAtSync) { // Let the predictor learn "私の名前は高橋です". segments.Clear(); - convreq = SetUpInputForConversion("わたしのなまえはたかはしです", - composer_.get(), &segments); + convreq = SetUpInputForConversion("わたしのなまえはたかはしです", &composer_, + &segments); AddCandidate("私の名前は高橋です", &segments); predictor->Finish(convreq, &segments); @@ -4260,7 +4251,7 @@ TEST_F(UserHistoryPredictorTest, 62DayOldEntriesAreDeletedAtSync) { // 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(); - convreq = SetUpInputForPrediction("わたしの", composer_.get(), &segments); + convreq = SetUpInputForPrediction("わたしの", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("私の名前は高橋です", segments)); EXPECT_FALSE(FindCandidateByValue("私の名前は中野です", segments)); @@ -4272,7 +4263,7 @@ TEST_F(UserHistoryPredictorTest, 62DayOldEntriesAreDeletedAtSync) { // Verify that "私の名前は中野です" is no longer predicted because it was // learned 63 days before. segments.Clear(); - convreq = SetUpInputForPrediction("わたしの", composer_.get(), &segments); + convreq = SetUpInputForPrediction("わたしの", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("私の名前は高橋です", segments)); EXPECT_FALSE(FindCandidateByValue("私の名前は中野です", segments)); @@ -4297,13 +4288,13 @@ TEST_F(UserHistoryPredictorTest, FutureTimestamp) { // Let the predictor learn "私の名前は中野です". Segments segments; ConversionRequest convreq = SetUpInputForConversion( - "わたしのなまえはなかのです", composer_.get(), &segments); + "わたしのなまえはなかのです", &composer_, &segments); AddCandidate("私の名前は中野です", &segments); predictor->Finish(convreq, &segments); // Verify that "私の名前は中野です" is predicted. segments.Clear(); - convreq = SetUpInputForPrediction("わたしの", composer_.get(), &segments); + convreq = SetUpInputForPrediction("わたしの", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("私の名前は中野です", segments)); @@ -4312,7 +4303,7 @@ TEST_F(UserHistoryPredictorTest, FutureTimestamp) { // Verify that "私の名前は中野です" is predicted without crash. segments.Clear(); - convreq = SetUpInputForPrediction("わたしの", composer_.get(), &segments); + convreq = SetUpInputForPrediction("わたしの", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_TRUE(FindCandidateByValue("私の名前は中野です", segments)); } @@ -4322,19 +4313,19 @@ TEST_F(UserHistoryPredictorTest, MaxPredictionCandidatesSize) { Segments segments; { ConversionRequest convreq = - SetUpInputForPrediction("てすと", composer_.get(), &segments); + SetUpInputForPrediction("てすと", &composer_, &segments); AddCandidate(0, "てすと", &segments); predictor->Finish(convreq, &segments); } { ConversionRequest convreq = - SetUpInputForPrediction("てすと", composer_.get(), &segments); + SetUpInputForPrediction("てすと", &composer_, &segments); AddCandidate(0, "テスト", &segments); predictor->Finish(convreq, &segments); } { ConversionRequest convreq = - SetUpInputForPrediction("てすと", composer_.get(), &segments); + SetUpInputForPrediction("てすと", &composer_, &segments); AddCandidate(0, "Test", &segments); predictor->Finish(convreq, &segments); } @@ -4356,13 +4347,13 @@ TEST_F(UserHistoryPredictorTest, MaxPredictionCandidatesSize) { } { ConversionRequest convreq = - SetUpInputForSuggestion("てすと", composer_.get(), &segments); + 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); - convreq = SetUpInputForPrediction("てすと", composer_.get(), &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); @@ -4372,13 +4363,13 @@ TEST_F(UserHistoryPredictorTest, MaxPredictionCandidatesSize) { { // Only 3 candidates in user history ConversionRequest convreq = - SetUpInputForSuggestion("てすと", composer_.get(), &segments); + 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); - convreq = SetUpInputForPrediction("てすと", composer_.get(), &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); @@ -4388,12 +4379,12 @@ 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; { - convreq = SetUpInputForPrediction("てすと", composer_.get(), &segments); + convreq = SetUpInputForPrediction("てすと", &composer_, &segments); AddCandidate(0, "てすと", &segments); predictor->Finish(convreq, &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); @@ -4421,14 +4412,14 @@ TEST_F(UserHistoryPredictorTest, MaxPredictionCandidatesSizeForZeroQuery) { // normal prediction candidates size { ConversionRequest convreq = - SetUpInputForSuggestion("かお", composer_.get(), &segments); + 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); - convreq = SetUpInputForPrediction("かお", composer_.get(), &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)); @@ -4439,7 +4430,7 @@ TEST_F(UserHistoryPredictorTest, MaxPredictionCandidatesSizeForZeroQuery) { // prediction candidates for zero query { ConversionRequest convreq = SetUpInputForSuggestionWithHistory( - "", "てすと", "てすと", composer_.get(), &segments); + "", "てすと", "てすと", &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)); @@ -4447,7 +4438,7 @@ TEST_F(UserHistoryPredictorTest, MaxPredictionCandidatesSizeForZeroQuery) { EXPECT_EQ(segments.conversion_segment(0).candidates_size(), 3); convreq = SetUpInputForPredictionWithHistory("", "てすと", "てすと", - composer_.get(), &segments); + &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)); @@ -4464,7 +4455,7 @@ TEST_F(UserHistoryPredictorTest, TypingCorrection) { { clock->Advance(absl::Hours(1)); ConversionRequest convreq = - SetUpInputForPrediction("がっこう", composer_.get(), &segments); + SetUpInputForPrediction("がっこう", &composer_, &segments); AddCandidate(0, "学校", &segments); predictor->Finish(convreq, &segments); } @@ -4472,7 +4463,7 @@ TEST_F(UserHistoryPredictorTest, TypingCorrection) { { clock->Advance(absl::Hours(1)); ConversionRequest convreq = - SetUpInputForPrediction("がっこう", composer_.get(), &segments); + SetUpInputForPrediction("がっこう", &composer_, &segments); AddCandidate(0, "ガッコウ", &segments); predictor->Finish(convreq, &segments); } @@ -4480,20 +4471,20 @@ TEST_F(UserHistoryPredictorTest, TypingCorrection) { { clock->Advance(absl::Hours(1)); ConversionRequest convreq = - SetUpInputForPrediction("かっこう", composer_.get(), &segments); + SetUpInputForPrediction("かっこう", &composer_, &segments); AddCandidate(0, "格好", &segments); predictor->Finish(convreq, &segments); } - request_->mutable_decoder_experiment_params() + request_.mutable_decoder_experiment_params() ->set_typing_correction_apply_user_history_size(1); ConversionRequest convreq = - SetUpInputForSuggestion("がっこ", composer_.get(), &segments); + SetUpInputForSuggestion("がっこ", &composer_, &segments); EXPECT_TRUE(predictor->PredictForRequest(convreq, &segments)); // No typing correction. - convreq = SetUpInputForSuggestion("かつこ", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("かつこ", &composer_, &segments); EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); std::vector expected; @@ -4510,15 +4501,15 @@ 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); - convreq = SetUpInputForSuggestion("かつこ", composer_.get(), &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); - convreq = SetUpInputForSuggestion("かつこ", composer_.get(), &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); @@ -4526,9 +4517,9 @@ TEST_F(UserHistoryPredictorTest, TypingCorrection) { 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); - convreq = SetUpInputForSuggestion("かつこ", composer_.get(), &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); @@ -4537,7 +4528,7 @@ TEST_F(UserHistoryPredictorTest, TypingCorrection) { EXPECT_EQ(segments.segment(0).candidate(2).value, "学校"); SetSupplementalModel(nullptr); - convreq = SetUpInputForSuggestion("かつこ", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("かつこ", &composer_, &segments); EXPECT_FALSE(predictor->PredictForRequest(convreq, &segments)); } @@ -4547,19 +4538,19 @@ TEST_F(UserHistoryPredictorTest, MaxCharCoverage) { { ConversionRequest convreq = - SetUpInputForPrediction("てすと", composer_.get(), &segments); + SetUpInputForPrediction("てすと", &composer_, &segments); AddCandidate(0, "てすと", &segments); predictor->Finish(convreq, &segments); } { ConversionRequest convreq = - SetUpInputForPrediction("てすと", composer_.get(), &segments); + SetUpInputForPrediction("てすと", &composer_, &segments); AddCandidate(0, "テスト", &segments); predictor->Finish(convreq, &segments); } { ConversionRequest convreq = - SetUpInputForPrediction("てすと", composer_.get(), &segments); + SetUpInputForPrediction("てすと", &composer_, &segments); AddCandidate(0, "Test", &segments); predictor->Finish(convreq, &segments); } @@ -4570,7 +4561,7 @@ 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); MakeSegments("てすと", &segments); ConversionRequest convreq = CreateConversionRequest(); @@ -4595,11 +4586,11 @@ TEST_F(UserHistoryPredictorTest, RemoveRedundantCandidates) { for (auto it = candidates.rbegin(); it != candidates.rend(); ++it) { clock->Advance(absl::Hours(1)); ConversionRequest convreq = - SetUpInputForPrediction("とうき", composer_.get(), &segments); + SetUpInputForPrediction("とうき", &composer_, &segments); AddCandidate(0, *it, &segments); predictor->Finish(convreq, &segments); } - request_->mutable_decoder_experiment_params() + request_.mutable_decoder_experiment_params() ->set_user_history_prediction_filter_redundant_candidates_mode( filter_mode); MakeSegments("とうき", &segments); @@ -4684,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 私の名前は中野です @@ -4693,7 +4684,7 @@ TEST_F(UserHistoryPredictorTest, ContentValueZeroQuery) { constexpr absl::string_view kKey = "わたしのなまえはなかのです"; constexpr absl::string_view kValue = "私の名前は中野です"; ConversionRequest convreq = - SetUpInputForPrediction(kKey, composer_.get(), &segments); + SetUpInputForPrediction(kKey, &composer_, &segments); Segment::Candidate *candidate = segments.mutable_segment(0)->add_candidate(); CHECK(candidate); @@ -4721,13 +4712,13 @@ TEST_F(UserHistoryPredictorTest, ContentValueZeroQuery) { for (const auto &[hist_key, hist_value, suggestion] : kZeroQueryTest) { segments.Clear(); ConversionRequest convreq = - SetUpInputForConversion(hist_key, composer_.get(), &segments); + SetUpInputForConversion(hist_key, &composer_, &segments); AddCandidate(0, hist_value, &segments); predictor->Finish(convreq, &segments); segments.mutable_segment(0)->set_segment_type(Segment::HISTORY); convreq = SetUpInputForSuggestionWithHistory("", hist_key, hist_value, - composer_.get(), &segments); - request_->set_zero_query_suggestion(true); + &composer_, &segments); + request_.set_zero_query_suggestion(true); ASSERT_TRUE(predictor->PredictForRequest(convreq, &segments)); } @@ -4735,18 +4726,18 @@ TEST_F(UserHistoryPredictorTest, ContentValueZeroQuery) { { segments.Clear(); ConversionRequest convreq = - SetUpInputForSuggestion("", composer_.get(), &segments); + SetUpInputForSuggestion("", &composer_, &segments); PrependHistorySegments("の", "の", &segments); PrependHistorySegments("わたし", "私", &segments); - request_->set_zero_query_suggestion(true); + request_.set_zero_query_suggestion(true); ASSERT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.conversion_segment(0).candidate(0).value, "名前"); segments.Clear(); - convreq = SetUpInputForSuggestion("", composer_.get(), &segments); + convreq = SetUpInputForSuggestion("", &composer_, &segments); PrependHistorySegments("は", "は", &segments); PrependHistorySegments("なまえ", "名前", &segments); - request_->set_zero_query_suggestion(true); + request_.set_zero_query_suggestion(true); ASSERT_TRUE(predictor->PredictForRequest(convreq, &segments)); EXPECT_EQ(segments.conversion_segment(0).candidate(0).value, "中野"); } From 895898081db43500797a6cc55beb31810d789537 Mon Sep 17 00:00:00 2001 From: Hiroyuki Komatsu Date: Wed, 9 Oct 2024 06:27:54 +0000 Subject: [PATCH 4/5] Remove convreq_ from user_segment_history_rewriter_test.cc * This is a preparation to replace Composer in ConversionRequest with const objects. #codehealth PiperOrigin-RevId: 683904483 --- .../user_segment_history_rewriter_test.cc | 332 +++++++++++------- 1 file changed, 197 insertions(+), 135 deletions(-) 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)); } } From 1f4119d3dfd8c834b6ab3de79806b7030205c251 Mon Sep 17 00:00:00 2001 From: Noriyuki Takahashi Date: Thu, 10 Oct 2024 02:06:34 +0000 Subject: [PATCH 5/5] Add a absl::string_view version for SplitStringToUtf8Chars(). The current implementation actually appends split characters to the output, so this CL also renames it to AppendUtf8Chars(). The split version is modified so that it returns a std::vector. PiperOrigin-RevId: 684252351 --- src/base/util.cc | 30 +++++++++++++++++---- src/base/util.h | 16 ++++++++--- src/base/util_test.cc | 40 ++++++++++++++++++++-------- src/composer/composer_test.cc | 6 ++--- src/converter/immutable_converter.cc | 4 +-- 5 files changed, 71 insertions(+), 25 deletions(-) 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.