1 // Copyright 2010-2018, Google Inc.
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are
6 // met:
7 //
8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above
11 // copyright notice, this list of conditions and the following disclaimer
12 // in the documentation and/or other materials provided with the
13 // distribution.
14 // * Neither the name of Google Inc. nor the names of its
15 // contributors may be used to endorse or promote products derived from
16 // this software without specific prior written permission.
17 //
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30 #include "converter/key_corrector.h"
31
32 #include <string>
33
34 #include "base/port.h"
35 #include "testing/base/public/gunit.h"
36
37 namespace mozc {
38 namespace {
39
TEST(KeyCorrectorTest,KeyCorrectorBasicTest)40 TEST(KeyCorrectorTest, KeyCorrectorBasicTest) {
41 EXPECT_FALSE(KeyCorrector::IsValidPosition(
42 KeyCorrector::InvalidPosition()));
43
44 EXPECT_TRUE(KeyCorrector::IsInvalidPosition(
45 KeyCorrector::InvalidPosition()));
46
47 {
48 KeyCorrector corrector("", KeyCorrector::KANA, 0);
49 EXPECT_EQ(KeyCorrector::KANA, corrector.mode());
50 EXPECT_FALSE(corrector.IsAvailable());
51 }
52
53 {
54 KeyCorrector corrector("", KeyCorrector::ROMAN, 0);
55 EXPECT_EQ(KeyCorrector::ROMAN, corrector.mode());
56 EXPECT_FALSE(corrector.IsAvailable());
57 }
58
59 {
60 KeyCorrector corrector("てすと", KeyCorrector::ROMAN, 0);
61 EXPECT_TRUE(corrector.IsAvailable());
62 EXPECT_EQ("てすと", corrector.original_key());
63 corrector.Clear();
64 EXPECT_FALSE(corrector.IsAvailable());
65 }
66 }
67
TEST(KeyCorrectorTest,KeyCorrectorKanaTest)68 TEST(KeyCorrectorTest, KeyCorrectorKanaTest) {
69 const string input = "みんあであそぼう";
70 KeyCorrector corrector(input, KeyCorrector::KANA, 0);
71 EXPECT_FALSE(corrector.IsAvailable());
72 EXPECT_EQ("", corrector.corrected_key());
73 EXPECT_EQ("", corrector.original_key());
74
75 EXPECT_EQ(KeyCorrector::InvalidPosition(),
76 corrector.GetCorrectedPosition(0));
77
78 EXPECT_EQ(KeyCorrector::InvalidPosition(),
79 corrector.GetOriginalPosition(0));
80 }
81
TEST(KeyCorrectorTest,KeyCorrectorRomanTest)82 TEST(KeyCorrectorTest, KeyCorrectorRomanTest) {
83 {
84 const string input = "ん";
85 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
86 EXPECT_TRUE(corrector.IsAvailable());
87 EXPECT_EQ("ん", corrector.corrected_key());
88 }
89
90 {
91 const string input = "かん";
92 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
93 EXPECT_TRUE(corrector.IsAvailable());
94 EXPECT_EQ("かん", corrector.corrected_key());
95 EXPECT_EQ(input, corrector.original_key());
96 }
97
98 {
99 const string input = "かに";
100 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
101 EXPECT_TRUE(corrector.IsAvailable());
102 EXPECT_EQ("かに", corrector.corrected_key());
103 }
104
105 {
106 const string input = "かm";
107 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
108 EXPECT_TRUE(corrector.IsAvailable());
109 EXPECT_EQ("かm", corrector.corrected_key());
110 }
111
112 {
113 const string input = "みんあであそぼう";
114 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
115 EXPECT_TRUE(corrector.IsAvailable());
116 EXPECT_EQ("みんなであそぼう", corrector.corrected_key());
117 EXPECT_EQ(input, corrector.original_key());
118 }
119
120 {
121 // don't rewrite 1st "ん"
122 const string input = "んあであそぼう";
123 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
124 EXPECT_TRUE(corrector.IsAvailable());
125 EXPECT_EQ("んあであそぼう", corrector.corrected_key());
126 EXPECT_EQ(input, corrector.original_key());
127 }
128
129 {
130 const string input = "こんかいのみんあはこんんでた";
131 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
132 EXPECT_TRUE(corrector.IsAvailable());
133 EXPECT_EQ("こんかいのみんなはこんでた", corrector.corrected_key());
134 EXPECT_EQ(input, corrector.original_key());
135 }
136
137 {
138 const string input = "みんあみんいみんうみんえみんおみんんか";
139 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
140 EXPECT_TRUE(corrector.IsAvailable());
141 EXPECT_EQ("みんなみんにみんぬみんねみんのみんか",
142 corrector.corrected_key());
143 EXPECT_EQ(input, corrector.original_key());
144 }
145
146 {
147 const string input = "こんんにちは";
148 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
149 EXPECT_TRUE(corrector.IsAvailable());
150 EXPECT_EQ("こんにちは", corrector.corrected_key());
151 EXPECT_EQ(input, corrector.original_key());
152 }
153
154 {
155 const string input = "こんんいちは";
156 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
157 EXPECT_TRUE(corrector.IsAvailable());
158 EXPECT_EQ("こんにちは", corrector.corrected_key());
159 EXPECT_EQ(input, corrector.original_key());
160 }
161
162 {
163 const string input = "しぜんんお";
164 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
165 EXPECT_TRUE(corrector.IsAvailable());
166 EXPECT_EQ("しぜんの", corrector.corrected_key());
167 EXPECT_EQ(input, corrector.original_key());
168 }
169
170 {
171 const string input = "あんんんたい";
172 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
173 EXPECT_TRUE(corrector.IsAvailable());
174 EXPECT_EQ("あんんんたい", corrector.corrected_key());
175 EXPECT_EQ(input, corrector.original_key());
176 }
177
178 {
179 const string input = "せにょう";
180 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
181 EXPECT_TRUE(corrector.IsAvailable());
182 EXPECT_EQ("せんよう", corrector.corrected_key());
183 EXPECT_EQ(input, corrector.original_key());
184 }
185
186 {
187 const string input = "せにゃうせにゅうせにょう";
188 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
189 EXPECT_TRUE(corrector.IsAvailable());
190 EXPECT_EQ("せんやうせんゆうせんよう", corrector.corrected_key());
191 EXPECT_EQ(input, corrector.original_key());
192 }
193
194 {
195 const string input = "こんんにちはせにょう";
196 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
197 EXPECT_TRUE(corrector.IsAvailable());
198 EXPECT_EQ("こんにちはせんよう", corrector.corrected_key());
199 EXPECT_EQ(input, corrector.original_key());
200 }
201
202 {
203 const string input = "おんあのここんいちは";
204 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
205 EXPECT_TRUE(corrector.IsAvailable());
206 EXPECT_EQ("おんなのここんにちは", corrector.corrected_key());
207 EXPECT_EQ(input, corrector.original_key());
208 }
209
210 {
211 const string input = "きっって";
212 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
213 EXPECT_TRUE(corrector.IsAvailable());
214 EXPECT_EQ("きって", corrector.corrected_key());
215 EXPECT_EQ(input, corrector.original_key());
216 }
217
218 {
219 const string input = "きっっって";
220 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
221 EXPECT_TRUE(corrector.IsAvailable());
222 EXPECT_EQ("きっっって", corrector.corrected_key());
223 EXPECT_EQ(input, corrector.original_key());
224 }
225
226 {
227 const string input = "きっっっ";
228 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
229 EXPECT_TRUE(corrector.IsAvailable());
230 EXPECT_EQ("きっっっ", corrector.corrected_key());
231 EXPECT_EQ(input, corrector.original_key());
232 }
233
234 {
235 const string input = "っっ";
236 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
237 EXPECT_TRUE(corrector.IsAvailable());
238 EXPECT_EQ("っっ", corrector.corrected_key());
239 EXPECT_EQ(input, corrector.original_key());
240 }
241
242 {
243 const string input = "しmばし";
244 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
245 EXPECT_TRUE(corrector.IsAvailable());
246 EXPECT_EQ("しんばし", corrector.corrected_key());
247 EXPECT_EQ(input, corrector.original_key());
248 }
249
250 {
251 const string input = "しmはししmぱしー";
252 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
253 EXPECT_TRUE(corrector.IsAvailable());
254 EXPECT_EQ("しmはししんぱしー", corrector.corrected_key());
255 EXPECT_EQ(input, corrector.original_key());
256 }
257
258 {
259 const string input = "ちゅごく";
260 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
261 EXPECT_TRUE(corrector.IsAvailable());
262 EXPECT_EQ("ちゅうごく", corrector.corrected_key());
263 EXPECT_EQ(input, corrector.original_key());
264 }
265
266 {
267 const string input = "きゅきゅしゃ";
268 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
269 EXPECT_TRUE(corrector.IsAvailable());
270 EXPECT_EQ("きゅうきゅうしゃ", corrector.corrected_key());
271 EXPECT_EQ(input, corrector.original_key());
272 }
273 }
274
TEST(KeyCorrectorTest,KeyCorrectorRomanPositionTest)275 TEST(KeyCorrectorTest, KeyCorrectorRomanPositionTest) {
276 {
277 const string input = "みんあであそぼう";
278 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
279 EXPECT_TRUE(corrector.IsAvailable());
280 EXPECT_EQ("みんなであそぼう", corrector.corrected_key());
281
282 EXPECT_EQ(0, corrector.GetCorrectedPosition(0));
283 EXPECT_EQ(1, corrector.GetCorrectedPosition(1));
284
285 EXPECT_EQ(3, corrector.GetCorrectedPosition(3));
286 EXPECT_EQ(6, corrector.GetCorrectedPosition(6));
287
288 EXPECT_EQ(9, corrector.GetCorrectedPosition(9));
289 EXPECT_EQ(12, corrector.GetCorrectedPosition(12));
290 EXPECT_EQ(KeyCorrector::InvalidPosition(),
291 corrector.GetCorrectedPosition(30));
292
293 EXPECT_EQ(0, corrector.GetOriginalPosition(0));
294 EXPECT_EQ(1, corrector.GetOriginalPosition(1));
295
296 EXPECT_EQ(3, corrector.GetOriginalPosition(3));
297 EXPECT_EQ(6, corrector.GetOriginalPosition(6));
298
299 EXPECT_EQ(9, corrector.GetOriginalPosition(9));
300 EXPECT_EQ(12, corrector.GetOriginalPosition(12));
301 EXPECT_EQ(KeyCorrector::InvalidPosition(),
302 corrector.GetOriginalPosition(30));
303 }
304
305 {
306 const string input = "こんんにちは";
307 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
308 EXPECT_TRUE(corrector.IsAvailable());
309 EXPECT_EQ("こんにちは", corrector.corrected_key());
310
311 EXPECT_EQ(0, corrector.GetCorrectedPosition(0));
312 EXPECT_EQ(KeyCorrector::InvalidPosition(),
313 corrector.GetCorrectedPosition(1));
314
315 EXPECT_EQ(KeyCorrector::InvalidPosition(),
316 corrector.GetCorrectedPosition(3));
317 EXPECT_EQ(KeyCorrector::InvalidPosition(),
318 corrector.GetCorrectedPosition(6));
319
320 EXPECT_EQ(6, corrector.GetCorrectedPosition(9));
321 EXPECT_EQ(9, corrector.GetCorrectedPosition(12));
322 EXPECT_EQ(KeyCorrector::InvalidPosition(),
323 corrector.GetCorrectedPosition(30));
324
325 EXPECT_EQ(0, corrector.GetOriginalPosition(0));
326 EXPECT_EQ(KeyCorrector::InvalidPosition(),
327 corrector.GetOriginalPosition(1));
328
329 EXPECT_EQ(KeyCorrector::InvalidPosition(),
330 corrector.GetOriginalPosition(3));
331 EXPECT_EQ(9, corrector.GetOriginalPosition(6));
332
333 EXPECT_EQ(12, corrector.GetOriginalPosition(9));
334 EXPECT_EQ(15, corrector.GetOriginalPosition(12));
335 EXPECT_EQ(KeyCorrector::InvalidPosition(),
336 corrector.GetOriginalPosition(30));
337 }
338
339 {
340 const string input = "こんんにちはせにょう";
341 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
342 EXPECT_TRUE(corrector.IsAvailable());
343 EXPECT_EQ("こんにちはせんよう", corrector.corrected_key());
344
345 EXPECT_EQ(0, corrector.GetCorrectedPosition(0));
346 EXPECT_EQ(KeyCorrector::InvalidPosition(),
347 corrector.GetCorrectedPosition(3));
348 EXPECT_EQ(6, corrector.GetCorrectedPosition(9));
349 EXPECT_EQ(9, corrector.GetCorrectedPosition(12));
350 EXPECT_EQ(21, corrector.GetCorrectedPosition(24));
351 EXPECT_EQ(24, corrector.GetCorrectedPosition(27));
352
353 EXPECT_EQ(0, corrector.GetOriginalPosition(0));
354 EXPECT_EQ(KeyCorrector::InvalidPosition(),
355 corrector.GetOriginalPosition(3));
356 EXPECT_EQ(9, corrector.GetOriginalPosition(6));
357 EXPECT_EQ(27, corrector.GetOriginalPosition(24));
358 EXPECT_EQ(24, corrector.GetOriginalPosition(21));
359 }
360 }
361
TEST(KeyCorrectorTest,KeyCorrectorRomanCorrectedPrefixTest)362 TEST(KeyCorrectorTest, KeyCorrectorRomanCorrectedPrefixTest) {
363 {
364 const string input = "てすと";
365 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
366 EXPECT_TRUE(corrector.IsAvailable());
367 size_t length = 0;
368
369 // same as the original key
370 EXPECT_TRUE(NULL == corrector.GetCorrectedPrefix(0, &length));
371 EXPECT_TRUE(NULL == corrector.GetCorrectedPrefix(1, &length));
372 EXPECT_TRUE(NULL == corrector.GetCorrectedPrefix(2, &length));
373 EXPECT_TRUE(NULL == corrector.GetCorrectedPrefix(3, &length));
374 }
375
376 {
377 const string input = "みんあであそぼう";
378 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
379 EXPECT_TRUE(corrector.IsAvailable());
380 EXPECT_EQ("みんなであそぼう", corrector.corrected_key());
381
382 const char *output = NULL;
383 size_t length = 0;
384
385 output = corrector.GetCorrectedPrefix(0, &length);
386 EXPECT_EQ("みんなであそぼう", string(output, length));
387
388 output = corrector.GetCorrectedPrefix(3, &length);
389 EXPECT_EQ("んなであそぼう", string(output, length));
390
391 output = corrector.GetCorrectedPrefix(6, &length);
392 EXPECT_EQ("なであそぼう", string(output, length));
393
394 output = corrector.GetCorrectedPrefix(9, &length);
395 // same
396 EXPECT_TRUE(NULL == output);
397 }
398
399 {
400 const string input = "こんんにちは";
401 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
402 EXPECT_TRUE(corrector.IsAvailable());
403 EXPECT_EQ("こんにちは", corrector.corrected_key());
404
405 const char *output = NULL;
406 size_t length = 0;
407
408 output = corrector.GetCorrectedPrefix(0, &length);
409 EXPECT_EQ("こんにちは", string(output, length));
410
411 output = corrector.GetCorrectedPrefix(3, &length);
412 EXPECT_TRUE(NULL == output);
413
414 output = corrector.GetCorrectedPrefix(6, &length);
415 EXPECT_TRUE(NULL == output);
416
417 output = corrector.GetCorrectedPrefix(9, &length);
418 EXPECT_TRUE(NULL == output);
419 }
420
421 {
422 const string input = "こんんにちはせにょう";
423 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
424 EXPECT_TRUE(corrector.IsAvailable());
425 EXPECT_EQ("こんにちはせんよう", corrector.corrected_key());
426
427 const char *output = NULL;
428 size_t length = 0;
429
430 output = corrector.GetCorrectedPrefix(0, &length);
431 EXPECT_EQ("こんにちはせんよう", string(output, length));
432
433 output = corrector.GetCorrectedPrefix(3, &length);
434 EXPECT_TRUE(NULL == output);
435
436 output = corrector.GetCorrectedPrefix(6, &length);
437 EXPECT_TRUE(NULL == output);
438
439 output = corrector.GetCorrectedPrefix(9, &length);
440 EXPECT_EQ("にちはせんよう", string(output, length));
441 }
442 }
443
TEST(KeyCorrectorTest,KeyCorrectorRomanGetOriginalOffsetTest)444 TEST(KeyCorrectorTest, KeyCorrectorRomanGetOriginalOffsetTest) {
445 {
446 const string input = "てすと";
447 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
448 EXPECT_TRUE(corrector.IsAvailable());
449 EXPECT_EQ(3, corrector.GetOriginalOffset(0, 3));
450 EXPECT_EQ(6, corrector.GetOriginalOffset(0, 6));
451 EXPECT_EQ(9, corrector.GetOriginalOffset(0, 9));
452
453 EXPECT_EQ(3, corrector.GetOriginalOffset(3, 3));
454 EXPECT_EQ(6, corrector.GetOriginalOffset(3, 6));
455 }
456
457 {
458 const string input = "みんあ";
459 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
460 EXPECT_TRUE(corrector.IsAvailable());
461 EXPECT_EQ(3, corrector.GetOriginalOffset(0, 3));
462 EXPECT_EQ(6, corrector.GetOriginalOffset(0, 6));
463 EXPECT_EQ(9, corrector.GetOriginalOffset(0, 9));
464 }
465
466 {
467 const string input = "きっって";
468 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
469 EXPECT_TRUE(corrector.IsAvailable());
470 EXPECT_EQ(12, corrector.GetOriginalOffset(0, 9));
471 }
472
473 {
474 const string input = "こんんにちは";
475 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
476 EXPECT_TRUE(corrector.IsAvailable());
477 EXPECT_EQ("こんにちは", corrector.corrected_key());
478
479 EXPECT_EQ(KeyCorrector::InvalidPosition(),
480 corrector.GetOriginalOffset(0, 3));
481 EXPECT_EQ(9, corrector.GetOriginalOffset(0, 6));
482 EXPECT_EQ(12, corrector.GetOriginalOffset(0, 9));
483
484 EXPECT_EQ(KeyCorrector::InvalidPosition(),
485 corrector.GetOriginalOffset(3, 3));
486
487 EXPECT_EQ(KeyCorrector::InvalidPosition(),
488 corrector.GetOriginalOffset(3, 6));
489
490 EXPECT_EQ(KeyCorrector::InvalidPosition(),
491 corrector.GetOriginalOffset(6, 3));
492
493 EXPECT_EQ(3, corrector.GetOriginalOffset(9, 3));
494
495 EXPECT_EQ(6, corrector.GetOriginalOffset(9, 6));
496 }
497 }
498
499 // Check if UCS4 is supported. b/3386634
TEST(KeyCorrectorTest,UCS4IsAvailable)500 TEST(KeyCorrectorTest, UCS4IsAvailable) {
501 {
502 const string input = ""; // UCS4 char in UTF8
503 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
504 EXPECT_TRUE(corrector.IsAvailable());
505 }
506
507 {
508 const string input = "こ"; // UCS2 char in UTF8
509 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
510 EXPECT_TRUE(corrector.IsAvailable());
511 }
512 }
513
TEST(KeyCorrectorTest,UCS4Test)514 TEST(KeyCorrectorTest, UCS4Test) {
515 {
516 const string input = "みんあ";
517 KeyCorrector corrector(input, KeyCorrector::ROMAN, 0);
518 EXPECT_TRUE(corrector.IsAvailable());
519 EXPECT_EQ(7, corrector.GetOriginalOffset(0, 7));
520 EXPECT_EQ(10, corrector.GetOriginalOffset(0, 10));
521 EXPECT_EQ(13, corrector.GetOriginalOffset(0, 13));
522 }
523 }
524
525 // Should not rewrite the character which is at the beginning of current input
TEST(KeyCorrectorTest,Bug3046266Test)526 TEST(KeyCorrectorTest, Bug3046266Test) {
527 {
528 const string input = "かんあか";
529 KeyCorrector corrector(input, KeyCorrector::ROMAN, 6); // history_size = 6
530 EXPECT_TRUE(corrector.IsAvailable());
531 size_t length = 0;
532
533 // same as the original key
534 EXPECT_TRUE(NULL == corrector.GetCorrectedPrefix(0, &length));
535 EXPECT_TRUE(NULL == corrector.GetCorrectedPrefix(1, &length));
536 EXPECT_TRUE(NULL == corrector.GetCorrectedPrefix(2, &length));
537 EXPECT_TRUE(NULL == corrector.GetCorrectedPrefix(3, &length));
538 }
539 }
540
541 } // namespace
542 } // namespace mozc
543