@@ -87,7 +87,6 @@ using mozc::dictionary::SuppressionDictionary;
87
87
using mozc::dictionary::Token;
88
88
using testing::_;
89
89
90
- DECLARE_string (test_tmpdir);
91
90
DECLARE_bool (enable_expansion_for_dictionary_predictor);
92
91
93
92
namespace mozc {
@@ -1324,6 +1323,48 @@ TEST_F(DictionaryPredictorTest, AggregateUnigramPrediction) {
1324
1323
EXPECT_EQ (1 , segments.conversion_segments_size ());
1325
1324
}
1326
1325
1326
+ TEST_F (DictionaryPredictorTest, AggregateUnigramCandidateForMixedConversion) {
1327
+ const char kHiraganaA [] = " \xE3\x81\x82 " ;
1328
+
1329
+ DictionaryMock mock_dict;
1330
+ // A system dictionary entry "a".
1331
+ mock_dict.AddLookupPredictive (kHiraganaA , kHiraganaA , " a" , Token::NONE);
1332
+ // System dictionary entries "a0", ..., "a9", which are detected as redundant
1333
+ // by MaybeRedundant(); see dictionary_predictor.cc.
1334
+ for (int i = 0 ; i < 10 ; ++i) {
1335
+ mock_dict.AddLookupPredictive (kHiraganaA , kHiraganaA ,
1336
+ Util::StringPrintf (" a%d" , i), Token::NONE);
1337
+ }
1338
+ // A user dictionary entry "aaa". MaybeRedundant() detects this entry as
1339
+ // redundant but it should not be filtered in prediction.
1340
+ mock_dict.AddLookupPredictive (kHiraganaA , kHiraganaA , " aaa" ,
1341
+ Token::USER_DICTIONARY);
1342
+
1343
+ config_->set_use_dictionary_suggest (true );
1344
+ config_->set_use_realtime_conversion (false );
1345
+ table_->LoadFromFile (" system://12keys-hiragana.tsv" );
1346
+ composer_->SetTable (table_.get ());
1347
+ InsertInputSequence (kHiraganaA , composer_.get ());
1348
+ Segments segments;
1349
+ segments.set_request_type (Segments::PREDICTION);
1350
+ Segment *segment = segments.add_segment ();
1351
+ segment->set_key (kHiraganaA );
1352
+
1353
+ vector<DictionaryPredictor::Result> results;
1354
+ DictionaryPredictor::AggregateUnigramCandidateForMixedConversion (
1355
+ mock_dict, *convreq_, segments, &results);
1356
+
1357
+ // Check if "aaa" is not filtered.
1358
+ auto iter = results.begin ();
1359
+ for (; iter != results.end (); ++iter) {
1360
+ if (iter->key == kHiraganaA && iter->value == " aaa" &&
1361
+ iter->IsUserDictionaryResult ()) {
1362
+ break ;
1363
+ }
1364
+ }
1365
+ EXPECT_NE (results.end (), iter);
1366
+ }
1367
+
1327
1368
TEST_F (DictionaryPredictorTest, AggregateBigramPrediction) {
1328
1369
unique_ptr<MockDataAndPredictor> data_and_predictor (
1329
1370
CreateDictionaryPredictorWithMockData ());
@@ -2842,6 +2883,91 @@ TEST_F(DictionaryPredictorTest, SetLMCost) {
2842
2883
EXPECT_GT (results[2 ].cost , results[1 ].cost );
2843
2884
}
2844
2885
2886
+ namespace {
2887
+
2888
+ void AddTestableDictionaryPredictorResult (
2889
+ const char *key, const char *value, int wcost,
2890
+ TestableDictionaryPredictor::PredictionTypes prediction_types,
2891
+ Token::AttributesBitfield attributes,
2892
+ vector<TestableDictionaryPredictor::Result> *results) {
2893
+ results->push_back (TestableDictionaryPredictor::MakeEmptyResult ());
2894
+ TestableDictionaryPredictor::Result *result = &results->back ();
2895
+ result->key = key;
2896
+ result->value = value;
2897
+ result->wcost = wcost;
2898
+ result->SetTypesAndTokenAttributes (prediction_types, attributes);
2899
+ }
2900
+
2901
+ } // namespace
2902
+
2903
+ TEST_F (DictionaryPredictorTest, SetLMCostForUserDictionaryWord) {
2904
+ unique_ptr<MockDataAndPredictor> data_and_predictor (
2905
+ CreateDictionaryPredictorWithMockData ());
2906
+ const TestableDictionaryPredictor *predictor =
2907
+ data_and_predictor->dictionary_predictor ();
2908
+
2909
+ // "あいか"
2910
+ const char *kAikaHiragana = " \xe3\x81\x82\xe3\x81\x84\xe3\x81\x8b " ;
2911
+ // "愛佳"
2912
+ const char *kAikaKanji = " \xe6\x84\x9b\xe4\xbd\xb3 " ;
2913
+
2914
+ Segments segments;
2915
+ segments.set_request_type (Segments::PREDICTION);
2916
+ Segment *segment = segments.add_segment ();
2917
+ ASSERT_NE (nullptr , segment);
2918
+ segment->set_key (kAikaHiragana );
2919
+
2920
+ {
2921
+ // Cost of words in user dictionary should be decreased.
2922
+ const int kOrigianlWordCost = 10000 ;
2923
+ vector<TestableDictionaryPredictor::Result> results;
2924
+ AddTestableDictionaryPredictorResult (
2925
+ kAikaHiragana , kAikaKanji , kOrigianlWordCost ,
2926
+ TestableDictionaryPredictor::UNIGRAM, Token::USER_DICTIONARY,
2927
+ &results);
2928
+
2929
+ predictor->SetLMCost (segments, &results);
2930
+
2931
+ EXPECT_EQ (1 , results.size ());
2932
+ EXPECT_EQ (kAikaKanji , results[0 ].value );
2933
+ EXPECT_GT (kOrigianlWordCost , results[0 ].cost );
2934
+ EXPECT_LE (1 , results[0 ].cost );
2935
+ }
2936
+
2937
+ {
2938
+ // Cost of words in user dictionary should not be decreased to below 1.
2939
+ const int kOrigianlWordCost = 10 ;
2940
+ vector<TestableDictionaryPredictor::Result> results;
2941
+ AddTestableDictionaryPredictorResult (
2942
+ kAikaHiragana , kAikaKanji , kOrigianlWordCost ,
2943
+ TestableDictionaryPredictor::UNIGRAM, Token::USER_DICTIONARY,
2944
+ &results);
2945
+
2946
+ predictor->SetLMCost (segments, &results);
2947
+
2948
+ EXPECT_EQ (1 , results.size ());
2949
+ EXPECT_EQ (kAikaKanji , results[0 ].value );
2950
+ EXPECT_GT (kOrigianlWordCost , results[0 ].cost );
2951
+ EXPECT_LE (1 , results[0 ].cost );
2952
+ }
2953
+
2954
+ {
2955
+ // Cost of words not in user dictionary should not be decreased.
2956
+ const int kOrigianlWordCost = 10000 ;
2957
+ vector<TestableDictionaryPredictor::Result> results;
2958
+ AddTestableDictionaryPredictorResult (
2959
+ kAikaHiragana , kAikaKanji , kOrigianlWordCost ,
2960
+ TestableDictionaryPredictor::UNIGRAM, Token::NONE,
2961
+ &results);
2962
+
2963
+ predictor->SetLMCost (segments, &results);
2964
+
2965
+ EXPECT_EQ (1 , results.size ());
2966
+ EXPECT_EQ (kAikaKanji , results[0 ].value );
2967
+ EXPECT_EQ (kOrigianlWordCost , results[0 ].cost );
2968
+ }
2969
+ }
2970
+
2845
2971
TEST_F (DictionaryPredictorTest, SuggestSpellingCorrection) {
2846
2972
testing::MockDataManager data_manager;
2847
2973
0 commit comments