OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/base/ime/character_composer.h" | 5 #include "ui/base/ime/character_composer.h" |
6 | 6 |
7 #include "base/utf_string_conversions.h" | 7 #include "base/utf_string_conversions.h" |
8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
9 #include "third_party/gtk+/gdk/gdkkeysyms.h" | 9 #include "third_party/gtk+/gdk/gdkkeysyms.h" |
10 #include "ui/base/events/event_constants.h" | 10 #include "ui/base/events/event_constants.h" |
11 #include "ui/base/glib/glib_integers.h" | 11 #include "ui/base/glib/glib_integers.h" |
12 | 12 |
13 namespace ui { | 13 namespace ui { |
14 | 14 |
15 namespace { | 15 namespace { |
16 | 16 |
17 // Expects key is not filtered and no character is composed. | 17 // Expects key is not filtered and no character is composed. |
18 void ExpectKeyNotFiltered(CharacterComposer* character_composer, | 18 void ExpectKeyNotFiltered(CharacterComposer* character_composer, |
19 uint key, | 19 uint key, |
20 uint flags) { | 20 int flags) { |
21 EXPECT_FALSE(character_composer->FilterKeyPress(key, flags)); | 21 EXPECT_FALSE(character_composer->FilterKeyPress(key, 0, flags)); |
22 EXPECT_TRUE(character_composer->composed_character().empty()); | 22 EXPECT_TRUE(character_composer->composed_character().empty()); |
23 } | 23 } |
24 | 24 |
25 // Expects key is filtered and no character is composed. | 25 // Expects key is filtered and no character is composed. |
26 void ExpectKeyFiltered(CharacterComposer* character_composer, | 26 void ExpectKeyFiltered(CharacterComposer* character_composer, |
27 uint key, | 27 uint key, |
28 uint flags) { | 28 int flags) { |
29 EXPECT_TRUE(character_composer->FilterKeyPress(key, flags)); | 29 EXPECT_TRUE(character_composer->FilterKeyPress(key, 0, flags)); |
30 EXPECT_TRUE(character_composer->composed_character().empty()); | 30 EXPECT_TRUE(character_composer->composed_character().empty()); |
31 } | 31 } |
32 | 32 |
| 33 // Expects key is filtered and no character is composed. |
| 34 void ExpectKeyFilteredWithKeycode(CharacterComposer* character_composer, |
| 35 uint key, |
| 36 uint keycode, |
| 37 int flags) { |
| 38 EXPECT_TRUE(character_composer->FilterKeyPress(key, keycode, flags)); |
| 39 EXPECT_TRUE(character_composer->composed_character().empty()); |
| 40 } |
| 41 |
33 // Expects |expected_character| is composed after sequence [key1, key2]. | 42 // Expects |expected_character| is composed after sequence [key1, key2]. |
34 void ExpectCharacterComposed(CharacterComposer* character_composer, | 43 void ExpectCharacterComposed(CharacterComposer* character_composer, |
35 uint key1, | 44 uint key1, |
36 uint key2, | 45 uint key2, |
37 uint flags, | 46 int flags, |
38 const string16& expected_character) { | 47 const string16& expected_character) { |
39 ExpectKeyFiltered(character_composer, key1, flags); | 48 ExpectKeyFiltered(character_composer, key1, flags); |
40 EXPECT_TRUE(character_composer->FilterKeyPress(key2, flags)); | 49 EXPECT_TRUE(character_composer->FilterKeyPress(key2, 0, flags)); |
41 EXPECT_EQ(expected_character, character_composer->composed_character()); | 50 EXPECT_EQ(expected_character, character_composer->composed_character()); |
42 } | 51 } |
43 | 52 |
44 // Expects |expected_character| is composed after sequence [key1, key2, key3]. | 53 // Expects |expected_character| is composed after sequence [key1, key2, key3]. |
45 void ExpectCharacterComposed(CharacterComposer* character_composer, | 54 void ExpectCharacterComposed(CharacterComposer* character_composer, |
46 uint key1, | 55 uint key1, |
47 uint key2, | 56 uint key2, |
48 uint key3, | 57 uint key3, |
49 uint flags, | 58 int flags, |
50 const string16& expected_character) { | 59 const string16& expected_character) { |
51 ExpectKeyFiltered(character_composer, key1, flags); | 60 ExpectKeyFiltered(character_composer, key1, flags); |
52 ExpectCharacterComposed(character_composer, key2, key3, flags, | 61 ExpectCharacterComposed(character_composer, key2, key3, flags, |
53 expected_character); | 62 expected_character); |
54 } | 63 } |
55 | 64 |
56 // Expects |expected_character| is composed after sequence [key1, key2, key3, | 65 // Expects |expected_character| is composed after sequence [key1, key2, key3, |
57 // key 4]. | 66 // key 4]. |
58 void ExpectCharacterComposed(CharacterComposer* character_composer, | 67 void ExpectCharacterComposed(CharacterComposer* character_composer, |
59 uint key1, | 68 uint key1, |
60 uint key2, | 69 uint key2, |
61 uint key3, | 70 uint key3, |
62 uint key4, | 71 uint key4, |
63 uint flags, | 72 int flags, |
64 const string16& expected_character) { | 73 const string16& expected_character) { |
65 ExpectKeyFiltered(character_composer, key1, flags); | 74 ExpectKeyFiltered(character_composer, key1, flags); |
66 ExpectCharacterComposed(character_composer, key2, key3, key4, flags, | 75 ExpectCharacterComposed(character_composer, key2, key3, key4, flags, |
67 expected_character); | 76 expected_character); |
68 } | 77 } |
69 | 78 |
70 // Expects |expected_character| is composed after sequence [key1, key2, key3, | 79 // Expects |expected_character| is composed after sequence [key1, key2, key3, |
71 // key 4, key5]. | 80 // key 4, key5]. |
72 void ExpectCharacterComposed(CharacterComposer* character_composer, | 81 void ExpectCharacterComposed(CharacterComposer* character_composer, |
73 uint key1, | 82 uint key1, |
74 uint key2, | 83 uint key2, |
75 uint key3, | 84 uint key3, |
76 uint key4, | 85 uint key4, |
77 uint key5, | 86 uint key5, |
78 uint flags, | 87 int flags, |
79 const string16& expected_character) { | 88 const string16& expected_character) { |
80 ExpectKeyFiltered(character_composer, key1, flags); | 89 ExpectKeyFiltered(character_composer, key1, flags); |
81 ExpectCharacterComposed(character_composer, key2, key3, key4, key5, flags, | 90 ExpectCharacterComposed(character_composer, key2, key3, key4, key5, flags, |
82 expected_character); | 91 expected_character); |
83 } | 92 } |
84 | 93 |
85 // Expects |expected_character| is composed after sequence [key1, key2, key3, | 94 // Expects |expected_character| is composed after sequence [key1, key2, key3, |
86 // key 4, key5, key6]. | 95 // key 4, key5, key6]. |
87 void ExpectCharacterComposed(CharacterComposer* character_composer, | 96 void ExpectCharacterComposed(CharacterComposer* character_composer, |
88 uint key1, | 97 uint key1, |
89 uint key2, | 98 uint key2, |
90 uint key3, | 99 uint key3, |
91 uint key4, | 100 uint key4, |
92 uint key5, | 101 uint key5, |
93 uint key6, | 102 uint key6, |
94 uint flags, | 103 int flags, |
95 const string16& expected_character) { | 104 const string16& expected_character) { |
96 ExpectKeyFiltered(character_composer, key1, flags); | 105 ExpectKeyFiltered(character_composer, key1, flags); |
97 ExpectCharacterComposed(character_composer, key2, key3, key4, key5, key6, | 106 ExpectCharacterComposed(character_composer, key2, key3, key4, key5, key6, |
98 flags, expected_character); | 107 flags, expected_character); |
99 } | 108 } |
100 | 109 |
| 110 // Expects |expected_character| is composed after sequence [{key1, keycode1}]. |
| 111 void ExpectCharacterComposedWithKeyCode(CharacterComposer* character_composer, |
| 112 uint key1, uint keycode1, |
| 113 int flags, |
| 114 const string16& expected_character) { |
| 115 EXPECT_TRUE(character_composer->FilterKeyPress(key1, keycode1, flags)); |
| 116 EXPECT_EQ(expected_character, character_composer->composed_character()); |
| 117 } |
| 118 |
101 } // namespace | 119 } // namespace |
102 | 120 |
103 TEST(CharacterComposerTest, InitialState) { | 121 TEST(CharacterComposerTest, InitialState) { |
104 CharacterComposer character_composer; | 122 CharacterComposer character_composer; |
105 EXPECT_TRUE(character_composer.composed_character().empty()); | 123 EXPECT_TRUE(character_composer.composed_character().empty()); |
106 } | 124 } |
107 | 125 |
108 TEST(CharacterComposerTest, NormalKeyIsNotFiltered) { | 126 TEST(CharacterComposerTest, NormalKeyIsNotFiltered) { |
109 CharacterComposer character_composer; | 127 CharacterComposer character_composer; |
110 ExpectKeyNotFiltered(&character_composer, GDK_KEY_B, 0); | 128 ExpectKeyNotFiltered(&character_composer, GDK_KEY_B, 0); |
111 ExpectKeyNotFiltered(&character_composer, GDK_KEY_Z, 0); | 129 ExpectKeyNotFiltered(&character_composer, GDK_KEY_Z, 0); |
112 ExpectKeyNotFiltered(&character_composer, GDK_KEY_c, 0); | 130 ExpectKeyNotFiltered(&character_composer, GDK_KEY_c, 0); |
113 ExpectKeyNotFiltered(&character_composer, GDK_KEY_m, 0); | 131 ExpectKeyNotFiltered(&character_composer, GDK_KEY_m, 0); |
114 ExpectKeyNotFiltered(&character_composer, GDK_KEY_0, 0); | 132 ExpectKeyNotFiltered(&character_composer, GDK_KEY_0, 0); |
115 ExpectKeyNotFiltered(&character_composer, GDK_KEY_1, 0); | 133 ExpectKeyNotFiltered(&character_composer, GDK_KEY_1, 0); |
116 ExpectKeyNotFiltered(&character_composer, GDK_KEY_8, 0); | 134 ExpectKeyNotFiltered(&character_composer, GDK_KEY_8, 0); |
117 } | 135 } |
118 | 136 |
119 TEST(CharacterComposerTest, PartiallyMatchingSequence) { | 137 TEST(CharacterComposerTest, PartiallyMatchingSequence) { |
120 CharacterComposer character_composer; | 138 CharacterComposer character_composer; |
121 | 139 |
122 // Composition with sequence ['dead acute', '1'] will fail. | 140 // Composition with sequence ['dead acute', '1'] will fail. |
123 ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute, 0); | 141 ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute, 0); |
124 EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_1, 0)); | 142 EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_1, 0, 0)); |
125 EXPECT_TRUE(character_composer.composed_character().empty()); | 143 EXPECT_TRUE(character_composer.composed_character().empty()); |
126 | 144 |
127 // Composition with sequence ['dead acute', 'dead circumflex', '1'] will fail. | 145 // Composition with sequence ['dead acute', 'dead circumflex', '1'] will fail. |
128 ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute, 0); | 146 ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute, 0); |
129 ExpectKeyFiltered(&character_composer, GDK_KEY_dead_circumflex, 0); | 147 ExpectKeyFiltered(&character_composer, GDK_KEY_dead_circumflex, 0); |
130 EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_1, 0)); | 148 EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_1, 0, 0)); |
131 EXPECT_TRUE(character_composer.composed_character().empty()); | 149 EXPECT_TRUE(character_composer.composed_character().empty()); |
132 } | 150 } |
133 | 151 |
134 TEST(CharacterComposerTest, FullyMatchingSequences) { | 152 TEST(CharacterComposerTest, FullyMatchingSequences) { |
135 CharacterComposer character_composer; | 153 CharacterComposer character_composer; |
136 // LATIN SMALL LETTER A WITH ACUTE | 154 // LATIN SMALL LETTER A WITH ACUTE |
137 ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, GDK_KEY_a, 0, | 155 ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, GDK_KEY_a, 0, |
138 string16(1, 0x00E1)); | 156 string16(1, 0x00E1)); |
139 // LATIN CAPITAL LETTER A WITH ACUTE | 157 // LATIN CAPITAL LETTER A WITH ACUTE |
140 ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, GDK_KEY_A, 0, | 158 ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, GDK_KEY_A, 0, |
(...skipping 14 matching lines...) Expand all Loading... |
155 // LATIN SMALL LETTER C WITH CEDILLA | 173 // LATIN SMALL LETTER C WITH CEDILLA |
156 ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, GDK_KEY_c, 0, | 174 ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, GDK_KEY_c, 0, |
157 string16(1, 0x00E7)); | 175 string16(1, 0x00E7)); |
158 } | 176 } |
159 | 177 |
160 TEST(CharacterComposerTest, FullyMatchingSequencesAfterMatchingFailure) { | 178 TEST(CharacterComposerTest, FullyMatchingSequencesAfterMatchingFailure) { |
161 CharacterComposer character_composer; | 179 CharacterComposer character_composer; |
162 // Composition with sequence ['dead acute', 'dead circumflex', '1'] will fail. | 180 // Composition with sequence ['dead acute', 'dead circumflex', '1'] will fail. |
163 ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute, 0); | 181 ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute, 0); |
164 ExpectKeyFiltered(&character_composer, GDK_KEY_dead_circumflex, 0); | 182 ExpectKeyFiltered(&character_composer, GDK_KEY_dead_circumflex, 0); |
165 EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_1, 0)); | 183 EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_1, 0, 0)); |
166 EXPECT_TRUE(character_composer.composed_character().empty()); | 184 EXPECT_TRUE(character_composer.composed_character().empty()); |
167 // LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE | 185 // LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE |
168 ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, | 186 ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, |
169 GDK_KEY_dead_circumflex, GDK_KEY_a, 0, | 187 GDK_KEY_dead_circumflex, GDK_KEY_a, 0, |
170 string16(1, 0x1EA5)); | 188 string16(1, 0x1EA5)); |
171 } | 189 } |
172 | 190 |
173 TEST(CharacterComposerTest, ComposedCharacterIsClearedAfterReset) { | 191 TEST(CharacterComposerTest, ComposedCharacterIsClearedAfterReset) { |
174 CharacterComposer character_composer; | 192 CharacterComposer character_composer; |
175 ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, GDK_KEY_a, 0, | 193 ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, GDK_KEY_a, 0, |
176 string16(1, 0x00E1)); | 194 string16(1, 0x00E1)); |
177 character_composer.Reset(); | 195 character_composer.Reset(); |
178 EXPECT_TRUE(character_composer.composed_character().empty()); | 196 EXPECT_TRUE(character_composer.composed_character().empty()); |
179 } | 197 } |
180 | 198 |
181 TEST(CharacterComposerTest, CompositionStateIsClearedAfterReset) { | 199 TEST(CharacterComposerTest, CompositionStateIsClearedAfterReset) { |
182 CharacterComposer character_composer; | 200 CharacterComposer character_composer; |
183 // Even though sequence ['dead acute', 'a'] will compose 'a with acute', | 201 // Even though sequence ['dead acute', 'a'] will compose 'a with acute', |
184 // no character is composed here because of reset. | 202 // no character is composed here because of reset. |
185 ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute, 0); | 203 ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute, 0); |
186 character_composer.Reset(); | 204 character_composer.Reset(); |
187 EXPECT_FALSE(character_composer.FilterKeyPress(GDK_KEY_a, 0)); | 205 EXPECT_FALSE(character_composer.FilterKeyPress(GDK_KEY_a, 0, 0)); |
188 EXPECT_TRUE(character_composer.composed_character().empty()); | 206 EXPECT_TRUE(character_composer.composed_character().empty()); |
189 } | 207 } |
190 | 208 |
191 TEST(CharacterComposerTest, KeySequenceCompositionPreedit) { | 209 TEST(CharacterComposerTest, KeySequenceCompositionPreedit) { |
192 CharacterComposer character_composer; | 210 CharacterComposer character_composer; |
193 // LATIN SMALL LETTER A WITH ACUTE | 211 // LATIN SMALL LETTER A WITH ACUTE |
194 // preedit_string() is always empty in key sequence composition mode. | 212 // preedit_string() is always empty in key sequence composition mode. |
195 ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute, 0); | 213 ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute, 0); |
196 EXPECT_TRUE(character_composer.preedit_string().empty()); | 214 EXPECT_TRUE(character_composer.preedit_string().empty()); |
197 EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_a, 0)); | 215 EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_a, 0, 0)); |
198 EXPECT_EQ(string16(1, 0x00E1), character_composer.composed_character()); | 216 EXPECT_EQ(string16(1, 0x00E1), character_composer.composed_character()); |
199 EXPECT_TRUE(character_composer.preedit_string().empty()); | 217 EXPECT_TRUE(character_composer.preedit_string().empty()); |
200 } | 218 } |
201 | 219 |
202 // ComposeCheckerWithCompactTable in character_composer.cc is depending on the | 220 // ComposeCheckerWithCompactTable in character_composer.cc is depending on the |
203 // assumption that the data in gtkimcontextsimpleseqs.h is correctly ordered. | 221 // assumption that the data in gtkimcontextsimpleseqs.h is correctly ordered. |
204 TEST(CharacterComposerTest, MainTableIsCorrectlyOrdered) { | 222 TEST(CharacterComposerTest, MainTableIsCorrectlyOrdered) { |
205 // This file is included here intentionally, instead of the top of the file, | 223 // This file is included here intentionally, instead of the top of the file, |
206 // because including this file at the top of the file will define a | 224 // because including this file at the top of the file will define a |
207 // global constant and contaminate the global namespace. | 225 // global constant and contaminate the global namespace. |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
375 | 393 |
376 // Backspace twice after Ctrl+Shift+U and 3. | 394 // Backspace twice after Ctrl+Shift+U and 3. |
377 ExpectKeyFiltered(&character_composer, GDK_KEY_U, | 395 ExpectKeyFiltered(&character_composer, GDK_KEY_U, |
378 EF_SHIFT_DOWN | EF_CONTROL_DOWN); | 396 EF_SHIFT_DOWN | EF_CONTROL_DOWN); |
379 ExpectKeyFiltered(&character_composer, GDK_KEY_3, 0); | 397 ExpectKeyFiltered(&character_composer, GDK_KEY_3, 0); |
380 ExpectKeyFiltered(&character_composer, GDK_KEY_BackSpace, 0); | 398 ExpectKeyFiltered(&character_composer, GDK_KEY_BackSpace, 0); |
381 ExpectKeyFiltered(&character_composer, GDK_KEY_BackSpace, 0); | 399 ExpectKeyFiltered(&character_composer, GDK_KEY_BackSpace, 0); |
382 ExpectKeyNotFiltered(&character_composer, GDK_KEY_3, 0); | 400 ExpectKeyNotFiltered(&character_composer, GDK_KEY_3, 0); |
383 } | 401 } |
384 | 402 |
| 403 TEST(CharacterComposerTest, HexadecimalCompositionPreeditWithModifierPressed) { |
| 404 // This test case supposes X Window System uses 101 keyboard layout. |
| 405 CharacterComposer character_composer; |
| 406 const int control_shift = EF_CONTROL_DOWN | EF_SHIFT_DOWN; |
| 407 // HIRAGANA LETTER A (U+3042) |
| 408 ExpectKeyFilteredWithKeycode(&character_composer, |
| 409 GDK_KEY_U, 30, control_shift); |
| 410 EXPECT_EQ(ASCIIToUTF16("u"), character_composer.preedit_string()); |
| 411 ExpectKeyFilteredWithKeycode(&character_composer, |
| 412 GDK_KEY_numbersign, 12, control_shift); |
| 413 EXPECT_EQ(ASCIIToUTF16("u3"), character_composer.preedit_string()); |
| 414 ExpectKeyFilteredWithKeycode(&character_composer, |
| 415 GDK_KEY_parenright, 19, control_shift); |
| 416 EXPECT_EQ(ASCIIToUTF16("u30"), character_composer.preedit_string()); |
| 417 ExpectKeyFilteredWithKeycode(&character_composer, |
| 418 GDK_KEY_dollar, 13, control_shift); |
| 419 EXPECT_EQ(ASCIIToUTF16("u304"), character_composer.preedit_string()); |
| 420 ExpectKeyFilteredWithKeycode(&character_composer, |
| 421 GDK_KEY_A, 38, control_shift); |
| 422 EXPECT_EQ(ASCIIToUTF16("u304a"), character_composer.preedit_string()); |
| 423 ExpectKeyFilteredWithKeycode(&character_composer, |
| 424 GDK_KEY_BackSpace, 22, control_shift); |
| 425 EXPECT_EQ(ASCIIToUTF16("u304"), character_composer.preedit_string()); |
| 426 ExpectKeyFilteredWithKeycode(&character_composer, |
| 427 GDK_KEY_at, 11, control_shift); |
| 428 EXPECT_EQ(ASCIIToUTF16("u3042"), character_composer.preedit_string()); |
| 429 ExpectCharacterComposedWithKeyCode(&character_composer, |
| 430 GDK_KEY_Return, 36, |
| 431 control_shift, |
| 432 string16(1, 0x3042)); |
| 433 EXPECT_EQ(ASCIIToUTF16(""), character_composer.preedit_string()); |
| 434 |
| 435 // Sequence with an ignored character (control + shift + 'x') and Escape. |
| 436 ExpectKeyFilteredWithKeycode(&character_composer, |
| 437 GDK_KEY_U, 30, control_shift); |
| 438 EXPECT_EQ(ASCIIToUTF16("u"), character_composer.preedit_string()); |
| 439 ExpectKeyFilteredWithKeycode(&character_composer, |
| 440 GDK_KEY_numbersign, 12, control_shift); |
| 441 EXPECT_EQ(ASCIIToUTF16("u3"), character_composer.preedit_string()); |
| 442 ExpectKeyFilteredWithKeycode(&character_composer, |
| 443 GDK_KEY_parenright, 19, control_shift); |
| 444 EXPECT_EQ(ASCIIToUTF16("u30"), character_composer.preedit_string()); |
| 445 ExpectKeyFilteredWithKeycode(&character_composer, |
| 446 GDK_KEY_X, 53, control_shift); |
| 447 EXPECT_EQ(ASCIIToUTF16("u30"), character_composer.preedit_string()); |
| 448 ExpectKeyFilteredWithKeycode(&character_composer, |
| 449 GDK_KEY_dollar, 13, control_shift); |
| 450 EXPECT_EQ(ASCIIToUTF16("u304"), character_composer.preedit_string()); |
| 451 ExpectKeyFilteredWithKeycode(&character_composer, |
| 452 GDK_KEY_at, 11, control_shift); |
| 453 EXPECT_EQ(ASCIIToUTF16("u3042"), character_composer.preedit_string()); |
| 454 ExpectKeyFilteredWithKeycode(&character_composer, |
| 455 GDK_KEY_Escape, 9, control_shift); |
| 456 EXPECT_EQ(ASCIIToUTF16(""), character_composer.preedit_string()); |
| 457 } |
| 458 |
385 TEST(CharacterComposerTest, InvalidHexadecimalSequence) { | 459 TEST(CharacterComposerTest, InvalidHexadecimalSequence) { |
386 CharacterComposer character_composer; | 460 CharacterComposer character_composer; |
387 // U+FFFFFFFF | 461 // U+FFFFFFFF |
388 ExpectKeyFiltered(&character_composer, GDK_KEY_U, | 462 ExpectKeyFiltered(&character_composer, GDK_KEY_U, |
389 EF_SHIFT_DOWN | EF_CONTROL_DOWN); | 463 EF_SHIFT_DOWN | EF_CONTROL_DOWN); |
390 for (int i = 0; i < 8; ++i) | 464 for (int i = 0; i < 8; ++i) |
391 ExpectKeyFiltered(&character_composer, GDK_KEY_f, 0); | 465 ExpectKeyFiltered(&character_composer, GDK_KEY_f, 0); |
392 EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_space, 0)); | 466 EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_space, 0, 0)); |
393 EXPECT_TRUE(character_composer.composed_character().empty()); | 467 EXPECT_TRUE(character_composer.composed_character().empty()); |
394 | 468 |
395 // U+0000 (Actually, this is a valid unicode character, but we don't | 469 // U+0000 (Actually, this is a valid unicode character, but we don't |
396 // compose a string with a character '\0') | 470 // compose a string with a character '\0') |
397 ExpectKeyFiltered(&character_composer, GDK_KEY_U, | 471 ExpectKeyFiltered(&character_composer, GDK_KEY_U, |
398 EF_SHIFT_DOWN | EF_CONTROL_DOWN); | 472 EF_SHIFT_DOWN | EF_CONTROL_DOWN); |
399 for (int i = 0; i < 4; ++i) | 473 for (int i = 0; i < 4; ++i) |
400 ExpectKeyFiltered(&character_composer, GDK_KEY_0, 0); | 474 ExpectKeyFiltered(&character_composer, GDK_KEY_0, 0); |
401 EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_space, 0)); | 475 EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_space, 0, 0)); |
402 EXPECT_TRUE(character_composer.composed_character().empty()); | 476 EXPECT_TRUE(character_composer.composed_character().empty()); |
403 | 477 |
404 // U+10FFFF | 478 // U+10FFFF |
405 ExpectKeyFiltered(&character_composer, GDK_KEY_U, | 479 ExpectKeyFiltered(&character_composer, GDK_KEY_U, |
406 EF_SHIFT_DOWN | EF_CONTROL_DOWN); | 480 EF_SHIFT_DOWN | EF_CONTROL_DOWN); |
407 ExpectKeyFiltered(&character_composer, GDK_KEY_1, 0); | 481 ExpectKeyFiltered(&character_composer, GDK_KEY_1, 0); |
408 ExpectKeyFiltered(&character_composer, GDK_KEY_0, 0); | 482 ExpectKeyFiltered(&character_composer, GDK_KEY_0, 0); |
409 for (int i = 0; i < 4; ++i) | 483 for (int i = 0; i < 4; ++i) |
410 ExpectKeyFiltered(&character_composer, GDK_KEY_f, 0); | 484 ExpectKeyFiltered(&character_composer, GDK_KEY_f, 0); |
411 EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_space, 0)); | 485 EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_space, 0, 0)); |
412 EXPECT_TRUE(character_composer.composed_character().empty()); | 486 EXPECT_TRUE(character_composer.composed_character().empty()); |
413 | 487 |
414 // U+110000 | 488 // U+110000 |
415 ExpectKeyFiltered(&character_composer, GDK_KEY_U, | 489 ExpectKeyFiltered(&character_composer, GDK_KEY_U, |
416 EF_SHIFT_DOWN | EF_CONTROL_DOWN); | 490 EF_SHIFT_DOWN | EF_CONTROL_DOWN); |
417 ExpectKeyFiltered(&character_composer, GDK_KEY_1, 0); | 491 ExpectKeyFiltered(&character_composer, GDK_KEY_1, 0); |
418 ExpectKeyFiltered(&character_composer, GDK_KEY_1, 0); | 492 ExpectKeyFiltered(&character_composer, GDK_KEY_1, 0); |
419 for (int i = 0; i < 4; ++i) | 493 for (int i = 0; i < 4; ++i) |
420 ExpectKeyFiltered(&character_composer, GDK_KEY_0, 0); | 494 ExpectKeyFiltered(&character_composer, GDK_KEY_0, 0); |
421 EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_space, 0)); | 495 EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_space, 0, 0)); |
422 EXPECT_TRUE(character_composer.composed_character().empty()); | 496 EXPECT_TRUE(character_composer.composed_character().empty()); |
423 } | 497 } |
424 | 498 |
425 TEST(CharacterComposerTest, HexadecimalSequenceAndDeadKey) { | 499 TEST(CharacterComposerTest, HexadecimalSequenceAndDeadKey) { |
426 CharacterComposer character_composer; | 500 CharacterComposer character_composer; |
427 // LATIN SMALL LETTER A WITH ACUTE | 501 // LATIN SMALL LETTER A WITH ACUTE |
428 ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, GDK_KEY_a, 0, | 502 ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, GDK_KEY_a, 0, |
429 string16(1, 0x00E1)); | 503 string16(1, 0x00E1)); |
430 // HIRAGANA LETTER A (U+3042) with dead_acute ignored. | 504 // HIRAGANA LETTER A (U+3042) with dead_acute ignored. |
431 ExpectKeyFiltered(&character_composer, GDK_KEY_U, | 505 ExpectKeyFiltered(&character_composer, GDK_KEY_U, |
432 EF_SHIFT_DOWN | EF_CONTROL_DOWN); | 506 EF_SHIFT_DOWN | EF_CONTROL_DOWN); |
433 ExpectCharacterComposed(&character_composer, GDK_KEY_3, GDK_KEY_0, | 507 ExpectCharacterComposed(&character_composer, GDK_KEY_3, GDK_KEY_0, |
434 GDK_KEY_dead_acute, GDK_KEY_4, GDK_KEY_2, | 508 GDK_KEY_dead_acute, GDK_KEY_4, GDK_KEY_2, |
435 GDK_KEY_space, 0, string16(1, 0x3042)); | 509 GDK_KEY_space, 0, string16(1, 0x3042)); |
436 // LATIN CAPITAL LETTER U WITH ACUTE while 'U' is pressed with Ctrl+Shift. | 510 // LATIN CAPITAL LETTER U WITH ACUTE while 'U' is pressed with Ctrl+Shift. |
437 ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute, 0); | 511 ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute, 0); |
438 EXPECT_TRUE(character_composer.FilterKeyPress( | 512 EXPECT_TRUE(character_composer.FilterKeyPress( |
439 GDK_KEY_U, EF_SHIFT_DOWN | EF_CONTROL_DOWN)); | 513 GDK_KEY_U, 0, EF_SHIFT_DOWN | EF_CONTROL_DOWN)); |
440 EXPECT_EQ(string16(1, 0x00DA), character_composer.composed_character()); | 514 EXPECT_EQ(string16(1, 0x00DA), character_composer.composed_character()); |
441 } | 515 } |
442 | 516 |
443 } // namespace ui | 517 } // namespace ui |
OLD | NEW |