Codebase list mozc / f4b11cb
Stop espacing non-ASCII string literals under src/session/. BUG=#385 REF_BUG=31204285 REF_CL=173506865 REF_TIME=2017-10-26T16:59:25+09:00 REF_TIME_RAW=1509004765 +0900 Noriyuki Takahashi 6 years ago
13 changed file(s) with 834 addition(s) and 1820 deletion(s). Raw diff Collapse all Expand all
2929
3030 MAJOR=2
3131 MINOR=23
32 BUILD=2753
32 BUILD=2754
3333 REVISION=102
3434 # This version represents the version of Mozc IME engine (converter, predictor,
3535 # etc.). This version info is included both in the Mozc server and in the Mozc
123123
124124 TEST(ImeContextTest, CopyContext) {
125125 composer::Table table;
126 // "あ"
127 table.AddRule("a", "\xE3\x81\x82", "");
128 // "ん"
129 table.AddRule("n", "\xE3\x82\x93", "");
130 // "な"
131 table.AddRule("na", "\xE3\x81\xAA", "");
126 table.AddRule("a", "あ", "");
127 table.AddRule("n", "ん", "");
128 table.AddRule("na", "な", "");
132129 const commands::Request request;
133130 const config::Config config;
134131
136133
137134 Segments segments;
138135 Segment *segment = segments.add_segment();
139 // "あん"
140 segment->set_key("\xE3\x81\x82\xE3\x82\x93");
136 segment->set_key("あん");
141137 Segment::Candidate *candidate = segment->add_candidate();
142 // "庵"
143 candidate->value = "\xE5\xBA\xB5";
138 candidate->value = "庵";
144139
145140 engine->mutable_converter_mock()->SetStartConversionForRequest(&segments,
146141 true);
161156
162157 string composition;
163158 source.composer().GetStringForSubmission(&composition);
164 // "あn"
165 EXPECT_EQ("\xE3\x81\x82\xEF\xBD\x8E", composition);
159 EXPECT_EQ("あn", composition);
166160
167161 ImeContext::CopyContext(source, &destination);
168162 EXPECT_EQ(ImeContext::COMPOSITION, destination.state());
169163 composition.clear();
170164 source.composer().GetStringForSubmission(&composition);
171 // "あn"
172 EXPECT_EQ("\xE3\x81\x82\xEF\xBD\x8E", composition);
165 EXPECT_EQ("あn", composition);
173166 }
174167
175168 {
191184 source.mutable_composer()->InsertCharacter("a");
192185 source.mutable_composer()->InsertCharacter("n");
193186 source.mutable_converter()->Convert(source.composer());
194 // "早い"
195 const string &kQuick = "\xE6\x97\xA9\xE3\x81\x84";
187 const string &kQuick = "早い";
196188 source.mutable_composer()->set_source_text(kQuick);
197189
198190 string composition;
199191 source.composer().GetQueryForConversion(&composition);
200 // "あん"
201 EXPECT_EQ("\xE3\x81\x82\xE3\x82\x93", composition);
192 EXPECT_EQ("あん", composition);
202193
203194 commands::Output output;
204195 source.converter().FillOutput(source.composer(), &output);
205196 EXPECT_EQ(1, output.preedit().segment_size());
206 // "庵"
207 EXPECT_EQ("\xE5\xBA\xB5", output.preedit().segment(0).value());
197 EXPECT_EQ("庵", output.preedit().segment(0).value());
208198
209199 ImeContext::CopyContext(source, &destination);
210200 EXPECT_EQ(kCreateTime, destination.create_time());
212202 EXPECT_EQ(ImeContext::CONVERSION, destination.state());
213203 composition.clear();
214204 destination.composer().GetQueryForConversion(&composition);
215 // "あん"
216 EXPECT_EQ("\xE3\x81\x82\xE3\x82\x93", composition);
205 EXPECT_EQ("あん", composition);
217206
218207 output.Clear();
219208 destination.converter().FillOutput(source.composer(), &output);
220209 EXPECT_EQ(1, output.preedit().segment_size());
221 // "庵"
222 EXPECT_EQ("\xE5\xBA\xB5", output.preedit().segment(0).value());
210 EXPECT_EQ("庵", output.preedit().segment(0).value());
223211
224212 EXPECT_EQ(kQuick, destination.composer().source_text());
225213 }
6060 punctuation == Config::COMMA_TOUTEN) {
6161 KeyEvent key_event;
6262 key_event.set_key_code(static_cast<uint32>(','));
63 // ","
64 key_event.set_key_string("\xef\xbc\x8c");
65 // "、"
66 table_.insert(std::make_pair("\xe3\x80\x81", key_event));
63 key_event.set_key_string(",");
64 table_.insert(std::make_pair("、", key_event));
6765 }
6866 if (punctuation == Config::COMMA_PERIOD ||
6967 punctuation == Config::KUTEN_PERIOD) {
7068 KeyEvent key_event;
7169 key_event.set_key_code(static_cast<uint32>('.'));
72 // "."
73 key_event.set_key_string("\xef\xbc\x8e");
74 // "。"
75 table_.insert(std::make_pair("\xe3\x80\x82", key_event));
70 key_event.set_key_string(".");
71 table_.insert(std::make_pair("。", key_event));
7672 }
7773
7874 const Config::SymbolMethod symbol = config.symbol_method();
8177 {
8278 KeyEvent key_event;
8379 key_event.set_key_code(static_cast<uint32>('['));
84 // "["
85 key_event.set_key_string("\xef\xbc\xbb");
86 // "「"
87 table_.insert(std::make_pair("\xe3\x80\x8c", key_event));
80 key_event.set_key_string("[");
81 table_.insert(std::make_pair("「", key_event));
8882 }
8983 {
9084 KeyEvent key_event;
9185 key_event.set_key_code(static_cast<uint32>(']'));
92 // "]"
93 key_event.set_key_string("\xef\xbc\xbd");
94 // "」"
95 table_.insert(std::make_pair("\xe3\x80\x8d", key_event));
86 key_event.set_key_string("]");
87 table_.insert(std::make_pair("」", key_event));
9688 }
9789 }
9890 if (symbol == Config::SQUARE_BRACKET_SLASH ||
9991 symbol == Config::CORNER_BRACKET_SLASH) {
10092 KeyEvent key_event;
10193 key_event.set_key_code(static_cast<uint32>('/'));
102 // "/"
103 key_event.set_key_string("\xef\xbc\x8f");
104 // "・"
105 table_.insert(std::make_pair("\xE3\x83\xBB", key_event));
94 key_event.set_key_string("/");
95 table_.insert(std::make_pair("・", key_event));
10696 }
10797 }
10898
133133 table->ReloadConfig(config);
134134 {
135135 SCOPED_TRACE("NUMPAD_INPUT_MODE: input: 0");
136 // "0"
137 TestNumpadTransformation(commands::KeyEvent::NUMPAD0, '0', "\xef\xbc\x90",
136 TestNumpadTransformation(commands::KeyEvent::NUMPAD0, '0', "0",
138137 commands::KeyEvent::FOLLOW_MODE);
139138 }
140139 {
141 // "="
142140 SCOPED_TRACE("NUMPAD_INPUT_MODE: input: =");
143 TestNumpadTransformation(commands::KeyEvent::EQUALS, '=', "\xef\xbc\x9d",
141 TestNumpadTransformation(commands::KeyEvent::EQUALS, '=', "=",
144142 commands::KeyEvent::FOLLOW_MODE);
145143 }
146144 }
151149 table->ReloadConfig(config);
152150 {
153151 SCOPED_TRACE("NUMPAD_FULL_WIDTH: input: 0");
154 // "0"
155 TestNumpadTransformation(commands::KeyEvent::NUMPAD0, '0', "\xef\xbc\x90",
152 TestNumpadTransformation(commands::KeyEvent::NUMPAD0, '0', "0",
156153 commands::KeyEvent::AS_IS);
157154 }
158155 {
159156 SCOPED_TRACE("NUMPAD_FULL_WIDTH: input: =");
160 // "="
161 TestNumpadTransformation(commands::KeyEvent::EQUALS, '=', "\xef\xbc\x9d",
157 TestNumpadTransformation(commands::KeyEvent::EQUALS, '=', "=",
162158 commands::KeyEvent::AS_IS);
163159 }
164160 }
200196 KeyEventTransformer *table = Singleton<KeyEventTransformer>::get();
201197
202198 { // Punctuation
203 const char *kFullKuten = "\xe3\x80\x81"; // "、"
204 const char *kFullTouten = "\xE3\x80\x82"; // "。"
205 const char *kFullComma = "\xef\xbc\x8c"; // ","
206 const char *kFullPeriod = "\xef\xbc\x8e"; // "."
199 const char *kFullKuten = "、";
200 const char *kFullTouten = "。";
201 const char *kFullComma = ",";
202 const char *kFullPeriod = ".";
207203
208204 {
209205 SCOPED_TRACE("KUTEN_TOUTEN");
244240 }
245241
246242 { // Symbol
247 const char *kFullLeftSquareBracket = "\xef\xbc\xbb"; // "["
248 const char *kFullRightSquareBracket = "\xef\xbc\xbd"; // "]"
249 const char *kFullLeftCornerBracket = "\xe3\x80\x8c"; // "「"
250 const char *kFullRightCornerBracket = "\xe3\x80\x8d"; // "」"
251 const char *kFullSlash = "\xef\xbc\x8f"; // "/"
252 const char *kFullMiddleDot = "\xE3\x83\xBB"; // "・"
243 const char *kFullLeftSquareBracket = "[";
244 const char *kFullRightSquareBracket = "]";
245 const char *kFullLeftCornerBracket = "「";
246 const char *kFullRightCornerBracket = "」";
247 const char *kFullSlash = "/";
248 const char *kFullMiddleDot = "・";
253249
254250 {
255251 SCOPED_TRACE("CORNER_BRACKET_MIDDLE_DOT");
315315 commands::Footer *footer = candidates->mutable_footer();
316316 if (category == commands::SUGGESTION) {
317317 // TODO(komatsu): Enable to localized the message.
318 // "Tabキーで選択"
319 const char kLabel[] = ("Tab\xE3\x82\xAD\xE3\x83\xBC\xE3\x81\xA7"
320 "\xE9\x81\xB8\xE6\x8A\x9E");
318 const char kLabel[] = "Tabキーで選択";
321319 // TODO(komatsu): Need to check if Tab is not changed to other key binding.
322320 footer->set_label(kLabel);
323321 } else {
336334 if (cand.has_annotation() && cand.annotation().deletable()) {
337335 // TODO(noriyukit): Change the message depending on user's keymap.
338336 #if defined(OS_MACOSX)
339 // "control+fn+deleteで履歴から削除"
340 const char kDeleteInstruction[] =
341 "\x63\x6F\x6E\x74\x72\x6F\x6C\x2B\x66\x6E\x2B\x64\x65\x6C\x65"
342 "\x74\x65\xE3\x81\xA7\xE5\xB1\xA5\xE6\xAD\xB4\xE3\x81\x8B\xE3"
343 "\x82\x89\xE5\x89\x8A\xE9\x99\xA4";
337 const char kDeleteInstruction[] = "control+fn+deleteで履歴から削除";
344338 #elif defined(OS_NACL)
345 // "ctrl+alt+backspaceで履歴から削除"
346 const char kDeleteInstruction[] =
347 "\x63\x74\x72\x6C\x2B\x61\x6C\x74\x2B\x62\x61\x63\x6B\x73\x70"
348 "\x61\x63\x65\xE3\x81\xA7\xE5\xB1\xA5\xE6\xAD\xB4\xE3\x81\x8B"
349 "\xE3\x82\x89\xE5\x89\x8A\xE9\x99\xA4";
350 #else // !OS_MACOSX && !OS_NACL
351 // "Ctrl+Delで履歴から削除"
352 const char kDeleteInstruction[] =
353 "\x43\x74\x72\x6C\x2B\x44\x65\x6C\xE3\x81\xA7\xE5\xB1\xA5"
354 "\xE6\xAD\xB4\xE3\x81\x8B\xE3\x82\x89\xE5\x89\x8A\xE9\x99\xA4";
339 const char kDeleteInstruction[] = "ctrl+alt+backspaceで履歴から削除";
340 #else // !OS_MACOSX && !OS_NACL
341 const char kDeleteInstruction[] = "Ctrl+Delで履歴から削除";
355342 #endif // OS_MACOSX || OS_NACL
356343 footer->set_label(kDeleteInstruction);
357344 show_build_number = false;
596596 #else // CHANNEL_DEV && GOOGLE_JAPANESE_INPUT_BUILD
597597 EXPECT_TRUE(candidates.footer().has_label());
598598 EXPECT_FALSE(candidates.footer().has_sub_label());
599 // "Tabキーで選択"
600 const char kLabel[] = ("Tab\xE3\x82\xAD\xE3\x83\xBC\xE3\x81\xA7"
601 "\xE9\x81\xB8\xE6\x8A\x9E");
599 const char kLabel[] = "Tabキーで選択";
602600 EXPECT_EQ(kLabel, candidates.footer().label());
603601 #endif // CHANNEL_DEV && GOOGLE_JAPANESE_INPUT_BUILD
604602
645643 ASSERT_TRUE(candidates.has_footer());
646644 ASSERT_TRUE(candidates.footer().has_label());
647645 #if defined(OS_MACOSX)
648 const char kDeleteInstruction[] = // "control+fn+deleteで履歴から削除"
649 "\x63\x6F\x6E\x74\x72\x6F\x6C\x2B\x66\x6E\x2B\x64\x65\x6C\x65"
650 "\x74\x65\xE3\x81\xA7\xE5\xB1\xA5\xE6\xAD\xB4\xE3\x81\x8B\xE3"
651 "\x82\x89\xE5\x89\x8A\xE9\x99\xA4";
646 const char kDeleteInstruction[] = "control+fn+deleteで履歴から削除";
652647 #elif defined(OS_NACL)
653 const char kDeleteInstruction[] = // "ctrl+alt+backspaceで履歴から削除"
654 "\x63\x74\x72\x6C\x2B\x61\x6C\x74\x2B\x62\x61\x63\x6B\x73\x70"
655 "\x61\x63\x65\xE3\x81\xA7\xE5\xB1\xA5\xE6\xAD\xB4\xE3\x81\x8B"
656 "\xE3\x82\x89\xE5\x89\x8A\xE9\x99\xA4";
648 const char kDeleteInstruction[] = "ctrl+alt+backspaceで履歴から削除";
657649 #else // !OS_MACOSX && !OS_NACL
658 const char kDeleteInstruction[] = // "Ctrl+Delで履歴から削除"
659 "\x43\x74\x72\x6C\x2B\x44\x65\x6C\xE3\x81\xA7\xE5\xB1\xA5"
660 "\xE6\xAD\xB4\xE3\x81\x8B\xE3\x82\x89\xE5\x89\x8A\xE9\x99\xA4";
650 const char kDeleteInstruction[] = "Ctrl+Delで履歴から削除";
661651 #endif // OS_MACOSX || OS_NACL
662652 EXPECT_EQ(kDeleteInstruction, candidates.footer().label());
663653 #if defined(CHANNEL_DEV) && defined(GOOGLE_JAPANESE_INPUT_BUILD)
771761 }
772762
773763 TEST(SessionOutputTest, FillConversionResultWithoutNormalization) {
774 // "ゔ"
775 const char kInput[] = "\xE3\x82\x94";
764 const char kInput[] = "ゔ";
776765
777766 commands::Result result;
778767 SessionOutput::FillConversionResultWithoutNormalization(
4949 segment->set_annotation(commands::Preedit::Segment::UNDERLINE);
5050 segment->set_value("Alpha");
5151 segment->set_value_length(5);
52 // "あるふぁ"
53 segment->set_key("\343\201\202\343\202\213\343\201\265\343\201\201");
52 segment->set_key("あるふぁ");
5453 }
5554 {
5655 commands::Preedit::Segment *segment = preedit->add_segment();
5756 segment->set_annotation(commands::Preedit::Segment::HIGHLIGHT);
5857 segment->set_value("be-ta");
5958 segment->set_value_length(5);
60 // "べーた"
61 segment->set_key("\343\201\271\343\203\274\343\201\237");
59 segment->set_key("べーた");
6260 }
6361 preedit->set_highlighted_position(5);
6462 }
7270 candidate->set_value("BETA");
7371 {
7472 commands::Annotation *annotation = candidate->mutable_annotation();
75 // "[半] アルファベット"
76 annotation->set_description(
77 "[\345\215\212] \343\202\242\343\203\253\343\203\225\343\202\241"
78 "\343\203\231\343\203\203\343\203\210");
73 annotation->set_description("[半] アルファベット");
7974 annotation->set_shortcut("1");
8075 }
8176 candidate->set_id(0);
8378 {
8479 commands::Candidates::Candidate *candidate = candidates->add_candidate();
8580 candidate->set_index(1);
86 // "ベータ"
87 candidate->set_value("\343\203\231\343\203\274\343\202\277");
88 {
89 commands::Annotation *annotation = candidate->mutable_annotation();
90 // "[全] カタカナ"
91 annotation->set_description(
92 "[\345\215\212] \343\202\253\343\202\277\343\202\253\343\203\212");
81 candidate->set_value("ベータ");
82 {
83 commands::Annotation *annotation = candidate->mutable_annotation();
84 annotation->set_description("[半] カタカナ");
9385 annotation->set_shortcut("2");
9486 }
9587 candidate->set_id(1);
10092 candidate->set_value("beta");
10193 {
10294 commands::Annotation *annotation = candidate->mutable_annotation();
103 // "[半] アルファベット"
104 annotation->set_description(
105 "[\345\215\212] \343\202\242\343\203\253\343\203\225\343\202\241"
106 "\343\203\231\343\203\203\343\203\210");
95 annotation->set_description("[半] アルファベット");
10796 annotation->set_shortcut("3");
10897 }
10998 candidate->set_id(2);
111100 {
112101 commands::Candidates::Candidate *candidate = candidates->add_candidate();
113102 candidate->set_index(3);
114 // "β"
115 candidate->set_value("\316\262");
116 {
117 commands::Annotation *annotation = candidate->mutable_annotation();
118 // "ギリシャ文字(小文字)"
119 annotation->set_description(
120 "\343\202\256\343\203\252\343\202\267\343\203\243\346\226\207"
121 "\345\255\227(\345\260\217\346\226\207\345\255\227)");
103 candidate->set_value("β");
104 {
105 commands::Annotation *annotation = candidate->mutable_annotation();
106 annotation->set_description("ギリシャ文字(小文字)");
122107 annotation->set_shortcut("4");
123108 }
124109 candidate->set_id(3);
126111 {
127112 commands::Candidates::Candidate *candidate = candidates->add_candidate();
128113 candidate->set_index(4);
129 // "Β"
130 candidate->set_value("\316\222");
131 {
132 commands::Annotation *annotation = candidate->mutable_annotation();
133 // "ギリシャ文字(大文字)"
134 annotation->set_description(
135 "\343\202\256\343\203\252\343\202\267\343\203\243\346\226\207"
136 "\345\255\227(\345\244\247\346\226\207\345\255\227)");
114 candidate->set_value("Β");
115 {
116 commands::Annotation *annotation = candidate->mutable_annotation();
117 annotation->set_description("ギリシャ文字(大文字)");
137118 annotation->set_shortcut("5");
138119 }
139120 candidate->set_id(4);
141122 {
142123 commands::Candidates::Candidate *candidate = candidates->add_candidate();
143124 candidate->set_index(5);
144 // "㌼"
145 candidate->set_value("\343\214\274");
146 {
147 commands::Annotation *annotation = candidate->mutable_annotation();
148 // "<機種依存文字>"
149 annotation->set_description("<\346\251\237\347\250\256\344\276\235"
150 "\345\255\230\346\226\207\345\255\227>");
125 candidate->set_value("㌼");
126 {
127 commands::Annotation *annotation = candidate->mutable_annotation();
128 annotation->set_description("<機種依存文字>");
151129 annotation->set_shortcut("6");
152130 }
153131 candidate->set_id(5);
158136 candidate->set_value("Beta");
159137 {
160138 commands::Annotation *annotation = candidate->mutable_annotation();
161 // "[半] アルファベット"
162 annotation->set_description(
163 "[\345\215\212] \343\202\242\343\203\253\343\203\225\343\202\241"
164 "\343\203\231\343\203\203\343\203\210");
139 annotation->set_description("[半] アルファベット");
165140 annotation->set_shortcut("7");
166141 }
167142 candidate->set_id(6);
169144 {
170145 commands::Candidates::Candidate *candidate = candidates->add_candidate();
171146 candidate->set_index(7);
172 // "べーた"
173 candidate->set_value("\343\201\271\343\203\274\343\201\237");
174 {
175 commands::Annotation *annotation = candidate->mutable_annotation();
176 // "ひらがな"
177 annotation->set_description(
178 "\343\201\262\343\202\211\343\201\214\343\201\252");
147 candidate->set_value("べーた");
148 {
149 commands::Annotation *annotation = candidate->mutable_annotation();
150 annotation->set_description("ひらがな");
179151 annotation->set_shortcut("8");
180152 }
181153 candidate->set_id(7);
183155 {
184156 commands::Candidates::Candidate *candidate = candidates->add_candidate();
185157 candidate->set_index(8);
186 // "そのほかの文字種"
187 candidate->set_value("\343\201\235\343\201\256\343\201\273\343\201\213"
188 "\343\201\256\346\226\207\345\255\227\347\250\256");
158 candidate->set_value("そのほかの文字種");
189159 {
190160 commands::Annotation *annotation = candidate->mutable_annotation();
191161 annotation->set_shortcut("9");
203173 commands::Candidates::Candidate *candidate =
204174 sub_candidates->add_candidate();
205175 candidate->set_index(0);
206 // "べーた"
207 candidate->set_value("\343\201\271\343\203\274\343\201\237");
208 {
209 commands::Annotation *annotation = candidate->mutable_annotation();
210 // "ひらがな"
211 annotation->set_description(
212 "\343\201\262\343\202\211\343\201\214\343\201\252");
176 candidate->set_value("べーた");
177 {
178 commands::Annotation *annotation = candidate->mutable_annotation();
179 annotation->set_description("ひらがな");
213180 }
214181 candidate->set_id(-1);
215182 }
217184 commands::Candidates::Candidate *candidate =
218185 sub_candidates->add_candidate();
219186 candidate->set_index(1);
220 // "ベータ"
221 candidate->set_value("\343\203\231\343\203\274\343\202\277");
222 {
223 commands::Annotation *annotation = candidate->mutable_annotation();
224 // "[全] カタカナ"
225 annotation->set_description(
226 "[\345\215\212] "
227 "\343\202\253\343\202\277\343\202\253\343\203\212");
187 candidate->set_value("ベータ");
188 {
189 commands::Annotation *annotation = candidate->mutable_annotation();
190 annotation->set_description("[半] カタカナ");
228191 }
229192 candidate->set_id(-2);
230193 }
235198 candidate->set_value("be-ta");
236199 {
237200 commands::Annotation *annotation = candidate->mutable_annotation();
238 // "[半]"
239 annotation->set_description("[\345\215\212]");
201 annotation->set_description("[半]");
240202 }
241203 candidate->set_id(-3);
242204 }
244206 commands::Candidates::Candidate *candidate =
245207 sub_candidates->add_candidate();
246208 candidate->set_index(3);
247 // "be-ta"
248 candidate->set_value(
249 "\357\275\202\357\275\205\357\274\215\357\275\224\357\275\201");
250 {
251 commands::Annotation *annotation = candidate->mutable_annotation();
252 // "[全]"
253 annotation->set_description("[\345\205\250]");
209 candidate->set_value("be-ta");
210 {
211 commands::Annotation *annotation = candidate->mutable_annotation();
212 annotation->set_description("[全]");
254213 }
255214 candidate->set_id(-7);
256215 }
258217 commands::Candidates::Candidate *candidate =
259218 sub_candidates->add_candidate();
260219 candidate->set_index(4);
261 // "ベータ"
262 candidate->set_value(
263 "\357\276\215\357\276\236\357\275\260\357\276\200");
264 {
265 commands::Annotation *annotation = candidate->mutable_annotation();
266 // "[半] カタカナ"
267 annotation->set_description(
268 "[\345\215\212] "
269 "\343\202\253\343\202\277\343\202\253\343\203\212");
220 candidate->set_value("ベータ");
221 {
222 commands::Annotation *annotation = candidate->mutable_annotation();
223 annotation->set_description("[半] カタカナ");
270224 }
271225 candidate->set_id(-11);
272226 }
304258 commands::CandidateWord *candidate = candidate_list->add_candidates();
305259 candidate->set_id(1);
306260 candidate->set_index(1);
307 // "ベータ"
308 candidate->set_value("\343\203\231\343\203\274\343\202\277");
261 candidate->set_value("ベータ");
309262 }
310263 {
311264 commands::CandidateWord *candidate = candidate_list->add_candidates();
323276 commands::CandidateWord *candidate = candidate_list->add_candidates();
324277 candidate->set_id(4);
325278 candidate->set_index(4);
326 // "β"
327 candidate->set_value("\316\262");
279 candidate->set_value("β");
328280 }
329281 {
330282 commands::CandidateWord *candidate = candidate_list->add_candidates();
331283 candidate->set_id(5);
332284 candidate->set_index(5);
333 // "Β"
334 candidate->set_value("\316\222");
285 candidate->set_value("Β");
335286 }
336287 {
337288 commands::CandidateWord *candidate = candidate_list->add_candidates();
338289 candidate->set_id(6);
339290 candidate->set_index(6);
340 // "㌼"
341 candidate->set_value("\343\214\274");
291 candidate->set_value("㌼");
342292 }
343293 {
344294 commands::CandidateWord *candidate = candidate_list->add_candidates();
345295 candidate->set_id(7);
346296 candidate->set_index(7);
347 // "べーた"
348 candidate->set_value("\343\201\271\343\203\274\343\201\237");
297 candidate->set_value("べーた");
349298 }
350299 {
351300 commands::CandidateWord *candidate = candidate_list->add_candidates();
352301 candidate->set_id(-1);
353302 candidate->set_index(8);
354 // "べーた"
355 candidate->set_value("\343\201\271\343\203\274\343\201\237");
303 candidate->set_value("べーた");
356304 }
357305 {
358306 commands::CandidateWord *candidate = candidate_list->add_candidates();
359307 candidate->set_id(-2);
360308 candidate->set_index(9);
361 // "ベータ"
362 candidate->set_value("\343\203\231\343\203\274\343\202\277");
309 candidate->set_value("ベータ");
363310 }
364311 {
365312 commands::CandidateWord *candidate = candidate_list->add_candidates();
371318 commands::CandidateWord *candidate = candidate_list->add_candidates();
372319 candidate->set_id(-7);
373320 candidate->set_index(11);
374 // "be-ta"
375 candidate->set_value(
376 "\357\275\202\357\275\205\357\274\215\357\275\224\357\275\201");
321 candidate->set_value("be-ta");
377322 }
378323 {
379324 commands::CandidateWord *candidate = candidate_list->add_candidates();
380325 candidate->set_id(-11);
381326 candidate->set_index(12);
382 // "ベータ"
383 candidate->set_value("\357\276\215\357\276\236\357\275\260\357\276\200");
327 candidate->set_value("ベータ");
384328 }
385329 candidate_list->set_category(commands::CONVERSION);
386330 }
387331 }
388 } // namespace
389332
390333 TEST(OutputUtilTest, GetCandidateIndexById) {
391334 commands::Output output;
426369 EXPECT_EQ(-3, candidate_id);
427370 }
428371
372 } // namespace
429373 } // namespace mozc
5959 #include "session/session_usage_stats_util.h"
6060 #include "usage_stats/usage_stats.h"
6161
62 using mozc::usage_stats::UsageStats;
63
6462 namespace mozc {
6563 namespace session {
66
6764 namespace {
65
66 using ::mozc::usage_stats::UsageStats;
6867
6968 // Set input mode if the current input mode is not the given mode.
7069 void SwitchInputMode(const transliteration::TransliterationType mode,
16161615 command->mutable_input()->clear_key();
16171616 commands::KeyEvent *key_event = command->mutable_input()->mutable_key();
16181617 key_event->set_key_code(' ');
1619 // " " (full-width space)
1620 key_event->set_key_string("\xE3\x80\x80");
1618 key_event->set_key_string(" "); // full-width space
16211619 key_event->set_input_style(commands::KeyEvent::DIRECT_INPUT);
16221620 if (has_mode) {
16231621 key_event->set_mode(mode);
26972695 const uint32 key_code, const string &key_string) {
26982696 return
26992697 (((key_code == static_cast<uint32>('.') && key_string.empty()) ||
2700 key_string == "." || key_string == "\xEF\xBC\x8E" ||
2701 key_string == "\xE3\x80\x82" || key_string == "\xEF\xBD\xA1") &&
2698 key_string == "." || key_string == "." ||
2699 key_string == "。" || key_string == "。") &&
27022700 (config.auto_conversion_key() &
27032701 config::Config::AUTO_CONVERSION_KUTEN)) ||
27042702 (((key_code == static_cast<uint32>(',') && key_string.empty()) ||
2705 key_string == "," || key_string == "\xEF\xBC\x8C" ||
2706 key_string == "\xE3\x80\x81" || key_string == "\xEF\xBD\xA4") &&
2703 key_string == "," || key_string == "," ||
2704 key_string == "、" || key_string == "、") &&
27072705 (config.auto_conversion_key() &
27082706 config::Config::AUTO_CONVERSION_TOUTEN)) ||
27092707 (((key_code == static_cast<uint32>('?') && key_string.empty()) ||
2710 key_string == "?" || key_string == "\xEF\xBC\x9F") &&
2708 key_string == "?" || key_string == "?") &&
27112709 (config.auto_conversion_key() &
27122710 config::Config::AUTO_CONVERSION_QUESTION_MARK)) ||
27132711 (((key_code == static_cast<uint32>('!') && key_string.empty()) ||
2714 key_string == "!" || key_string == "\xEF\xBC\x81") &&
2712 key_string == "!" || key_string == "!") &&
27152713 (config.auto_conversion_key() &
27162714 config::Config::AUTO_CONVERSION_EXCLAMATION_MARK));
27172715 }
14011401 transliterations = candidate_list_->AllocateSubCandidateList(kNoRotate);
14021402 transliterations->set_focused(true);
14031403
1404 const char kT13nLabel[] =
1405 // "そのほかの文字種";
1406 "\xe3\x81\x9d\xe3\x81\xae\xe3\x81\xbb\xe3\x81\x8b\xe3\x81\xae"
1407 "\xe6\x96\x87\xe5\xad\x97\xe7\xa8\xae";
1404 const char kT13nLabel[] = "そのほかの文字種";
14081405 transliterations->set_name(kT13nLabel);
14091406 } else {
14101407 transliterations = candidate_list_.get();
6464 namespace mozc {
6565 namespace session {
6666
67 using mozc::commands::Context;
68 using mozc::commands::Request;
69 using mozc::commands::RequestForUnitTest;
70 using mozc::config::Config;
71
72 // "あいうえお"
73 static const char kChars_Aiueo[] =
74 "\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a";
75 // "も"
76 static const char kChars_Mo[] = "\xE3\x82\x82";
77 // "もずく"
78 static const char kChars_Mozuku[] = "\xE3\x82\x82\xE3\x81\x9A\xE3\x81\x8F";
79 // "もずくす"
80 static const char kChars_Mozukusu[] =
81 "\xE3\x82\x82\xE3\x81\x9A\xE3\x81\x8F\xE3\x81\x99";
82 // "ももんが"
83 static const char kChars_Momonga[] =
84 "\xE3\x82\x82\xE3\x82\x82\xE3\x82\x93\xE3\x81\x8C";
67 using ::mozc::commands::Context;
68 using ::mozc::commands::Request;
69 using ::mozc::commands::RequestForUnitTest;
70 using ::mozc::config::Config;
71
72 static const char kChars_Aiueo[] = "あいうえお";
73 static const char kChars_Mo[] = "も";
74 static const char kChars_Mozuku[] = "もずく";
75 static const char kChars_Mozukusu[] = "もずくす";
76 static const char kChars_Momonga[] = "ももんが";
8577
8678 class SessionConverterTest : public ::testing::Test {
8779 protected:
175167 Segment::Candidate *candidate;
176168
177169 segment = segments->add_segment();
178 // "あいうえお"
179 segment->set_key(
180 "\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a");
181 candidate = segment->add_candidate();
182 // "あいうえお"
183 candidate->key =
184 "\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a";
170 segment->set_key("あいうえお");
171 candidate = segment->add_candidate();
172 candidate->key = "あいうえお";
185173 candidate->value = candidate->key;
186174 candidate = segment->add_candidate();
187 // "あいうえお"
188 candidate->key =
189 "\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a";
190 // "アイウエオ"
191 candidate->value =
192 "\xe3\x82\xa2\xe3\x82\xa4\xe3\x82\xa6\xe3\x82\xa8\xe3\x82\xaa";
175 candidate->key = "あいうえお";
176 candidate->value = "アイウエオ";
193177 }
194178
195179 // set result for "かまぼこのいんぼう"
200184 segments->Clear();
201185 segment = segments->add_segment();
202186
203 // "かまぼこの"
204 segment->set_key(
205 "\xe3\x81\x8b\xe3\x81\xbe\xe3\x81\xbc\xe3\x81\x93\xe3\x81\xae");
206 candidate = segment->add_candidate();
207 // "かまぼこの"
208 candidate->value =
209 "\xe3\x81\x8b\xe3\x81\xbe\xe3\x81\xbc\xe3\x81\x93\xe3\x81\xae";
210 candidate = segment->add_candidate();
211 // "カマボコの"
212 candidate->value =
213 "\xe3\x82\xab\xe3\x83\x9e\xe3\x83\x9c\xe3\x82\xb3\xe3\x81\xae";
187 segment->set_key("かまぼこの");
188 candidate = segment->add_candidate();
189 candidate->value = "かまぼこの";
190 candidate = segment->add_candidate();
191 candidate->value = "カマボコの";
214192 segment = segments->add_segment();
215 // "いんぼう"
216 segment->set_key("\xe3\x81\x84\xe3\x82\x93\xe3\x81\xbc\xe3\x81\x86");
217 candidate = segment->add_candidate();
218 // "陰謀"
219 candidate->value = "\xe9\x99\xb0\xe8\xac\x80";
220 candidate = segment->add_candidate();
221 // "印房"
222 candidate->value = "\xe5\x8d\xb0\xe6\x88\xbf";
193 segment->set_key("いんぼう");
194 candidate = segment->add_candidate();
195 candidate->value = "陰謀";
196 candidate = segment->add_candidate();
197 candidate->value = "印房";
223198
224199 // Set dummy T13Ns
225200 std::vector<Segment::Candidate> *meta_candidates =
259234
260235 // set result for "like"
261236 void InitConverterWithLike(Segments *segments) {
262 // "ぃ"
263 composer_->InsertCharacterKeyAndPreedit("li", "\xE3\x81\x83");
264 // "け"
265 composer_->InsertCharacterKeyAndPreedit("ke", "\xE3\x81\x91");
237 composer_->InsertCharacterKeyAndPreedit("li", "ぃ");
238 composer_->InsertCharacterKeyAndPreedit("ke", "け");
266239
267240 Segment *segment;
268241 Segment::Candidate *candidate;
270243 segments->Clear();
271244 segment = segments->add_segment();
272245
273 // "ぃ"
274 segment->set_key("\xE3\x81\x83");
275 candidate = segment->add_candidate();
276 // "ぃ"
277 candidate->value = "\xE3\x81\x83";
278
279 candidate = segment->add_candidate();
280 // "ィ"
281 candidate->value = "\xE3\x82\xA3";
246 segment->set_key("ぃ");
247 candidate = segment->add_candidate();
248 candidate->value = "ぃ";
249
250 candidate = segment->add_candidate();
251 candidate->value = "ィ";
282252
283253 segment = segments->add_segment();
284 // "け"
285 segment->set_key("\xE3\x81\x91");
286 candidate = segment->add_candidate();
287 // "家"
288 candidate->value = "\xE5\xAE\xB6";
289 candidate = segment->add_candidate();
290 // "け"
291 candidate->value = "\xE3\x81\x91";
254 segment->set_key("け");
255 candidate = segment->add_candidate();
256 candidate->value = "家";
257 candidate = segment->add_candidate();
258 candidate->value = "け";
292259
293260 FillT13Ns(segments, composer_.get());
294261 convertermock_->SetStartConversionForRequest(segments, true);
535502
536503 const commands::Preedit &conversion = output.preedit();
537504 EXPECT_EQ(1, conversion.segment_size());
538 EXPECT_EQ("\xEF\xBC\xA1\xEF\xBC\xA9\xEF\xBC\xB5\xEF\xBC\xA5\xEF\xBC\xAF",
539 conversion.segment(0).value());
505 EXPECT_EQ("AIUEO", conversion.segment(0).value());
540506 EXPECT_FALSE(IsCandidateListVisible(converter));
541507 EXPECT_SELECTED_CANDIDATE_INDICES_EQ(converter, expected_indices);
542508 }
568534
569535 const commands::Preedit &conversion = output.preedit();
570536 EXPECT_EQ(2, conversion.segment_size());
571 // "ぃ"
572 EXPECT_EQ("\xE3\x81\x83", conversion.segment(0).value());
573 // "家"
574 EXPECT_EQ("\xE5\xAE\xB6", conversion.segment(1).value());
537 EXPECT_EQ("ぃ", conversion.segment(0).value());
538 EXPECT_EQ("家", conversion.segment(1).value());
575539 EXPECT_FALSE(IsCandidateListVisible(converter));
576540 EXPECT_SELECTED_CANDIDATE_INDICES_EQ(converter, expected_indices);
577541 }
613577 converter.set_selection_shortcut(config::Config::NO_SHORTCUT);
614578 }
615579
616 // "dvd"
617 composer_->InsertCharacterKeyAndPreedit(
618 "dvd", "\xEF\xBD\x84\xEF\xBD\x96\xEF\xBD\x84");
580 composer_->InsertCharacterKeyAndPreedit("dvd", "dvd");
619581 FillT13Ns(&segments, composer_.get());
620582 convertermock_->SetStartConversionForRequest(&segments, true);
621583 EXPECT_TRUE(converter.ConvertToTransliteration(*composer_,
631593
632594 const commands::Preedit &conversion = output.preedit();
633595 EXPECT_EQ(1, conversion.segment_size());
634 // "dvd"
635 EXPECT_EQ("\xEF\xBD\x84\xEF\xBD\x96\xEF\xBD\x84",
636 conversion.segment(0).value());
596 EXPECT_EQ("dvd", conversion.segment(0).value());
637597 EXPECT_FALSE(IsCandidateListVisible(converter));
638598 EXPECT_SELECTED_CANDIDATE_INDICES_EQ(converter, expected_indices);
639599 }
649609
650610 const commands::Preedit &conversion = output.preedit();
651611 EXPECT_EQ(1, conversion.segment_size());
652 // "DVD"
653 EXPECT_EQ("\xEF\xBC\xA4\xEF\xBC\xB6\xEF\xBC\xA4",
654 conversion.segment(0).value());
612 EXPECT_EQ("DVD", conversion.segment(0).value());
655613 EXPECT_FALSE(IsCandidateListVisible(converter));
656614 EXPECT_SELECTED_CANDIDATE_INDICES_EQ(converter, expected_indices);
657615 }
667625
668626 const commands::Preedit &conversion = output.preedit();
669627 EXPECT_EQ(1, conversion.segment_size());
670 // "Dvd"
671 EXPECT_EQ("\xEF\xBC\xA4\xEF\xBD\x96\xEF\xBD\x84",
672 conversion.segment(0).value());
628 EXPECT_EQ("Dvd", conversion.segment(0).value());
673629 EXPECT_FALSE(IsCandidateListVisible(converter));
674630 EXPECT_SELECTED_CANDIDATE_INDICES_EQ(converter, expected_indices);
675631 }
680636 convertermock_.get(), request_.get(), config_.get());
681637 Segments segments;
682638 SetKamaboko(&segments);
683 const string kKamabokono =
684 "\xe3\x81\x8b\xe3\x81\xbe\xe3\x81\xbc\xe3\x81\x93\xe3\x81\xae";
685 const string kInbou =
686 "\xe3\x81\x84\xe3\x82\x93\xe3\x81\xbc\xe3\x81\x86";
639 const string kKamabokono = "かまぼこの";
640 const string kInbou = "いんぼう";
687641
688642 // Test for conversion
689643 composer_->InsertCharacterPreedit(kKamabokono + kInbou);
694648 expected_indices.push_back(0);
695649 expected_indices.push_back(0);
696650 {
697 // "かまぼこのいんぼう"
698651 EXPECT_EQ(0, GetSegmentIndex(converter));
699652 EXPECT_SELECTED_CANDIDATE_INDICES_EQ(converter, expected_indices);
700653
714667 EXPECT_EQ(commands::Preedit::Segment::UNDERLINE,
715668 conversion.segment(1).annotation());
716669 EXPECT_EQ(kInbou, conversion.segment(1).key());
717 // "陰謀"
718 EXPECT_EQ("\xe9\x99\xb0\xe8\xac\x80", conversion.segment(1).value());
670 EXPECT_EQ("陰謀", conversion.segment(1).value());
719671 }
720672
721673 // Test for candidates [CandidateNext]
746698 EXPECT_EQ(3, candidates.size()); // two candidates + one t13n sub list.
747699 EXPECT_EQ(0, candidates.position());
748700 EXPECT_EQ(kKamabokono, candidates.candidate(0).value());
749 // "カマボコの"
750 EXPECT_EQ("\xe3\x82\xab\xe3\x83\x9e\xe3\x83\x9c\xe3\x82\xb3\xe3\x81\xae",
751 candidates.candidate(1).value());
752
753 // "そのほかの文字種";
754 EXPECT_EQ("\xe3\x81\x9d\xe3\x81\xae\xe3\x81\xbb\xe3\x81\x8b\xe3\x81\xae"
755 "\xe6\x96\x87\xe5\xad\x97\xe7\xa8\xae",
756 candidates.candidate(2).value());
701 EXPECT_EQ("カマボコの", candidates.candidate(1).value());
702 EXPECT_EQ("そのほかの文字種", candidates.candidate(2).value());
757703 }
758704
759705 // Test for segment motion. [SegmentFocusRight]
774720 EXPECT_EQ(0, candidates.focused_index());
775721 EXPECT_EQ(3, candidates.size()); // two candidates + one t13n sub list.
776722 EXPECT_EQ(5, candidates.position());
777 // "陰謀"
778 EXPECT_EQ("\xe9\x99\xb0\xe8\xac\x80",
779 candidates.candidate(0).value());
780 // "印房"
781 EXPECT_EQ("\xe5\x8d\xb0\xe6\x88\xbf",
782 candidates.candidate(1).value());
783
784 // "そのほかの文字種";
785 EXPECT_EQ("\xe3\x81\x9d\xe3\x81\xae\xe3\x81\xbb\xe3\x81\x8b\xe3\x81\xae"
786 "\xe6\x96\x87\xe5\xad\x97\xe7\xa8\xae",
787 candidates.candidate(2).value());
723 EXPECT_EQ("陰謀", candidates.candidate(0).value());
724 EXPECT_EQ("印房", candidates.candidate(1).value());
725 EXPECT_EQ("そのほかの文字種", candidates.candidate(2).value());
788726 }
789727
790728 // Test for segment motion. [SegmentFocusLeft]
806744 EXPECT_EQ(3, candidates.size()); // two candidates + one t13n sub list.
807745 EXPECT_EQ(0, candidates.position());
808746 EXPECT_EQ(kKamabokono, candidates.candidate(0).value());
809 // "カマボコの"
810 EXPECT_EQ("\xe3\x82\xab\xe3\x83\x9e\xe3\x83\x9c\xe3\x82\xb3\xe3\x81\xae",
811 candidates.candidate(1).value());
812
813 // "そのほかの文字種";
814 EXPECT_EQ("\xe3\x81\x9d\xe3\x81\xae\xe3\x81\xbb\xe3\x81\x8b\xe3\x81\xae"
815 "\xe6\x96\x87\xe5\xad\x97\xe7\xa8\xae",
816 candidates.candidate(2).value());
747 EXPECT_EQ("カマボコの", candidates.candidate(1).value());
748 EXPECT_EQ("そのほかの文字種", candidates.candidate(2).value());
817749 }
818750
819751 // Test for segment motion. [SegmentFocusLeft] at the head of segments.
837769 EXPECT_EQ(0, candidates.focused_index());
838770 EXPECT_EQ(3, candidates.size()); // two candidates + one t13n sub list.
839771 EXPECT_EQ(5, candidates.position());
840 // "陰謀"
841 EXPECT_EQ("\xe9\x99\xb0\xe8\xac\x80",
842 candidates.candidate(0).value());
843 // "印房"
844 EXPECT_EQ("\xe5\x8d\xb0\xe6\x88\xbf",
845 candidates.candidate(1).value());
846
847 // "そのほかの文字種";
848 EXPECT_EQ("\xe3\x81\x9d\xe3\x81\xae\xe3\x81\xbb\xe3\x81\x8b\xe3\x81\xae"
849 "\xe6\x96\x87\xe5\xad\x97\xe7\xa8\xae",
850 candidates.candidate(2).value());
772 EXPECT_EQ("陰謀", candidates.candidate(0).value());
773 EXPECT_EQ("印房", candidates.candidate(1).value());
774 EXPECT_EQ("そのほかの文字種", candidates.candidate(2).value());
851775 }
852776
853777 // Test for segment motion. [SegmentFocusRight] at the tail of segments.
872796 EXPECT_EQ(3, candidates.size()); // two candidates + one t13n sub list.
873797 EXPECT_EQ(0, candidates.position());
874798 EXPECT_EQ(kKamabokono, candidates.candidate(0).value());
875 // "カマボコの"
876 EXPECT_EQ("\xe3\x82\xab\xe3\x83\x9e\xe3\x83\x9c\xe3\x82\xb3\xe3\x81\xae",
877 candidates.candidate(1).value());
878
879 // "そのほかの文字種";
880 EXPECT_EQ("\xe3\x81\x9d\xe3\x81\xae\xe3\x81\xbb\xe3\x81\x8b\xe3\x81\xae"
881 "\xe6\x96\x87\xe5\xad\x97\xe7\xa8\xae",
882 candidates.candidate(2).value());
799 EXPECT_EQ("カマボコの", candidates.candidate(1).value());
800 EXPECT_EQ("そのほかの文字種", candidates.candidate(2).value());
883801 }
884802
885803 // Test for candidate motion. [CandidateNext]
900818 EXPECT_EQ(1, candidates.focused_index());
901819 EXPECT_EQ(3, candidates.size()); // two candidates + one t13n sub list.
902820 EXPECT_EQ(5, candidates.position());
903 // "陰謀"
904 EXPECT_EQ("\xe9\x99\xb0\xe8\xac\x80", candidates.candidate(0).value());
905 // "印房"
906 EXPECT_EQ("\xe5\x8d\xb0\xe6\x88\xbf", candidates.candidate(1).value());
907
908 // "そのほかの文字種";
909 EXPECT_EQ("\xe3\x81\x9d\xe3\x81\xae\xe3\x81\xbb\xe3\x81\x8b\xe3\x81\xae"
910 "\xe6\x96\x87\xe5\xad\x97\xe7\xa8\xae",
911 candidates.candidate(2).value());
821 EXPECT_EQ("陰謀", candidates.candidate(0).value());
822 EXPECT_EQ("印房", candidates.candidate(1).value());
823 EXPECT_EQ("そのほかの文字種", candidates.candidate(2).value());
912824
913825 const commands::Preedit &conversion = output.preedit();
914826 EXPECT_EQ(kKamabokono, conversion.segment(0).value());
915 // "印房"
916 EXPECT_EQ("\xe5\x8d\xb0\xe6\x88\xbf", conversion.segment(1).value());
827 EXPECT_EQ("印房", conversion.segment(1).value());
917828 }
918829
919830 // Test for segment motion again [SegmentFocusLeftEdge] [SegmentFocusLast]
923834 SetKamaboko(&fixed_segments);
924835 EXPECT_SELECTED_CANDIDATE_INDICES_EQ(converter, expected_indices);
925836
926 // "陰謀"
927 ASSERT_EQ("\xe9\x99\xb0\xe8\xac\x80",
837 ASSERT_EQ("陰謀",
928838 fixed_segments.segment(1).candidate(0).value);
929 // "印房"
930 ASSERT_EQ("\xe5\x8d\xb0\xe6\x88\xbf",
839 ASSERT_EQ("印房",
931840 fixed_segments.segment(1).candidate(1).value);
932841 // swap the values.
933842 fixed_segments.mutable_segment(1)->mutable_candidate(0)->value.swap(
934843 fixed_segments.mutable_segment(1)->mutable_candidate(1)->value);
935 // "印房"
936 ASSERT_EQ("\xe5\x8d\xb0\xe6\x88\xbf",
844 ASSERT_EQ("印房",
937845 fixed_segments.segment(1).candidate(0).value);
938 // "陰謀"
939 ASSERT_EQ("\xe9\x99\xb0\xe8\xac\x80",
846 ASSERT_EQ("陰謀",
940847 fixed_segments.segment(1).candidate(1).value);
941848 convertermock_->SetCommitSegmentValue(&fixed_segments, true);
942849 }
959866 EXPECT_EQ(0, candidates.focused_index());
960867 EXPECT_EQ(3, candidates.size()); // two candidates + one t13n sub list.
961868 EXPECT_EQ(5, candidates.position());
962 // "印房"
963 EXPECT_EQ("\xe5\x8d\xb0\xe6\x88\xbf", candidates.candidate(0).value());
964
965 // "陰謀"
966 EXPECT_EQ("\xe9\x99\xb0\xe8\xac\x80", candidates.candidate(1).value());
967
968 // "そのほかの文字種";
969 EXPECT_EQ("\xe3\x81\x9d\xe3\x81\xae\xe3\x81\xbb\xe3\x81\x8b\xe3\x81\xae"
970 "\xe6\x96\x87\xe5\xad\x97\xe7\xa8\xae",
971 candidates.candidate(2).value());
869 EXPECT_EQ("印房", candidates.candidate(0).value());
870
871 EXPECT_EQ("陰謀", candidates.candidate(1).value());
872
873 EXPECT_EQ("そのほかの文字種", candidates.candidate(2).value());
972874
973875 const commands::Preedit &conversion = output.preedit();
974876 EXPECT_EQ(kKamabokono, conversion.segment(0).value());
975 // "印房"
976 EXPECT_EQ("\xe5\x8d\xb0\xe6\x88\xbf", conversion.segment(1).value());
877 EXPECT_EQ("印房", conversion.segment(1).value());
977878 }
978879
979880 converter.Commit(*composer_, Context::default_instance());
990891 EXPECT_FALSE(output.has_candidates());
991892
992893 const commands::Result &result = output.result();
993 // "かまぼこの印房"
994 EXPECT_EQ("\xe3\x81\x8b\xe3\x81\xbe\xe3\x81\xbc\xe3\x81\x93\xe3\x81\xae"
995 "\xe5\x8d\xb0\xe6\x88\xbf",
996 result.value());
997 // "かまぼこのいんぼう"
998 EXPECT_EQ("\xe3\x81\x8b\xe3\x81\xbe\xe3\x81\xbc\xe3\x81\x93\xe3\x81\xae"
999 "\xe3\x81\x84\xe3\x82\x93\xe3\x81\xbc\xe3\x81\x86",
1000 result.key());
894 EXPECT_EQ("かまぼこの印房", result.value());
895 EXPECT_EQ("かまぼこのいんぼう", result.key());
1001896 EXPECT_FALSE(converter.IsActive());
1002897 }
1003898 }
1005900 TEST_F(SessionConverterTest, Transliterations) {
1006901 SessionConverter converter(
1007902 convertermock_.get(), request_.get(), config_.get());
1008 // "く"
1009 composer_->InsertCharacterKeyAndPreedit("h", "\xE3\x81\x8F");
1010 // "ま"
1011 composer_->InsertCharacterKeyAndPreedit("J", "\xE3\x81\xBE");
903 composer_->InsertCharacterKeyAndPreedit("h", "く");
904 composer_->InsertCharacterKeyAndPreedit("J", "ま");
1012905
1013906 Segments segments;
1014907 { // Initialize segments.
1015908 Segment *segment = segments.add_segment();
1016 // "くま"
1017 segment->set_key("\xE3\x81\x8F\xE3\x81\xBE");
1018 // "クマー"
1019 segment->add_candidate()->value = "\xE3\x82\xAF\xE3\x83\x9E\xE3\x83\xBC";
909 segment->set_key("くま");
910 segment->add_candidate()->value = "クマー";
1020911 }
1021912 FillT13Ns(&segments, composer_.get());
1022913 convertermock_->SetStartConversionForRequest(&segments, true);
1041932 const commands::Candidates &candidates = output.candidates();
1042933 EXPECT_EQ(2, candidates.size()); // one candidate + one t13n sub list.
1043934 EXPECT_EQ(1, candidates.focused_index());
1044 // "そのほかの文字種";
1045 EXPECT_EQ("\xe3\x81\x9d\xe3\x81\xae\xe3\x81\xbb\xe3\x81\x8b\xe3\x81\xae"
1046 "\xe6\x96\x87\xe5\xad\x97\xe7\xa8\xae",
1047 candidates.candidate(1).value());
935 EXPECT_EQ("そのほかの文字種", candidates.candidate(1).value());
1048936
1049937 std::vector<string> t13ns;
1050938 composer_->GetTransliterations(&t13ns);
1066954 Segment *segment = segments.add_segment();
1067955 Segment::Candidate *candidate;
1068956 CHECK(segment);
1069 // "かまぼこの"
1070 segment->set_key(
1071 "\xe3\x81\x8b\xe3\x81\xbe\xe3\x81\xbc\xe3\x81\x93\xe3\x81\xae");
957 segment->set_key("かまぼこの");
1072958 candidate = segment->add_candidate();
1073959 CHECK(candidate);
1074 // "かまぼこの"
1075 candidate->value =
1076 "\xe3\x81\x8b\xe3\x81\xbe\xe3\x81\xbc\xe3\x81\x93\xe3\x81\xae";
960 candidate->value = "かまぼこの";
1077961
1078962 segment = segments.add_segment();
1079963 CHECK(segment);
1080 // "いんぼう"
1081 segment->set_key("\xe3\x81\x84\xe3\x82\x93\xe3\x81\xbc\xe3\x81\x86");
964 segment->set_key("いんぼう");
1082965 candidate = segment->add_candidate();
1083966 CHECK(candidate);
1084 // "いんぼう"
1085 candidate->value =
1086 "\xe3\x81\x84\xe3\x82\x93\xe3\x81\xbc\xe3\x81\x86";
967 candidate->value = "いんぼう";
1087968
1088969 InsertASCIISequence("kamabokonoinbou", composer_.get());
1089970 FillT13Ns(&segments, composer_.get());
1107988 segments.Clear();
1108989 segment = segments.add_segment();
1109990
1110 // "かまぼこの"
1111 segment->set_key(
1112 "\xe3\x81\x8b\xe3\x81\xbe\xe3\x81\xbc\xe3\x81\x93\xe3\x81\xae");
1113 candidate = segment->add_candidate();
1114 // "かまぼこの"
1115 candidate->value =
1116 "\xe3\x81\x8b\xe3\x81\xbe\xe3\x81\xbc\xe3\x81\x93\xe3\x81\xae";
1117 candidate = segment->add_candidate();
1118 // "カマボコの"
1119 candidate->value =
1120 "\xe3\x82\xab\xe3\x83\x9e\xe3\x83\x9c\xe3\x82\xb3\xe3\x81\xae";
991 segment->set_key("かまぼこの");
992 candidate = segment->add_candidate();
993 candidate->value = "かまぼこの";
994 candidate = segment->add_candidate();
995 candidate->value = "カマボコの";
1121996
1122997 segment = segments.add_segment();
1123 // "いんぼ"
1124 segment->set_key("\xe3\x81\x84\xe3\x82\x93\xe3\x81\xbc");
1125 candidate = segment->add_candidate();
1126 // "インボ"
1127 candidate->value = "\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x9c";
998 segment->set_key("いんぼ");
999 candidate = segment->add_candidate();
1000 candidate->value = "インボ";
11281001
11291002 segment = segments.add_segment();
1130 // "う"
1131 segment->set_key("\xe3\x81\x86");
1132 candidate = segment->add_candidate();
1133 // "ウ"
1134 candidate->value = "\xe3\x82\xa6";
1003 segment->set_key("う");
1004 candidate = segment->add_candidate();
1005 candidate->value = "ウ";
11351006
11361007 FillT13Ns(&segments, composer_.get());
11371008 convertermock_->SetResizeSegment1(&segments, true);
11511022 EXPECT_TRUE(output.has_preedit());
11521023 const commands::Preedit &preedit = output.preedit();
11531024 EXPECT_EQ(3, preedit.segment_size());
1154 // "インボ"
1155 EXPECT_EQ("\xef\xbd\xb2\xef\xbe\x9d\xef\xbe\x8e\xef\xbe\x9e",
1025 EXPECT_EQ("インボ",
11561026 preedit.segment(1).value());
11571027 EXPECT_SELECTED_CANDIDATE_INDICES_EQ(converter, expected_indices);
11581028 }
11621032 SessionConverter converter(
11631033 convertermock_.get(), request_.get(), config_.get());
11641034 std::vector<int> expected_indices;
1165 // "あ"
1166 composer_->InsertCharacterKeyAndPreedit("a", "\xE3\x81\x82");
1167 // "b"
1168 composer_->InsertCharacterKeyAndPreedit("b", "\xEF\xBD\x82");
1169 // "c"
1170 composer_->InsertCharacterKeyAndPreedit("c", "\xEF\xBD\x83");
1035 composer_->InsertCharacterKeyAndPreedit("a", "あ");
1036 composer_->InsertCharacterKeyAndPreedit("b", "b");
1037 composer_->InsertCharacterKeyAndPreedit("c", "c");
11711038
11721039 Segments segments;
11731040 { // Initialize segments.
11741041 Segment *segment = segments.add_segment();
1175 // "あbc"
1176 segment->set_key("\xE3\x81\x82\xEF\xBD\x82\xEF\xBD\x83");
1177 // "あべし"
1178 segment->add_candidate()->value = "\xE3\x81\x82\xE3\x81\xB9\xE3\x81\x97";
1042 segment->set_key("あbc");
1043 segment->add_candidate()->value = "あべし";
11791044 }
11801045 FillT13Ns(&segments, composer_.get());
11811046 convertermock_->SetStartConversionForRequest(&segments, true);
11931058
11941059 const commands::Preedit &conversion = output.preedit();
11951060 EXPECT_EQ(1, conversion.segment_size());
1196 // "アbc"
1197 EXPECT_EQ("\xEF\xBD\xB1\x62\x63", conversion.segment(0).value());
1061 EXPECT_EQ("アbc", conversion.segment(0).value());
11981062 }
11991063
12001064 // Composition will be transliterated to "abc".
12101074
12111075 const commands::Preedit &conversion = output.preedit();
12121076 EXPECT_EQ(1, conversion.segment_size());
1213 // "abc"
1214 EXPECT_EQ("\xEF\xBD\x81\xEF\xBD\x82\xEF\xBD\x83",
1077 EXPECT_EQ("abc",
12151078 conversion.segment(0).value());
12161079 }
12171080
12271090
12281091 const commands::Preedit &conversion = output.preedit();
12291092 EXPECT_EQ(1, conversion.segment_size());
1230 // "abc"
12311093 EXPECT_EQ("abc", conversion.segment(0).value());
12321094 }
12331095
12431105
12441106 const commands::Preedit &conversion = output.preedit();
12451107 EXPECT_EQ(1, conversion.segment_size());
1246 // "ABC"
12471108 EXPECT_EQ("ABC", conversion.segment(0).value());
12481109 }
12491110 }
12531114 // ConvertToHalfWidth converts punctuations differently w/ or w/o kana.
12541115 SessionConverter converter(
12551116 convertermock_.get(), request_.get(), config_.get());
1256 // "q"
1257 composer_->InsertCharacterKeyAndPreedit("q", "\xef\xbd\x91");
1258 // "、"
1259 composer_->InsertCharacterKeyAndPreedit(",", "\xe3\x80\x81");
1260 // "。"
1261 composer_->InsertCharacterKeyAndPreedit(".", "\xe3\x80\x82");
1117 composer_->InsertCharacterKeyAndPreedit("q", "q");
1118 composer_->InsertCharacterKeyAndPreedit(",", "、");
1119 composer_->InsertCharacterKeyAndPreedit(".", "。");
12621120
12631121 Segments segments;
12641122 { // Initialize segments.
12651123 Segment *segment = segments.add_segment();
1266 // "q、。"
1267 segment->set_key("\xef\xbd\x91\xe3\x80\x81\xe3\x80\x82");
1124 segment->set_key("q、。");
12681125 segment->add_candidate()->value = "q,.";
1269 // "q、。"
1270 segment->add_candidate()->value = "q\xef\xbd\xa4\xef\xbd\xa1";
1126 segment->add_candidate()->value = "q、。";
12711127 }
12721128 FillT13Ns(&segments, composer_.get());
12731129 convertermock_->SetStartConversionForRequest(&segments, true);
12861142
12871143 const commands::Preedit &conversion = output.preedit();
12881144 EXPECT_EQ(1, conversion.segment_size());
1289 // "q、。"
1290 EXPECT_EQ("q\xef\xbd\xa4\xef\xbd\xa1", conversion.segment(0).value());
1145 EXPECT_EQ("q、。", conversion.segment(0).value());
12911146 }
12921147 }
12931148
12951150 { // From composition mode.
12961151 SessionConverter converter(
12971152 convertermock_.get(), request_.get(), config_.get());
1298 // "あ"
1299 composer_->InsertCharacterKeyAndPreedit("a", "\xE3\x81\x82");
1300 // "b"
1301 composer_->InsertCharacterKeyAndPreedit("b", "\xEF\xBD\x82");
1302 // "c"
1303 composer_->InsertCharacterKeyAndPreedit("c", "\xEF\xBD\x83");
1153 composer_->InsertCharacterKeyAndPreedit("a", "あ");
1154 composer_->InsertCharacterKeyAndPreedit("b", "b");
1155 composer_->InsertCharacterKeyAndPreedit("c", "c");
13041156
13051157 Segments segments;
13061158 { // Initialize segments.
13071159 Segment *segment = segments.add_segment();
1308 // "あbc"
1309 segment->set_key("\xE3\x81\x82\xEF\xBD\x82\xEF\xBD\x83");
1310 // "あべし"
1311 segment->add_candidate()->value = "\xE3\x81\x82\xE3\x81\xB9\xE3\x81\x97";
1160 segment->set_key("あbc");
1161 segment->add_candidate()->value = "あべし";
13121162 }
13131163 FillT13Ns(&segments, composer_.get());
13141164 convertermock_->SetStartConversionForRequest(&segments, true);
13271177
13281178 const commands::Preedit &conversion = output.preedit();
13291179 EXPECT_EQ(1, conversion.segment_size());
1330 // "アbc"
1331 EXPECT_EQ("\xE3\x82\xA2\xEF\xBD\x82\xEF\xBD\x83",
1180 EXPECT_EQ("アbc",
13321181 conversion.segment(0).value());
13331182 }
13341183
13441193
13451194 const commands::Preedit &conversion = output.preedit();
13461195 EXPECT_EQ(1, conversion.segment_size());
1347 // "アbc"
1348 EXPECT_EQ("\xEF\xBD\xB1\x62\x63", conversion.segment(0).value());
1196 EXPECT_EQ("アbc", conversion.segment(0).value());
13491197 }
13501198
13511199 EXPECT_TRUE(converter.SwitchKanaType(*composer_));
13601208
13611209 const commands::Preedit &conversion = output.preedit();
13621210 EXPECT_EQ(1, conversion.segment_size());
1363 // "あbc"
1364 EXPECT_EQ("\xE3\x81\x82\xEF\xBD\x82\xEF\xBD\x83",
1211 EXPECT_EQ("あbc",
13651212 conversion.segment(0).value());
13661213 }
13671214 }
13701217 SessionConverter converter(
13711218 convertermock_.get(), request_.get(), config_.get());
13721219 composer_->EditErase();
1373 // "か"
1374 composer_->InsertCharacterKeyAndPreedit("ka", "\xE3\x81\x8B");
1375 // "ん"
1376 composer_->InsertCharacterKeyAndPreedit("n", "\xE3\x82\x93");
1377 // "じ"
1378 composer_->InsertCharacterKeyAndPreedit("ji", "\xE3\x81\x98");
1220 composer_->InsertCharacterKeyAndPreedit("ka", "か");
1221 composer_->InsertCharacterKeyAndPreedit("n", "ん");
1222 composer_->InsertCharacterKeyAndPreedit("ji", "じ");
13791223
13801224 Segments segments;
13811225 { // Initialize segments.
13821226 Segment *segment = segments.add_segment();
1383 // "かんじ"
1384 segment->set_key("\xE3\x81\x8B\xE3\x82\x93\xE3\x81\x98");
1385 // "漢字"
1386 segment->add_candidate()->value = "\xE6\xBC\xA2\xE5\xAD\x97";
1227 segment->set_key("かんじ");
1228 segment->add_candidate()->value = "漢字";
13871229 }
13881230 FillT13Ns(&segments, composer_.get());
13891231 convertermock_->SetStartConversionForRequest(&segments, true);
14021244
14031245 const commands::Preedit &conversion = output.preedit();
14041246 EXPECT_EQ(1, conversion.segment_size());
1405 // "漢字"
1406 EXPECT_EQ("\xE6\xBC\xA2\xE5\xAD\x97",
1407 conversion.segment(0).value());
1247 EXPECT_EQ("漢字", conversion.segment(0).value());
14081248 }
14091249
14101250 EXPECT_TRUE(converter.SwitchKanaType(*composer_));
14191259
14201260 const commands::Preedit &conversion = output.preedit();
14211261 EXPECT_EQ(1, conversion.segment_size());
1422 // "かんじ"
1423 EXPECT_EQ("\xE3\x81\x8B\xE3\x82\x93\xE3\x81\x98",
1424 conversion.segment(0).value());
1262 EXPECT_EQ("かんじ", conversion.segment(0).value());
14251263 }
14261264
14271265 EXPECT_TRUE(converter.SwitchKanaType(*composer_));
14361274
14371275 const commands::Preedit &conversion = output.preedit();
14381276 EXPECT_EQ(1, conversion.segment_size());
1439 // "カンジ"
1440 EXPECT_EQ("\xE3\x82\xAB\xE3\x83\xB3\xE3\x82\xB8",
1441 conversion.segment(0).value());
1277 EXPECT_EQ("カンジ", conversion.segment(0).value());
14421278 }
14431279
14441280 EXPECT_TRUE(converter.SwitchKanaType(*composer_));
14531289
14541290 const commands::Preedit &conversion = output.preedit();
14551291 EXPECT_EQ(1, conversion.segment_size());
1456 // "カンジ"
1457 EXPECT_EQ("\xEF\xBD\xB6\xEF\xBE\x9D\xEF\xBD\xBC\xEF\xBE\x9E",
1458 conversion.segment(0).value());
1292 EXPECT_EQ("カンジ", conversion.segment(0).value());
14591293 }
14601294
14611295 EXPECT_TRUE(converter.SwitchKanaType(*composer_));
14701304
14711305 const commands::Preedit &conversion = output.preedit();
14721306 EXPECT_EQ(1, conversion.segment_size());
1473 // "かんじ"
1474 EXPECT_EQ("\xE3\x81\x8B\xE3\x82\x93\xE3\x81\x98",
1475 conversion.segment(0).value());
1307 EXPECT_EQ("かんじ", conversion.segment(0).value());
14761308 }
14771309 }
14781310 }
14851317 FillT13Ns(&segments, composer_.get());
14861318 convertermock_->SetStartConversionForRequest(&segments, true);
14871319
1488 // "かまぼこの"
1489 const string kKamabokono =
1490 "\xe3\x81\x8b\xe3\x81\xbe\xe3\x81\xbc\xe3\x81\x93\xe3\x81\xae";
1491 // "いんぼう"
1492 const string kInbou =
1493 "\xe3\x81\x84\xe3\x82\x93\xe3\x81\xbc\xe3\x81\x86";
1494
1495 // "かまぼこのいんぼう"
1320 const string kKamabokono = "かまぼこの";
1321 const string kInbou = "いんぼう";
1322
14961323 composer_->InsertCharacterPreedit(kKamabokono + kInbou);
14971324 EXPECT_TRUE(converter.Convert(*composer_));
14981325 std::vector<int> expected_indices;
15091336 EXPECT_FALSE(output.has_candidates());
15101337
15111338 const commands::Preedit &conversion = output.preedit();
1512 // "かまぼこの"
15131339 EXPECT_EQ(kKamabokono, conversion.segment(0).value());
1514 // "陰謀"
1515 EXPECT_EQ("\xe9\x99\xb0\xe8\xac\x80", conversion.segment(1).value());
1516 }
1517
1518 // "カマボコの陰謀"
1340 EXPECT_EQ("陰謀", conversion.segment(1).value());
1341 }
1342
15191343 converter.CandidateNext(*composer_);
15201344 expected_indices[0] += 1;
15211345 EXPECT_TRUE(IsCandidateListVisible(converter));
15291353 EXPECT_TRUE(output.has_candidates());
15301354
15311355 const commands::Preedit &conversion = output.preedit();
1532 // "カマボコの"
1533 EXPECT_EQ("\xE3\x82\xAB\xE3\x83\x9E\xE3\x83\x9C\xE3\x82\xB3\xE3\x81\xAE",
1534 conversion.segment(0).value());
1535 // "陰謀"
1536 EXPECT_EQ("\xe9\x99\xb0\xe8\xac\x80", conversion.segment(1).value());
1356 EXPECT_EQ("カマボコの", conversion.segment(0).value());
1357 EXPECT_EQ("陰謀", conversion.segment(1).value());
15371358 }
15381359
15391360 { // Initialization of SetCommitSegments.
15401361 Segments segments_after_submit;
15411362 Segment *segment = segments_after_submit.add_segment();
1542 // "いんぼう"
1543 segment->set_key("\xe3\x81\x84\xe3\x82\x93\xe3\x81\xbc\xe3\x81\x86");
1544 segment->add_candidate()->value = "\xe9\x99\xb0\xe8\xac\x80"; // "陰謀"
1545 segment->add_candidate()->value = "\xe5\x8d\xb0\xe6\x88\xbf"; // "印房"
1363 segment->set_key("いんぼう");
1364 segment->add_candidate()->value = "陰謀";
1365 segment->add_candidate()->value = "印房";
15461366 convertermock_->SetCommitSegments(&segments_after_submit, true);
15471367 }
15481368 size_t size;
15501370 expected_indices.erase(expected_indices.begin(),
15511371 expected_indices.begin() + 1);
15521372 EXPECT_FALSE(IsCandidateListVisible(converter));
1553 // "かまぼこの"
15541373 EXPECT_EQ(Util::CharsLen(kKamabokono), size);
15551374 EXPECT_TRUE(converter.IsActive());
15561375 EXPECT_SELECTED_CANDIDATE_INDICES_EQ(converter, expected_indices);
15641383 TEST_F(SessionConverterTest, CommitHeadToFocusedSegments) {
15651384 SessionConverter converter(
15661385 convertermock_.get(), request_.get(), config_.get());
1567 // "いべりこ"
1568 const string kIberiko = "\xE3\x81\x84\xE3\x81\xB9\xE3\x82\x8A\xE3\x81\x93";
1569 // "ねこを"
1570 const string kNekowo = "\xE3\x81\xAD\xE3\x81\x93\xE3\x82\x92";
1571 // "いただいた"
1572 const string kItadaita = "\xE3\x81\x84\xE3\x81\x9F\xE3\x81"
1573 "\xA0\xE3\x81\x84\xE3\x81\x9F";
1386 const string kIberiko = "いべりこ";
1387 const string kNekowo = "ねこを";
1388 const string kItadaita = "いただいた";
15741389 { // Three segments as the result of conversion.
15751390 Segments segments;
15761391 Segment *segment;
15791394 segment = segments.add_segment();
15801395 segment->set_key(kIberiko);
15811396 candidate = segment->add_candidate();
1582 // "イベリコ"
1583 candidate->value = "\xE3\x82\xA4\xE3\x83\x99\xE3\x83\xAA\xE3\x82\xB3";
1397 candidate->value = "イベリコ";
15841398
15851399 segment = segments.add_segment();
15861400 segment->set_key(kNekowo);
15871401 candidate = segment->add_candidate();
1588 // "猫を"
1589 candidate->value = "\xE7\x8C\xAB\xE3\x82\x92";
1402 candidate->value = "猫を";
15901403
15911404 segment = segments.add_segment();
15921405 segment->set_key(kItadaita);
15931406 candidate = segment->add_candidate();
1594 // "頂いた"
1595 candidate->value = "\xE9\xA0\x82\xE3\x81\x84\xE3\x81\x9F";
1407 candidate->value = "頂いた";
15961408 convertermock_->SetStartConversionForRequest(&segments, true);
15971409 }
15981410
16111423 segment = segments.add_segment();
16121424 segment->set_key(kItadaita);
16131425 candidate = segment->add_candidate();
1614 // "頂いた"
1615 candidate->value = "\xE9\xA0\x82\xE3\x81\x84\xE3\x81\x9F";
1426 candidate->value = "頂いた";
16161427 convertermock_->SetStartConversionForRequest(&segments, true);
16171428
16181429 convertermock_->SetCommitSegments(&segments, true);
16331444 SetKamaboko(&segments);
16341445 convertermock_->SetStartConversionForRequest(&segments, true);
16351446
1636 // "かまぼこの"
1637 const string kKamabokono =
1638 "\xe3\x81\x8b\xe3\x81\xbe\xe3\x81\xbc\xe3\x81\x93\xe3\x81\xae";
1639 // "いんぼう"
1640 const string kInbou =
1641 "\xe3\x81\x84\xe3\x82\x93\xe3\x81\xbc\xe3\x81\x86";
1642
1643 // "かまぼこのいんぼう"
1447 const string kKamabokono = "かまぼこの";
1448 const string kInbou = "いんぼう";
1449
16441450 composer_->InsertCharacterPreedit(kKamabokono + kInbou);
16451451 EXPECT_TRUE(converter.Convert(*composer_));
16461452 // Here [かまぼこの]|陰謀
16981504 segments.set_request_type(Segments::SUGGESTION);
16991505 Segment *segment = segments.add_segment();
17001506 Segment::Candidate *candidate;
1701 // "も"
17021507 segment->set_key(kChars_Mo);
17031508 candidate = segment->add_candidate();
1704 // "もずくす"
17051509 candidate->value = kChars_Mozukusu;
17061510 candidate->key = kChars_Mozukusu;
17071511 candidate->content_key = kChars_Mozukusu;
17081512 candidate = segment->add_candidate();
1709 // "ももんが"
17101513 candidate->value = kChars_Momonga;
17111514 candidate->key = kChars_Momonga;
17121515 candidate->content_key = kChars_Momonga;
17811584 segments.set_request_type(Segments::SUGGESTION);
17821585 Segment *segment = segments.add_segment();
17831586 Segment::Candidate *candidate;
1784 // "も"
17851587 segment->set_key(kChars_Mo);
17861588 candidate = segment->add_candidate();
1787 // "もずくす"
17881589 candidate->value = kChars_Mozukusu;
17891590 candidate->key = kChars_Mozukusu;
17901591 candidate->content_key = kChars_Mozukusu;
17911592 candidate = segment->add_candidate();
1792 // "ももんが"
17931593 candidate->value = kChars_Momonga;
17941594 candidate->key = kChars_Momonga;
17951595 candidate->content_key = kChars_Momonga;
18571657 convertermock_.get(), request_.get(), config_.get());
18581658 Segments segments1, segments2;
18591659 Segments suggestion_segments;
1860 // "ここで"
1861 const string kChars_Kokode =
1862 "\xe3\x81\x93\xe3\x81\x93\xe3\x81\xa7";
1863 // "はきものを"
1864 const string kChars_Hakimonowo =
1865 "\xe3\x81\xaf\xe3\x81\x8d\xe3\x82\x82\xe3\x81\xae\xe3\x82\x92";
1660 const string kChars_Kokode = "ここで";
1661 const string kChars_Hakimonowo = "はきものを";
18661662
18671663 { // Initialize mock segments for partial suggestion
18681664 segments1.set_request_type(Segments::PARTIAL_SUGGESTION);
18701666 Segment::Candidate *candidate;
18711667 segment->set_key(kChars_Kokode);
18721668 candidate = segment->add_candidate();
1873 // "此処で"
1874 candidate->value = "\xe6\xad\xa4\xe5\x87\xa6\xe3\x81\xa7\xe3\x81\xaf";
1669 candidate->value = "此処では";
18751670 candidate->key = kChars_Kokode;
18761671 candidate->content_key = kChars_Kokode;
18771672 candidate->attributes = Segment::Candidate::PARTIALLY_KEY_CONSUMED;
18861681 Segment::Candidate *candidate;
18871682 segment->set_key(kChars_Kokode);
18881683 candidate = segment->add_candidate();
1889 // "ここでは着物を"
1890 candidate->value = "\xe3\x81\x93\xe3\x81\x93\xe3\x81\xa7\xe3\x81"
1891 "\xaf\xe7\x9d\x80\xe7\x89\xa9\xe3\x82\x92";
1892 // "ここではきものを"
1893 candidate->key = "\xe3\x81\x93\xe3\x81\x93\xe3\x81\xa7\xe3\x81"
1894 "\xaf\xe3\x81\x8d\xe3\x82\x82\xe3\x81\xae\xe3\x82\x92";
1684 candidate->value = "ここでは着物を";
1685 candidate->key = "ここではきものを";
18951686 candidate->content_key = candidate->key;
18961687 candidate = segment->add_candidate();
18971688 }
19021693 Segment::Candidate *candidate;
19031694 segment->set_key(kChars_Hakimonowo);
19041695 candidate = segment->add_candidate();
1905 // "履物を"
1906 candidate->value = "\xe6\xad\xa4\xe5\x87\xa6\xe3\x81\xa7\xe3\x81\xaf";
1696 candidate->value = "此処では";
19071697 candidate->key = kChars_Hakimonowo;
19081698 candidate->content_key = kChars_Hakimonowo;
19091699 }
19591749 EXPECT_TRUE(output.has_result());
19601750
19611751 const commands::Result &result = output.result();
1962 // "此処で"
1963 EXPECT_EQ("\xe6\xad\xa4\xe5\x87\xa6\xe3\x81\xa7\xe3\x81\xaf",
1964 result.value());
1752 EXPECT_EQ("此処では", result.value());
19651753 EXPECT_EQ(kChars_Kokode, result.key());
19661754 EXPECT_EQ(SessionConverterInterface::SUGGESTION, GetState(converter));
19671755 }
19951783 segments.set_request_type(Segments::SUGGESTION);
19961784 Segment *segment = segments.add_segment();
19971785 Segment::Candidate *candidate;
1998 // "も"
19991786 segment->set_key(kChars_Mo);
20001787 candidate = segment->add_candidate();
2001 // "もずくす"
20021788 candidate->value = kChars_Mozukusu;
20031789 candidate->content_key = kChars_Mozukusu;
20041790 candidate = segment->add_candidate();
2005 // "ももんが"
20061791 candidate->value = kChars_Momonga;
20071792 candidate->content_key = kChars_Momonga;
20081793 }
20361821
20371822 const commands::Candidates &candidates = output.candidates();
20381823 EXPECT_EQ(2, candidates.size());
2039 // "もずくす"
20401824 EXPECT_EQ(kChars_Mozukusu, candidates.candidate(0).value());
20411825 EXPECT_FALSE(candidates.has_focused_index());
20421826 }
20461830 segments.set_request_type(Segments::PREDICTION);
20471831 Segment *segment = segments.add_segment();
20481832 Segment::Candidate *candidate;
2049 // "も"
20501833 segment->set_key(kChars_Mo);
20511834 candidate = segment->add_candidate();
2052 // "もずく"
20531835 candidate->value = kChars_Mozuku;
20541836 candidate->content_key = kChars_Mozuku;
20551837 candidate = segment->add_candidate();
2056 // "ももんが"
20571838 candidate->value = kChars_Momonga;
20581839 candidate->content_key = kChars_Momonga;
20591840 candidate = segment->add_candidate();
2060 // "モンドリアン"
2061 candidate->value = "\xE3\x83\xA2\xE3\x83\xB3\xE3\x83\x89"
2062 "\xE3\x83\xAA\xE3\x82\xA2\xE3\x83\xB3";
2063 // "もんどりあん"
2064 candidate->content_key = "\xE3\x82\x82\xE3\x82\x93\xE3\x81\xA9"
2065 "\xE3\x82\x8A\xE3\x81\x82\xE3\x82\x93";
1841 candidate->value = "モンドリアン";
1842 candidate->content_key = "もんどりあん";
20661843 }
20671844
20681845 // Prediction
21141891 const commands::Candidates &candidates = output.candidates();
21151892 // Candidates should be merged with the previous suggestions.
21161893 EXPECT_EQ(4, candidates.size());
2117 // "もずくす"
21181894 EXPECT_EQ(kChars_Mozukusu, candidates.candidate(0).value());
2119 // "ももんが"
21201895 EXPECT_EQ(kChars_Momonga, candidates.candidate(1).value());
2121 // "もずく"
21221896 EXPECT_EQ(kChars_Mozuku, candidates.candidate(2).value());
2123 // "モンドリアン"
2124 EXPECT_EQ("\xE3\x83\xA2\xE3\x83\xB3\xE3\x83\x89"
2125 "\xE3\x83\xAA\xE3\x82\xA2\xE3\x83\xB3",
2126 candidates.candidate(3).value());
1897 EXPECT_EQ("モンドリアン", candidates.candidate(3).value());
21271898 EXPECT_TRUE(candidates.has_focused_index());
21281899 }
21291900
21441915 EXPECT_FALSE(output.has_candidates());
21451916
21461917 const commands::Result &result = output.result();
2147 // "モンドリアン"
2148 EXPECT_EQ("\xE3\x83\xA2\xE3\x83\xB3\xE3\x83\x89"
2149 "\xE3\x83\xAA\xE3\x82\xA2\xE3\x83\xB3",
2150 result.value());
2151 // "もんどりあん"
2152 EXPECT_EQ("\xE3\x82\x82\xE3\x82\x93\xE3\x81\xA9"
2153 "\xE3\x82\x8A\xE3\x81\x82\xE3\x82\x93",
2154 result.key());
1918 EXPECT_EQ("モンドリアン", result.value());
1919 EXPECT_EQ("もんどりあん", result.key());
21551920 }
21561921
21571922 segments.Clear();
21591924 segments.set_request_type(Segments::PREDICTION);
21601925 Segment *segment = segments.add_segment();
21611926 Segment::Candidate *candidate;
2162 // "も"
21631927 segment->set_key(kChars_Mo);
21641928 candidate = segment->add_candidate();
2165 // "もずく"
21661929 candidate->value = kChars_Mozuku;
21671930 candidate->content_key = kChars_Mozuku;
21681931 candidate = segment->add_candidate();
2169 // "ももんが"
21701932 candidate->value = kChars_Momonga;
21711933 candidate->content_key = kChars_Momonga;
21721934 candidate = segment->add_candidate();
2173 // "モンドリアン"
2174 candidate->value = "\xE3\x83\xA2\xE3\x83\xB3\xE3\x83\x89"
2175 "\xE3\x83\xAA\xE3\x82\xA2\xE3\x83\xB3";
2176 // "もんどりあん"
2177 candidate->content_key = "\xE3\x82\x82\xE3\x82\x93\xE3\x81\xA9"
2178 "\xE3\x82\x8A\xE3\x81\x82\xE3\x82\x93";
1935 candidate->value = "モンドリアン";
1936 candidate->content_key = "もんどりあん";
21791937 }
21801938
21811939 // Prediction without suggestion.
21951953 // Check the conversion
21961954 const commands::Preedit &conversion = output.preedit();
21971955 EXPECT_EQ(1, conversion.segment_size());
2198 // "もずく"
21991956 EXPECT_EQ(kChars_Mozuku, conversion.segment(0).value());
22001957
22011958 // Check the candidate list
22021959 const commands::Candidates &candidates = output.candidates();
22031960 // Candidates should NOT be merged with the previous suggestions.
22041961 EXPECT_EQ(3, candidates.size());
2205 // "もずく"
22061962 EXPECT_EQ(kChars_Mozuku, candidates.candidate(0).value());
2207 // "ももんが"
22081963 EXPECT_EQ(kChars_Momonga, candidates.candidate(1).value());
2209 // "モンドリアン"
2210 EXPECT_EQ("\xE3\x83\xA2\xE3\x83\xB3\xE3\x83\x89"
2211 "\xE3\x83\xAA\xE3\x82\xA2\xE3\x83\xB3",
2212 candidates.candidate(2).value());
1964 EXPECT_EQ("モンドリアン", candidates.candidate(2).value());
22131965 EXPECT_TRUE(candidates.has_focused_index());
22141966 }
22151967 }
22221974 segments.set_request_type(Segments::SUGGESTION);
22231975 Segment *segment = segments.add_segment();
22241976 Segment::Candidate *candidate;
2225 // "も"
22261977 segment->set_key(kChars_Mo);
22271978 candidate = segment->add_candidate();
2228 // "もずくす"
22291979 candidate->value = kChars_Mozukusu;
22301980 candidate->content_key = kChars_Mozukusu;
22311981 candidate = segment->add_candidate();
2232 // "ももんが"
22331982 candidate->value = kChars_Momonga;
22341983 candidate->content_key = kChars_Momonga;
22351984 }
22562005 segments.set_request_type(Segments::SUGGESTION);
22572006 Segment *segment = segments.add_segment();
22582007 Segment::Candidate *candidate;
2259 // "も"
22602008 segment->set_key(kChars_Mo);
22612009 candidate = segment->add_candidate();
2262 // "もずくす"
22632010 candidate->value = kChars_Mozukusu;
22642011 candidate->content_key = kChars_Mozukusu;
22652012 candidate = segment->add_candidate();
2266 // "ももんが"
22672013 candidate->value = kChars_Momonga;
22682014 candidate->content_key = kChars_Momonga;
22692015 }
25032249 {
25042250 Segment *segment = segments.mutable_conversion_segment(0);
25052251 Segment::Candidate *candidate = segment->add_candidate();
2506 // "あいうえお_2"
2507 candidate->value =
2508 "\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a_2";
2252 candidate->value = "あいうえお_2";
25092253 // New meta candidates.
25102254 // They should be ignored.
25112255 std::vector<Segment::Candidate> *meta_candidates =
26332377 convertermock_.get(), request_.get(), config_.get());
26342378 Segments segments;
26352379 SetKamaboko(&segments);
2636 // "かまぼこの"
2637 const string kKamabokono =
2638 "\xe3\x81\x8b\xe3\x81\xbe\xe3\x81\xbc\xe3\x81\x93\xe3\x81\xae";
2639 // "いんぼう"
2640 const string kInbou =
2641 "\xe3\x81\x84\xe3\x82\x93\xe3\x81\xbc\xe3\x81\x86";
2380 const string kKamabokono = "かまぼこの";
2381 const string kInbou = "いんぼう";
26422382 composer_->InsertCharacterPreedit(kKamabokono + kInbou);
26432383
26442384 FillT13Ns(&segments, composer_.get());
27882528 Segments segments;
27892529
27902530 // Set history segments.
2791 // "車で", "行く"
2792 const string kHistoryInput[] = {
2793 "\xE8\xBB\x8A\xE3\x81\xA7",
2794 "\xE8\xA1\x8C\xE3\x81\x8F"
2795 };
2531 const string kHistoryInput[] = {"車で", "行く"};
27962532 for (size_t i = 0; i < arraysize(kHistoryInput); ++i) {
27972533 Segment *segment = segments.add_segment();
27982534 segment->set_segment_type(Segment::HISTORY);
28052541 Segments src;
28062542 GetSegments(converter, &src);
28072543 ASSERT_EQ(2, src.history_segments_size());
2808 // "車で"
2809 EXPECT_EQ("\xE8\xBB\x8A\xE3\x81\xA7",
2810 src.history_segment(0).candidate(0).value);
2811 // "行く"
2812 EXPECT_EQ("\xE8\xA1\x8C\xE3\x81\x8F",
2813 src.history_segment(1).candidate(0).value);
2814
2815 // "歩いて"
2816 src.mutable_history_segment(0)->mutable_candidate(0)->value
2817 = "\xE6\xAD\xA9\xE3\x81\x84\xE3\x81\xA6";
2544 EXPECT_EQ("車で", src.history_segment(0).candidate(0).value);
2545 EXPECT_EQ("行く", src.history_segment(1).candidate(0).value);
2546
2547 src.mutable_history_segment(0)->mutable_candidate(0)->value = "歩いて";
28182548 Segment *segment = src.add_segment();
28192549 segment->set_segment_type(Segment::FREE);
28202550 Segment::Candidate *candidate = segment->add_candidate();
28272557
28282558 ASSERT_EQ(2, dest.history_segments_size());
28292559 ASSERT_EQ(1, dest.conversion_segments_size());
2830 // "歩いて"
28312560 EXPECT_EQ(src.history_segment(0).candidate(0).value,
28322561 dest.history_segment(0).candidate(0).value);
2833 // "行く"
28342562 EXPECT_EQ(src.history_segment(1).candidate(0).value,
28352563 dest.history_segment(1).candidate(0).value);
2836 // "?"
28372564 EXPECT_EQ(src.history_segment(2).candidate(0).value,
28382565 dest.history_segment(2).candidate(0).value);
28392566 }
28422569 SessionConverter src(
28432570 convertermock_.get(), request_.get(), config_.get());
28442571
2845 // "かまぼこの"
2846 const string kKamabokono =
2847 "\xe3\x81\x8b\xe3\x81\xbe\xe3\x81\xbc\xe3\x81\x93\xe3\x81\xae";
2848 // "いんぼう"
2849 const string kInbou =
2850 "\xe3\x81\x84\xe3\x82\x93\xe3\x81\xbc\xe3\x81\x86";
2851 // "陰謀"
2852 const string kInbouKanji = "\xE9\x99\xB0\xE8\xAC\x80";
2572 const string kKamabokono = "かまぼこの";
2573 const string kInbou = "いんぼう";
2574 const string kInbouKanji = "陰謀";
28532575
28542576 { // create source converter
28552577 Segments segments;
28912613 segments.set_request_type(Segments::SUGGESTION);
28922614 Segment *segment = segments.add_segment();
28932615 Segment::Candidate *candidate;
2894 // "も"
28952616 segment->set_key(kChars_Mo);
28962617 candidate = segment->add_candidate();
2897 // "もずくす"
28982618 candidate->value = kChars_Mozukusu;
28992619 candidate->content_key = kChars_Mozukusu;
29002620 candidate = segment->add_candidate();
2901 // "ももんが"
29022621 candidate->value = kChars_Momonga;
29032622 candidate->content_key = kChars_Momonga;
29042623 }
29142633 segments.set_request_type(Segments::SUGGESTION);
29152634 Segment *segment = segments.add_segment();
29162635 Segment::Candidate *candidate;
2917 // "もず"
2918 segment->set_key("\xE3\x82\x82\xE3\x81\x9A");
2919 candidate = segment->add_candidate();
2920 // "もずくす"
2636 segment->set_key("もず");
2637 candidate = segment->add_candidate();
29212638 candidate->value = kChars_Mozukusu;
29222639 candidate->content_key = kChars_Mozukusu;
29232640 }
2924 composer_->InsertCharacterPreedit("\xE3\x82\x82\xE3\x81\x9A");
2641 composer_->InsertCharacterPreedit("もず");
29252642
29262643 // Suggestion
29272644 convertermock_->SetStartSuggestionForRequest(&segments, true);
29382655 const commands::Candidates &candidates = output.candidates();
29392656 // Candidates should be merged with the previous suggestions.
29402657 EXPECT_EQ(1, candidates.size());
2941 // "もずくす"
29422658 EXPECT_EQ(kChars_Mozukusu, candidates.candidate(0).value());
29432659 EXPECT_FALSE(candidates.has_focused_index());
29442660 }
30202736 segments.set_request_type(Segments::PREDICTION);
30212737 Segment *segment = segments.add_segment();
30222738 Segment::Candidate *candidate;
3023 // "も"
30242739 segment->set_key(kChars_Mo);
30252740 candidate = segment->add_candidate();
3026 // "もずく"
30272741 candidate->value = kChars_Mozuku;
30282742 candidate->content_key = kChars_Mozuku;
30292743 candidate = segment->add_candidate();
3030 // "ももんが"
30312744 candidate->value = kChars_Momonga;
30322745 candidate->content_key = kChars_Momonga;
30332746 }
30712784 SessionConverter converter(
30722785 convertermock_.get(), request_.get(), config_.get());
30732786 // "〜〜〜〜" U+301C * 4
3074 const string wave_dash_301c =
3075 "\xE3\x80\x9C\xE3\x80\x9C\xE3\x80\x9C\xE3\x80\x9C";
2787 const string wave_dash_301c = "〜〜〜〜";
30762788 composer_->InsertCharacterPreedit(wave_dash_301c);
30772789 Segments segments;
30782790 convertermock_->SetFinishConversion(&segments, true);
30812793
30822794 #ifdef OS_WIN
30832795 // "~~~~" U+FF5E * 4
3084 const string fullwidth_tilde_ff5e =
3085 "\xEF\xBD\x9E\xEF\xBD\x9E\xEF\xBD\x9E\xEF\xBD\x9E";
2796 const string fullwidth_tilde_ff5e = "~~~~";
30862797 EXPECT_EQ(fullwidth_tilde_ff5e,
30872798 segments.conversion_segment(0).candidate(0).value);
30882799 EXPECT_EQ(fullwidth_tilde_ff5e,
32402951 SessionConverter converter(
32412952 convertermock_.get(), request_.get(), config_.get());
32422953
3243 // "阿伊宇江於"
3244 const char *kKanjiAiueo =
3245 "\xe9\x98\xbf\xe4\xbc\x8a\xe5\xae\x87\xe6\xb1\x9f\xe6\x96\xbc";
2954 const char *kKanjiAiueo = "阿伊宇江於";
32462955 // Set up Segments for reverse conversion.
32472956 Segments reverse_segments;
32482957 Segment *segment;
33083017 public:
33093018 ConverterMockForReset() : reset_conversion_called_(false) {}
33103019
3311 virtual bool ResetConversion(Segments *segments) const {
3020 bool ResetConversion(Segments *segments) const override {
33123021 reset_conversion_called_ = true;
33133022 return true;
33143023 }
33293038 public:
33303039 ConverterMockForRevert() : revert_conversion_called_(false) {}
33313040
3332 virtual bool RevertConversion(Segments *segments) const {
3041 bool RevertConversion(Segments *segments) const override {
33333042 revert_conversion_called_ = true;
33343043 return true;
33353044 }
33503059 public:
33513060 ConverterMockForReconstructHistory() : reconstruct_history_called_(false) {}
33523061
3353 virtual bool ReconstructHistory(Segments *segments,
3354 const string &preceding_text) const {
3062 bool ReconstructHistory(Segments *segments,
3063 const string &preceding_text) const override {
33553064 reconstruct_history_called_ = true;
33563065 preceding_text_ = preceding_text;
33573066 ConverterMock::ReconstructHistory(segments, preceding_text);
34013110 TEST_F(SessionConverterTest, CommitHead) {
34023111 SessionConverter converter(
34033112 convertermock_.get(), request_.get(), config_.get());
3404 // "あいうえお"
34053113 composer_->InsertCharacterPreedit(kChars_Aiueo);
34063114
34073115 size_t committed_size;
34153123 EXPECT_FALSE(output.has_candidates());
34163124
34173125 const commands::Result &result = output.result();
3418 EXPECT_EQ("\xe3\x81\x82", result.value()); // "あ"
3419 EXPECT_EQ("\xe3\x81\x82", result.key()); // "あ"
3126 EXPECT_EQ("あ", result.value());
3127 EXPECT_EQ("あ", result.key());
34203128 string preedit;
34213129 composer_->GetStringForPreedit(&preedit);
3422 // "いうえお"
3423 EXPECT_EQ("\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a", preedit);
3130 EXPECT_EQ("いうえお", preedit);
34243131
34253132 converter.CommitHead(3, *composer_, &committed_size);
34263133 EXPECT_EQ(3, committed_size);
34323139 EXPECT_FALSE(output.has_candidates());
34333140
34343141 const commands::Result &result2 = output.result();
3435 // "いうえ"
3436 EXPECT_EQ("\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88", result2.value());
3437 // "いうえ"
3438 EXPECT_EQ("\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88", result2.key());
3142 EXPECT_EQ("いうえ", result2.value());
3143 EXPECT_EQ("いうえ", result2.key());
34393144 composer_->GetStringForPreedit(&preedit);
3440 EXPECT_EQ("\xe3\x81\x8a", preedit); // "お"
3145 EXPECT_EQ("お", preedit);
34413146
34423147 EXPECT_STATS_NOT_EXIST("Commit");
34433148 EXPECT_STATS_NOT_EXIST("CommitFromComposition");
34633168 }
34643169
34653170 TEST_F(SessionConverterTest, CommandCandidateWithCommitCommands) {
3466 const string kKamabokono =
3467 "\xe3\x81\x8b\xe3\x81\xbe\xe3\x81\xbc\xe3\x81\x93\xe3\x81\xae";
3468 const string kInbou =
3469 "\xe3\x81\x84\xe3\x82\x93\xe3\x81\xbc\xe3\x81\x86";
3171 const string kKamabokono = "かまぼこの";
3172 const string kInbou = "いんぼう";
34703173 composer_->InsertCharacterPreedit(kKamabokono + kInbou);
34713174
34723175 {
563563 // Carrier emoji "GOOGLE"
564564 storage_entry->mutable_value()->Add()->assign("\xF3\xBE\xBA\xA0");
565565 // Unicode emoji "BLACK SUN WITH RAYS"
566 storage_entry->mutable_value()->Add()->assign("\xE2\x98\x80");
566 storage_entry->mutable_value()->Add()->assign("☀");
567567 // Unicode emoji "RABBIT FACE"
568 storage_entry->mutable_value()->Add()->assign("\xF0\x9F\x90\xB0");
568 storage_entry->mutable_value()->Add()->assign("🐰");
569569 EXPECT_TRUE(handler.EvalCommand(&command));
570570 EXPECT_COUNT_STATS("CommitCarrierEmoji", 3);
571571 EXPECT_COUNT_STATS("CommitUnicodeEmoji", 2);
178178
179179 const commands::Preedit &conversion = output.preedit();
180180 ASSERT_LE(2, conversion.segment_size());
181 // "ぃ"
182 EXPECT_EQ("\xE3\x81\x83", conversion.segment(0).value());
181 EXPECT_EQ("ぃ", conversion.segment(0).value());
183182 }
184183
185184 // TranslateHalfASCII
301300
302301 commands::Command command;
303302 InsertCharacterChars("yoroshi", &command);
304 // "よろしく"
305 const string kYoroshikuString =
306 "\xe3\x82\x88\xe3\x82\x8d\xe3\x81\x97\xe3\x81\x8f";
303 const string kYoroshikuString = "よろしく";
307304
308305 command.Clear();
309306 session_->PredictAndConvert(&command);
458455 InsertCharacterChars("[],.", &command);
459456 command.Clear();
460457 SendKey("F8", &command);
461 // "「」、。"
462 EXPECT_EQ("\357\275\242\357\275\243\357\275\244\357\275\241",
463 command.output().preedit().segment(0).value());
458 EXPECT_EQ("「」、。", command.output().preedit().segment(0).value());
464459 }
465460
466461 {
470465 InsertCharacterChars("[g],.", &command);
471466 command.Clear();
472467 SendKey("F8", &command);
473 // "「g」、。"
474 EXPECT_EQ("\357\275\242\147\357\275\243\357\275\244\357\275\241",
475 command.output().preedit().segment(0).value());
468 EXPECT_EQ("「g」、。", command.output().preedit().segment(0).value());
476469 }
477470
478471 {
482475 InsertCharacterChars("[a],.", &command);
483476 command.Clear();
484477 SendKey("F8", &command);
485 // "「ア」、。"
486 EXPECT_EQ("\357\275\242\357\275\261\357\275\243\357\275\244\357\275\241",
487 command.output().preedit().segment(0).value());
478 EXPECT_EQ("「ア」、。", command.output().preedit().segment(0).value());
488479 }
489480 }
490481
513504 command.Clear();
514505 commands::KeyEvent *key_event = command.mutable_input()->mutable_key();
515506 key_event->set_key_code('a');
516 key_event->set_key_string("\xE3\x81\xA1"); // "ち"
507 key_event->set_key_string("ち");
517508 session_->InsertCharacter(&command);
518509 }
519510
534525
535526 commands::Command command;
536527 InsertCharacterChars("ssh", &command);
537 // "っsh"
538 EXPECT_EQ("\xE3\x81\xA3\xEF\xBD\x93\xEF\xBD\x88", GetComposition(command));
528 EXPECT_EQ("っsh", GetComposition(command));
539529
540530 command.Clear();
541531 command.mutable_input()->set_type(commands::Input::SEND_COMMAND);
548538 EXPECT_TRUE(command.output().has_result());
549539 EXPECT_FALSE(command.output().has_preedit());
550540
551 // "っsh"
552 EXPECT_EQ("\xE3\x81\xA3\xEF\xBD\x93\xEF\xBD\x88",
553 command.output().result().value());
541 EXPECT_EQ("っsh", command.output().result().value());
554542 }
555543
556544 } // namespace mozc
5858 #include "usage_stats/usage_stats.h"
5959 #include "usage_stats/usage_stats_testing_util.h"
6060
61 namespace mozc {
62
63 class ConverterInterface;
64 class PredictorInterface;
65
66 namespace dictionary { class SuppressionDictionary; }
67
68 namespace session {
69 namespace {
70
6171 using ::mozc::commands::Request;
6272 using ::mozc::usage_stats::UsageStats;
63
64 namespace mozc {
65
66 class ConverterInterface;
67 class PredictorInterface;
68
69 namespace dictionary { class SuppressionDictionary; }
70
71 namespace session {
72 namespace {
73
74 // "あいうえお"
75 const char kAiueo[] =
76 "\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A";
77 // " "
78 const char kFullWidthSpace[] = "\xE3\x80\x80";
79 // "アイウエオ"
80 const char kKatakanaAiueo[] =
81 "\xe3\x82\xa2\xe3\x82\xa4\xe3\x82\xa6\xe3\x82\xa8\xe3\x82\xaa";
82 // "あ"
83 const char kHiraganaA[] = "\xE3\x81\x82";
84 // "a"
85 const char kFullWidthSmallA[] = "\xEF\xBD\x81";
8673
8774 void SetSendKeyCommandWithKeyString(const string &key_string,
8875 commands::Command *command) {
609596 Segment::Candidate *candidate;
610597
611598 segment = segments->add_segment();
612 // "あいうえお"
613 segment->set_key(kAiueo);
599 segment->set_key("あいうえお");
614600 candidate = segment->add_candidate();
615 // "あいうえお"
616 candidate->key = kAiueo;
617 candidate->content_key = kAiueo;
618 candidate->value = kAiueo;
601 candidate->key = "あいうえお";
602 candidate->content_key = "あいうえお";
603 candidate->value = "あいうえお";
619604 candidate = segment->add_candidate();
620 // "アイウエオ"
621 candidate->key = kAiueo;
622 candidate->content_key = kAiueo;
623 candidate->value = kKatakanaAiueo;
605 candidate->key = "あいうえお";
606 candidate->content_key = "あいうえお";
607 candidate->value = "アイウエオ";
624608 }
625609
626610 void InitSessionToDirect(Session* session) {
686670 segments->Clear();
687671 segment = segments->add_segment();
688672
689 // "ぃ"
690 segment->set_key("\xE3\x81\x83");
673 segment->set_key("ぃ");
691674 candidate = segment->add_candidate();
692 // "ぃ"
693 candidate->value = "\xE3\x81\x83";
675 candidate->value = "ぃ";
694676
695677 candidate = segment->add_candidate();
696 // "ィ"
697 candidate->value = "\xE3\x82\xA3";
678 candidate->value = "ィ";
698679
699680 segment = segments->add_segment();
700 // "け"
701 segment->set_key("\xE3\x81\x91");
681 segment->set_key("け");
702682 candidate = segment->add_candidate();
703 // "家"
704 candidate->value = "\xE5\xAE\xB6";
683 candidate->value = "家";
705684 candidate = segment->add_candidate();
706 // "け"
707 candidate->value = "\xE3\x81\x91";
685 candidate->value = "け";
708686 }
709687
710688 void FillT13Ns(const ConversionRequest &request, Segments *segments) {
816794 command.Clear();
817795 session->Convert(&command);
818796 EXPECT_FALSE(command.output().has_result());
819 // "あいうえお"
820 EXPECT_PREEDIT(kAiueo, command);
797 EXPECT_PREEDIT("あいうえお", command);
821798
822799 GetConverterMock()->SetCommitSegmentValue(&segments, true);
823800 command.Clear();
824801
825802 session->Commit(&command);
826803 EXPECT_FALSE(command.output().has_preedit());
827 // "あいうえお"
828 EXPECT_RESULT(kAiueo, command);
804 EXPECT_RESULT("あいうえお", command);
829805 }
830806 }
831807
869845 InitSessionToPrecomposition(session.get());
870846 commands::Command command;
871847 SendKey("a", session.get(), &command);
872 // "あ"
873 EXPECT_SINGLE_SEGMENT(kHiraganaA, command)
848 EXPECT_SINGLE_SEGMENT("あ", command)
874849 << "Global Romaji table should be initialized for each test fixture.";
875850 }
876851 }
929904 InsertCharacterChars("k", session.get(), &command);
930905 SendCommand(commands::SessionCommand::SUBMIT, session.get(), &command);
931906 EXPECT_TRUE(command.output().consumed());
932 // "k"
933 EXPECT_RESULT("\xef\xbd\x8b", command);
907 EXPECT_RESULT("k", command);
934908 EXPECT_FALSE(command.output().has_preedit());
935909 EXPECT_FALSE(command.output().has_candidates());
936910
937911 // SWITCH_INPUT_MODE
938912 SendKey("a", session.get(), &command);
939 EXPECT_SINGLE_SEGMENT(kHiraganaA, command);
913 EXPECT_SINGLE_SEGMENT("あ", command);
940914
941915 SwitchInputMode(commands::FULL_ASCII, session.get());
942916
943917 SendKey("a", session.get(), &command);
944 // "あa"
945 EXPECT_SINGLE_SEGMENT("\xE3\x81\x82\xEF\xBD\x81", command);
918 EXPECT_SINGLE_SEGMENT("あa", command);
946919
947920 // GET_STATUS
948921 SendCommand(commands::SessionCommand::GET_STATUS, session.get(), &command);
981954
982955 // SWITCH_INPUT_MODE
983956 SendKey("a", session.get(), &command);
984 EXPECT_SINGLE_SEGMENT(kHiraganaA, command);
957 EXPECT_SINGLE_SEGMENT("あ", command);
985958
986959 SwitchInputMode(commands::FULL_ASCII, session.get());
987960
988961 SendKey("a", session.get(), &command);
989 // "あa"
990 EXPECT_SINGLE_SEGMENT("\xE3\x81\x82\xEF\xBD\x81", command);
962 EXPECT_SINGLE_SEGMENT("あa", command);
991963
992964 // GET_STATUS
993965 SendCommand(commands::SessionCommand::GET_STATUS, session.get(), &command);
1017989 EXPECT_EQ(commands::HIRAGANA, command.output().mode());
1018990
1019991 SendKey("a", session.get(), &command);
1020 // "あ"
1021 EXPECT_SINGLE_SEGMENT(kHiraganaA, command);
992 EXPECT_SINGLE_SEGMENT("あ", command);
1022993
1023994 // GET_STATUS
1024995 SendCommand(commands::SessionCommand::GET_STATUS, session.get(), &command);
10521023 EXPECT_FALSE(command.output().has_candidates());
10531024
10541025 SendKey("a", session.get(), &command);
1055 EXPECT_SINGLE_SEGMENT(kHiraganaA, command);
1026 EXPECT_SINGLE_SEGMENT("あ", command);
10561027 }
10571028
10581029 TEST_F(SessionTest, InputMode) {
11001071 session->SendCommand(&command);
11011072 EXPECT_TRUE(command.output().consumed());
11021073 EXPECT_FALSE(command.output().has_result());
1103 // "アイウエオ"
1104 EXPECT_PREEDIT(
1105 "\xEF\xBD\xB1\xEF\xBD\xB2\xEF\xBD\xB3\xEF\xBD\xB4\xEF\xBD\xB5", command);
1074 EXPECT_PREEDIT("アイウエオ", command);
11061075 EXPECT_FALSE(command.output().has_candidates());
11071076 }
11081077
11241093
11251094 command.Clear();
11261095 session->ConvertNext(&command);
1127 // "アイウエオ"
1128 EXPECT_SINGLE_SEGMENT(
1129 "\xE3\x82\xA2\xE3\x82\xA4\xE3\x82\xA6\xE3\x82\xA8\xE3\x82\xAA", command);
1096 EXPECT_SINGLE_SEGMENT("アイウエオ", command);
11301097
11311098 SetSendCommandCommand(commands::SessionCommand::HIGHLIGHT_CANDIDATE,
11321099 &command);
11351102 session->SendCommand(&command);
11361103 EXPECT_TRUE(command.output().consumed());
11371104 EXPECT_FALSE(command.output().has_result());
1138 // "アイウエオ"
1139 EXPECT_SINGLE_SEGMENT(
1140 "\xEF\xBD\xB1\xEF\xBD\xB2\xEF\xBD\xB3\xEF\xBD\xB4\xEF\xBD\xB5", command);
1105 EXPECT_SINGLE_SEGMENT("アイウエオ", command);
11411106 EXPECT_TRUE(command.output().has_candidates());
11421107 }
11431108
11541119 FillT13Ns(request, &segments);
11551120 GetConverterMock()->SetStartConversionForRequest(&segments, true);
11561121
1157 // "あいうえお"
1158 EXPECT_SINGLE_SEGMENT_AND_KEY(kAiueo, kAiueo, command);
1122 EXPECT_SINGLE_SEGMENT_AND_KEY("あいうえお", "あいうえお", command);
11591123
11601124 command.Clear();
11611125 session->Convert(&command);
11691133 EXPECT_TRUE(command.output().preedit().segment(i).has_key());
11701134 key += command.output().preedit().segment(i).key();
11711135 }
1172 // "あいうえお"
1173 EXPECT_EQ(kAiueo, key);
1136 EXPECT_EQ("あいうえお", key);
11741137 }
11751138
11761139 TEST_F(SessionTest, SegmentWidthShrink) {
12351198 // "わたしのなまえはなかのです[]"
12361199
12371200 segment = segments.add_segment();
1238 // "わたしの"
1239 segment->set_key("\xe3\x82\x8f\xe3\x81\x9f\xe3\x81\x97\xe3\x81\xae");
1201 segment->set_key("わたしの");
12401202 candidate = segment->add_candidate();
1241 // "私の"
1242 candidate->value = "\xe7\xa7\x81\xe3\x81\xae";
1203 candidate->value = "私の";
12431204 candidate = segment->add_candidate();
1244 // "わたしの"
1245 candidate->value = "\xe3\x82\x8f\xe3\x81\x9f\xe3\x81\x97\xe3\x81\xae";
1205 candidate->value = "わたしの";
12461206 candidate = segment->add_candidate();
1247 // "渡しの"
1248 candidate->value = "\xe6\xb8\xa1\xe3\x81\x97\xe3\x81\xae";
1207 candidate->value = "渡しの";
12491208
12501209 segment = segments.add_segment();
1251 // "なまえは"
1252 segment->set_key("\xe3\x81\xaa\xe3\x81\xbe\xe3\x81\x88\xe3\x81\xaf");
1210 segment->set_key("なまえは");
12531211 candidate = segment->add_candidate();
1254 // "名前は"
1255 candidate->value = "\xe5\x90\x8d\xe5\x89\x8d\xe3\x81\xaf";
1212 candidate->value = "名前は";
12561213 candidate = segment->add_candidate();
1257 // "ナマエは"
1258 candidate->value = "\xe3\x83\x8a\xe3\x83\x9e\xe3\x82\xa8\xe3\x81\xaf";
1214 candidate->value = "ナマエは";
12591215
12601216 segment = segments.add_segment();
1261 // "なかのです"
1262 segment->set_key(
1263 "\xe3\x81\xaa\xe3\x81\x8b\xe3\x81\xae\xe3\x81\xa7\xe3\x81\x99");
1217 segment->set_key("なかのです");
12641218 candidate = segment->add_candidate();
1265 // "中野です"
1266 candidate->value = "\xe4\xb8\xad\xe9\x87\x8e\xe3\x81\xa7\xe3\x81\x99";
1219 candidate->value = "中野です";
12671220 candidate = segment->add_candidate();
1268 // "なかのです"
1269 candidate->value
1270 = "\xe3\x81\xaa\xe3\x81\x8b\xe3\x81\xae\xe3\x81\xa7\xe3\x81\x99";
1221 candidate->value = "なかのです";
12711222 SetComposer(session.get(), &request);
12721223 FillT13Ns(request, &segments);
12731224 GetConverterMock()->SetStartConversionForRequest(&segments, true);
13121263
13131264 segments.Clear();
13141265 segment = segments.add_segment();
1315 // "あ"
1316 segment->set_key(kHiraganaA);
1266 segment->set_key("あ");
13171267 candidate = segment->add_candidate();
1318 // "阿"
1319 candidate->value = "\xe9\x98\xbf";
1268 candidate->value = "阿";
13201269 candidate = segment->add_candidate();
1321 // "亜"
1322 candidate->value = "\xe4\xba\x9c";
1270 candidate->value = "亜";
13231271
13241272 SetComposer(session.get(), &request);
13251273 FillT13Ns(request, &segments);
13481296 InsertCharacterChars("ai", session.get(), &command);
13491297
13501298 segment = segments.add_segment();
1351 // "あい"
1352 segment->set_key("\xe3\x81\x82\xe3\x81\x84");
1299 segment->set_key("あい");
13531300 candidate = segment->add_candidate();
1354 // "愛"
1355 candidate->value = "\xe6\x84\x9b";
1301 candidate->value = "愛";
13561302 candidate = segment->add_candidate();
1357 // "相"
1358 candidate->value = "\xe7\x9b\xb8";
1303 candidate->value = "相";
13591304 ConversionRequest request;
13601305 SetComposer(session.get(), &request);
13611306 FillT13Ns(request, &segments);
13681313
13691314 segments.Clear();
13701315 segment = segments.add_segment();
1371 // "あ"
1372 segment->set_key(kHiraganaA);
1316 segment->set_key("あ");
13731317 candidate = segment->add_candidate();
1374 // "あ"
1375 candidate->value = kHiraganaA;
1318 candidate->value = "あ";
13761319 segment = segments.add_segment();
1377 // "い"
1378 segment->set_key("\xe3\x81\x84");
1320 segment->set_key("い");
13791321 candidate = segment->add_candidate();
1380 // "い"
1381 candidate->value = "\xe3\x81\x84";
1322 candidate->value = "い";
13821323 candidate = segment->add_candidate();
1383 // "位"
1384 candidate->value = "\xe4\xbd\x8d";
1324 candidate->value = "位";
13851325 GetConverterMock()->SetResizeSegment1(&segments, true);
13861326
13871327 command.Clear();
14061346
14071347 segments.Clear();
14081348 segment = segments.add_segment();
1409 // "あい"
1410 segment->set_key("\xe3\x81\x82\xe3\x81\x84");
1349 segment->set_key("あい");
14111350 candidate = segment->add_candidate();
1412 // "愛"
1413 candidate->value = "\xe6\x84\x9b";
1351 candidate->value = "愛";
14141352 candidate = segment->add_candidate();
1415 // "相"
1416 candidate->value = "\xe7\x9b\xb8";
1353 candidate->value = "相";
14171354 SetComposer(session.get(), &request);
14181355 FillT13Ns(request, &segments);
14191356 GetConverterMock()->SetStartConversionForRequest(&segments, true);
14271364 session->Convert(&command);
14281365 // "[相]"
14291366 }
1430
14311367
14321368 TEST_F(SessionTest, KeepFixedCandidateAfterSegmentWidthExpand) {
14331369 // Issue#1271099
14421378 // "ばりにりょこうにいった[]"
14431379
14441380 segment = segments.add_segment();
1445 // "ばりに"
1446 segment->set_key("\xe3\x81\xb0\xe3\x82\x8a\xe3\x81\xab");
1381 segment->set_key("ばりに");
14471382 candidate = segment->add_candidate();
1448 // "バリに"
1449 candidate->value = "\xe3\x83\x90\xe3\x83\xaa\xe3\x81\xab";
1383 candidate->value = "バリに";
14501384 candidate = segment->add_candidate();
1451 // "針に"
1452 candidate->value = "\xe9\x87\x9d\xe3\x81\xab";
1385 candidate->value = "針に";
14531386
14541387 segment = segments.add_segment();
1455 // "りょこうに"
1456 segment->set_key(
1457 "\xe3\x82\x8a\xe3\x82\x87\xe3\x81\x93\xe3\x81\x86\xe3\x81\xab");
1388 segment->set_key("りょこうに");
14581389 candidate = segment->add_candidate();
1459 // "旅行に"
1460 candidate->value = "\xe6\x97\x85\xe8\xa1\x8c\xe3\x81\xab";
1390 candidate->value = "旅行に";
14611391
14621392 segment = segments.add_segment();
1463 // "いった"
1464 segment->set_key("\xe3\x81\x84\xe3\x81\xa3\xe3\x81\x9f");
1393 segment->set_key("いった");
14651394 candidate = segment->add_candidate();
1466 // "行った"
1467 candidate->value = "\xe8\xa1\x8c\xe3\x81\xa3\xe3\x81\x9f";
1395 candidate->value = "行った";
14681396
14691397 ConversionRequest request;
14701398 SetComposer(session.get(), &request);
14741402 command.Clear();
14751403 session->Convert(&command);
14761404 // ex. "[バリに]旅行に行った"
1477 EXPECT_EQ("\xE3\x83\x90\xE3\x83\xAA\xE3\x81\xAB\xE6\x97\x85\xE8\xA1\x8C\xE3"
1478 "\x81\xAB\xE8\xA1\x8C\xE3\x81\xA3\xE3\x81\x9F", GetComposition(command));
1405 EXPECT_EQ("バリに旅行に行った", GetComposition(command));
14791406 command.Clear();
14801407 session->ConvertNext(&command);
14811408 // ex. "[針に]旅行に行った"
14941421 EXPECT_EQ(first_segment, command.output().preedit().segment(0).value());
14951422
14961423 segment = segments.mutable_segment(1);
1497 // "りょこうにい"
1498 segment->set_key("\xe3\x82\x8a\xe3\x82\x87\xe3\x81\x93"
1499 "\xe3\x81\x86\xe3\x81\xab\xe3\x81\x84");
1424 segment->set_key("りょこうにい");
15001425 candidate = segment->mutable_candidate(0);
1501 // "旅行に行"
1502 candidate->value = "\xe6\x97\x85\xe8\xa1\x8c\xe3\x81\xab\xe8\xa1\x8c";
1426 candidate->value = "旅行に行";
15031427
15041428 segment = segments.mutable_segment(2);
1505 // "った"
1506 segment->set_key("\xe3\x81\xa3\xe3\x81\x9f");
1429 segment->set_key("った");
15071430 candidate = segment->mutable_candidate(0);
1508 // "った"
1509 candidate->value = "\xe3\x81\xa3\xe3\x81\x9f";
1431 candidate->value = "った";
15101432
15111433 GetConverterMock()->SetResizeSegment1(&segments, true);
15121434
15331455 // "わたしのなまえ[]"
15341456
15351457 segment = segments.add_segment();
1536 // "わたしの"
1537 segment->set_key("\xe3\x82\x8f\xe3\x81\x9f\xe3\x81\x97\xe3\x81\xae");
1458 segment->set_key("わたしの");
15381459 candidate = segment->add_candidate();
1539 // "私の"
1540 candidate->value = "\xe7\xa7\x81\xe3\x81\xae";
1460 candidate->value = "私の";
15411461 candidate = segment->add_candidate();
1542 // "わたしの"
1543 candidate->value = "\xe3\x82\x8f\xe3\x81\x9f\xe3\x81\x97\xe3\x81\xae";
1462 candidate->value = "わたしの";
15441463 candidate = segment->add_candidate();
1545 // "渡しの"
1546 candidate->value = "\xe6\xb8\xa1\xe3\x81\x97\xe3\x81\xae";
1464 candidate->value = "渡しの";
15471465
15481466 segment = segments.add_segment();
1549 // "なまえ"
1550 segment->set_key("\xe3\x81\xaa\xe3\x81\xbe\xe3\x81\x88");
1467 segment->set_key("なまえ");
15511468 candidate = segment->add_candidate();
1552 // "名前"
1553 candidate->value = "\xe5\x90\x8d\xe5\x89\x8d";
1469 candidate->value = "名前";
15541470
15551471 ConversionRequest request;
15561472 SetComposer(session.get(), &request);
15591475
15601476 command.Clear();
15611477 session->Convert(&command);
1478 EXPECT_EQ(0, command.output().candidates().focused_index());
15621479 // "[私の]名前"
1563 EXPECT_EQ(0, command.output().candidates().focused_index());
15641480
15651481 command.Clear();
15661482 session->ConvertNext(&command);
1483 EXPECT_EQ(1, command.output().candidates().focused_index());
15671484 // "[わたしの]名前"
1568 EXPECT_EQ(1, command.output().candidates().focused_index());
15691485
15701486 command.Clear();
15711487 session->ConvertNext(&command);
15961512 // "わたしのはは[]"
15971513
15981514 segment = segments.add_segment();
1599 // "わたしの"
1600 segment->set_key("\xe3\x82\x8f\xe3\x81\x9f\xe3\x81\x97\xe3\x81\xae");
1515 segment->set_key("わたしの");
16011516 candidate = segment->add_candidate();
1602 // "私の"
1603 candidate->value = "\xe7\xa7\x81\xe3\x81\xae";
1517 candidate->value = "私の";
16041518 segment = segments.add_segment();
1605 // "はは"
1606 segment->set_key("\xe3\x81\xaf\xe3\x81\xaf");
1519 segment->set_key("はは");
16071520 candidate = segment->add_candidate();
1608 // "母"
1609 candidate->value = "\xe6\xaf\x8d";
1521 candidate->value = "母";
16101522
16111523 ConversionRequest request;
16121524 SetComposer(session.get(), &request);
16291541 session->CommitSegment(&command);
16301542 // "私の" + "[母]"
16311543
1632 // "は"
1633 segment->set_key("\xe3\x81\xaf");
1634 // "葉"
1635 candidate->value = "\xe8\x91\x89";
1544 segment->set_key("は");
1545 candidate->value = "葉";
16361546 segment = segments.add_segment();
1637 // "は"
1638 segment->set_key("\xe3\x81\xaf");
1547 segment->set_key("は");
16391548 candidate = segment->add_candidate();
1640 // "は"
1641 candidate->value = "\xe3\x81\xaf";
1549 candidate->value = "は";
16421550 segments.pop_front_segment();
16431551 GetConverterMock()->SetResizeSegment1(&segments, true);
16441552
16581566 InsertCharacterChars("jishin", session.get(), &command);
16591567
16601568 segment = segments.add_segment();
1661 // "じしん"
1662 segment->set_key("\xe3\x81\x98\xe3\x81\x97\xe3\x82\x93");
1569 segment->set_key("じしん");
16631570 candidate = segment->add_candidate();
1664 // "自信"
1665 candidate->value = "\xe8\x87\xaa\xe4\xbf\xa1";
1571 candidate->value = "自信";
16661572 candidate = segment->add_candidate();
1667 // "自身"
1668 candidate->value = "\xe8\x87\xaa\xe8\xba\xab";
1573 candidate->value = "自身";
16691574
16701575 ConversionRequest request;
16711576 SetComposer(session.get(), &request);
17061611 InsertCharacterChars("jishin", session.get(), &command);
17071612
17081613 segment = segments.add_segment();
1709 // "じしん"
1710 segment->set_key("\xe3\x81\x98\xe3\x81\x97\xe3\x82\x93");
1614 segment->set_key("じしん");
17111615 candidate = segment->add_candidate();
1712 // "自信"
1713 candidate->value = "\xe8\x87\xaa\xe4\xbf\xa1";
1616 candidate->value = "自信";
17141617 candidate = segment->add_candidate();
1715 // "自身"
1716 candidate->value = "\xe8\x87\xaa\xe8\xba\xab";
1618 candidate->value = "自身";
17171619
17181620 ConversionRequest request;
17191621 SetComposer(session.get(), &request);
17621664
17631665 const commands::Preedit &conversion = output.preedit();
17641666 EXPECT_EQ(2, conversion.segment_size());
1765 // "ぃ"
1766 EXPECT_EQ("\xE3\x81\x83", conversion.segment(0).value());
1767 // "家"
1768 EXPECT_EQ("\xE5\xAE\xB6", conversion.segment(1).value());
1667 EXPECT_EQ("ぃ", conversion.segment(0).value());
1668 EXPECT_EQ("家", conversion.segment(1).value());
17691669 }
17701670
17711671 // TranslateHalfASCII
17921692 Segments segments;
17931693 { // Initialize segments.
17941694 Segment *segment = segments.add_segment();
1795 // "あbc"
1796 segment->set_key("\xE3\x81\x82\xEF\xBD\x82\xEF\xBD\x83");
1797 // "あべし"
1798 segment->add_candidate()->value = "\xE3\x81\x82\xE3\x81\xB9\xE3\x81\x97";
1695 segment->set_key("あbc");
1696 segment->add_candidate()->value = "あべし";
17991697 }
18001698 ConversionRequest request;
18011699 SetComposer(session.get(), &request);
18041702
18051703 command.Clear();
18061704 session->ConvertToHalfWidth(&command);
1807 // "アbc"
1808 EXPECT_SINGLE_SEGMENT("\xEF\xBD\xB1\x62\x63", command);
1705 EXPECT_SINGLE_SEGMENT("アbc", command);
18091706
18101707 command.Clear();
18111708 session->ConvertToFullASCII(&command);
18271724 InsertCharacterChars("dvd", session.get(), &command);
18281725
18291726 segment = segments.add_segment();
1830 // "dvd"
1831 segment->set_key("\xEF\xBD\x84\xEF\xBD\x96\xEF\xBD\x84");
1727 segment->set_key("dvd");
18321728 candidate = segment->add_candidate();
18331729 candidate->value = "DVD";
18341730 candidate = segment->add_candidate();
18411737
18421738 command.Clear();
18431739 session->ConvertToFullASCII(&command);
1844 // "dvd"
1845 EXPECT_SINGLE_SEGMENT("\xEF\xBD\x84\xEF\xBD\x96\xEF\xBD\x84", command);
1740 EXPECT_SINGLE_SEGMENT("dvd", command);
18461741
18471742 command.Clear();
18481743 session->ConvertToFullASCII(&command);
1849 // "DVD"
1850 EXPECT_SINGLE_SEGMENT("\xEF\xBC\xA4\xEF\xBC\xB6\xEF\xBC\xA4", command);
1744 EXPECT_SINGLE_SEGMENT("DVD", command);
18511745
18521746 command.Clear();
18531747 session->ConvertToFullASCII(&command);
1854 // "Dvd"
1855 EXPECT_SINGLE_SEGMENT("\xEF\xBC\xA4\xEF\xBD\x96\xEF\xBD\x84", command);
1748 EXPECT_SINGLE_SEGMENT("Dvd", command);
18561749
18571750 command.Clear();
18581751 session->ConvertToFullASCII(&command);
1859 // "dvd"
1860 EXPECT_SINGLE_SEGMENT("\xEF\xBD\x84\xEF\xBD\x96\xEF\xBD\x84", command);
1752 EXPECT_SINGLE_SEGMENT("dvd", command);
18611753 }
18621754
18631755 TEST_F(SessionTest, ConvertConsonantsToFullAlphanumericWithoutCascadingWindow) {
18761768 InsertCharacterChars("dvd", session.get(), &command);
18771769
18781770 segment = segments.add_segment();
1879 // "dvd"
1880 segment->set_key("\xEF\xBD\x84\xEF\xBD\x96\xEF\xBD\x84");
1771 segment->set_key("dvd");
18811772 candidate = segment->add_candidate();
18821773 candidate->value = "DVD";
18831774 candidate = segment->add_candidate();
18901781
18911782 command.Clear();
18921783 session->ConvertToFullASCII(&command);
1893 // "dvd"
1894 EXPECT_SINGLE_SEGMENT("\xEF\xBD\x84\xEF\xBD\x96\xEF\xBD\x84", command);
1784 EXPECT_SINGLE_SEGMENT("dvd", command);
18951785
18961786 command.Clear();
18971787 session->ConvertToFullASCII(&command);
1898 // "DVD"
1899 EXPECT_SINGLE_SEGMENT("\xEF\xBC\xA4\xEF\xBC\xB6\xEF\xBC\xA4", command);
1788 EXPECT_SINGLE_SEGMENT("DVD", command);
19001789
19011790 command.Clear();
19021791 session->ConvertToFullASCII(&command);
1903 // "Dvd"
1904 EXPECT_SINGLE_SEGMENT("\xEF\xBC\xA4\xEF\xBD\x96\xEF\xBD\x84", command);
1792 EXPECT_SINGLE_SEGMENT("Dvd", command);
19051793
19061794 command.Clear();
19071795 session->ConvertToFullASCII(&command);
1908 // "dvd"
1909 EXPECT_SINGLE_SEGMENT("\xEF\xBD\x84\xEF\xBD\x96\xEF\xBD\x84", command);
1796 EXPECT_SINGLE_SEGMENT("dvd", command);
19101797 }
19111798
19121799 // Convert input string to Hiragana, Katakana, and Half Katakana
19201807 Segments segments;
19211808 { // Initialize segments.
19221809 Segment *segment = segments.add_segment();
1923 // "あbc"
1924 segment->set_key("\xE3\x81\x82\xEF\xBD\x82\xEF\xBD\x83");
1925 // "あべし"
1926 segment->add_candidate()->value = "\xE3\x81\x82\xE3\x81\xB9\xE3\x81\x97";
1810 segment->set_key("あbc");
1811 segment->add_candidate()->value = "あべし";
19271812 }
19281813
19291814 ConversionRequest request;
19331818
19341819 command.Clear();
19351820 session->SwitchKanaType(&command);
1936 // "アbc"
1937 EXPECT_SINGLE_SEGMENT("\xE3\x82\xA2\xEF\xBD\x82\xEF\xBD\x83", command);
1821 EXPECT_SINGLE_SEGMENT("アbc", command);
19381822
19391823 command.Clear();
19401824 session->SwitchKanaType(&command);
1941 // "アbc"
1942 EXPECT_SINGLE_SEGMENT("\xEF\xBD\xB1\x62\x63", command);
1825 EXPECT_SINGLE_SEGMENT("アbc", command);
19431826
19441827 command.Clear();
19451828 session->SwitchKanaType(&command);
1946 // "あbc"
1947 EXPECT_SINGLE_SEGMENT("\xE3\x81\x82\xEF\xBD\x82\xEF\xBD\x83", command);
1829 EXPECT_SINGLE_SEGMENT("あbc", command);
19481830
19491831 command.Clear();
19501832 session->SwitchKanaType(&command);
1951 // "アbc"
1952 EXPECT_SINGLE_SEGMENT("\xE3\x82\xA2\xEF\xBD\x82\xEF\xBD\x83", command);
1833 EXPECT_SINGLE_SEGMENT("アbc", command);
19531834 }
19541835
19551836 { // From conversion mode.
19611842 Segments segments;
19621843 { // Initialize segments.
19631844 Segment *segment = segments.add_segment();
1964 // "かんじ"
1965 segment->set_key("\xE3\x81\x8B\xE3\x82\x93\xE3\x81\x98");
1966 // "漢字"
1967 segment->add_candidate()->value = "\xE6\xBC\xA2\xE5\xAD\x97";
1845 segment->set_key("かんじ");
1846 segment->add_candidate()->value = "漢字";
19681847 }
19691848
19701849 ConversionRequest request;
19741853
19751854 command.Clear();
19761855 session->Convert(&command);
1977 // "漢字"
1978 EXPECT_SINGLE_SEGMENT("\xE6\xBC\xA2\xE5\xAD\x97", command);
1856 EXPECT_SINGLE_SEGMENT("漢字", command);
19791857
19801858 command.Clear();
19811859 session->SwitchKanaType(&command);
1982 // "かんじ"
1983 EXPECT_SINGLE_SEGMENT("\xE3\x81\x8B\xE3\x82\x93\xE3\x81\x98", command);
1860 EXPECT_SINGLE_SEGMENT("かんじ", command);
19841861
19851862 command.Clear();
19861863 session->SwitchKanaType(&command);
1987 // "カンジ"
1988 EXPECT_SINGLE_SEGMENT("\xE3\x82\xAB\xE3\x83\xB3\xE3\x82\xB8", command);
1864 EXPECT_SINGLE_SEGMENT("カンジ", command);
19891865
19901866 command.Clear();
19911867 session->SwitchKanaType(&command);
1992 // "カンジ"
19931868 EXPECT_SINGLE_SEGMENT(
1994 "\xEF\xBD\xB6\xEF\xBE\x9D\xEF\xBD\xBC\xEF\xBE\x9E", command);
1869 "カンジ", command);
19951870
19961871 command.Clear();
19971872 session->SwitchKanaType(&command);
1998 // "かんじ"
1999 EXPECT_SINGLE_SEGMENT("\xE3\x81\x8B\xE3\x82\x93\xE3\x81\x98", command);
1873 EXPECT_SINGLE_SEGMENT("かんじ", command);
20001874 }
20011875 }
20021876
20081882
20091883 // HIRAGANA
20101884 InsertCharacterChars("a", session.get(), &command);
2011 // "あ"
2012 EXPECT_EQ(kHiraganaA, GetComposition(command));
1885 EXPECT_EQ("あ", GetComposition(command));
20131886 EXPECT_TRUE(command.output().has_mode());
20141887 EXPECT_EQ(commands::HIRAGANA, command.output().mode());
20151888
20191892 command.Clear();
20201893 session->InputModeSwitchKanaType(&command);
20211894 InsertCharacterChars("a", session.get(), &command);
2022 // "ア"
2023 EXPECT_EQ("\xE3\x82\xA2", GetComposition(command));
1895 EXPECT_EQ("ア", GetComposition(command));
20241896 EXPECT_TRUE(command.output().has_mode());
20251897 EXPECT_EQ(commands::FULL_KATAKANA, command.output().mode());
20261898
20301902 command.Clear();
20311903 session->InputModeSwitchKanaType(&command);
20321904 InsertCharacterChars("a", session.get(), &command);
2033 // "ア"
2034 EXPECT_EQ("\xEF\xBD\xB1",
2035 GetComposition(command));
1905 EXPECT_EQ("ア", GetComposition(command));
20361906 EXPECT_TRUE(command.output().has_mode());
20371907 EXPECT_EQ(commands::HALF_KATAKANA, command.output().mode());
20381908
20421912 command.Clear();
20431913 session->InputModeSwitchKanaType(&command);
20441914 InsertCharacterChars("a", session.get(), &command);
2045 // "あ"
2046 EXPECT_EQ(kHiraganaA, GetComposition(command));
1915 EXPECT_EQ("あ", GetComposition(command));
20471916 EXPECT_TRUE(command.output().has_mode());
20481917 EXPECT_EQ(commands::HIRAGANA, command.output().mode());
20491918
20531922 command.Clear();
20541923 session->InputModeHalfASCII(&command);
20551924 InsertCharacterChars("a", session.get(), &command);
2056 // "a"
20571925 EXPECT_EQ("a", GetComposition(command));
20581926 EXPECT_TRUE(command.output().has_mode());
20591927 EXPECT_EQ(commands::HALF_ASCII, command.output().mode());
20641932 command.Clear();
20651933 session->InputModeSwitchKanaType(&command);
20661934 InsertCharacterChars("a", session.get(), &command);
2067 // "a"
20681935 EXPECT_EQ("a", GetComposition(command));
20691936 EXPECT_TRUE(command.output().has_mode());
20701937 EXPECT_EQ(commands::HALF_ASCII, command.output().mode());
20751942 command.Clear();
20761943 session->InputModeFullASCII(&command);
20771944 InsertCharacterChars("a", session.get(), &command);
2078 // "a"
2079 EXPECT_EQ(kFullWidthSmallA, GetComposition(command));
1945 EXPECT_EQ("a", GetComposition(command));
20801946 EXPECT_TRUE(command.output().has_mode());
20811947 EXPECT_EQ(commands::FULL_ASCII, command.output().mode());
20821948
20861952 command.Clear();
20871953 session->InputModeSwitchKanaType(&command);
20881954 InsertCharacterChars("a", session.get(), &command);
2089 // "a"
2090 EXPECT_EQ(kFullWidthSmallA, GetComposition(command));
1955 EXPECT_EQ("a", GetComposition(command));
20911956 EXPECT_TRUE(command.output().has_mode());
20921957 EXPECT_EQ(commands::FULL_ASCII, command.output().mode());
20931958 }
21001965
21011966 command.Clear();
21021967 session->TranslateHalfWidth(&command);
2103 // "アbc"
2104 EXPECT_SINGLE_SEGMENT("\xEF\xBD\xB1\x62\x63", command);
1968 EXPECT_SINGLE_SEGMENT("アbc", command);
21051969
21061970 command.Clear();
21071971 session->TranslateFullASCII(&command);
2108 // "abc".
2109 EXPECT_SINGLE_SEGMENT("\xEF\xBD\x81\xEF\xBD\x82\xEF\xBD\x83", command);
1972 EXPECT_SINGLE_SEGMENT("abc", command);
21101973
21111974 command.Clear();
21121975 session->TranslateHalfWidth(&command);
21782041 Segment *segment;
21792042 Segment::Candidate *candidate;
21802043 composer::Table table;
2181 // "ぱ"
2182 table.AddRule("pa", "\xe3\x81\xb1", "");
2183 // "ん"
2184 table.AddRule("n", "\xe3\x82\x93", "");
2185 // "な"
2186 table.AddRule("na", "\xe3\x81\xaa", "");
2044 table.AddRule("pa", "ぱ", "");
2045 table.AddRule("n", "ん", "");
2046 table.AddRule("na", "な", "");
21872047 // This rule makes the "n" rule ambiguous.
21882048
21892049 std::unique_ptr<Session> session(new Session(engine_.get()));
21932053 commands::Command command;
21942054 InsertCharacterChars("pan", session.get(), &command);
21952055
2196 // "ぱn"
2197 EXPECT_EQ("\xe3\x81\xb1\xef\xbd\x8e",
2056 EXPECT_EQ("ぱn",
21982057 command.output().preedit().segment(0).value());
21992058
22002059 command.Clear();
22012060
22022061 segment = segments.add_segment();
2203 // "ぱん"
2204 segment->set_key("\xe3\x81\xb1\xe3\x82\x93");
2062 segment->set_key("ぱん");
22052063 candidate = segment->add_candidate();
2206 // "パン"
2207 candidate->value = "\xe3\x83\x91\xe3\x83\xb3";
2064 candidate->value = "パン";
22082065
22092066 ConversionRequest request;
22102067 SetComposer(session.get(), &request);
22122069 GetConverterMock()->SetStartConversionForRequest(&segments, true);
22132070
22142071 session->ConvertToHiragana(&command);
2215 // "ぱん"
2216 EXPECT_SINGLE_SEGMENT("\xe3\x81\xb1\xe3\x82\x93", command);
2072 EXPECT_SINGLE_SEGMENT("ぱん", command);
22172073
22182074 command.Clear();
22192075 session->ConvertToHalfASCII(&command);
22262082 Segment *segment;
22272083 Segment::Candidate *candidate;
22282084 composer::Table table;
2229 // "す゛", "ず"
2230 table.AddRule("\xe3\x81\x99\xe3\x82\x9b", "\xe3\x81\x9a", "");
2085 table.AddRule("す゛", "ず", "");
22312086
22322087 std::unique_ptr<Session> session(new Session(engine_.get()));
22332088 session->get_internal_composer_only_for_unittest()->SetTable(&table);
22352090
22362091 commands::Command command;
22372092 SetSendKeyCommand("m", &command);
2238 // "も"
2239 command.mutable_input()->mutable_key()->set_key_string("\xe3\x82\x82");
2093 command.mutable_input()->mutable_key()->set_key_string("も");
22402094 session->SendKey(&command);
22412095
22422096 SetSendKeyCommand("r", &command);
2243 // "す"
2244 command.mutable_input()->mutable_key()->set_key_string("\xe3\x81\x99");
2097 command.mutable_input()->mutable_key()->set_key_string("す");
22452098 session->SendKey(&command);
22462099
22472100 SetSendKeyCommand("@", &command);
2248 // "゛"
2249 command.mutable_input()->mutable_key()->set_key_string("\xe3\x82\x9b");
2101 command.mutable_input()->mutable_key()->set_key_string("゛");
22502102 session->SendKey(&command);
22512103
22522104 SetSendKeyCommand("h", &command);
2253 // "く"
2254 command.mutable_input()->mutable_key()->set_key_string("\xe3\x81\x8f");
2105 command.mutable_input()->mutable_key()->set_key_string("く");
22552106 session->SendKey(&command);
22562107
22572108 SetSendKeyCommand("!", &command);
22582109 command.mutable_input()->mutable_key()->set_key_string("!");
22592110 session->SendKey(&command);
22602111
2261 // "もずく!"
2262 EXPECT_EQ("\xe3\x82\x82\xe3\x81\x9a\xe3\x81\x8f\xef\xbc\x81",
2263 command.output().preedit().segment(0).value());
2112 EXPECT_EQ("もずく!", command.output().preedit().segment(0).value());
22642113
22652114 segment = segments.add_segment();
2266 // "もずく!"
2267 segment->set_key("\xe3\x82\x82\xe3\x81\x9a\xe3\x81\x8f!");
2115 segment->set_key("もずく!");
22682116 candidate = segment->add_candidate();
2269 // "もずく!"
2270 candidate->value = "\xe3\x82\x82\xe3\x81\x9a\xe3\x81\x8f\xef\xbc\x81";
2117 candidate->value = "もずく!";
22712118
22722119 ConversionRequest request;
22732120 SetComposer(session.get(), &request);
22932140
22942141 string long_a;
22952142 for (int i = 0; i < 500; ++i) {
2296 // "あ"
2297 long_a += kHiraganaA;
2143 long_a += "あ";
22982144 }
22992145 segment = segments.add_segment();
23002146 segment->set_key(long_a);
24122258 InsertCharacterChars("ai", &session, &command);
24132259 ConversionRequest request;
24142260 SetComposer(&session, &request);
2415 // "あい"
2416 EXPECT_EQ("\xE3\x81\x82\xE3\x81\x84", GetComposition(command));
2261 EXPECT_EQ("あい", GetComposition(command));
24172262
24182263 command.Clear();
24192264 GetConverterMock()->SetFinishConversion(&empty_segments, true);
24202265 session.CommitFirstSuggestion(&command);
24212266 EXPECT_FALSE(command.output().has_preedit());
2422 // "あいうえお"
2423 EXPECT_RESULT(kAiueo, command);
2267 EXPECT_RESULT("あいうえお", command);
24242268 EXPECT_EQ(ImeContext::PRECOMPOSITION, session.context().state());
24252269
24262270 command.Clear();
24292273 EXPECT_TRUE(command.output().has_deletion_range());
24302274 EXPECT_EQ(-5, command.output().deletion_range().offset());
24312275 EXPECT_EQ(5, command.output().deletion_range().length());
2432 // "あい"
2433 EXPECT_SINGLE_SEGMENT("\xE3\x81\x82\xE3\x81\x84", command);
2276 EXPECT_SINGLE_SEGMENT("あい", command);
24342277 EXPECT_EQ(2, command.output().candidates().size());
24352278 EXPECT_EQ(ImeContext::COMPOSITION, session.context().state());
24362279 }
24952338 command.Clear();
24962339 session->Convert(&command);
24972340 EXPECT_FALSE(command.output().has_result());
2498 // "あいうえお"
2499 EXPECT_PREEDIT(kAiueo, command);
2341 EXPECT_PREEDIT("あいうえお", command);
25002342
25012343 GetConverterMock()->SetCommitSegmentValue(&segments, true);
25022344 command.Clear();
25032345 session->Commit(&command);
25042346 EXPECT_FALSE(command.output().has_preedit());
2505 // "あいうえお"
2506 EXPECT_RESULT(kAiueo, command);
2347 EXPECT_RESULT("あいうえお", command);
25072348
25082349 command.Clear();
25092350 session->Undo(&command);
25112352 EXPECT_TRUE(command.output().has_deletion_range());
25122353 EXPECT_EQ(-5, command.output().deletion_range().offset());
25132354 EXPECT_EQ(5, command.output().deletion_range().length());
2514 // "あいうえお"
2515 EXPECT_PREEDIT(kAiueo, command);
2355 EXPECT_PREEDIT("あいうえお", command);
25162356
25172357 // Undo twice - do nothing and keep the previous status.
25182358 command.Clear();
25192359 session->Undo(&command);
25202360 EXPECT_FALSE(command.output().has_result());
25212361 EXPECT_FALSE(command.output().has_deletion_range());
2522 // "あいうえお"
2523 EXPECT_PREEDIT(kAiueo, command);
2362 EXPECT_PREEDIT("あいうえお", command);
25242363 }
25252364
25262365 { // Undo after commitment of conversion
25272366 command.Clear();
25282367 session->ConvertNext(&command);
25292368 EXPECT_FALSE(command.output().has_result());
2530 // "アイウエオ"
2531 EXPECT_PREEDIT(kKatakanaAiueo, command);
2369 EXPECT_PREEDIT("アイウエオ", command);
25322370
25332371 GetConverterMock()->SetCommitSegmentValue(&segments, true);
25342372 command.Clear();
25352373 session->Commit(&command);
25362374 EXPECT_FALSE(command.output().has_preedit());
2537 // "アイウエオ"
2538 EXPECT_RESULT(kKatakanaAiueo, command);
2375 EXPECT_RESULT("アイウエオ", command);
25392376
25402377 command.Clear();
25412378 session->Undo(&command);
25432380 EXPECT_TRUE(command.output().has_deletion_range());
25442381 EXPECT_EQ(-5, command.output().deletion_range().offset());
25452382 EXPECT_EQ(5, command.output().deletion_range().length());
2546 // "アイウエオ"
2547 EXPECT_PREEDIT(kKatakanaAiueo, command);
2383 EXPECT_PREEDIT("アイウエオ", command);
25482384
25492385 // Undo twice - do nothing and keep the previous status.
25502386 command.Clear();
25512387 session->Undo(&command);
25522388 EXPECT_FALSE(command.output().has_result());
25532389 EXPECT_FALSE(command.output().has_deletion_range());
2554 // "アイウエオ"
2555 EXPECT_PREEDIT(kKatakanaAiueo, command);
2390 EXPECT_PREEDIT("アイウエオ", command);
25562391 }
25572392
25582393 { // Undo after commitment of conversion with Ctrl-Backspace.
28082643 command.Clear();
28092644 session->Convert(&command);
28102645 EXPECT_FALSE(command.output().has_result());
2811 // "あいうえお"
2812 EXPECT_PREEDIT(kAiueo, command);
2646 EXPECT_PREEDIT("あいうえお", command);
28132647
28142648 GetConverterMock()->SetCommitSegmentValue(&segments, true);
28152649 command.Clear();
28162650 session->Commit(&command);
28172651 EXPECT_FALSE(command.output().has_preedit());
2818 // "あいうえお"
2819 EXPECT_RESULT(kAiueo, command);
2652 EXPECT_RESULT("あいうえお", command);
28202653 }
28212654 }
28222655 // Try UndoOrRewind twice.
28252658 command.Clear();
28262659 session->UndoOrRewind(&command);
28272660 EXPECT_FALSE(command.output().has_result());
2828 // "あいうえお"
2829 EXPECT_PREEDIT(kAiueo, command);
2661 EXPECT_PREEDIT("あいうえお", command);
28302662 EXPECT_TRUE(command.output().has_deletion_range());
28312663 command.Clear();
28322664 session->UndoOrRewind(&command);
28332665 EXPECT_FALSE(command.output().has_result());
2834 // "あいうえお"
2835 EXPECT_PREEDIT(kAiueo, command);
2666 EXPECT_PREEDIT("あいうえお", command);
28362667 EXPECT_FALSE(command.output().has_deletion_range());
28372668 }
28382669
28532684 commands::Command command;
28542685 InsertCharacterChars("11111", session.get(), &command);
28552686 EXPECT_FALSE(command.output().has_result());
2856 // "お"
2857 EXPECT_PREEDIT("\xE3\x81\x8A", command);
2687 EXPECT_PREEDIT("お", command);
28582688 EXPECT_FALSE(command.output().has_deletion_range());
28592689 EXPECT_TRUE(command.output().has_all_candidate_words());
28602690
28612691 command.Clear();
28622692 session->UndoOrRewind(&command);
28632693 EXPECT_FALSE(command.output().has_result());
2864 // "え"
2865 EXPECT_PREEDIT("\xE3\x81\x88", command);
2694 EXPECT_PREEDIT("え", command);
28662695 EXPECT_FALSE(command.output().has_deletion_range());
28672696 EXPECT_TRUE(command.output().has_all_candidate_words());
28682697 }
28782707 Segments segments;
28792708 { // Initialize segments.
28802709 Segment *segment = segments.add_segment();
2881 // "あbc"
2882 segment->set_key("\xE3\x81\x82\xEF\xBD\x82\xEF\xBD\x83");
2883 // "あべし"
2884 segment->add_candidate()->value = "\xE3\x81\x82\xE3\x81\xB9\xE3\x81\x97";
2710 segment->set_key("あbc");
2711 segment->add_candidate()->value = "あべし";
28852712 }
28862713
28872714 command.Clear();
28882715 SetSendCommandCommand(commands::SessionCommand::COMMIT_RAW_TEXT, &command);
28892716 session->SendCommand(&command);
2890 // "abc"
28912717 EXPECT_RESULT_AND_KEY("abc", "abc", command);
28922718 EXPECT_EQ(ImeContext::PRECOMPOSITION, session->context().state());
28932719 }
29012727 Segments segments;
29022728 { // Initialize segments.
29032729 Segment *segment = segments.add_segment();
2904 // "あbc"
2905 segment->set_key("\xE3\x81\x82\xEF\xBD\x82\xEF\xBD\x83");
2906 // "あべし"
2907 segment->add_candidate()->value = "\xE3\x81\x82\xE3\x81\xB9\xE3\x81\x97";
2730 segment->set_key("あbc");
2731 segment->add_candidate()->value = "あべし";
29082732 }
29092733
29102734 ConversionRequest request;
29132737 GetConverterMock()->SetStartConversionForRequest(&segments, true);
29142738 command.Clear();
29152739 session->Convert(&command);
2916 // "あべし"
2917 EXPECT_PREEDIT("\xE3\x81\x82\xE3\x81\xB9\xE3\x81\x97", command);
2740 EXPECT_PREEDIT("あべし", command);
29182741 EXPECT_EQ(ImeContext::CONVERSION, session->context().state());
29192742
29202743 command.Clear();
29212744 SetSendCommandCommand(commands::SessionCommand::COMMIT_RAW_TEXT, &command);
29222745 session->SendCommand(&command);
2923 // "abc"
29242746 EXPECT_RESULT_AND_KEY("abc", "abc", command);
29252747 EXPECT_EQ(ImeContext::PRECOMPOSITION, session->context().state());
29262748 }
29312753 Segment *segment;
29322754 Segment::Candidate *candidate;
29332755 composer::Table table;
2934 // "す゛", "ず"
2935 table.AddRule("\xe3\x81\x99\xe3\x82\x9b", "\xe3\x81\x9a", "");
2756 table.AddRule("す゛", "ず", "");
29362757
29372758 std::unique_ptr<Session> session(new Session(engine_.get()));
29382759 session->get_internal_composer_only_for_unittest()->SetTable(&table);
29402761
29412762 commands::Command command;
29422763 SetSendKeyCommand("m", &command);
2943 // "も"
2944 command.mutable_input()->mutable_key()->set_key_string("\xe3\x82\x82");
2764 command.mutable_input()->mutable_key()->set_key_string("も");
29452765 session->SendKey(&command);
29462766
29472767 SetSendKeyCommand("r", &command);
2948 // "す"
2949 command.mutable_input()->mutable_key()->set_key_string("\xe3\x81\x99");
2768 command.mutable_input()->mutable_key()->set_key_string("す");
29502769 session->SendKey(&command);
29512770
29522771 SetSendKeyCommand("@", &command);
2953 // "゛"
2954 command.mutable_input()->mutable_key()->set_key_string("\xe3\x82\x9b");
2772 command.mutable_input()->mutable_key()->set_key_string("゛");
29552773 session->SendKey(&command);
29562774
29572775 SetSendKeyCommand("h", &command);
2958 // "く"
2959 command.mutable_input()->mutable_key()->set_key_string("\xe3\x81\x8f");
2776 command.mutable_input()->mutable_key()->set_key_string("く");
29602777 session->SendKey(&command);
29612778
29622779 SetSendKeyCommand("!", &command);
29632780 command.mutable_input()->mutable_key()->set_key_string("!");
29642781 session->SendKey(&command);
29652782
2966 // "もずく!"
2967 EXPECT_EQ("\xe3\x82\x82\xe3\x81\x9a\xe3\x81\x8f\xef\xbc\x81",
2968 command.output().preedit().segment(0).value());
2783 EXPECT_EQ("もずく!", command.output().preedit().segment(0).value());
29692784
29702785 segment = segments.add_segment();
2971 // "もずく!"
2972 segment->set_key("\xe3\x82\x82\xe3\x81\x9a\xe3\x81\x8f!");
2786 segment->set_key("もずく!");
29732787 candidate = segment->add_candidate();
2974 // "もずく!"
2975 candidate->value = "\xe3\x82\x82\xe3\x81\x9a\xe3\x81\x8f\xef\xbc\x81";
2788 candidate->value = "もずく!";
29762789
29772790 ConversionRequest request;
29782791 SetComposer(session.get(), &request);
29822795 command.Clear();
29832796 SetSendCommandCommand(commands::SessionCommand::COMMIT_RAW_TEXT, &command);
29842797 session->SendCommand(&command);
2985 // "abc"
29862798 EXPECT_RESULT_AND_KEY("mr@h!", "mr@h!", command);
29872799 EXPECT_EQ(ImeContext::PRECOMPOSITION, session->context().state());
29882800 }
30112823 }
30122824
30132825 InsertCharacterChars("aiueo", session.get(), &command);
3014 EXPECT_PREEDIT(kAiueo, command);
2826 EXPECT_PREEDIT("あいうえお", command);
30152827
30162828 // Should be ignored in composition state.
30172829 {
30212833 commands::SessionCommand::CONVERT_NEXT_PAGE);
30222834 ASSERT_TRUE(session->SendCommand(&command));
30232835 EXPECT_TRUE(command.output().consumed());
3024 EXPECT_PREEDIT(kAiueo, command) << "should do nothing";
2836 EXPECT_PREEDIT("あいうえお", command) << "should do nothing";
30252837
30262838 command.Clear();
30272839 command.mutable_input()->set_type(commands::Input::SEND_COMMAND);
30292841 commands::SessionCommand::CONVERT_PREV_PAGE);
30302842 ASSERT_TRUE(session->SendCommand(&command));
30312843 EXPECT_TRUE(command.output().consumed());
3032 EXPECT_PREEDIT(kAiueo, command) << "should do nothing";
2844 EXPECT_PREEDIT("あいうえお", command) << "should do nothing";
30332845 }
30342846
30352847 // Generate sequential candidates as follows.
30472859 Segments segments;
30482860 Segment *segment = NULL;
30492861 segment = segments.add_segment();
3050 segment->set_key(kAiueo);
2862 segment->set_key("あいうえお");
30512863 for (int page_index = 0; page_index < 3; ++page_index) {
30522864 for (int cand_index = 0; cand_index < 9; ++cand_index) {
30532865 segment->add_candidate()->value = Util::StringPrintf(
31142926 command.Clear();
31152927 session->Convert(&command);
31162928 EXPECT_FALSE(command.output().has_result());
3117 // "あいうえお"
3118 EXPECT_PREEDIT(kAiueo, command);
2929 EXPECT_PREEDIT("あいうえお", command);
31192930
31202931 GetConverterMock()->SetCommitSegmentValue(&segments, true);
31212932 command.Clear();
31222933 session->Commit(&command);
31232934 EXPECT_FALSE(command.output().has_preedit());
3124 // "あいうえお"
3125 EXPECT_RESULT(kAiueo, command);
2935 EXPECT_RESULT("あいうえお", command);
31262936
31272937 SendKey("Shift", session.get(), &command);
31282938 EXPECT_FALSE(command.output().has_result());
31342944 EXPECT_TRUE(command.output().has_deletion_range());
31352945 EXPECT_EQ(-5, command.output().deletion_range().offset());
31362946 EXPECT_EQ(5, command.output().deletion_range().length());
3137 // "あいうえお"
3138 EXPECT_PREEDIT(kAiueo, command);
2947 EXPECT_PREEDIT("あいうえお", command);
31392948 }
31402949
31412950 { // Type "aiueo" -> Convert -> Type "a" -> Escape -> Undo
31492958 command.Clear();
31502959 session->Convert(&command);
31512960 EXPECT_FALSE(command.output().has_result());
3152 // "あいうえお"
3153 EXPECT_PREEDIT(kAiueo, command);
2961 EXPECT_PREEDIT("あいうえお", command);
31542962
31552963 SendKey("a", session.get(), &command);
3156 // "あいうえお"
3157 EXPECT_RESULT(kAiueo, command);
3158 // "あ"
3159 EXPECT_SINGLE_SEGMENT(kHiraganaA, command);
2964 EXPECT_RESULT("あいうえお", command);
2965 EXPECT_SINGLE_SEGMENT("あ", command);
31602966
31612967 SendKey("Escape", session.get(), &command);
31622968 EXPECT_FALSE(command.output().has_result());
31682974 EXPECT_TRUE(command.output().has_deletion_range());
31692975 EXPECT_EQ(-5, command.output().deletion_range().offset());
31702976 EXPECT_EQ(5, command.output().deletion_range().length());
3171 // "あいうえお"
3172 EXPECT_PREEDIT(kAiueo, command);
2977 EXPECT_PREEDIT("あいうえお", command);
31732978 }
31742979 }
31752980
32023007 command.Clear();
32033008 session->Convert(&command);
32043009 EXPECT_FALSE(command.output().has_result());
3205 // "あいうえお"
3206 EXPECT_PREEDIT(kAiueo, command);
3010 EXPECT_PREEDIT("あいうえお", command);
32073011 // Direct input
32083012 SendKey("Numpad0", session.get(), &command);
32093013 EXPECT_TRUE(GetComposition(command).empty());
3210 // "あいうえお0"
3211 EXPECT_RESULT(string(kAiueo) + "0", command);
3014 EXPECT_RESULT("あいうえお0", command);
32123015
32133016 // Undo - Do NOT nothing
32143017 command.Clear();
32573060 SendKey("a", session.get(), &command);
32583061 EXPECT_EQ(commands::HIRAGANA, command.output().mode());
32593062 EXPECT_FALSE(command.output().has_result());
3260 // "AAあ"
3261 EXPECT_PREEDIT("AA\xE3\x81\x82", command);
3063 EXPECT_PREEDIT("AAあ", command);
32623064
32633065 // Submit and Undo
32643066 SendKey("Enter", session.get(), &command);
32673069 session->Undo(&command);
32683070 EXPECT_EQ(commands::HIRAGANA, command.output().mode());
32693071 EXPECT_FALSE(command.output().has_result());
3270 // "AAあ"
3271 EXPECT_PREEDIT("AA\xE3\x81\x82", command);
3072 EXPECT_PREEDIT("AAあ", command);
32723073
32733074 // Input additional "Aa"
32743075 SendKey("A", session.get(), &command);
32753076 SendKey("a", session.get(), &command);
32763077 EXPECT_FALSE(command.output().has_result());
3277 // "AAあAa"
3278 EXPECT_PREEDIT("AA" + string(kHiraganaA) + "Aa", command);
3078 EXPECT_PREEDIT("AAあAa", command);
32793079 EXPECT_EQ(commands::HALF_ASCII, command.output().mode());
32803080
32813081 // Submit and Undo
32853085 session->Undo(&command);
32863086 EXPECT_EQ(commands::HALF_ASCII, command.output().mode());
32873087 EXPECT_FALSE(command.output().has_result());
3288 // "AAあAa"
3289 EXPECT_PREEDIT("AA" + string(kHiraganaA) + "Aa", command);
3088 EXPECT_PREEDIT("AAあAa", command);
32903089 }
32913090
32923091 TEST_F(SessionTest, DCHECKFailureAfterUndo) {
33053104 command.Clear();
33063105 session->Undo(&command);
33073106 EXPECT_FALSE(command.output().has_result());
3308 // "あべ"
3309 EXPECT_PREEDIT("\xE3\x81\x82\xE3\x81\xB9", command);
3107 EXPECT_PREEDIT("あべ", command);
33103108
33113109 InsertCharacterChars("s", session.get(), &command);
33123110 EXPECT_FALSE(command.output().has_result());
3313 // "あべs"
3314 EXPECT_PREEDIT("\xE3\x81\x82\xE3\x81\xB9\xEF\xBD\x93", command);
3111 EXPECT_PREEDIT("あべs", command);
33153112
33163113 InsertCharacterChars("h", session.get(), &command);
33173114 EXPECT_FALSE(command.output().has_result());
3318 // "あべsh"
3319 EXPECT_PREEDIT("\xE3\x81\x82\xE3\x81\xB9\xEF\xBD\x93\xEF\xBD\x88", command);
3115 EXPECT_PREEDIT("あべsh", command);
33203116
33213117 InsertCharacterChars("i", session.get(), &command);
33223118 EXPECT_FALSE(command.output().has_result());
3323 // "あべし"
3324 EXPECT_PREEDIT("\xE3\x81\x82\xE3\x81\xB9\xE3\x81\x97", command);
3119 EXPECT_PREEDIT("あべし", command);
33253120 }
33263121
33273122 TEST_F(SessionTest, ConvertToFullOrHalfAlphanumericAfterUndo) {
33493144 session->Undo(&command);
33503145 EXPECT_FALSE(command.output().has_result());
33513146 ASSERT_TRUE(command.output().has_preedit());
3352 // "あいうえお"
3353 EXPECT_EQ(kAiueo, GetComposition(command));
3147 EXPECT_EQ("あいうえお", GetComposition(command));
33543148
33553149 GetConverterMock()->SetStartConversionForRequest(&segments, true);
33563150 command.Clear();
33693163 session->Undo(&command);
33703164 EXPECT_FALSE(command.output().has_result());
33713165 ASSERT_TRUE(command.output().has_preedit());
3372 // "あいうえお"
3373 EXPECT_EQ(kAiueo, GetComposition(command));
3166 EXPECT_EQ("あいうえお", GetComposition(command));
33743167
33753168 GetConverterMock()->SetStartConversionForRequest(&segments, true);
33763169 command.Clear();
33773170 session->ConvertToFullASCII(&command);
33783171 EXPECT_FALSE(command.output().has_result());
33793172 ASSERT_TRUE(command.output().has_preedit());
3380 // "aiueo"
3381 EXPECT_EQ("\xEF\xBD\x81\xEF\xBD\x89\xEF\xBD\x95\xEF\xBD\x85\xEF\xBD\x8F",
3382 GetComposition(command));
3173 EXPECT_EQ("aiueo", GetComposition(command));
33833174 }
33843175 }
33853176
33993190
34003191 commands::Command command;
34013192
3402 // "ち"
3403 InsertCharacterCodeAndString('a', "\xE3\x81\xA1", session.get(), &command);
3404 // "ち"
3405 EXPECT_EQ("\xE3\x81\xA1", GetComposition(command));
3193 InsertCharacterCodeAndString('a', "ち", session.get(), &command);
3194 EXPECT_EQ("ち", GetComposition(command));
34063195
34073196 SendKey("Enter", session.get(), &command);
34083197 command.Clear();
34103199
34113200 EXPECT_FALSE(command.output().has_result());
34123201 ASSERT_TRUE(command.output().has_preedit());
3413 // "ち"
3414 EXPECT_EQ("\xE3\x81\xA1", GetComposition(command));
3415
3416 // "゛"
3417 InsertCharacterCodeAndString('@', "\xE3\x82\x9B", session.get(), &command);
3202 EXPECT_EQ("ち", GetComposition(command));
3203
3204 InsertCharacterCodeAndString('@', "゛", session.get(), &command);
34183205 EXPECT_FALSE(command.output().has_result());
34193206 ASSERT_TRUE(command.output().has_preedit());
3420 // "ぢ"
3421 EXPECT_EQ("\xE3\x81\xA2", GetComposition(command));
3207 EXPECT_EQ("ぢ", GetComposition(command));
34223208 }
34233209
34243210 TEST_F(SessionTest, SpaceOnAlphanumeric) {
34543240
34553241 SendKey("a", &session, &command);
34563242 EXPECT_RESULT("A ", command);
3457 // "あ"
3458 EXPECT_EQ(kHiraganaA, GetComposition(command));
3243 EXPECT_EQ("あ", GetComposition(command));
34593244 }
34603245
34613246 {
34903275 InsertCharacterChars("watasinonamae", session.get(), &command);
34913276
34923277 segment = segments.add_segment();
3493 // "わたしの"
3494 segment->set_key("\xe3\x82\x8f\xe3\x81\x9f\xe3\x81\x97\xe3\x81\xae");
3278 segment->set_key("わたしの");
34953279 candidate = segment->add_candidate();
3496 // "私の"
3497 candidate->value = "\xe7\xa7\x81\xe3\x81\xae";
3280 candidate->value = "私の";
34983281 candidate = segment->add_candidate();
3499 // "渡しの"
3500 candidate->value = "\xe6\xb8\xa1\xe3\x81\x97\xe3\x81\xae";
3282 candidate->value = "渡しの";
35013283 segment = segments.add_segment();
3502 // "名前"
3503 segment->set_key("\xe5\x90\x8d\xe5\x89\x8d");
3284 segment->set_key("名前");
35043285 candidate = segment->add_candidate();
3505 // "なまえ"
3506 candidate->value = "\xe3\x81\xaa\xe3\x81\xbe\xe3\x81\x88";
3286 candidate->value = "なまえ";
35073287 candidate = segment->add_candidate();
3508 // "ナマエ"
3509 candidate->value = "\xe3\x83\x8a\xe3\x83\x9e\xe3\x82\xa8";
3288 candidate->value = "ナマエ";
35103289
35113290 ConversionRequest request;
35123291 SetComposer(session.get(), &request);
35483327 commands::Command command;
35493328 InsertCharacterChars("kamabokonoinbou", session.get(), &command);
35503329 segment = segments.add_segment();
3551 // "かまぼこの"
3552 segment->set_key(
3553 "\xe3\x81\x8b\xe3\x81\xbe\xe3\x81\xbc\xe3\x81\x93\xe3\x81\xae");
3330 segment->set_key("かまぼこの");
35543331 candidate = segment->add_candidate();
3555 // "かまぼこの"
3556 candidate->value
3557 = "\xe3\x81\x8b\xe3\x81\xbe\xe3\x81\xbc\xe3\x81\x93\xe3\x81\xae";
3332 candidate->value = "かまぼこの";
35583333 candidate = segment->add_candidate();
3559 // "カマボコの"
3560 candidate->value
3561 = "\xe3\x82\xab\xe3\x83\x9e\xe3\x83\x9c\xe3\x82\xb3\xe3\x81\xae";
3334 candidate->value = "カマボコの";
35623335 segment = segments.add_segment();
3563 // "いんぼう"
3564 segment->set_key("\xe3\x81\x84\xe3\x82\x93\xe3\x81\xbc\xe3\x81\x86");
3336 segment->set_key("いんぼう");
35653337 candidate = segment->add_candidate();
3566 // "陰謀"
3567 candidate->value = "\xe9\x99\xb0\xe8\xac\x80";
3338 candidate->value = "陰謀";
35683339 candidate = segment->add_candidate();
3569 // "印房"
3570 candidate->value = "\xe5\x8d\xb0\xe6\x88\xbf";
3340 candidate->value = "印房";
35713341
35723342 ConversionRequest request;
35733343 SetComposer(session.get(), &request);
35903360
35913361 segments.Clear();
35923362 segment = segments.add_segment();
3593 // "いんぼう"
3594 segment->set_key("\xe3\x81\x84\xe3\x82\x93\xe3\x81\xbc\xe3\x81\x86");
3363 segment->set_key("いんぼう");
35953364 candidate = segment->add_candidate();
3596 // "陰謀"
3597 candidate->value = "\xe9\x99\xb0\xe8\xac\x80";
3365 candidate->value = "陰謀";
35983366 candidate = segment->add_candidate();
3599 // "陰謀論"
3600 candidate->value = "\xe9\x99\xb0\xe8\xac\x80\xe8\xab\x96";
3367 candidate->value = "陰謀論";
36013368 candidate = segment->add_candidate();
3602 // "陰謀説"
3603 candidate->value = "\xe9\x99\xb0\xe8\xac\x80\xe8\xaa\xac";
3369 candidate->value = "陰謀説";
36043370
36053371 GetConverterMock()->SetStartPredictionForRequest(&segments, true);
36063372
36203386 Segments segments;
36213387 Segment *segment;
36223388 segment = segments.add_segment();
3623 // "かまぼこの"
3624 segment->set_key(
3625 "\xe3\x81\x8b\xe3\x81\xbe\xe3\x81\xbc\xe3\x81\x93\xe3\x81\xae");
3389 segment->set_key("かまぼこの");
36263390 candidate = segment->add_candidate();
3627 // "かまぼこの"
3628 candidate->value
3629 = "\xe3\x81\x8b\xe3\x81\xbe\xe3\x81\xbc\xe3\x81\x93\xe3\x81\xae";
3391 candidate->value = "かまぼこの";
36303392 candidate = segment->add_candidate();
3631 // "カマボコの"
3632 candidate->value
3633 = "\xe3\x82\xab\xe3\x83\x9e\xe3\x83\x9c\xe3\x82\xb3\xe3\x81\xae";
3393 candidate->value = "カマボコの";
36343394
36353395 segment = segments.add_segment();
3636 // "いんぼう"
3637 segment->set_key("\xe3\x81\x84\xe3\x82\x93\xe3\x81\xbc\xe3\x81\x86");
3396 segment->set_key("いんぼう");
36383397 candidate = segment->add_candidate();
3639 // "陰謀"
3640 candidate->value = "\xe9\x99\xb0\xe8\xac\x80";
3398 candidate->value = "陰謀";
36413399 candidate = segment->add_candidate();
3642 // "印房"
3643 candidate->value = "\xe5\x8d\xb0\xe6\x88\xbf";
3400 candidate->value = "印房";
36443401 ConversionRequest request;
36453402 SetComposer(session.get(), &request);
36463403 FillT13Ns(request, &segments);
36503407 Segments segments;
36513408 Segment *segment;
36523409 segment = segments.add_segment();
3653 // "かまぼこの"
3654 segment->set_key(
3655 "\xe3\x81\x8b\xe3\x81\xbe\xe3\x81\xbc\xe3\x81\x93\xe3\x81\xae");
3410 segment->set_key("かまぼこの");
36563411 candidate = segment->add_candidate();
3657 // "かまぼこの"
3658 candidate->value
3659 = "\xe3\x81\x8b\xe3\x81\xbe\xe3\x81\xbc\xe3\x81\x93\xe3\x81\xae";
3412 candidate->value = "かまぼこの";
36603413 candidate = segment->add_candidate();
3661 // "カマボコの"
3662 candidate->value
3663 = "\xe3\x82\xab\xe3\x83\x9e\xe3\x83\x9c\xe3\x82\xb3\xe3\x81\xae";
3414 candidate->value = "カマボコの";
36643415
36653416 segment = segments.add_segment();
3666 // "いんぼ"
3667 segment->set_key("\xe3\x81\x84\xe3\x82\x93\xe3\x81\xbc");
3417 segment->set_key("いんぼ");
36683418 candidate = segment->add_candidate();
3669 // "いんぼ"
3670 candidate->value = "\xe3\x81\x84\xe3\x82\x93\xe3\x81\xbc";
3419 candidate->value = "いんぼ";
36713420 candidate = segment->add_candidate();
3672 // "インボ"
3673 candidate->value = "\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x9c";
3421 candidate->value = "インボ";
36743422
36753423 segment = segments.add_segment();
3676 // "う"
3677 segment->set_key("\xe3\x81\x86");
3424 segment->set_key("う");
36783425 candidate = segment->add_candidate();
3679 // "ウ"
3680 candidate->value = "\xe3\x82\xa6";
3426 candidate->value = "ウ";
36813427 candidate = segment->add_candidate();
3682 // "卯"
3683 candidate->value = "\xe5\x8d\xaf";
3428 candidate->value = "卯";
36843429
36853430 ConversionRequest request;
36863431 SetComposer(session.get(), &request);
36973442 // Convert to T13N (Half katakana)
36983443 SendKey("F8", session.get(), &command);
36993444
3700 // "インボ"
3701 EXPECT_EQ("\xef\xbd\xb2\xef\xbe\x9d\xef\xbe\x8e\xef\xbe\x9e",
3702 command.output().preedit().segment(1).value());
3445 EXPECT_EQ("インボ", command.output().preedit().segment(1).value());
37033446 }
37043447
37053448 TEST_F(SessionTest, Shortcut) {
37843527 // See the description in command.proto.
37853528 EXPECT_TRUE(SendKey("CAPS S", session.get(), &command));
37863529 EXPECT_TRUE(command.output().consumed());
3787 // "アイウエオ"
3788 EXPECT_EQ("\xE3\x82\xA2\xE3\x82\xA4\xE3\x82\xA6\xE3\x82\xA8\xE3\x82\xAA",
3789 GetComposition(command));
3530 EXPECT_EQ("アイウエオ", GetComposition(command));
37903531 }
37913532
37923533 TEST_F(SessionTest, NumpadKey) {
38543595 EXPECT_TRUE(TestSendKey("0", session.get(), &command));
38553596 EXPECT_TRUE(SendKey("0", session.get(), &command));
38563597
3857 // "0"
3858 EXPECT_SINGLE_SEGMENT_AND_KEY("\xEF\xBC\x90", "\xEF\xBC\x90", command);
3598 EXPECT_SINGLE_SEGMENT_AND_KEY("0", "0", command);
38593599
38603600 // In the Composition state, DIVIDE on the pre-edit should be treated as "/".
38613601 EXPECT_TRUE(TestSendKey("Divide", session.get(), &command));
38623602 EXPECT_TRUE(SendKey("Divide", session.get(), &command));
38633603
3864 // "0/"
3865 EXPECT_SINGLE_SEGMENT_AND_KEY(
3866 "\xEF\xBC\x90\x2F", "\xEF\xBC\x90\x2F", command);
3604 EXPECT_SINGLE_SEGMENT_AND_KEY("0/", "0/", command);
38673605
38683606 // In the Composition state, "Numpad0" should be treated as half-width "0".
38693607 EXPECT_TRUE(SendKey("Numpad0", session.get(), &command));
38703608
3871 // "0/0"
3872 EXPECT_SINGLE_SEGMENT_AND_KEY(
3873 "\xEF\xBC\x90\x2F\x30", "\xEF\xBC\x90\x2F\x30", command);
3609 EXPECT_SINGLE_SEGMENT_AND_KEY("0/0", "0/0", command);
38743610
38753611 // Separator should be treated as Enter.
38763612 EXPECT_TRUE(TestSendKey("Separator", session.get(), &command));
38773613 EXPECT_TRUE(SendKey("Separator", session.get(), &command));
38783614
38793615 EXPECT_FALSE(command.output().has_preedit());
3880 // "0/0"
3881 EXPECT_RESULT("\xEF\xBC\x90\x2F\x30", command);
3616 EXPECT_RESULT("0/0", command);
38823617
38833618 // http://b/2097087
38843619 EXPECT_TRUE(SendKey("0", session.get(), &command));
38853620
3886 // "0"
3887 EXPECT_SINGLE_SEGMENT_AND_KEY("\xEF\xBC\x90", "\xEF\xBC\x90", command);
3621 EXPECT_SINGLE_SEGMENT_AND_KEY("0", "0", command);
38883622
38893623 EXPECT_TRUE(SendKey("Divide", session.get(), &command));
3890 // "0/"
3891 EXPECT_SINGLE_SEGMENT_AND_KEY(
3892 "\xEF\xBC\x90\x2F", "\xEF\xBC\x90\x2F", command);
3624 EXPECT_SINGLE_SEGMENT_AND_KEY("0/", "0/", command);
38933625
38943626 EXPECT_TRUE(SendKey("Divide", session.get(), &command));
3895 // "0//"
3896 EXPECT_SINGLE_SEGMENT_AND_KEY(
3897 "\xEF\xBC\x90\x2F\x2F", "\xEF\xBC\x90\x2F\x2F", command);
3627 EXPECT_SINGLE_SEGMENT_AND_KEY("0//", "0//", command);
38983628
38993629 EXPECT_TRUE(SendKey("Subtract", session.get(), &command));
39003630 EXPECT_TRUE(SendKey("Subtract", session.get(), &command));
39013631 EXPECT_TRUE(SendKey("Decimal", session.get(), &command));
39023632 EXPECT_TRUE(SendKey("Decimal", session.get(), &command));
3903 // "0//--.."
3904 EXPECT_SINGLE_SEGMENT_AND_KEY(
3905 "\xEF\xBC\x90\x2F\x2F\x2D\x2D\x2E\x2E",
3906 "\xEF\xBC\x90\x2F\x2F\x2D\x2D\x2E\x2E", command);
3633 EXPECT_SINGLE_SEGMENT_AND_KEY("0//--..", "0//--..", command);
39073634 }
39083635
39093636 TEST_F(SessionTest, KanaSymbols) {
39183645 {
39193646 commands::Command command;
39203647 SetSendKeyCommand("<", &command);
3921 // "、"
3922 command.mutable_input()->mutable_key()->set_key_string("\xe3\x80\x81");
3648 command.mutable_input()->mutable_key()->set_key_string("、");
39233649 EXPECT_TRUE(session->SendKey(&command));
3924 // ","
39253650 EXPECT_EQ(static_cast<uint32>(','), command.input().key().key_code());
3926 EXPECT_EQ("\xef\xbc\x8c", command.input().key().key_string());
3927 EXPECT_EQ("\xef\xbc\x8c", command.output().preedit().segment(0).value());
3651 EXPECT_EQ(",", command.input().key().key_string());
3652 EXPECT_EQ(",", command.output().preedit().segment(0).value());
39283653 }
39293654 {
39303655 commands::Command command;
39333658 {
39343659 commands::Command command;
39353660 SetSendKeyCommand("?", &command);
3936 // "・"
3937 command.mutable_input()->mutable_key()->set_key_string("\xe3\x83\xbb");
3661 command.mutable_input()->mutable_key()->set_key_string("・");
39383662 EXPECT_TRUE(session->SendKey(&command));
3939 // "/"
39403663 EXPECT_EQ(static_cast<uint32>('/'), command.input().key().key_code());
3941 EXPECT_EQ("\xef\xbc\x8f", command.input().key().key_string());
3942 EXPECT_EQ("\xef\xbc\x8f", command.output().preedit().segment(0).value());
3664 EXPECT_EQ("/", command.input().key().key_string());
3665 EXPECT_EQ("/", command.output().preedit().segment(0).value());
39433666 }
39443667 }
39453668
39573680 // Shift does nothing because the input mode has already been reverted.
39583681 EXPECT_TRUE(SendKey("Shift", session.get(), &command));
39593682 EXPECT_TRUE(SendKey("a", session.get(), &command)); // "あAaああ"
3960 // "あAaああ"
3961 EXPECT_EQ("\xE3\x81\x82\x41\x61\xE3\x81\x82\xE3\x81\x82",
3962 GetComposition(command));
3683 EXPECT_EQ("あAaああ", GetComposition(command));
39633684 }
39643685
39653686 { // Revert back to the previous input mode.
39773698 // Shift does nothing because the input mode has already been reverted.
39783699 EXPECT_TRUE(SendKey("Shift", session.get(), &command));
39793700 EXPECT_TRUE(SendKey("a", session.get(), &command)); // "アAaアア"
3980 // "アAaアア"
3981 EXPECT_EQ("\xE3\x82\xA2\x41\x61\xE3\x82\xA2\xE3\x82\xA2",
3982 GetComposition(command));
3701 EXPECT_EQ("アAaアア", GetComposition(command));
39833702 }
39843703 }
39853704
44064125 segments_jueri.set_request_type(Segments::PARTIAL_SUGGESTION);
44074126 Segment *segment;
44084127 segment = segments_jueri.add_segment();
4409 // "じゅえり"
4410 const char kJueri[] = "\xE3\x81\x98\xE3\x82\x85\xE3\x81\x88\xE3\x82\x8A";
4128 const char kJueri[] = "じゅえり";
44114129 segment->set_key(kJueri);
44124130 Segment::Candidate *candidate = segment->add_candidate();
4413 candidate->key = "\xE3\x81\x8F\xE3\x81\x88\xE3\x82\x8A"; // "くえり"
4131 candidate->key = "くえり";
44144132 candidate->content_key = candidate->key;
4415 candidate->value = "\xE3\x82\xAF\xE3\x82\xA8\xE3\x83\xAA"; // "クエリ"
4133 candidate->value = "クエリ";
44164134 candidate->attributes = Segment::Candidate::PARTIALLY_KEY_CONSUMED;
44174135 candidate->consumed_key_size = Util::CharsLen(kJueri);
44184136
44254143
44264144 ASSERT_TRUE(command.output().has_candidates());
44274145 EXPECT_EQ(1, command.output().preedit().segment_size());
4428 EXPECT_EQ(kJueri,
4429 command.output().preedit().segment(0).key());
4146 EXPECT_EQ(kJueri, command.output().preedit().segment(0).key());
44304147 EXPECT_EQ(1, command.output().candidates().candidate_size());
4431 EXPECT_EQ("\xE3\x82\xAF\xE3\x82\xA8\xE3\x83\xAA", // "クエリ"
4432 command.output().candidates().candidate(0).value());
4148 EXPECT_EQ("クエリ", command.output().candidates().candidate(0).value());
44334149
44344150 // commit partial suggestion
44354151 Segments empty_segments;
44394155 GetConverterMock()->SetStartSuggestionForRequest(&segments_jueri, true);
44404156 session->SendCommand(&command);
44414157 EXPECT_TRUE(command.output().consumed());
4442 // "クエリ", "くえり"
4443 EXPECT_RESULT_AND_KEY(
4444 "\xE3\x82\xAF\xE3\x82\xA8\xE3\x83\xAA",
4445 "\xE3\x81\x8F\xE3\x81\x88\xE3\x82\x8A", command);
4158 EXPECT_RESULT_AND_KEY("クエリ", "くえり", command);
44464159 EXPECT_FALSE(command.output().has_preedit());
44474160 }
44484161
44574170 segments_wata.set_request_type(Segments::PARTIAL_SUGGESTION);
44584171 Segment *segment;
44594172 segment = segments_wata.add_segment();
4460 // "わた"
4461 const char kWata[] = "\xe3\x82\x8f\xe3\x81\x9f";
4173 const char kWata[] = "わた";
44624174 segment->set_key(kWata);
4463 Segment::Candidate *cand1 = AddCandidate(kWata,
4464 "\xe7\xb6\xbf", segment); // "綿"
4175 Segment::Candidate *cand1 = AddCandidate(kWata, "綿", segment);
44654176 cand1->attributes = Segment::Candidate::PARTIALLY_KEY_CONSUMED;
44664177 cand1->consumed_key_size = Util::CharsLen(kWata);
44674178 Segment::Candidate *cand2 = AddCandidate(kWata, kWata, segment);
44744185 segments_watashino.set_request_type(Segments::SUGGESTION);
44754186 Segment *segment;
44764187 segment = segments_watashino.add_segment();
4477 // "わたしの"
4478 const char kWatashino[] =
4479 "\xe3\x82\x8f\xe3\x81\x9f\xe3\x81\x97\xe3\x81\xae";
4188 const char kWatashino[] = "わたしの";
44804189 segment->set_key(kWatashino);
44814190 Segment::Candidate *cand1 = segment->add_candidate();
4482 cand1->value = "\xe7\xa7\x81\xe3\x81\xae"; // "私の";
4191 cand1->value = "私の";
44834192 cand1->attributes = Segment::Candidate::PARTIALLY_KEY_CONSUMED;
44844193 cand1->consumed_key_size = Util::CharsLen(kWatashino);
44854194 Segment::Candidate *cand2 = segment->add_candidate();
44934202 segments_shino.set_request_type(Segments::SUGGESTION);
44944203 Segment *segment;
44954204 segment = segments_shino.add_segment();
4496 // "しの"
4497 const char kShino[] = "\xe3\x81\x97\xe3\x81\xae";
4205 const char kShino[] = "しの";
44984206 segment->set_key(kShino);
44994207 Segment::Candidate *candidate;
4500 candidate = AddCandidate(
4501 "\xe3\x81\x97\xe3\x81\xae\xe3\x81\xbf\xe3\x82\x84", // "しのみや"
4502 "\xe5\x9b\x9b\xe3\x83\x8e\xe5\xae\xae", segment); // "四ノ宮"
4208 candidate = AddCandidate("しのみや", "四ノ宮", segment);
45034209 candidate->content_key = segment->key();
45044210 candidate->attributes = Segment::Candidate::PARTIALLY_KEY_CONSUMED;
45054211 candidate->consumed_key_size = Util::CharsLen(kShino);
45144220 InsertCharacterChars("watashino", session.get(), &command);
45154221 ASSERT_TRUE(command.output().has_candidates());
45164222 EXPECT_EQ(2, command.output().candidates().candidate_size());
4517 // "私の"
4518 EXPECT_EQ("\xe7\xa7\x81\xe3\x81\xae",
4519 command.output().candidates().candidate(0).value());
4223 EXPECT_EQ("私の", command.output().candidates().candidate(0).value());
45204224
45214225 // partial suggestion for "わた|しの"
45224226 GetConverterMock()->SetStartPartialSuggestion(&segments_wata, false);
45284232 // partial suggestion candidates
45294233 ASSERT_TRUE(command.output().has_candidates());
45304234 EXPECT_EQ(2, command.output().candidates().candidate_size());
4531 // "綿"
4532 EXPECT_EQ("\xe7\xb6\xbf", command.output().candidates().candidate(0).value());
4235 EXPECT_EQ("綿", command.output().candidates().candidate(0).value());
45334236
45344237 // commit partial suggestion
45354238 SetSendCommandCommand(commands::SessionCommand::SUBMIT_CANDIDATE, &command);
45374240 GetConverterMock()->SetStartSuggestionForRequest(&segments_shino, true);
45384241 session->SendCommand(&command);
45394242 EXPECT_TRUE(command.output().consumed());
4540 // "綿", "わた"
4541 EXPECT_RESULT_AND_KEY("\xe7\xb6\xbf", "\xe3\x82\x8f\xe3\x81\x9f", command);
4243 EXPECT_RESULT_AND_KEY("綿", "わた", command);
45424244
45434245 // remaining text in preedit
45444246 EXPECT_EQ(2, command.output().preedit().cursor());
4545 // "しの"
4546 EXPECT_SINGLE_SEGMENT("\xe3\x81\x97\xe3\x81\xae", command);
4247 EXPECT_SINGLE_SEGMENT("しの", command);
45474248
45484249 // Suggestion for new text fills the candidates.
45494250 EXPECT_TRUE(command.output().has_candidates());
4550 // "四ノ宮"
4551 EXPECT_EQ("\xe5\x9b\x9b\xe3\x83\x8e\xe5\xae\xae",
4552 command.output().candidates().candidate(0).value());
4251 EXPECT_EQ("四ノ宮", command.output().candidates().candidate(0).value());
45534252 }
45544253
45554254 TEST_F(SessionTest, ToggleAlphanumericMode) {
45594258
45604259 {
45614260 InsertCharacterChars("a", session.get(), &command);
4562 // "あ"
4563 EXPECT_EQ(kHiraganaA, GetComposition(command));
4261 EXPECT_EQ("あ", GetComposition(command));
45644262 EXPECT_TRUE(command.output().has_mode());
45654263 EXPECT_EQ(commands::HIRAGANA, command.output().mode());
45664264
45684266 session->ToggleAlphanumericMode(&command);
45694267 EXPECT_EQ(commands::HALF_ASCII, command.output().mode());
45704268 InsertCharacterChars("a", session.get(), &command);
4571 // "あa"
4572 EXPECT_EQ("\xE3\x81\x82\x61", GetComposition(command));
4269 EXPECT_EQ("あa", GetComposition(command));
45734270 EXPECT_TRUE(command.output().has_mode());
45744271 EXPECT_EQ(commands::HALF_ASCII, command.output().mode());
45754272
45764273 command.Clear();
45774274 session->ToggleAlphanumericMode(&command);
45784275 InsertCharacterChars("a", session.get(), &command);
4579 // "あaあ"
4580 EXPECT_EQ("\xE3\x81\x82\x61\xE3\x81\x82", GetComposition(command));
4276 EXPECT_EQ("あaあ", GetComposition(command));
45814277 EXPECT_TRUE(command.output().has_mode());
45824278 EXPECT_EQ(commands::HIRAGANA, command.output().mode());
45834279 }
46104306 session->ToggleAlphanumericMode(&command);
46114307 EXPECT_EQ(commands::HIRAGANA, command.output().mode());
46124308 InsertCharacterChars("n", session.get(), &command); // on Hiragana mode
4613 // "n"
4614 EXPECT_EQ("\xEF\xBD\x8E", GetComposition(command));
4309 EXPECT_EQ("n", GetComposition(command));
46154310
46164311 command.Clear();
46174312 session->ToggleAlphanumericMode(&command);
46184313 EXPECT_EQ(commands::HALF_ASCII, command.output().mode());
46194314 InsertCharacterChars("a", session.get(), &command); // on Half ascii mode.
4620 // "na"
4621 EXPECT_EQ("\xEF\xBD\x8E\x61", GetComposition(command));
4315 EXPECT_EQ("na", GetComposition(command));
46224316 }
46234317
46244318 {
46324326
46334327 session->InputModeHiragana(&command);
46344328 InsertCharacterChars("a", session.get(), &command); // on Hiragana mode
4635 // "あ"
4636 EXPECT_EQ(kHiraganaA, GetComposition(command));
4329 EXPECT_EQ("あ", GetComposition(command));
46374330
46384331 Segments segments;
46394332 SetAiueo(&segments);
46454338 command.Clear();
46464339 session->Convert(&command);
46474340
4648 // "あいうえお"
4649 EXPECT_EQ(kAiueo, GetComposition(command));
4341 EXPECT_EQ("あいうえお", GetComposition(command));
46504342
46514343 command.Clear();
46524344 session->ToggleAlphanumericMode(&command);
46734365 EXPECT_TRUE(session->InsertSpace(&command));
46744366 EXPECT_TRUE(command.output().consumed());
46754367 EXPECT_FALSE(command.output().has_preedit());
4676 // " " (full-width space)
4677 EXPECT_RESULT(kFullWidthSpace, command);
4368 EXPECT_RESULT(" ", command); // Full-width space
46784369
46794370 // Change the setting to HALF_WIDTH.
46804371 config::Config config;
46944385 EXPECT_TRUE(session->InsertSpace(&command));
46954386 EXPECT_TRUE(command.output().consumed());
46964387 EXPECT_FALSE(command.output().has_preedit());
4697 // " " (full-width space)
4698 EXPECT_RESULT(kFullWidthSpace, command);
4388 EXPECT_RESULT(" ", command); // Full-width space
46994389 }
47004390
47014391 TEST_F(SessionTest, InsertSpaceToggled) {
47234413 EXPECT_TRUE(session->InsertSpaceToggled(&command));
47244414 EXPECT_TRUE(command.output().consumed());
47254415 EXPECT_FALSE(command.output().has_preedit());
4726 // " " (full-width space)
4727 EXPECT_RESULT(kFullWidthSpace, command);
4416 EXPECT_RESULT(" ", command); // Full-width space
47284417
47294418 // Change the setting to FULL_WIDTH.
47304419 config.set_space_character_form(config::Config::FUNDAMENTAL_FULL_WIDTH);
47514440 EXPECT_FALSE(command.output().has_result());
47524441
47534442 EXPECT_TRUE(SendKey("a", session.get(), &command));
4754 // "あ"
4755 EXPECT_EQ(kHiraganaA, GetComposition(command));
4443 EXPECT_EQ("あ", GetComposition(command));
47564444
47574445 command.Clear();
47584446 EXPECT_TRUE(session->InsertSpaceHalfWidth(&command));
4759 // "あ "
4760 EXPECT_EQ("\xE3\x81\x82\x20", GetComposition(command));
4447 EXPECT_EQ("あ ", GetComposition(command));
47614448
47624449 { // Convert "あ " with dummy conversions.
47634450 Segments segments;
4764 // "亜 "
4765 segments.add_segment()->add_candidate()->value = "\xE4\xBA\x9C\x20";
4451 segments.add_segment()->add_candidate()->value = "亜 ";
47664452 ConversionRequest request;
47674453 SetComposer(session.get(), &request);
47684454 FillT13Ns(request, &segments);
47744460
47754461 command.Clear();
47764462 EXPECT_TRUE(session->InsertSpaceHalfWidth(&command));
4777 // "亜 "
4778 EXPECT_EQ("\xE4\xBA\x9C ", command.output().result().value());
4463 EXPECT_EQ("亜 ", command.output().result().value());
47794464 EXPECT_EQ("", GetComposition(command));
47804465 }
47814466
47914476 EXPECT_TRUE(session->InsertSpaceFullWidth(&command));
47924477 EXPECT_TRUE(command.output().consumed());
47934478 EXPECT_FALSE(command.output().has_preedit());
4794 EXPECT_RESULT(kFullWidthSpace, command);
4479 EXPECT_RESULT(" ", command); // Full-width space
47954480
47964481 EXPECT_TRUE(SendKey("a", session.get(), &command));
4797 // "あ"
4798 EXPECT_EQ(kHiraganaA, GetComposition(command));
4482 EXPECT_EQ("あ", GetComposition(command));
47994483
48004484 command.Clear();
48014485 command.mutable_input()->mutable_key()->CopyFrom(space_key);
48024486 EXPECT_TRUE(session->InsertSpaceFullWidth(&command));
4803 // "あ " (full-width space)
4804 EXPECT_EQ("\xE3\x81\x82\xE3\x80\x80", GetComposition(command));
4805
4806 { // Convert "あ " with dummy conversions.
4487 EXPECT_EQ("あ ", // full-width space
4488 GetComposition(command));
4489
4490 { // Convert "あ " (full-width space) with dummy conversions.
48074491 Segments segments;
4808 // "亜 "
4809 segments.add_segment()->add_candidate()->value = "\xE4\xBA\x9C\xE3\x80\x80";
4492 segments.add_segment()->add_candidate()->value = "亜 ";
48104493 ConversionRequest request;
48114494 SetComposer(session.get(), &request);
48124495 FillT13Ns(request, &segments);
48194502 command.Clear();
48204503 command.mutable_input()->mutable_key()->CopyFrom(space_key);
48214504 EXPECT_TRUE(session->InsertSpaceFullWidth(&command));
4822 // "亜  "
4823 EXPECT_EQ("\xE4\xBA\x9C\xE3\x80\x80\xE3\x80\x80",
4824 command.output().result().value());
4505 EXPECT_EQ("亜  ", command.output().result().value());
48254506 EXPECT_EQ("", GetComposition(command));
48264507 }
48274508
48614542 EXPECT_TRUE(command.output().consumed());
48624543 EXPECT_TRUE(SendKey("a", session.get(), &command));
48634544 EXPECT_TRUE(command.output().consumed());
4864 // "あ"
4865 EXPECT_PREEDIT(kHiraganaA, command);
4545 EXPECT_PREEDIT("あ", command);
48664546 EXPECT_EQ(ImeContext::COMPOSITION, session->context().state());
48674547
48684548 EXPECT_TRUE(TestSendKeyWithMode(
48714551 EXPECT_TRUE(SendKeyWithMode(
48724552 "Space", commands::HALF_KATAKANA, session.get(), &command));
48734553 EXPECT_TRUE(command.output().consumed());
4874 // "あ "
4875 EXPECT_PREEDIT(string(kHiraganaA) + " ", command);
4554 EXPECT_PREEDIT("あ ", command);
48764555 EXPECT_EQ(ImeContext::COMPOSITION, session->context().state());
48774556 }
48784557
48964575 EXPECT_TRUE(SendKeyWithMode(
48974576 "Space", commands::HALF_KATAKANA, session.get(), &command));
48984577 EXPECT_TRUE(command.output().consumed());
4899 // " "
4900 EXPECT_RESULT(kFullWidthSpace, command);
4578 EXPECT_RESULT(" ", command);
49014579 EXPECT_EQ(ImeContext::PRECOMPOSITION, session->context().state());
49024580 EXPECT_EQ(commands::HALF_KATAKANA, command.output().mode());
49034581 }
49114589 EXPECT_TRUE(command.output().consumed());
49124590 EXPECT_TRUE(SendKey("a", session.get(), &command));
49134591 EXPECT_TRUE(command.output().consumed());
4914 // "あ"
4915 EXPECT_PREEDIT(kHiraganaA, command);
4592 EXPECT_PREEDIT("あ", command);
49164593 EXPECT_EQ(ImeContext::COMPOSITION, session->context().state());
49174594
49184595 EXPECT_TRUE(TestSendKeyWithMode(
49214598 EXPECT_TRUE(SendKeyWithMode(
49224599 "Space", commands::HALF_KATAKANA, session.get(), &command));
49234600 EXPECT_TRUE(command.output().consumed());
4924 // "あ "
4925 EXPECT_PREEDIT(string(kHiraganaA) + kFullWidthSpace, command);
4601 EXPECT_PREEDIT("あ ", command); // Full-width space
49264602 EXPECT_EQ(ImeContext::COMPOSITION, session->context().state());
49274603 }
49284604
49504626 EXPECT_TRUE(SendKeyWithMode(
49514627 "Space", commands::HALF_ASCII, session.get(), &command));
49524628 EXPECT_TRUE(command.output().consumed());
4953 // " "
4954 EXPECT_RESULT(kFullWidthSpace, command);
4629 EXPECT_RESULT(" ", command);
49554630 EXPECT_EQ(ImeContext::PRECOMPOSITION, session->context().state());
49564631 EXPECT_EQ(commands::HALF_ASCII, command.output().mode());
49574632 }
49764651 EXPECT_TRUE(SendKeyWithMode(
49774652 "Space", commands::HALF_ASCII, session.get(), &command));
49784653 EXPECT_TRUE(command.output().consumed());
4979 // "a "
4980 EXPECT_PREEDIT(string("a") + kFullWidthSpace, command);
4654 EXPECT_PREEDIT("a ", command); // Full-width space
49814655 EXPECT_EQ(commands::HALF_ASCII, command.output().mode());
49824656 }
49834657
50174691 EXPECT_TRUE(SendKeyWithMode(
50184692 "a", commands::FULL_ASCII, session.get(), &command));
50194693 EXPECT_TRUE(command.output().consumed());
5020 // "a"
5021 EXPECT_PREEDIT(kFullWidthSmallA, command);
4694 EXPECT_PREEDIT("a", command);
50224695 EXPECT_EQ(commands::FULL_ASCII, command.output().mode());
50234696
50244697 EXPECT_TRUE(TestSendKeyWithMode(
50274700 EXPECT_TRUE(SendKeyWithMode(
50284701 "Space", commands::FULL_ASCII, session.get(), &command));
50294702 EXPECT_TRUE(command.output().consumed());
5030 // "a "
5031 EXPECT_PREEDIT(kFullWidthSmallA + string(" "), command);
4703 EXPECT_PREEDIT("a ", command);
50324704 EXPECT_EQ(commands::FULL_ASCII, command.output().mode());
50334705 }
50344706 }
51844856 EXPECT_TRUE(SendKey("Space", session.get(), &command));
51854857 EXPECT_TRUE(command.output().consumed());
51864858 EXPECT_FALSE(command.output().has_preedit());
5187 // " " (full-width space)
5188 EXPECT_RESULT(kFullWidthSpace, command);
4859 EXPECT_RESULT(" ", command); // Full-width space
51894860 EXPECT_TRUE(TryUndoAndAssertDoNothing(session.get()));
51904861
51914862 // A space key event with any modifier key assigned to InsertFullSpace should
51994870 EXPECT_TRUE(SendKey("Shift Space", session.get(), &command));
52004871 EXPECT_TRUE(command.output().consumed());
52014872 EXPECT_FALSE(command.output().has_preedit());
5202 // " " (full-width space)
5203 EXPECT_RESULT(kFullWidthSpace, command);
4873 EXPECT_RESULT(" ", command); // Full-width space
52044874 EXPECT_TRUE(TryUndoAndAssertDoNothing(session.get()));
52054875 }
52064876
52814951 commands::Command command;
52824952
52834953 SendKey("a", session.get(), &command);
5284 // "あ"
5285 EXPECT_EQ(kHiraganaA, GetComposition(command));
4954 EXPECT_EQ("あ", GetComposition(command));
52864955 EXPECT_EQ(ImeContext::COMPOSITION, session->context().state());
52874956
52884957 EXPECT_TRUE(TestSendKey("Ctrl a", session.get(), &command));
52894958 EXPECT_TRUE(command.output().consumed());
52904959
52914960 SendKey("Ctrl a", session.get(), &command);
5292 // "あ "
5293 EXPECT_EQ("\xE3\x81\x82\xE3\x80\x80", GetComposition(command));
4961 EXPECT_EQ("あ ", GetComposition(command));
52944962
52954963 EXPECT_TRUE(TestSendKey("Ctrl b", session.get(), &command));
52964964 EXPECT_TRUE(command.output().consumed());
52974965
52984966 SendKey("Ctrl b", session.get(), &command);
5299 // "あ  "
5300 EXPECT_EQ("\xE3\x81\x82\xE3\x80\x80 ", GetComposition(command));
4967 EXPECT_EQ("あ  ", GetComposition(command));
53014968
53024969 EXPECT_TRUE(TestSendKey("Ctrl c", session.get(), &command));
53034970 EXPECT_TRUE(command.output().consumed());
53044971
53054972 SendKey("Ctrl c", session.get(), &command);
5306 // "あ  "
5307 EXPECT_EQ("\xE3\x81\x82\xE3\x80\x80 ", GetComposition(command));
4973 EXPECT_EQ("あ  ", GetComposition(command));
53084974
53094975 EXPECT_TRUE(TestSendKey("Ctrl d", session.get(), &command));
53104976 EXPECT_TRUE(command.output().consumed());
53114977
53124978 SendKey("Ctrl d", session.get(), &command);
5313 // "あ   "
5314 EXPECT_EQ("\xE3\x81\x82\xE3\x80\x80 \xE3\x80\x80", GetComposition(command));
4979 EXPECT_EQ("あ   ", GetComposition(command));
53154980 }
53164981
53174982 TEST_F(SessionTest, InsertSpaceInConversionMode) {
53405005 EXPECT_TRUE(SendKey("Ctrl a", session.get(), &command));
53415006 EXPECT_TRUE(GetComposition(command).empty());
53425007 ASSERT_TRUE(command.output().has_result());
5343 // "あいうえお "
5344 EXPECT_EQ("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88"
5345 "\xE3\x81\x8A\xE3\x80\x80",
5346 command.output().result().value());
5008 EXPECT_EQ("あいうえお ", command.output().result().value());
53475009 EXPECT_TRUE(TryUndoAndAssertDoNothing(session.get()));
53485010 }
53495011
53575019 EXPECT_TRUE(SendKey("Ctrl b", session.get(), &command));
53585020 EXPECT_TRUE(GetComposition(command).empty());
53595021 ASSERT_TRUE(command.output().has_result());
5360 // "あいうえお "
5361 EXPECT_EQ("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A ",
5362 command.output().result().value());
5022 EXPECT_EQ("あいうえお ", command.output().result().value());
53635023 EXPECT_TRUE(TryUndoAndAssertDoNothing(session.get()));
53645024 }
53655025
53735033 EXPECT_TRUE(SendKey("Ctrl c", session.get(), &command));
53745034 EXPECT_TRUE(GetComposition(command).empty());
53755035 ASSERT_TRUE(command.output().has_result());
5376 // "あいうえお "
5377 EXPECT_EQ("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A ",
5378 command.output().result().value());
5036 EXPECT_EQ("あいうえお ", command.output().result().value());
53795037 EXPECT_TRUE(TryUndoAndAssertDoNothing(session.get()));
53805038 }
53815039
53895047 EXPECT_TRUE(SendKey("Ctrl d", session.get(), &command));
53905048 EXPECT_TRUE(GetComposition(command).empty());
53915049 ASSERT_TRUE(command.output().has_result());
5392 // "あいうえお "
5393 EXPECT_EQ("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88"
5394 "\xE3\x81\x8A\xE3\x80\x80",
5395 command.output().result().value());
5050 EXPECT_EQ("あいうえお ", command.output().result().value());
53965051 EXPECT_TRUE(TryUndoAndAssertDoNothing(session.get()));
53975052 }
53985053 }
54055060 EXPECT_TRUE(session->InputModeHalfKatakana(&command));
54065061 EXPECT_EQ(commands::HALF_KATAKANA, command.output().mode());
54075062 InsertCharacterChars("a", session.get(), &command);
5408 // "ア"
5409 EXPECT_EQ("\xEF\xBD\xB1", GetComposition(command));
5063 EXPECT_EQ("ア", GetComposition(command));
54105064
54115065 command.Clear();
54125066 commands::KeyEvent space_key;
54135067 space_key.set_special_key(commands::KeyEvent::SPACE);
54145068 command.mutable_input()->mutable_key()->CopyFrom(space_key);
54155069 EXPECT_TRUE(session->InsertSpaceFullWidth(&command));
5416 // "ア " (full-width space)
5417 EXPECT_EQ("\xEF\xBD\xB1\xE3\x80\x80", GetComposition(command));
5070 EXPECT_EQ("ア ", GetComposition(command)); // "ア " (full-width space)
54185071 }
54195072
54205073 TEST_F(SessionTest, IsFullWidthInsertSpace) {
56235276 Segments segments;
56245277 Segment *segment;
56255278 segment = segments.add_segment();
5626 // "いんぼう"
5627 segment->set_key("\xe3\x81\x84\xe3\x82\x93\xe3\x81\xbc\xe3\x81\x86");
5628 // "陰謀"
5629 segment->add_candidate()->value = "\xe9\x99\xb0\xe8\xac\x80";
5630 // "陰謀論"
5631 segment->add_candidate()->value = "\xe9\x99\xb0\xe8\xac\x80\xe8\xab\x96";
5632 // "陰謀説"
5633 segment->add_candidate()->value = "\xe9\x99\xb0\xe8\xac\x80\xe8\xaa\xac";
5279 segment->set_key("いんぼう");
5280 segment->add_candidate()->value = "陰謀";
5281 segment->add_candidate()->value = "陰謀論";
5282 segment->add_candidate()->value = "陰謀説";
56345283 GetConverterMock()->SetStartPredictionForRequest(&segments, true);
56355284
56365285 std::unique_ptr<Session> session(new Session(engine_.get()));
56475296
56485297 command.Clear();
56495298 EXPECT_TRUE(session->CommitSegment(&command));
5650 // "陰謀"
5651 EXPECT_RESULT("\xE9\x99\xB0\xE8\xAC\x80", command);
5299 EXPECT_RESULT("陰謀", command);
56525300 EXPECT_FALSE(command.output().has_preedit());
56535301 }
56545302
56915339 std::unique_ptr<Session> session(new Session(engine_.get()));
56925340 InitSessionToPrecomposition(session.get());
56935341
5694 // "a"
56955342 commands::Command command;
56965343 InsertCharacterChars("a", session.get(), &command);
56975344
57095356 command.Clear();
57105357 EXPECT_TRUE(session->CommitSegment(&command));
57115358
5712 // "a"
57135359 InsertCharacterChars("a", session.get(), &command);
5714 EXPECT_SINGLE_SEGMENT(kHiraganaA, command);
5360 EXPECT_SINGLE_SEGMENT("あ", command);
57155361 EXPECT_FALSE(command.output().has_candidates());
57165362 }
57175363
57475393
57485394 // The composition should have been reset.
57495395 InsertCharacterChars("ku", session.get(), &command);
5750 // "く"
5751 EXPECT_EQ("\343\201\217", command.output().preedit().segment(0).value());
5396 EXPECT_EQ("く", command.output().preedit().segment(0).value());
57525397 }
57535398
57545399 TEST_F(SessionTest, Issue2026354) {
57725417
57735418 // EXPECT_TRUE(session->ConvertNext(&command));
57745419 TestSendKey("Space", session.get(), &command);
5775 EXPECT_PREEDIT(kAiueo, command);
5420 EXPECT_PREEDIT("あいうえお", command);
57765421 command.mutable_output()->clear_candidates();
57775422 EXPECT_FALSE(command.output().has_candidates());
57785423 }
58205465
58215466 // After submission, input mode should be reverted.
58225467 SendKey("a", session.get(), &command);
5823 // "あ"
5824 EXPECT_EQ(kHiraganaA, GetComposition(command));
5468 EXPECT_EQ("あ", GetComposition(command));
58255469
58265470 command.Clear();
58275471 session->EditCancel(&command);
58475491 commands::Command command;
58485492 session->ToggleAlphanumericMode(&command);
58495493
5850 // "ち"
5851 InsertCharacterCodeAndString('a', "\xE3\x81\xA1", session.get(), &command);
5494 InsertCharacterCodeAndString('a', "ち", session.get(), &command);
58525495 EXPECT_EQ("a", GetComposition(command));
58535496
58545497 command.Clear();
58555498 session->ToggleAlphanumericMode(&command);
58565499 EXPECT_EQ("a", GetComposition(command));
58575500
5858 // "に"
5859 InsertCharacterCodeAndString('i', "\xE3\x81\xAB", session.get(), &command);
5860 // "aに"
5861 EXPECT_EQ("a\xE3\x81\xAB", GetComposition(command));
5501 InsertCharacterCodeAndString('i', "に", session.get(), &command);
5502 EXPECT_EQ("aに", GetComposition(command));
58625503 }
58635504
58645505 TEST_F(SessionTest, Issue1556649) {
58675508 InitSessionToPrecomposition(session.get());
58685509 commands::Command command;
58695510 InsertCharacterChars("kudoudesu", session.get(), &command);
5870 // "くどうです"
5871 EXPECT_EQ("\xE3\x81\x8F\xE3\x81\xA9\xE3\x81\x86\xE3\x81\xA7\xE3\x81\x99",
5511 EXPECT_EQ("くどうです",
58725512 GetComposition(command));
58735513 EXPECT_EQ(5, command.output().preedit().cursor());
58745514
58755515 command.Clear();
58765516 EXPECT_TRUE(session->DisplayAsHalfKatakana(&command));
5877 // "クドウデス"
5878 EXPECT_EQ("\xEF\xBD\xB8\xEF\xBE\x84\xEF\xBE\x9E\xEF\xBD\xB3\xEF\xBE\x83"
5879 "\xEF\xBE\x9E\xEF\xBD\xBD",
5880 GetComposition(command));
5517 EXPECT_EQ("クドウデス", GetComposition(command));
58815518 EXPECT_EQ(7, command.output().preedit().cursor());
58825519
58835520 for (size_t i = 0; i < 7; ++i) {
58985535 command.Clear();
58995536 EXPECT_TRUE(session->ToggleAlphanumericMode(&command));
59005537 EXPECT_TRUE(SendKey("i", session.get(), &command));
5901 // "あi"
5902 EXPECT_EQ("\xE3\x81\x82\x69", GetComposition(command));
5538 EXPECT_EQ("あi", GetComposition(command));
59035539
59045540 EXPECT_TRUE(SendKey("Space", session.get(), &command));
5905 // "あi "
5906 EXPECT_EQ("\xE3\x81\x82\x69\x20", GetComposition(command));
5541 EXPECT_EQ("あi ", GetComposition(command));
59075542 }
59085543
59095544 {
59125547 commands::Command command;
59135548 EXPECT_TRUE(SendKey("a", session.get(), &command));
59145549 EXPECT_TRUE(SendKey("I", session.get(), &command));
5915 // "あI"
5916 EXPECT_EQ("\xE3\x81\x82\x49", GetComposition(command));
5550 EXPECT_EQ("あI", GetComposition(command));
59175551
59185552 EXPECT_TRUE(SendKey("Space", session.get(), &command));
5919 // "あI "
5920 EXPECT_EQ("\xE3\x81\x82\x49\x20", GetComposition(command));
5553 EXPECT_EQ("あI ", GetComposition(command));
59215554 }
59225555 }
59235556
59285561 InitSessionToPrecomposition(session.get());
59295562 commands::Command command;
59305563 InsertCharacterChars("aiu", session.get(), &command);
5931 // "あいう"
5932 EXPECT_EQ("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86", GetComposition(command));
5564 EXPECT_EQ("あいう", GetComposition(command));
59335565
59345566 for (size_t i = 0; i < 3; ++i) {
59355567 const size_t expected_pos = 2 - i;
60055637 EXPECT_TRUE(SendKey("Eisu", session.get(), &command));
60065638 EXPECT_TRUE(SendKey("i", session.get(), &command));
60075639
6008 // "あ い"
6009 EXPECT_EQ("\xE3\x81\x82\x20\xE3\x81\x84", GetComposition(command));
5640 EXPECT_EQ("あ い", GetComposition(command));
60105641
60115642 command.Clear();
60125643 EXPECT_TRUE(session->DisplayAsFullKatakana(&command));
60135644
6014 // "ア イ"(fullwidth space)
6015 EXPECT_EQ("\xE3\x82\xA2\xE3\x80\x80\xE3\x82\xA4", GetComposition(command));
5645 EXPECT_EQ("ア イ", GetComposition(command)); // fullwidth space
60165646 }
60175647
60185648 { // ConvertToFullKatakana
60265656 EXPECT_TRUE(SendKey("Eisu", session.get(), &command));
60275657 EXPECT_TRUE(SendKey("i", session.get(), &command));
60285658
6029 // "あ い"
6030 EXPECT_EQ("\xE3\x81\x82\x20\xE3\x81\x84", GetComposition(command));
5659 EXPECT_EQ("あ い", GetComposition(command));
60315660
60325661 { // Initialize GetConverterMock() to generate t13n candidates.
60335662 Segments segments;
60345663 Segment *segment;
60355664 segments.set_request_type(Segments::CONVERSION);
60365665 segment = segments.add_segment();
6037 // "あ い"
6038 segment->set_key("\xE3\x81\x82\x20\xE3\x81\x84");
5666 segment->set_key("あ い");
60395667 Segment::Candidate *candidate;
60405668 candidate = segment->add_candidate();
6041 // "あ い"
6042 candidate->value = "\xE3\x81\x82\x20\xE3\x81\x84";
5669 candidate->value = "あ い";
60435670 ConversionRequest request;
60445671 SetComposer(session.get(), &request);
60455672 FillT13Ns(request, &segments);
60495676 command.Clear();
60505677 EXPECT_TRUE(session->ConvertToFullKatakana(&command));
60515678
6052 // "ア イ"(fullwidth space)
6053 EXPECT_EQ("\xE3\x82\xA2\xE3\x80\x80\xE3\x82\xA4", GetComposition(command));
5679 EXPECT_EQ("ア イ", GetComposition(command)); // fullwidth space
60545680 }
60555681 }
60565682 #endif // !OS_NACL
61295755
61305756 EXPECT_TRUE(SendKey("Ctrl Shift Space", session.get(), &command));
61315757 EXPECT_TRUE(command.output().consumed());
6132 EXPECT_PREEDIT(string("a") + kFullWidthSpace, command);
5758 EXPECT_PREEDIT("a ", command); // Full-width space
61335759 }
61345760
61355761 TEST_F(SessionTest, Issue2297060) {
61655791 Segment::Candidate *candidate;
61665792
61675793 segment = segments.add_segment();
6168 // "あ"
6169 segment->set_key(kHiraganaA);
5794 segment->set_key("あ");
61705795 candidate = segment->add_candidate();
6171 // "亜"
6172 candidate->value = "\xE4\xBA\x9C";
5796 candidate->value = "亜";
61735797 ConversionRequest request;
61745798 request.set_config(&config);
61755799 SetComposer(session.get(), &request);
61785802 }
61795803
61805804 EXPECT_TRUE(SendKey("a", session.get(), &command));
6181 // "あ"
6182 EXPECT_EQ(kHiraganaA, GetComposition(command));
5805 EXPECT_EQ("あ", GetComposition(command));
61835806
61845807 EXPECT_TRUE(SendKey("Space", session.get(), &command));
6185 // "亜"
6186 EXPECT_EQ("\xE4\xBA\x9C", GetComposition(command));
5808 EXPECT_EQ("亜", GetComposition(command));
61875809
61885810 EXPECT_TRUE(SendKey("Numpad0", session.get(), &command));
61895811 EXPECT_TRUE(GetComposition(command).empty());
6190 // "亜0", "あ0"
6191 EXPECT_RESULT_AND_KEY("\xE4\xBA\x9C\x30", "\xE3\x81\x82\x30", command);
5812 EXPECT_RESULT_AND_KEY("亜0", "あ0", command);
61925813
61935814 // The previous Numpad0 must not affect the current composition.
61945815 EXPECT_TRUE(SendKey("a", session.get(), &command));
6195 // "あ"
6196 EXPECT_EQ(kHiraganaA, GetComposition(command));
5816 EXPECT_EQ("あ", GetComposition(command));
61975817 }
61985818
61995819 TEST_F(SessionTest, Issue2569789) {
62425862 EXPECT_EQ(commands::HIRAGANA, command.output().mode());
62435863
62445864 InsertCharacterChars("aaa", session.get(), &command);
6245 // "Googleあああ"
6246 EXPECT_EQ("Google\xE3\x81\x82\xE3\x81\x82\xE3\x81\x82",
6247 GetComposition(command));
5865 EXPECT_EQ("Googleあああ", GetComposition(command));
62485866 }
62495867
62505868 {
62755893 session->InputModeFullKatakana(&command);
62765894
62775895 SendKey("i", session.get(), &command);
6278 // "あイ"
6279 EXPECT_EQ("\xE3\x81\x82\xE3\x82\xA4", GetComposition(command));
5896 EXPECT_EQ("あイ", GetComposition(command));
62805897
62815898 SendKey("backspace", session.get(), &command);
6282 // "あ"
6283 EXPECT_EQ(kHiraganaA, GetComposition(command));
5899 EXPECT_EQ("あ", GetComposition(command));
62845900 EXPECT_EQ(commands::FULL_KATAKANA, command.output().mode());
62855901 }
62865902
63005916 ASSERT_TRUE(command.output().consumed());
63015917
63025918 ASSERT_TRUE(command.output().has_result());
6303 // "あ"
6304 EXPECT_EQ(kHiraganaA, command.output().result().value());
5919 EXPECT_EQ("あ", command.output().result().value());
63055920 EXPECT_EQ(commands::DIRECT, command.output().mode());
63065921
63075922 ASSERT_FALSE(command.output().has_preedit());
63255940 ASSERT_TRUE(command.output().consumed());
63265941
63275942 ASSERT_TRUE(command.output().has_result());
6328 // "あ"
6329 EXPECT_EQ(kHiraganaA, command.output().result().value());
5943 EXPECT_EQ("あ", command.output().result().value());
63305944 EXPECT_EQ(commands::DIRECT, command.output().mode());
63315945
63325946 ASSERT_FALSE(command.output().has_preedit());
63445958 ASSERT_TRUE(command.output().consumed());
63455959
63465960 ASSERT_TRUE(command.output().has_result());
6347 // "あ"
6348 EXPECT_EQ(kHiraganaA, command.output().result().value());
5961 EXPECT_EQ("あ", command.output().result().value());
63495962 EXPECT_EQ(commands::DIRECT, command.output().mode());
63505963
63515964 ASSERT_FALSE(command.output().has_preedit());
63715984
63725985 EXPECT_TRUE(SendKey("Hiragana", session.get(), &command));
63735986 EXPECT_TRUE(SendKey("a", session.get(), &command));
6374 // "あ"
6375 EXPECT_SINGLE_SEGMENT(kHiraganaA, command);
5987 EXPECT_SINGLE_SEGMENT("あ", command);
63765988 #endif // OS_WIN
63775989 }
63785990
63795991 TEST_F(SessionTest, HandlingDirectInputTableAttribute) {
63805992 composer::Table table;
6381 // "か"
6382 table.AddRuleWithAttributes("ka", "\xE3\x81\x8B", "",
5993 table.AddRuleWithAttributes("ka", "か", "",
63835994 composer::DIRECT_INPUT);
6384 // "っ"
6385 table.AddRuleWithAttributes("tt", "\xE3\x81\xA3", "t",
5995 table.AddRuleWithAttributes("tt", "っ", "t",
63865996 composer::DIRECT_INPUT);
6387 // "た"
6388 table.AddRuleWithAttributes("ta", "\xE3\x81\x9F", "",
5997 table.AddRuleWithAttributes("ta", "た", "",
63895998 composer::NO_TABLE_ATTRIBUTE);
63905999
63916000 Session session(engine_.get());
63976006 EXPECT_FALSE(command.output().has_result());
63986007
63996008 SendKey("a", &session, &command);
6400 // "か"
6401 EXPECT_RESULT("\xE3\x81\x8B", command);
6009 EXPECT_RESULT("か", command);
64026010
64036011 SendKey("t", &session, &command);
64046012 EXPECT_FALSE(command.output().has_result());
64076015 EXPECT_FALSE(command.output().has_result());
64086016
64096017 SendKey("a", &session, &command);
6410 // "った"
6411 EXPECT_RESULT("\xE3\x81\xA3\xE3\x81\x9F", command);
6018 EXPECT_RESULT("った", command);
64126019 }
64136020
64146021 TEST_F(SessionTest, IMEOnWithModeTest) {
64266033 EXPECT_EQ(commands::HIRAGANA,
64276034 command.output().mode());
64286035 SendKey("a", session.get(), &command);
6429 // "あ"
6430 EXPECT_SINGLE_SEGMENT(kHiraganaA, command);
6036 EXPECT_SINGLE_SEGMENT("あ", command);
64316037 }
64326038 {
64336039 std::unique_ptr<Session> session(new Session(engine_.get()));
64416047 EXPECT_EQ(commands::FULL_KATAKANA,
64426048 command.output().mode());
64436049 SendKey("a", session.get(), &command);
6444 // "ア"
6445 EXPECT_SINGLE_SEGMENT("\xE3\x82\xA2", command);
6050 EXPECT_SINGLE_SEGMENT("ア", command);
64466051 }
64476052 {
64486053 std::unique_ptr<Session> session(new Session(engine_.get()));
64576062 command.output().mode());
64586063 SendKey("a", session.get(), &command);
64596064 // "ア" (half-width Katakana)
6460 EXPECT_SINGLE_SEGMENT("\xEF\xBD\xB1", command);
6065 EXPECT_SINGLE_SEGMENT("ア", command);
64616066 }
64626067 {
64636068 std::unique_ptr<Session> session(new Session(engine_.get()));
64716076 EXPECT_EQ(commands::FULL_ASCII,
64726077 command.output().mode());
64736078 SendKey("a", session.get(), &command);
6474 // "a"
6475 EXPECT_SINGLE_SEGMENT("\xEF\xBD\x81", command);
6079 EXPECT_SINGLE_SEGMENT("a", command);
64766080 }
64776081 {
64786082 std::unique_ptr<Session> session(new Session(engine_.get()));
64866090 EXPECT_EQ(commands::HALF_ASCII,
64876091 command.output().mode());
64886092 SendKey("a", session.get(), &command);
6489 // "a"
64906093 EXPECT_SINGLE_SEGMENT("a", command);
64916094 }
64926095 }
65406143 InitSessionToPrecomposition(session.get());
65416144 commands::Command command;
65426145 SendKey("a", session.get(), &command);
6543 // "あ"
6544 EXPECT_SINGLE_SEGMENT(kHiraganaA, command);
6146 EXPECT_SINGLE_SEGMENT("あ", command);
65456147
65466148 command.Clear();
65476149 EXPECT_TRUE(session->InputModeHiragana(&command));
65486150 EXPECT_TRUE(command.output().consumed());
65496151 EXPECT_EQ(mozc::commands::HIRAGANA, command.output().mode());
6550 // "あ"
6551 EXPECT_SINGLE_SEGMENT(kHiraganaA, command);
6152 EXPECT_SINGLE_SEGMENT("あ", command);
65526153
65536154 command.Clear();
65546155 EXPECT_TRUE(session->InputModeFullKatakana(&command));
65556156 EXPECT_TRUE(command.output().consumed());
65566157 EXPECT_EQ(mozc::commands::FULL_KATAKANA, command.output().mode());
6557 // "あ"
6558 EXPECT_SINGLE_SEGMENT(kHiraganaA, command);
6158 EXPECT_SINGLE_SEGMENT("あ", command);
65596159
65606160 command.Clear();
65616161 EXPECT_TRUE(session->InputModeHalfKatakana(&command));
65626162 EXPECT_TRUE(command.output().consumed());
65636163 EXPECT_EQ(mozc::commands::HALF_KATAKANA, command.output().mode());
6564 // "あ"
6565 EXPECT_SINGLE_SEGMENT(kHiraganaA, command);
6164 EXPECT_SINGLE_SEGMENT("あ", command);
65666165
65676166 command.Clear();
65686167 EXPECT_TRUE(session->InputModeFullASCII(&command));
65696168 EXPECT_TRUE(command.output().consumed());
65706169 EXPECT_EQ(mozc::commands::FULL_ASCII, command.output().mode());
6571 // "あ"
6572 EXPECT_SINGLE_SEGMENT(kHiraganaA, command);
6170 EXPECT_SINGLE_SEGMENT("あ", command);
65736171
65746172 command.Clear();
65756173 EXPECT_TRUE(session->InputModeHalfASCII(&command));
65766174 EXPECT_TRUE(command.output().consumed());
65776175 EXPECT_EQ(mozc::commands::HALF_ASCII, command.output().mode());
6578 // "あ"
6579 EXPECT_SINGLE_SEGMENT(kHiraganaA, command);
6176 EXPECT_SINGLE_SEGMENT("あ", command);
65806177 }
65816178
65826179 TEST_F(SessionTest, InputModeOutputHasCandidates) {
67386335 command.Clear();
67396336 session->Convert(&command);
67406337 EXPECT_FALSE(command.output().has_result());
6741 // "あいうえお"
6742 EXPECT_SINGLE_SEGMENT(kAiueo, command);
6338 EXPECT_SINGLE_SEGMENT("あいうえお", command);
67436339
67446340 GetConverterMock()->SetCommitSegmentValue(&segments, true);
67456341 command.Clear();
67466342 session->Commit(&command);
67476343 EXPECT_FALSE(command.output().has_preedit());
6748 // "あいうえお"
6749 EXPECT_RESULT(kAiueo, command);
6344 EXPECT_RESULT("あいうえお", command);
67506345
67516346 command.Clear();
67526347 session->ResetContext(&command);
68236418 command.Clear();
68246419 session->Convert(&command);
68256420 EXPECT_FALSE(command.output().has_result());
6826 // "あいうえお"
6827 EXPECT_SINGLE_SEGMENT(kAiueo, command);
6421 EXPECT_SINGLE_SEGMENT("あいうえお", command);
68286422
68296423 convertermock->SetCommitSegmentValue(&segments, true);
68306424 command.Clear();
68316425 session->Commit(&command);
68326426 EXPECT_FALSE(command.output().has_preedit());
6833 // "あいうえお"
6834 EXPECT_RESULT(kAiueo, command);
6427 EXPECT_RESULT("あいうえお", command);
68356428
68366429 command.Clear();
68376430 session->Undo(&command);
68886481 // The last "." is a triggering key for auto conversion
68896482 InsertCharacterChars("tesuto.", session.get(), &command);
68906483
6891 // "てすと。",
6892 EXPECT_SINGLE_SEGMENT_AND_KEY(
6893 "\xE3\x81\xA6\xE3\x81\x99\xE3\x81\xA8\xE3\x80\x82",
6894 "\xE3\x81\xA6\xE3\x81\x99\xE3\x81\xA8\xE3\x80\x82", command);
6484 EXPECT_SINGLE_SEGMENT_AND_KEY("てすと。", "てすと。", command);
68956485 }
68966486 {
68976487 std::unique_ptr<Session> session(new Session(engine_.get()));
69006490 commands::Command command;
69016491
69026492 // The last "." is a triggering key for auto conversion
6903 // "てすと。"
6904 InsertCharacterString("\xE3\x81\xA6\xE3\x81\x99\xE3\x81\xA8\xE3\x80\x82",
6905 "wrs/", session.get(), &command);
6906
6907 // "てすと。",
6908 EXPECT_SINGLE_SEGMENT_AND_KEY(
6909 "\xE3\x81\xA6\xE3\x81\x99\xE3\x81\xA8\xE3\x80\x82",
6910 "\xE3\x81\xA6\xE3\x81\x99\xE3\x81\xA8\xE3\x80\x82", command);
6493 InsertCharacterString("てすと。", "wrs/", session.get(), &command);
6494
6495 EXPECT_SINGLE_SEGMENT_AND_KEY("てすと。", "てすと。", command);
69116496 }
69126497
69136498 // Auto On
69226507 // The last "." is a triggering key for auto conversion
69236508 InsertCharacterChars("tesuto.", session.get(), &command);
69246509
6925 EXPECT_SINGLE_SEGMENT_AND_KEY(kAiueo, kAiueo, command);
6510 EXPECT_SINGLE_SEGMENT_AND_KEY("あいうえお", "あいうえお", command);
69266511 }
69276512 {
69286513 std::unique_ptr<Session> session(new Session(engine_.get()));
69326517 commands::Command command;
69336518
69346519 // The last "." is a triggering key for auto conversion
6935 // "てすと。",
6936 InsertCharacterString("\xE3\x81\xA6\xE3\x81\x99\xE3\x81\xA8\xE3\x80\x82",
6937 "wrs/", session.get(), &command);
6938
6939 EXPECT_SINGLE_SEGMENT_AND_KEY(kAiueo, kAiueo, command);
6520 InsertCharacterString("てすと。", "wrs/", session.get(), &command);
6521
6522 EXPECT_SINGLE_SEGMENT_AND_KEY("あいうえお", "あいうえお", command);
69406523 }
69416524
69426525 // Don't trigger auto conversion for the pattern number + "."
69496532 // The last "." is a triggering key for auto conversion
69506533 InsertCharacterChars("123.", session.get(), &command);
69516534
6952 // "123."
6953 EXPECT_SINGLE_SEGMENT_AND_KEY(
6954 "\xEF\xBC\x91\xEF\xBC\x92\xEF\xBC\x93\xEF\xBC\x8E",
6955 "\xEF\xBC\x91\xEF\xBC\x92\xEF\xBC\x93\xEF\xBC\x8E", command);
6535 EXPECT_SINGLE_SEGMENT_AND_KEY("123.", "123.", command);
69566536 }
69576537
69586538 // Don't trigger auto conversion for the ".."
69656545 // The last "." is a triggering key for auto conversion
69666546 InsertCharacterChars("..", session.get(), &command);
69676547
6968 // "。。"
6969 EXPECT_SINGLE_SEGMENT_AND_KEY(
6970 "\xE3\x80\x82\xE3\x80\x82", "\xE3\x80\x82\xE3\x80\x82", command);
6548 EXPECT_SINGLE_SEGMENT_AND_KEY("。。", "。。", command);
69716549 }
69726550
69736551 {
69776555 commands::Command command;
69786556
69796557 // The last "." is a triggering key for auto conversion
6980 // "123。"
6981 InsertCharacterString("\xEF\xBC\x91\xEF\xBC\x92\xEF\xBC\x93\xE3\x80\x82",
6982 "123.", session.get(), &command);
6983
6984 // "123."
6985 EXPECT_SINGLE_SEGMENT_AND_KEY(
6986 "\xEF\xBC\x91\xEF\xBC\x92\xEF\xBC\x93\xEF\xBC\x8E",
6987 "\xEF\xBC\x91\xEF\xBC\x92\xEF\xBC\x93\xEF\xBC\x8E", command);
6558 InsertCharacterString("123。", "123.", session.get(), &command);
6559
6560 EXPECT_SINGLE_SEGMENT_AND_KEY("123.", "123.", command);
69886561 }
69896562
69906563 // Don't trigger auto conversion for "." only.
69976570 // The last "." is a triggering key for auto conversion
69986571 InsertCharacterChars(".", session.get(), &command);
69996572
7000 // "。"
7001 EXPECT_SINGLE_SEGMENT_AND_KEY("\xE3\x80\x82", "\xE3\x80\x82", command);
6573 EXPECT_SINGLE_SEGMENT_AND_KEY("。", "。", command);
70026574 }
70036575
70046576 {
70086580 commands::Command command;
70096581
70106582 // The last "." is a triggering key for auto conversion
7011 // "。",
7012 InsertCharacterString("\xE3\x80\x82", "/", session.get(), &command);
7013
7014 // "。"
7015 EXPECT_SINGLE_SEGMENT_AND_KEY("\xE3\x80\x82", "\xE3\x80\x82", command);
6583 InsertCharacterString("。", "/", session.get(), &command);
6584
6585 EXPECT_SINGLE_SEGMENT_AND_KEY("。", "。", command);
70166586 }
70176587
70186588 // Do auto conversion even if romanji-table is modified.
70236593
70246594 // Modify romanji-table to convert "zz" -> "。"
70256595 composer::Table zz_table;
7026 // "てすと。"
7027 zz_table.AddRule("te", "\xE3\x81\xA6", "");
7028 zz_table.AddRule("su", "\xE3\x81\x99", "");
7029 zz_table.AddRule("to", "\xE3\x81\xA8", "");
7030 zz_table.AddRule("zz", "\xE3\x80\x82", "");
6596 zz_table.AddRule("te", "て", "");
6597 zz_table.AddRule("su", "す", "");
6598 zz_table.AddRule("to", "と", "");
6599 zz_table.AddRule("zz", "。", "");
70316600 session->get_internal_composer_only_for_unittest()->SetTable(&zz_table);
70326601
70336602 // The last "zz" is converted to "." and triggering key for auto conversion
70346603 commands::Command command;
70356604 InsertCharacterChars("tesutozz", session.get(), &command);
70366605
7037 EXPECT_SINGLE_SEGMENT_AND_KEY(kAiueo, kAiueo, command);
6606 EXPECT_SINGLE_SEGMENT_AND_KEY("あいうえお", "あいうえお", command);
70386607 }
70396608
70406609 {
70686637 commands::Command command;
70696638
70706639 if (kana_mode) {
7071 // "てすと"
7072 string key = "\xE3\x81\xA6\xE3\x81\x99\xE3\x81\xA8";
6640 string key = "てすと";
70736641 key += trigger_key[i];
70746642 InsertCharacterString(key, "wst/", session.get(), &command);
70756643 } else {
70836651 EXPECT_TRUE(command.output().preedit().segment(0).has_key());
70846652
70856653 if (onoff > 0 && flag[i] > 0) {
7086 // "あいうえお"
7087 EXPECT_EQ("\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86"
7088 "\xe3\x81\x88\xe3\x81\x8a",
6654 EXPECT_EQ("あいうえお",
70896655 command.output().preedit().segment(0).key());
70906656 } else {
70916657 // Not "あいうえお"
7092 EXPECT_NE("\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86"
7093 "\xe3\x81\x88\xe3\x81\x8a",
6658 EXPECT_NE("あいうえお",
70946659 command.output().preedit().segment(0).key());
70956660 }
70966661 }
71156680 command.mutable_input()->mutable_key()->set_mode(commands::FULL_KATAKANA);
71166681 EXPECT_TRUE(session->SendKey(&command));
71176682 EXPECT_TRUE(command.output().consumed());
7118 EXPECT_RESULT(kFullWidthSpace, command);
6683 EXPECT_RESULT(" ", command);
71196684 EXPECT_EQ(mozc::commands::FULL_KATAKANA, command.output().mode());
71206685 }
71216686
71276692
71286693 commands::Command command;
71296694 InsertCharacterChars("ssh", session.get(), &command);
7130 // "っsh"
7131 EXPECT_EQ("\xE3\x81\xA3\xEF\xBD\x93\xEF\xBD\x88", GetComposition(command));
6695 EXPECT_EQ("っsh", GetComposition(command));
71326696
71336697 Segments segments;
71346698 // Set a dummy segments for ConvertToHalfASCII.
71356699 {
71366700 Segment *segment;
71376701 segment = segments.add_segment();
7138 // // "っsh"
7139 // segment->set_key("\xE3\x81\xA3\xEF\xBD\x93\xEF\xBD\x88");
7140 // "っsh"
7141 segment->set_key("\xE3\x81\xA3sh");
6702 segment->set_key("っsh");
71426703
71436704 segment->add_candidate()->value = "[SSH]";
71446705 }
71636724
71646725 SendKey("1", session.get(), &command);
71656726 // "あ|"
7166 EXPECT_EQ(kHiraganaA, command.output().preedit().segment(0).value());
6727 EXPECT_EQ("あ", command.output().preedit().segment(0).value());
71676728 EXPECT_EQ(1, command.output().preedit().cursor());
71686729
71696730 SendKey("1", session.get(), &command);
71706731 // "い|"
7171 EXPECT_EQ("\xE3\x81\x84", command.output().preedit().segment(0).value());
6732 EXPECT_EQ("い", command.output().preedit().segment(0).value());
71726733 EXPECT_EQ(1, command.output().preedit().cursor());
71736734
71746735 SendKey("1", session.get(), &command);
71806741 SendKey("1", session.get(), &command);
71816742 SendKey("1", session.get(), &command);
71826743 SendKey("1", session.get(), &command);
7183 // "あ|"
7184 EXPECT_EQ(kHiraganaA, command.output().preedit().segment(0).value());
6744 EXPECT_EQ("あ", command.output().preedit().segment(0).value());
71856745 EXPECT_EQ(1, command.output().preedit().cursor());
71866746
71876747 SendKey("2", session.get(), &command);
7188 // "あか|"
7189 EXPECT_EQ("\xE3\x81\x82\xE3\x81\x8B",
6748 EXPECT_EQ("あか",
71906749 command.output().preedit().segment(0).value());
71916750 EXPECT_EQ(2, command.output().preedit().cursor());
71926751
71936752 SendKey("2", session.get(), &command);
7194 // "あき|"
7195 EXPECT_EQ("\xE3\x81\x82\xE3\x81\x8D",
6753 EXPECT_EQ("あき",
71966754 command.output().preedit().segment(0).value());
71976755 EXPECT_EQ(2, command.output().preedit().cursor());
71986756
71996757 SendKey("*", session.get(), &command);
7200 // "あぎ|"
7201 EXPECT_EQ("\xE3\x81\x82\xE3\x81\x8E",
6758 EXPECT_EQ("あぎ",
72026759 command.output().preedit().segment(0).value());
72036760 EXPECT_EQ(2, command.output().preedit().cursor());
72046761
72056762 SendKey("*", session.get(), &command);
7206 // "あき|"
7207 EXPECT_EQ("\xE3\x81\x82\xE3\x81\x8D",
6763 EXPECT_EQ("あき",
72086764 command.output().preedit().segment(0).value());
72096765 EXPECT_EQ(2, command.output().preedit().cursor());
72106766
72116767 SendKey("3", session.get(), &command);
7212 // "あきさ|"
7213 EXPECT_EQ("\xE3\x81\x82\xE3\x81\x8D\xE3\x81\x95",
6768 EXPECT_EQ("あきさ",
72146769 command.output().preedit().segment(0).value());
72156770 EXPECT_EQ(3, command.output().preedit().cursor());
72166771
72176772 SendSpecialKey(commands::KeyEvent::RIGHT, session.get(), &command);
7218 // "あきさ|"
7219 EXPECT_EQ("\xE3\x81\x82\xE3\x81\x8D\xE3\x81\x95",
6773 EXPECT_EQ("あきさ",
72206774 command.output().preedit().segment(0).value());
72216775 EXPECT_EQ(3, command.output().preedit().cursor());
72226776
72236777 SendKey("3", session.get(), &command);
7224 // "あきささ|"
7225 EXPECT_EQ("\xE3\x81\x82\xE3\x81\x8D\xE3\x81\x95\xE3\x81\x95",
6778 EXPECT_EQ("あきささ",
72266779 command.output().preedit().segment(0).value());
72276780 EXPECT_EQ(4, command.output().preedit().cursor());
72286781
72296782 SendSpecialKey(commands::KeyEvent::LEFT, session.get(), &command);
7230 // "あきさ|さ"
7231 EXPECT_EQ("\xE3\x81\x82\xE3\x81\x8D\xE3\x81\x95\xE3\x81\x95",
6783 EXPECT_EQ("あきささ",
72326784 command.output().preedit().segment(0).value());
72336785 EXPECT_EQ(3, command.output().preedit().cursor());
72346786
72356787 SendKey("4", session.get(), &command);
7236 // "あきさた|さ"
7237 EXPECT_EQ("\xE3\x81\x82\xE3\x81\x8D\xE3\x81\x95\xE3\x81\x9F\xE3\x81\x95",
6788 EXPECT_EQ("あきさたさ",
72386789 command.output().preedit().segment(0).value());
72396790 EXPECT_EQ(4, command.output().preedit().cursor());
72406791
72416792 SendSpecialKey(commands::KeyEvent::LEFT, session.get(), &command);
7242 // "あきさ|たさ"
7243 EXPECT_EQ("\xE3\x81\x82\xE3\x81\x8D\xE3\x81\x95\xE3\x81\x9F\xE3\x81\x95",
6793 EXPECT_EQ("あきさたさ",
72446794 command.output().preedit().segment(0).value());
72456795 EXPECT_EQ(3, command.output().preedit().cursor());
72466796
72476797 SendKey("*", session.get(), &command);
7248 // "あきざ|たさ"
7249 EXPECT_EQ("\xE3\x81\x82\xE3\x81\x8D\xE3\x81\x96\xE3\x81\x9F\xE3\x81\x95",
6798 EXPECT_EQ("あきざたさ",
72506799 command.output().preedit().segment(0).value());
72516800 EXPECT_EQ(3, command.output().preedit().cursor());
72526801
72576806 SendSpecialKey(commands::KeyEvent::END, session.get(), &command);
72586807 SendKey("6", session.get(), &command);
72596808 SendKey("*", session.get(), &command);
7260 // "あきざたさひば|"
7261 EXPECT_EQ("\xE3\x81\x82\xE3\x81\x8D\xE3\x81\x96\xE3\x81\x9F\xE3\x81\x95"
7262 "\xE3\x81\xB2\xE3\x81\xB0",
6809 EXPECT_EQ("あきざたさひば",
72636810 command.output().preedit().segment(0).value());
72646811 EXPECT_EQ(7, command.output().preedit().cursor());
72656812
72706817 SendSpecialKey(commands::KeyEvent::RIGHT, session.get(), &command);
72716818 SendKey("6", session.get(), &command);
72726819 SendKey("*", session.get(), &command);
7273 // "あきざたさひばひば|"
7274 EXPECT_EQ("\xE3\x81\x82\xE3\x81\x8D\xE3\x81\x96\xE3\x81\x9F\xE3\x81\x95"
7275 "\xE3\x81\xB2\xE3\x81\xB0\xE3\x81\xB2\xE3\x81\xB0",
6820 EXPECT_EQ("あきざたさひばひば",
72766821 command.output().preedit().segment(0).value());
72776822 EXPECT_EQ(9, command.output().preedit().cursor());
72786823
72806825 SendSpecialKey(commands::KeyEvent::END, session.get(), &command);
72816826 SendKey("6", session.get(), &command);
72826827 SendKey("6", session.get(), &command);
7283 // "あきざたさひばひばひ|"
7284 EXPECT_EQ("\xE3\x81\x82\xE3\x81\x8D\xE3\x81\x96\xE3\x81\x9F\xE3\x81\x95"
7285 "\xE3\x81\xB2\xE3\x81\xB0\xE3\x81\xB2\xE3\x81\xB0\xE3\x81\xB2",
6828 EXPECT_EQ("あきざたさひばひばひ",
72866829 command.output().preedit().segment(0).value());
72876830 SendSpecialKey(commands::KeyEvent::LEFT, session.get(), &command);
72886831 SendKey("6", session.get(), &command);
7289 // "あきざたさひばひばは|ひ"
7290 EXPECT_EQ("\xE3\x81\x82\xE3\x81\x8D\xE3\x81\x96\xE3\x81\x9F\xE3\x81\x95"
7291 "\xE3\x81\xB2\xE3\x81\xB0\xE3\x81\xB2\xE3\x81\xB0\xE3\x81\xAF"
7292 "\xE3\x81\xB2",
6832 EXPECT_EQ("あきざたさひばひばはひ",
72936833 command.output().preedit().segment(0).value());
72946834 SendKey("*", session.get(), &command);
7295 // "あきざたさひばひばば|ひ"
7296 EXPECT_EQ("\xE3\x81\x82\xE3\x81\x8D\xE3\x81\x96\xE3\x81\x9F\xE3\x81\x95"
7297 "\xE3\x81\xB2\xE3\x81\xB0\xE3\x81\xB2\xE3\x81\xB0\xE3\x81\xB0"
7298 "\xE3\x81\xB2",
6835 EXPECT_EQ("あきざたさひばひばばひ",
72996836 command.output().preedit().segment(0).value());
73006837 EXPECT_EQ(10, command.output().preedit().cursor());
73016838
73026839 // Test for Home key
73036840 SendSpecialKey(commands::KeyEvent::HOME, session.get(), &command);
7304 // "|あきざたさひばひばばひ"
7305 EXPECT_EQ("\xE3\x81\x82\xE3\x81\x8D\xE3\x81\x96\xE3\x81\x9F\xE3\x81\x95"
7306 "\xE3\x81\xB2\xE3\x81\xB0\xE3\x81\xB2\xE3\x81\xB0\xE3\x81\xB0"
7307 "\xE3\x81\xB2",
6841 EXPECT_EQ("あきざたさひばひばばひ",
73086842 command.output().preedit().segment(0).value());
73096843 SendKey("6", session.get(), &command);
73106844 SendKey("*", session.get(), &command);
7311 // "ば|あきざたさひばひばばひ"
7312 EXPECT_EQ("\xE3\x81\xB0\xE3\x81\x82\xE3\x81\x8D\xE3\x81\x96\xE3\x81\x9F"
7313 "\xE3\x81\x95\xE3\x81\xB2\xE3\x81\xB0\xE3\x81\xB2\xE3\x81\xB0"
7314 "\xE3\x81\xB0\xE3\x81\xB2",
6845 EXPECT_EQ("ばあきざたさひばひばばひ",
73156846 command.output().preedit().segment(0).value());
73166847 EXPECT_EQ(1, command.output().preedit().cursor());
73176848
73186849 SendSpecialKey(commands::KeyEvent::END, session.get(), &command);
73196850 SendKey("5", session.get(), &command);
7320 // "ばあきざたさひばひばばひな|"
7321 EXPECT_EQ("\xE3\x81\xB0\xE3\x81\x82\xE3\x81\x8D\xE3\x81\x96\xE3\x81\x9F"
7322 "\xE3\x81\x95\xE3\x81\xB2\xE3\x81\xB0\xE3\x81\xB2\xE3\x81\xB0"
7323 "\xE3\x81\xB0\xE3\x81\xB2\xE3\x81\xAA",
6851 EXPECT_EQ("ばあきざたさひばひばばひな",
73246852 command.output().preedit().segment(0).value());
73256853 SendKey("*", session.get(), &command); // no effect
7326 // "ばあきざたさひばひばばひな|"
7327 EXPECT_EQ("\xE3\x81\xB0\xE3\x81\x82\xE3\x81\x8D\xE3\x81\x96\xE3\x81\x9F"
7328 "\xE3\x81\x95\xE3\x81\xB2\xE3\x81\xB0\xE3\x81\xB2\xE3\x81\xB0"
7329 "\xE3\x81\xB0\xE3\x81\xB2\xE3\x81\xAA",
6854 EXPECT_EQ("ばあきざたさひばひばばひな",
73306855 command.output().preedit().segment(0).value());
73316856 EXPECT_EQ(13, command.output().preedit().cursor());
73326857 }
73406865 std::unique_ptr<Session> session(new Session(engine_.get()));
73416866 session->SetConfig(&config);
73426867 InitSessionToPrecomposition(session.get(), *mobile_request_);
7343 // "は"
7344 InsertCharacterCodeAndString('6', "\xE3\x81\xAF", session.get(), &command);
7345 // "し"
7346 InsertCharacterCodeAndString('3', "\xE3\x81\x97", session.get(), &command);
6868 InsertCharacterCodeAndString('6', "は", session.get(), &command);
6869 InsertCharacterCodeAndString('3', "し", session.get(), &command);
73476870 SendKey("*", session.get(), &command);
7348 // "ょ"
7349 InsertCharacterCodeAndString('3', "\xE3\x82\x87", session.get(), &command);
7350 // "う"
7351 InsertCharacterCodeAndString('1', "\xE3\x81\x86", session.get(), &command);
7352 // "はじょう"
7353 EXPECT_EQ("\xE3\x81\xAF\xE3\x81\x98\xE3\x82\x87\xE3\x81\x86",
6871 InsertCharacterCodeAndString('3', "ょ", session.get(), &command);
6872 InsertCharacterCodeAndString('1', "う", session.get(), &command);
6873 EXPECT_EQ("はじょう",
73546874 command.output().preedit().segment(0).value());
73556875 }
73566876
73636883 SendKey("3", session.get(), &command);
73646884 SendKey("3", session.get(), &command);
73656885 SendKey("*", session.get(), &command);
7366 // "ょ"
7367 InsertCharacterCodeAndString('3', "\xE3\x82\x87", session.get(), &command);
7368 // "う"
7369 InsertCharacterCodeAndString('1', "\xE3\x81\x86", session.get(), &command);
7370 // "はじょう"
7371 EXPECT_EQ("\xE3\x81\xAF\xE3\x81\x98\xE3\x82\x87\xE3\x81\x86",
7372 command.output().preedit().segment(0).value());
6886 InsertCharacterCodeAndString('3', "ょ", session.get(), &command);
6887 InsertCharacterCodeAndString('1', "う", session.get(), &command);
6888 EXPECT_EQ("はじょう", command.output().preedit().segment(0).value());
73736889 }
73746890
73756891 {
73816897 SendKey("2", session.get(), &command);
73826898 SendKey("3", session.get(), &command);
73836899 SendKey("3", session.get(), &command);
7384 // "あかし"
7385 EXPECT_EQ("\xE3\x81\x82\xE3\x81\x8B\xE3\x81\x97",
7386 command.output().preedit().segment(0).value());
7387 // "の"
7388 InsertCharacterCodeAndString('5', "\xE3\x81\xAE", session.get(), &command);
7389 // "く"
7390 InsertCharacterCodeAndString('2', "\xE3\x81\x8F", session.get(), &command);
7391 // "し"
7392 InsertCharacterCodeAndString('3', "\xE3\x81\x97", session.get(), &command);
7393 // "あかしのくし"
7394 EXPECT_EQ("\xE3\x81\x82\xE3\x81\x8B\xE3\x81\x97\xE3\x81\xAE\xE3\x81\x8F\xE3"
7395 "\x81\x97",
7396 command.output().preedit().segment(0).value());
6900 EXPECT_EQ("あかし", command.output().preedit().segment(0).value());
6901 InsertCharacterCodeAndString('5', "の", session.get(), &command);
6902 InsertCharacterCodeAndString('2', "く", session.get(), &command);
6903 InsertCharacterCodeAndString('3', "し", session.get(), &command);
6904 EXPECT_EQ("あかしのくし", command.output().preedit().segment(0).value());
73976905 SendSpecialKey(commands::KeyEvent::LEFT, session.get(), &command);
73986906 SendSpecialKey(commands::KeyEvent::LEFT, session.get(), &command);
73996907 SendSpecialKey(commands::KeyEvent::LEFT, session.get(), &command);
74096917 SendKey("9", session.get(), &command);
74106918 SendSpecialKey(commands::KeyEvent::RIGHT, session.get(), &command);
74116919 SendSpecialKey(commands::KeyEvent::RIGHT, session.get(), &command);
7412 // "ん"
7413 InsertCharacterCodeAndString('0', "\xE3\x82\x93", session.get(), &command);
6920 InsertCharacterCodeAndString('0', "ん", session.get(), &command);
74146921 SendSpecialKey(commands::KeyEvent::END, session.get(), &command);
74156922 SendKey("1", session.get(), &command);
74166923 SendKey("1", session.get(), &command);
74176924 SendKey("1", session.get(), &command);
74186925 SendKey("*", session.get(), &command);
74196926 SendSpecialKey(commands::KeyEvent::LEFT, session.get(), &command);
7420 // "ゆ"
7421 InsertCharacterCodeAndString('8', "\xE3\x82\x86", session.get(), &command);
6927 InsertCharacterCodeAndString('8', "ゆ", session.get(), &command);
74226928 SendKey("*", session.get(), &command);
74236929 SendSpecialKey(commands::KeyEvent::RIGHT, session.get(), &command);
74246930 SendKey("*", session.get(), &command);
74256931 SendKey("*", session.get(), &command);
7426 // "あるかしんのくしゅう"
7427 EXPECT_EQ("\xE3\x81\x82\xE3\x82\x8B\xE3\x81\x8B\xE3\x81\x97\xE3\x82\x93\xE3"
7428 "\x81\xAE\xE3\x81\x8F\xE3\x81\x97\xE3\x82\x85\xE3\x81\x86",
7429 command.output().preedit().segment(0).value());
6932 EXPECT_EQ("あるかしんのくしゅう",
6933 command.output().preedit().segment(0).value());
74306934 SendSpecialKey(commands::KeyEvent::HOME, session.get(), &command);
74316935 SendSpecialKey(commands::KeyEvent::RIGHT, session.get(), &command);
74326936 SendSpecialKey(commands::KeyEvent::RIGHT, session.get(), &command);
7433 // "は"
7434 InsertCharacterCodeAndString('6', "\xE3\x81\xAF", session.get(), &command);
6937 InsertCharacterCodeAndString('6', "は", session.get(), &command);
74356938 SendKey("*", session.get(), &command);
74366939 SendKey("*", session.get(), &command);
74376940 SendKey("*", session.get(), &command);
74446947 SendKey("6", session.get(), &command);
74456948 SendKey("6", session.get(), &command);
74466949 SendKey("6", session.get(), &command);
7447 // "あるぱかしんのふくしゅう"
7448 EXPECT_EQ("\xE3\x81\x82\xE3\x82\x8B\xE3\x81\xB1\xE3\x81\x8B\xE3\x81\x97\xE3"
7449 "\x82\x93\xE3\x81\xAE\xE3\x81\xB5\xE3\x81\x8F\xE3\x81\x97\xE3\x82\x85"
7450 "\xE3\x81\x86",
7451 command.output().preedit().segment(0).value());
6950 EXPECT_EQ("あるぱかしんのふくしゅう",
6951 command.output().preedit().segment(0).value());
74526952 }
74536953 }
74546954
74686968 Segment::Candidate *candidate;
74696969
74706970 segment = segments.add_segment();
7471 // "ねこの"
7472 segment->set_key("\xE3\x81\xAD\xE3\x81\x93\xE3\x81\xAE");
6971 segment->set_key("ねこの");
74736972 candidate = segment->add_candidate();
7474 // "猫の"
7475 candidate->value = "\xE7\x8C\xAB\xE3\x81\xAE";
6973 candidate->value = "猫の";
74766974
74776975 segment = segments.add_segment();
7478 // "しっぽを"
7479 segment->set_key("\xE3\x81\x97\xE3\x81\xA3\xE3\x81\xBD\xE3\x82\x92");
6976 segment->set_key("しっぽを");
74806977 candidate = segment->add_candidate();
7481 // "しっぽを"
7482 candidate->value = "\xE3\x81\x97\xE3\x81\xA3\xE3\x81\xBD\xE3\x82\x92";
6978 candidate->value = "しっぽを";
74836979
74846980 segment = segments.add_segment();
7485 // "ぬいた"
7486 segment->set_key("\xE3\x81\xAC\xE3\x81\x84\xE3\x81\x9F");
6981 segment->set_key("ぬいた");
74876982 candidate = segment->add_candidate();
7488 // "抜いた"
7489 candidate->value = "\xE6\x8A\x9C\xE3\x81\x84\xE3\x81\x9F";
6983 candidate->value = "抜いた";
74906984
74916985 GetConverterMock()->SetStartConversionForRequest(&segments, true);
74926986 }
75056999 Segment::Candidate *candidate;
75067000
75077001 segment = segments.add_segment();
7508 // "ぬいた"
7509 segment->set_key("\xE3\x81\xAC\xE3\x81\x84\xE3\x81\x9F");
7002 segment->set_key("ぬいた");
75107003 candidate = segment->add_candidate();
7511 // "抜いた"
7512 candidate->value = "\xE6\x8A\x9C\xE3\x81\x84\xE3\x81\x9F";
7004 candidate->value = "抜いた";
75137005
75147006 GetConverterMock()->SetCommitSegments(&segments, true);
75157007 }
75177009 command.Clear();
75187010 command.mutable_input()->mutable_command()->set_id(0);
75197011 ASSERT_TRUE(session->CommitCandidate(&command));
7520 // "抜いた"
7521 EXPECT_PREEDIT("\xE6\x8A\x9C\xE3\x81\x84\xE3\x81\x9F", command);
7522 // "抜いた" "ぬいた"
7523 EXPECT_SINGLE_SEGMENT_AND_KEY("\xE6\x8A\x9C\xE3\x81\x84\xE3\x81\x9F",
7524 "\xE3\x81\xAC\xE3\x81\x84\xE3\x81\x9F",
7525 command);
7526 // "猫のしっぽを"
7527 EXPECT_RESULT("\xE7\x8C\xAB\xE3\x81\xAE"
7528 "\xE3\x81\x97\xE3\x81\xA3\xE3\x81\xBD\xE3\x82\x92", command);
7012 EXPECT_PREEDIT("抜いた", command);
7013 EXPECT_SINGLE_SEGMENT_AND_KEY("抜いた", "ぬいた", command);
7014 EXPECT_RESULT("猫のしっぽを", command);
75297015 }
75307016
75317017 TEST_F(SessionTest, CommitCandidateAt3rdOf3Segments) {
75447030 Segment::Candidate *candidate;
75457031
75467032 segment = segments.add_segment();
7547 // "ねこの"
7548 segment->set_key("\xE3\x81\xAD\xE3\x81\x93\xE3\x81\xAE");
7033 segment->set_key("ねこの");
75497034 candidate = segment->add_candidate();
7550 // "猫の"
7551 candidate->value = "\xE7\x8C\xAB\xE3\x81\xAE";
7035 candidate->value = "猫の";
75527036
75537037 segment = segments.add_segment();
7554 // "しっぽを"
7555 segment->set_key("\xE3\x81\x97\xE3\x81\xA3\xE3\x81\xBD\xE3\x82\x92");
7038 segment->set_key("しっぽを");
75567039 candidate = segment->add_candidate();
7557 // "しっぽを"
7558 candidate->value = "\xE3\x81\x97\xE3\x81\xA3\xE3\x81\xBD\xE3\x82\x92";
7040 candidate->value = "しっぽを";
75597041
75607042 segment = segments.add_segment();
7561 // "ぬいた"
7562 segment->set_key("\xE3\x81\xAC\xE3\x81\x84\xE3\x81\x9F");
7043 segment->set_key("ぬいた");
75637044 candidate = segment->add_candidate();
7564 // "抜いた"
7565 candidate->value = "\xE6\x8A\x9C\xE3\x81\x84\xE3\x81\x9F";
7045 candidate->value = "抜いた";
75667046
75677047 GetConverterMock()->SetStartConversionForRequest(&segments, true);
75687048 }
75857065 command.mutable_input()->mutable_command()->set_id(0);
75867066 ASSERT_TRUE(session->CommitCandidate(&command));
75877067 EXPECT_FALSE(command.output().has_preedit());
7588 // "猫のしっぽを抜いた"
7589 EXPECT_RESULT("\xE7\x8C\xAB\xE3\x81\xAE"
7590 "\xE3\x81\x97\xE3\x81\xA3\xE3\x81\xBD\xE3\x82\x92"
7591 "\xE6\x8A\x9C\xE3\x81\x84\xE3\x81\x9F" , command);
7068 EXPECT_RESULT("猫のしっぽを抜いた" , command);
75927069 }
75937070
75947071 TEST_F(SessionTest, CommitCandidate_suggestion) {
77327209 TEST_F(SessionTest, ConvertReverse) {
77337210 std::unique_ptr<Session> session(new Session(engine_.get()));
77347211 InitSessionToPrecomposition(session.get());
7735 // "阿伊宇江於"
7736 const char kKanjiAiueo[] =
7737 "\xe9\x98\xbf\xe4\xbc\x8a\xe5\xae\x87\xe6\xb1\x9f\xe6\x96\xbc";
7212 const char kKanjiAiueo[] = "阿伊宇江於";
77387213 commands::Command command;
77397214 SetupCommandForReverseConversion(kKanjiAiueo, command.mutable_input());
7740 SetupMockForReverseConversion(kKanjiAiueo, kAiueo);
7215 SetupMockForReverseConversion(kKanjiAiueo, "あいうえお");
77417216
77427217 EXPECT_TRUE(session->SendCommand(&command));
77437218 EXPECT_TRUE(command.output().consumed());
77527227 TEST_F(SessionTest, EscapeFromConvertReverse) {
77537228 std::unique_ptr<Session> session(new Session(engine_.get()));
77547229 InitSessionToPrecomposition(session.get());
7755 // "阿伊宇江於"
7756 const char kKanjiAiueo[] =
7757 "\xe9\x98\xbf\xe4\xbc\x8a\xe5\xae\x87\xe6\xb1\x9f\xe6\x96\xbc";
7230 const char kKanjiAiueo[] = "阿伊宇江於";
77587231
77597232 commands::Command command;
77607233 SetupCommandForReverseConversion(kKanjiAiueo, command.mutable_input());
7761 SetupMockForReverseConversion(kKanjiAiueo, kAiueo);
7234 SetupMockForReverseConversion(kKanjiAiueo, "あいうえお");
77627235
77637236 EXPECT_TRUE(session->SendCommand(&command));
77647237 EXPECT_TRUE(command.output().consumed());
77677240 SendKey("ESC", session.get(), &command);
77687241
77697242 // KANJI should be converted into HIRAGANA in pre-edit state.
7770 EXPECT_SINGLE_SEGMENT(kAiueo, command);
7243 EXPECT_SINGLE_SEGMENT("あいうえお", command);
77717244
77727245 SendKey("ESC", session.get(), &command);
77737246
77797252 TEST_F(SessionTest, SecondEscapeFromConvertReverse) {
77807253 std::unique_ptr<Session> session(new Session(engine_.get()));
77817254 InitSessionToPrecomposition(session.get());
7782 // "阿伊宇江於"
7783 const char kKanjiAiueo[] =
7784 "\xe9\x98\xbf\xe4\xbc\x8a\xe5\xae\x87\xe6\xb1\x9f\xe6\x96\xbc";
7255 const char kKanjiAiueo[] = "阿伊宇江於";
77857256 commands::Command command;
77867257 SetupCommandForReverseConversion(kKanjiAiueo, command.mutable_input());
7787 SetupMockForReverseConversion(kKanjiAiueo, kAiueo);
7258 SetupMockForReverseConversion(kKanjiAiueo, "あいうえお");
77887259
77897260 EXPECT_TRUE(session->SendCommand(&command));
77907261 EXPECT_TRUE(command.output().consumed());
77997270 EXPECT_RESULT_AND_KEY(kKanjiAiueo, kKanjiAiueo, command);
78007271
78017272 SendKey("a", session.get(), &command);
7802 // "あ"
7803 EXPECT_EQ(kHiraganaA, GetComposition(command));
7273 EXPECT_EQ("あ", GetComposition(command));
78047274
78057275 SendKey("ESC", session.get(), &command);
78067276 EXPECT_FALSE(command.output().has_preedit());
78387308
78397309 std::unique_ptr<Session> session(new Session(engine_.get()));
78407310 InitSessionToPrecomposition(session.get());
7841 // "ゔ"
7842 const char kInput[] = "\xE3\x82\x94";
7311 const char kInput[] = "ゔ";
78437312
78447313 commands::Command command;
78457314 SetupCommandForReverseConversion(kInput, command.mutable_input());
78627331 TEST_F(SessionTest, EscapeFromCompositionAfterConvertReverse) {
78637332 std::unique_ptr<Session> session(new Session(engine_.get()));
78647333 InitSessionToPrecomposition(session.get());
7865 // "阿伊宇江於"
7866 const char kKanjiAiueo[] =
7867 "\xe9\x98\xbf\xe4\xbc\x8a\xe5\xae\x87\xe6\xb1\x9f\xe6\x96\xbc";
7334 const char kKanjiAiueo[] = "阿伊宇江於";
78687335
78697336 commands::Command command;
78707337 SetupCommandForReverseConversion(kKanjiAiueo, command.mutable_input());
7871 SetupMockForReverseConversion(kKanjiAiueo, kAiueo);
7338 SetupMockForReverseConversion(kKanjiAiueo, "あいうえお");
78727339
78737340 // Conversion Reverse
78747341 EXPECT_TRUE(session->SendCommand(&command));
78817348
78827349 // Escape in composition state
78837350 SendKey("a", session.get(), &command);
7884 // "あ"
7885 EXPECT_EQ(kHiraganaA, GetComposition(command));
7351 EXPECT_EQ("あ", GetComposition(command));
78867352
78877353 SendKey("ESC", session.get(), &command);
78887354 EXPECT_FALSE(command.output().has_preedit());
78927358 TEST_F(SessionTest, ConvertReverseFromOffState) {
78937359 std::unique_ptr<Session> session(new Session(engine_.get()));
78947360 InitSessionToPrecomposition(session.get());
7895 // "阿伊宇江於"
7896 const string kanji_aiueo =
7897 "\xe9\x98\xbf\xe4\xbc\x8a\xe5\xae\x87\xe6\xb1\x9f\xe6\x96\xbc";
7361 const string kanji_aiueo = "阿伊宇江於";
78987362
78997363 // IMEOff
79007364 commands::Command command;
79017365 SendSpecialKey(commands::KeyEvent::OFF, session.get(), &command);
79027366
79037367 SetupCommandForReverseConversion(kanji_aiueo, command.mutable_input());
7904 SetupMockForReverseConversion(kanji_aiueo, kAiueo);
7368 SetupMockForReverseConversion(kanji_aiueo, "あいうえお");
79057369 EXPECT_TRUE(session->SendCommand(&command));
79067370 EXPECT_TRUE(command.output().consumed());
79077371 }
79127376 InitSessionToPrecomposition(session.get());
79137377
79147378 commands::Command command;
7915 SetupCommandForReverseConversion(kAiueo, command.mutable_input());
7916 SetupMockForReverseConversion(kAiueo, kAiueo);
7379 SetupCommandForReverseConversion("あいうえお", command.mutable_input());
7380 SetupMockForReverseConversion("あいうえお", "あいうえお");
79177381 EXPECT_TRUE(session->SendCommand(&command));
79187382 EXPECT_TRUE(command.output().consumed());
7919 EXPECT_EQ(kAiueo, command.output().preedit().segment(0).value());
7920 EXPECT_EQ(kAiueo,
7383 EXPECT_EQ("あいうえお", command.output().preedit().segment(0).value());
7384 EXPECT_EQ("あいうえお",
79217385 command.output().all_candidate_words().candidates(0).value());
79227386 EXPECT_TRUE(command.output().has_candidates());
79237387 EXPECT_GT(command.output().candidates().candidate_size(), 0);
79247388
79257389 SendKey("ESC", session.get(), &command);
79267390 SendKey("a", session.get(), &command);
7927 // "あいうえおあ"
7928 EXPECT_EQ(string(kAiueo) + kHiraganaA,
7929 command.output().preedit().segment(0).value());
7391 EXPECT_EQ("あいうえおあ", command.output().preedit().segment(0).value());
79307392 EXPECT_FALSE(command.output().has_result());
79317393 }
79327394
81587620 EXPECT_TRUE(command.output().consumed());
81597621 EXPECT_FALSE(command.output().has_preedit());
81607622 EXPECT_EQ("", GetComposition(command));
8161 // " " (full-width space)
8162 EXPECT_RESULT(kFullWidthSpace, command);
7623 EXPECT_RESULT(" ", command); // Full-width space
81637624 EXPECT_EQ(ImeContext::PRECOMPOSITION, session.context().state());
81647625 }
81657626
81747635 EXPECT_TRUE(command.output().consumed());
81757636 EXPECT_FALSE(command.output().has_result());
81767637 EXPECT_EQ(commands::HIRAGANA, command.output().mode());
8177 // "あ"
8178 EXPECT_PREEDIT(kHiraganaA, command);
7638 EXPECT_PREEDIT("あ", command);
81797639 EXPECT_EQ(ImeContext::COMPOSITION, session.context().state());
81807640 }
81817641
83717831 SetSendKeyCommand("3", &command);
83727832 command.mutable_input()->mutable_config()->CopyFrom(overriding_config);
83737833 session.SendKey(&command);
8374 // "さ"
8375 EXPECT_EQ("\xE3\x81\x95", GetComposition(command));
7834 EXPECT_EQ("さ", GetComposition(command));
83767835
83777836 SetSendKeyCommand("3", &command);
83787837 command.mutable_input()->mutable_config()->CopyFrom(overriding_config);
83797838 session.SendKey(&command);
8380 // "し"
8381 EXPECT_EQ("\xE3\x81\x97", GetComposition(command));
7839 EXPECT_EQ("し", GetComposition(command));
83827840
83837841 SetSendCommandCommand(commands::SessionCommand::UNDO_OR_REWIND, &command);
83847842 command.mutable_input()->mutable_config()->CopyFrom(overriding_config);
83857843 session.SendCommand(&command);
8386 // "さ"
8387 EXPECT_EQ("\xE3\x81\x95", GetComposition(command));
7844 EXPECT_EQ("さ", GetComposition(command));
83887845 EXPECT_TRUE(command.output().consumed());
83897846 command.Clear();
83907847
83917848 SetSendCommandCommand(commands::SessionCommand::UNDO_OR_REWIND, &command);
83927849 command.mutable_input()->mutable_config()->CopyFrom(overriding_config);
83937850 session.SendCommand(&command);
8394 // "そ"
8395 EXPECT_EQ("\xE3\x81\x9D", GetComposition(command));
7851 EXPECT_EQ("そ", GetComposition(command));
83967852 EXPECT_TRUE(command.output().consumed());
83977853 command.Clear();
83987854 }
84187874 SetSendKeyCommand("3", &command);
84197875 command.mutable_input()->mutable_config()->CopyFrom(overriding_config);
84207876 session.SendKey(&command);
8421 // "さ"
8422 EXPECT_EQ("\xE3\x81\x95", GetComposition(command));
7877 EXPECT_EQ("さ", GetComposition(command));
84237878
84247879 SetSendKeyCommand("*", &command);
84257880 command.mutable_input()->mutable_config()->CopyFrom(overriding_config);
84267881 session.SendKey(&command);
8427 // "ざ"
8428 EXPECT_EQ("\xE3\x81\x96", GetComposition(command));
7882 EXPECT_EQ("ざ", GetComposition(command));
84297883
84307884 SetSendCommandCommand(commands::SessionCommand::UNDO_OR_REWIND, &command);
84317885 command.mutable_input()->mutable_config()->CopyFrom(overriding_config);
84327886 session.SendCommand(&command);
8433 // "ざ"
8434 EXPECT_EQ("\xE3\x81\x96", GetComposition(command));
7887 EXPECT_EQ("ざ", GetComposition(command));
84357888 EXPECT_TRUE(command.output().consumed());
84367889
84377890
84387891 SetSendKeyCommand("*", &command);
84397892 command.mutable_input()->mutable_config()->CopyFrom(overriding_config);
84407893 session.SendKey(&command);
8441 // "さ"
8442 EXPECT_EQ("\xE3\x81\x95", GetComposition(command));
7894 EXPECT_EQ("さ", GetComposition(command));
84437895 command.Clear();
84447896
84457897 SetSendCommandCommand(commands::SessionCommand::UNDO_OR_REWIND, &command);
84467898 command.mutable_input()->mutable_config()->CopyFrom(overriding_config);
84477899 session.SendCommand(&command);
8448 // "さ"
8449 EXPECT_EQ("\xE3\x81\x95", GetComposition(command));
7900 EXPECT_EQ("さ", GetComposition(command));
84507901 EXPECT_TRUE(command.output().consumed());
84517902 command.Clear();
84527903 }
85017952 command.Clear();
85027953 session.Convert(&command);
85037954 EXPECT_FALSE(command.output().has_result());
8504 // "あいうえお"
8505 EXPECT_PREEDIT(kAiueo, command);
7955 EXPECT_PREEDIT("あいうえお", command);
85067956
85077957 GetConverterMock()->SetCommitSegmentValue(&segments, true);
85087958 command.Clear();
85097959 session.Commit(&command);
85107960 EXPECT_FALSE(command.output().has_preedit());
8511 // "あいうえお"
8512 EXPECT_RESULT(kAiueo, command);
7961 EXPECT_RESULT("あいうえお", command);
85137962
85147963 command.Clear();
85157964 SetSendCommandCommand(commands::SessionCommand::UNDO_OR_REWIND, &command);
85197968 EXPECT_TRUE(command.output().has_deletion_range());
85207969 EXPECT_EQ(-5, command.output().deletion_range().offset());
85217970 EXPECT_EQ(5, command.output().deletion_range().length());
8522 // "あいうえお"
8523 EXPECT_PREEDIT(kAiueo, command);
7971 EXPECT_PREEDIT("あいうえお", command);
85247972 EXPECT_TRUE(command.output().consumed());
85257973
85267974 // Undo twice - do nothing and keep the previous status.
85297977 session.SendCommand(&command);
85307978 EXPECT_FALSE(command.output().has_result());
85317979 EXPECT_FALSE(command.output().has_deletion_range());
8532 // "あいうえお"
8533 EXPECT_PREEDIT(kAiueo, command);
7980 EXPECT_PREEDIT("あいうえお", command);
85347981 EXPECT_TRUE(command.output().consumed());
85357982 }
85367983
85558002 SetSendKeyCommand("1", &command);
85568003 command.mutable_input()->mutable_config()->CopyFrom(overriding_config);
85578004 session.SendKey(&command);
8558 // "あ"
8559 EXPECT_EQ(kHiraganaA, GetComposition(command));
8005 EXPECT_EQ("あ", GetComposition(command));
85608006 command.Clear();
85618007
85628008 session.Commit(&command);
85638009 EXPECT_FALSE(command.output().has_preedit());
8564 // "あ"
8565 EXPECT_RESULT(kHiraganaA, command);
8010 EXPECT_RESULT("あ", command);
85668011
85678012 // Produce "か" in composition.
85688013 SetSendKeyCommand("2", &command);
85698014 command.mutable_input()->mutable_config()->CopyFrom(overriding_config);
85708015 session.SendKey(&command);
8571 // "か"
8572 EXPECT_EQ("\xE3\x81\x8B", GetComposition(command));
8016 EXPECT_EQ("か", GetComposition(command));
85738017 EXPECT_TRUE(command.output().consumed());
85748018 command.Clear();
85758019
85778021 SetSendCommandCommand(commands::SessionCommand::UNDO_OR_REWIND, &command);
85788022 command.mutable_input()->mutable_config()->CopyFrom(overriding_config);
85798023 session.SendCommand(&command);
8580 // "こ"
8581 EXPECT_PREEDIT("\xE3\x81\x93", command);
8024 EXPECT_PREEDIT("こ", command);
85828025 EXPECT_TRUE(command.output().consumed());
85838026 command.Clear();
85848027 }
86118054 SetSendKeyCommand("!", &command);
86128055 session.SendKey(&command);
86138056 EXPECT_EQ(ImeContext::COMPOSITION, session.context().state());
8614 // "!"
8615 EXPECT_EQ("\xef\xbc\x81", GetComposition(command));
8057 EXPECT_EQ("!", GetComposition(command));
86168058
86178059 ASSERT_TRUE(command.output().has_candidates());
86188060
86198061 std::vector<int> ids;
8620 // "!"
8621 FindCandidateIDs(
8622 command.output().candidates(), "\xef\xbc\x81", &ids);
8062 FindCandidateIDs(command.output().candidates(), "!", &ids);
86238063 EXPECT_GE(1, ids.size());
86248064
86258065 FindCandidateIDs(command.output().candidates(), "!", &ids);
86398079 EXPECT_TRUE(command.output().has_deletion_range());
86408080 ASSERT_TRUE(command.output().has_candidates());
86418081
8642 // "!"
8643 FindCandidateIDs(
8644 command.output().candidates(), "\xef\xbc\x81", &ids);
8082 FindCandidateIDs(command.output().candidates(), "!", &ids);
86458083 EXPECT_GE(1, ids.size());
86468084
86478085 FindCandidateIDs(command.output().candidates(), "!", &ids);
88158253 TEST_F(SessionTest, CommitHead) {
88168254 std::unique_ptr<Session> session(new Session(engine_.get()));
88178255 composer::Table table;
8818 // "も"
8819 table.AddRule("mo", "\xe3\x82\x82", "");
8820 // "ず"
8821 table.AddRule("zu", "\xe3\x81\x9a", "");
8256 table.AddRule("mo", "も", "");
8257 table.AddRule("zu", "ず", "");
88228258
88238259 session->get_internal_composer_only_for_unittest()->SetTable(&table);
88248260
88268262 commands::Command command;
88278263
88288264 InsertCharacterChars("moz", session.get(), &command);
8829 // 'もz'
8830 EXPECT_EQ("\xe3\x82\x82\xef\xbd\x9a", GetComposition(command));
8265 EXPECT_EQ("もz", GetComposition(command));
88318266 command.Clear();
88328267 session->CommitHead(1, &command);
88338268 EXPECT_EQ(commands::Result_ResultType_STRING,
88348269 command.output().result().type());
8835 EXPECT_EQ("\xe3\x82\x82", command.output().result().value()); // 'も'
8836 EXPECT_EQ("\xef\xbd\x9a", GetComposition(command)); // 'z'
8270 EXPECT_EQ("も", command.output().result().value());
8271 EXPECT_EQ("z", GetComposition(command));
88378272 InsertCharacterChars("u", session.get(), &command);
8838 // 'ず'
8839 EXPECT_EQ("\xe3\x81\x9a", GetComposition(command));
8273 EXPECT_EQ("ず", GetComposition(command));
88408274 }
88418275
88428276 TEST_F(SessionTest, PasswordWithToggleAlpabetInput) {
94938927 segments_a_conv.set_request_type(Segments::CONVERSION);
94948928 Segment *segment;
94958929 segment = segments_a_conv.add_segment();
9496 segment->set_key(kHiraganaA);
9497 segment->add_candidate()->value = kHiraganaA;
8930 segment->set_key("あ");
8931 segment->add_candidate()->value = "あ";
94988932 }
94998933 GetConverterMock()->SetStartConversionForRequest(&segments_a_conv, true);
95008934
95588992 EXPECT_TRUE(SendKey("d", session.get(), &command));
95598993 EXPECT_TRUE(SendKey("e", session.get(), &command));
95608994 EXPECT_TRUE(SendKey("l", session.get(), &command));
9561 EXPECT_PREEDIT("\xE3\x81\xA7\xEF\xBD\x8C", command); // "でl"
8995 EXPECT_PREEDIT("でl", command);
95628996
95638997 // Start prediction. Preedit = "DeleteHistory".
95648998 command.Clear();
95719005 // composition state and preedit gets back to "でl" again.
95729006 EXPECT_TRUE(SendKey("Ctrl Delete", session.get(), &command));
95739007 EXPECT_EQ(ImeContext::COMPOSITION, session->context().state());
9574 EXPECT_PREEDIT("\xE3\x81\xA7\xEF\xBD\x8C", command); // "でl"
9008 EXPECT_PREEDIT("でl", command);
95759009 }
95769010
95779011 TEST_F(SessionTest, SendKeyWithKeyString_Direct) {
95799013 InitSessionToDirect(&session);
95809014
95819015 commands::Command command;
9582 const char kZa[] = "\xE3\x81\x96"; // "ざ"
9016 const char kZa[] = "ざ";
95839017 SetSendKeyCommandWithKeyString(kZa, &command);
95849018 EXPECT_TRUE(session.TestSendKey(&command));
95859019 EXPECT_FALSE(command.output().consumed());
95969030
95979031 // Test for precomposition state.
95989032 EXPECT_EQ(ImeContext::PRECOMPOSITION, session.context().state());
9599 const char kZa[] = "\xE3\x81\x96"; // "ざ"
9033 const char kZa[] = "ざ";
96009034 SetSendKeyCommandWithKeyString(kZa, &command);
96019035 EXPECT_TRUE(session.TestSendKey(&command));
96029036 EXPECT_TRUE(command.output().consumed());
96099043
96109044 // Test for composition state.
96119045 EXPECT_EQ(ImeContext::COMPOSITION, session.context().state());
9612 const char kOnsenManju[] = "\xE2\x99\xA8\xE9\xA5\x85\xE9\xA0\xAD"; // "♨饅頭"
9046 const char kOnsenManju[] = "♨饅頭";
96139047 SetSendKeyCommandWithKeyString(kOnsenManju, &command);
96149048 EXPECT_TRUE(session.TestSendKey(&command));
96159049 EXPECT_TRUE(command.output().consumed());
97959229 command.mutable_input()->mutable_command()->set_composition_mode(
97969230 commands::FULL_KATAKANA);
97979231 ASSERT_TRUE(session->SendCommand(&command));
9798 EXPECT_RESULT(kAiueo, command);
9232 EXPECT_RESULT("あいうえお", command);
97999233 EXPECT_TRUE(command.output().consumed());
98009234 ASSERT_TRUE(command.output().has_status());
98019235 EXPECT_FALSE(command.output().status().activated());