| 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 |