Index: ui/base/ime/character_composer_unittest.cc |
diff --git a/ui/base/ime/character_composer_unittest.cc b/ui/base/ime/character_composer_unittest.cc |
index 8f93da271283b182e3a28908c7a64bfe9b4d3763..e12a121fe4f22668a91537495834b7ce77ef1dbd 100644 |
--- a/ui/base/ime/character_composer_unittest.cc |
+++ b/ui/base/ime/character_composer_unittest.cc |
@@ -17,16 +17,25 @@ namespace { |
// Expects key is not filtered and no character is composed. |
void ExpectKeyNotFiltered(CharacterComposer* character_composer, |
uint key, |
- uint flags) { |
- EXPECT_FALSE(character_composer->FilterKeyPress(key, flags)); |
+ int flags) { |
+ EXPECT_FALSE(character_composer->FilterKeyPress(key, 0, flags)); |
EXPECT_TRUE(character_composer->composed_character().empty()); |
} |
// Expects key is filtered and no character is composed. |
void ExpectKeyFiltered(CharacterComposer* character_composer, |
uint key, |
- uint flags) { |
- EXPECT_TRUE(character_composer->FilterKeyPress(key, flags)); |
+ int flags) { |
+ EXPECT_TRUE(character_composer->FilterKeyPress(key, 0, flags)); |
+ EXPECT_TRUE(character_composer->composed_character().empty()); |
+} |
+ |
+// Expects key is filtered and no character is composed. |
+void ExpectKeyFilteredWithKeycode(CharacterComposer* character_composer, |
+ uint key, |
+ uint keycode, |
+ int flags) { |
+ EXPECT_TRUE(character_composer->FilterKeyPress(key, keycode, flags)); |
EXPECT_TRUE(character_composer->composed_character().empty()); |
} |
@@ -34,10 +43,10 @@ void ExpectKeyFiltered(CharacterComposer* character_composer, |
void ExpectCharacterComposed(CharacterComposer* character_composer, |
uint key1, |
uint key2, |
- uint flags, |
+ int flags, |
const string16& expected_character) { |
ExpectKeyFiltered(character_composer, key1, flags); |
- EXPECT_TRUE(character_composer->FilterKeyPress(key2, flags)); |
+ EXPECT_TRUE(character_composer->FilterKeyPress(key2, 0, flags)); |
EXPECT_EQ(expected_character, character_composer->composed_character()); |
} |
@@ -46,7 +55,7 @@ void ExpectCharacterComposed(CharacterComposer* character_composer, |
uint key1, |
uint key2, |
uint key3, |
- uint flags, |
+ int flags, |
const string16& expected_character) { |
ExpectKeyFiltered(character_composer, key1, flags); |
ExpectCharacterComposed(character_composer, key2, key3, flags, |
@@ -60,7 +69,7 @@ void ExpectCharacterComposed(CharacterComposer* character_composer, |
uint key2, |
uint key3, |
uint key4, |
- uint flags, |
+ int flags, |
const string16& expected_character) { |
ExpectKeyFiltered(character_composer, key1, flags); |
ExpectCharacterComposed(character_composer, key2, key3, key4, flags, |
@@ -75,7 +84,7 @@ void ExpectCharacterComposed(CharacterComposer* character_composer, |
uint key3, |
uint key4, |
uint key5, |
- uint flags, |
+ int flags, |
const string16& expected_character) { |
ExpectKeyFiltered(character_composer, key1, flags); |
ExpectCharacterComposed(character_composer, key2, key3, key4, key5, flags, |
@@ -91,13 +100,22 @@ void ExpectCharacterComposed(CharacterComposer* character_composer, |
uint key4, |
uint key5, |
uint key6, |
- uint flags, |
+ int flags, |
const string16& expected_character) { |
ExpectKeyFiltered(character_composer, key1, flags); |
ExpectCharacterComposed(character_composer, key2, key3, key4, key5, key6, |
flags, expected_character); |
} |
+// Expects |expected_character| is composed after sequence [{key1, keycode1}]. |
+void ExpectCharacterComposedWithKeyCode(CharacterComposer* character_composer, |
+ uint key1, uint keycode1, |
+ int flags, |
+ const string16& expected_character) { |
+ EXPECT_TRUE(character_composer->FilterKeyPress(key1, keycode1, flags)); |
+ EXPECT_EQ(expected_character, character_composer->composed_character()); |
+} |
+ |
} // namespace |
TEST(CharacterComposerTest, InitialState) { |
@@ -121,13 +139,13 @@ TEST(CharacterComposerTest, PartiallyMatchingSequence) { |
// Composition with sequence ['dead acute', '1'] will fail. |
ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute, 0); |
- EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_1, 0)); |
+ EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_1, 0, 0)); |
EXPECT_TRUE(character_composer.composed_character().empty()); |
// Composition with sequence ['dead acute', 'dead circumflex', '1'] will fail. |
ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute, 0); |
ExpectKeyFiltered(&character_composer, GDK_KEY_dead_circumflex, 0); |
- EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_1, 0)); |
+ EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_1, 0, 0)); |
EXPECT_TRUE(character_composer.composed_character().empty()); |
} |
@@ -162,7 +180,7 @@ TEST(CharacterComposerTest, FullyMatchingSequencesAfterMatchingFailure) { |
// Composition with sequence ['dead acute', 'dead circumflex', '1'] will fail. |
ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute, 0); |
ExpectKeyFiltered(&character_composer, GDK_KEY_dead_circumflex, 0); |
- EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_1, 0)); |
+ EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_1, 0, 0)); |
EXPECT_TRUE(character_composer.composed_character().empty()); |
// LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE |
ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, |
@@ -184,7 +202,7 @@ TEST(CharacterComposerTest, CompositionStateIsClearedAfterReset) { |
// no character is composed here because of reset. |
ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute, 0); |
character_composer.Reset(); |
- EXPECT_FALSE(character_composer.FilterKeyPress(GDK_KEY_a, 0)); |
+ EXPECT_FALSE(character_composer.FilterKeyPress(GDK_KEY_a, 0, 0)); |
EXPECT_TRUE(character_composer.composed_character().empty()); |
} |
@@ -194,7 +212,7 @@ TEST(CharacterComposerTest, KeySequenceCompositionPreedit) { |
// preedit_string() is always empty in key sequence composition mode. |
ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute, 0); |
EXPECT_TRUE(character_composer.preedit_string().empty()); |
- EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_a, 0)); |
+ EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_a, 0, 0)); |
EXPECT_EQ(string16(1, 0x00E1), character_composer.composed_character()); |
EXPECT_TRUE(character_composer.preedit_string().empty()); |
} |
@@ -382,6 +400,62 @@ TEST(CharacterComposerTest, CancelHexadecimalCompositionWithBackspace) { |
ExpectKeyNotFiltered(&character_composer, GDK_KEY_3, 0); |
} |
+TEST(CharacterComposerTest, HexadecimalCompositionPreeditWithModifierPressed) { |
+ // This test case supposes X Window System uses 101 keyboard layout. |
+ CharacterComposer character_composer; |
+ const int control_shift = EF_CONTROL_DOWN | EF_SHIFT_DOWN; |
+ // HIRAGANA LETTER A (U+3042) |
+ ExpectKeyFilteredWithKeycode(&character_composer, |
+ GDK_KEY_U, 30, control_shift); |
+ EXPECT_EQ(ASCIIToUTF16("u"), character_composer.preedit_string()); |
+ ExpectKeyFilteredWithKeycode(&character_composer, |
+ GDK_KEY_numbersign, 12, control_shift); |
+ EXPECT_EQ(ASCIIToUTF16("u3"), character_composer.preedit_string()); |
+ ExpectKeyFilteredWithKeycode(&character_composer, |
+ GDK_KEY_parenright, 19, control_shift); |
+ EXPECT_EQ(ASCIIToUTF16("u30"), character_composer.preedit_string()); |
+ ExpectKeyFilteredWithKeycode(&character_composer, |
+ GDK_KEY_dollar, 13, control_shift); |
+ EXPECT_EQ(ASCIIToUTF16("u304"), character_composer.preedit_string()); |
+ ExpectKeyFilteredWithKeycode(&character_composer, |
+ GDK_KEY_A, 38, control_shift); |
+ EXPECT_EQ(ASCIIToUTF16("u304a"), character_composer.preedit_string()); |
+ ExpectKeyFilteredWithKeycode(&character_composer, |
+ GDK_KEY_BackSpace, 22, control_shift); |
+ EXPECT_EQ(ASCIIToUTF16("u304"), character_composer.preedit_string()); |
+ ExpectKeyFilteredWithKeycode(&character_composer, |
+ GDK_KEY_at, 11, control_shift); |
+ EXPECT_EQ(ASCIIToUTF16("u3042"), character_composer.preedit_string()); |
+ ExpectCharacterComposedWithKeyCode(&character_composer, |
+ GDK_KEY_Return, 36, |
+ control_shift, |
+ string16(1, 0x3042)); |
+ EXPECT_EQ(ASCIIToUTF16(""), character_composer.preedit_string()); |
+ |
+ // Sequence with an ignored character (control + shift + 'x') and Escape. |
+ ExpectKeyFilteredWithKeycode(&character_composer, |
+ GDK_KEY_U, 30, control_shift); |
+ EXPECT_EQ(ASCIIToUTF16("u"), character_composer.preedit_string()); |
+ ExpectKeyFilteredWithKeycode(&character_composer, |
+ GDK_KEY_numbersign, 12, control_shift); |
+ EXPECT_EQ(ASCIIToUTF16("u3"), character_composer.preedit_string()); |
+ ExpectKeyFilteredWithKeycode(&character_composer, |
+ GDK_KEY_parenright, 19, control_shift); |
+ EXPECT_EQ(ASCIIToUTF16("u30"), character_composer.preedit_string()); |
+ ExpectKeyFilteredWithKeycode(&character_composer, |
+ GDK_KEY_X, 53, control_shift); |
+ EXPECT_EQ(ASCIIToUTF16("u30"), character_composer.preedit_string()); |
+ ExpectKeyFilteredWithKeycode(&character_composer, |
+ GDK_KEY_dollar, 13, control_shift); |
+ EXPECT_EQ(ASCIIToUTF16("u304"), character_composer.preedit_string()); |
+ ExpectKeyFilteredWithKeycode(&character_composer, |
+ GDK_KEY_at, 11, control_shift); |
+ EXPECT_EQ(ASCIIToUTF16("u3042"), character_composer.preedit_string()); |
+ ExpectKeyFilteredWithKeycode(&character_composer, |
+ GDK_KEY_Escape, 9, control_shift); |
+ EXPECT_EQ(ASCIIToUTF16(""), character_composer.preedit_string()); |
+} |
+ |
TEST(CharacterComposerTest, InvalidHexadecimalSequence) { |
CharacterComposer character_composer; |
// U+FFFFFFFF |
@@ -389,7 +463,7 @@ TEST(CharacterComposerTest, InvalidHexadecimalSequence) { |
EF_SHIFT_DOWN | EF_CONTROL_DOWN); |
for (int i = 0; i < 8; ++i) |
ExpectKeyFiltered(&character_composer, GDK_KEY_f, 0); |
- EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_space, 0)); |
+ EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_space, 0, 0)); |
EXPECT_TRUE(character_composer.composed_character().empty()); |
// U+0000 (Actually, this is a valid unicode character, but we don't |
@@ -398,7 +472,7 @@ TEST(CharacterComposerTest, InvalidHexadecimalSequence) { |
EF_SHIFT_DOWN | EF_CONTROL_DOWN); |
for (int i = 0; i < 4; ++i) |
ExpectKeyFiltered(&character_composer, GDK_KEY_0, 0); |
- EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_space, 0)); |
+ EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_space, 0, 0)); |
EXPECT_TRUE(character_composer.composed_character().empty()); |
// U+10FFFF |
@@ -408,7 +482,7 @@ TEST(CharacterComposerTest, InvalidHexadecimalSequence) { |
ExpectKeyFiltered(&character_composer, GDK_KEY_0, 0); |
for (int i = 0; i < 4; ++i) |
ExpectKeyFiltered(&character_composer, GDK_KEY_f, 0); |
- EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_space, 0)); |
+ EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_space, 0, 0)); |
EXPECT_TRUE(character_composer.composed_character().empty()); |
// U+110000 |
@@ -418,7 +492,7 @@ TEST(CharacterComposerTest, InvalidHexadecimalSequence) { |
ExpectKeyFiltered(&character_composer, GDK_KEY_1, 0); |
for (int i = 0; i < 4; ++i) |
ExpectKeyFiltered(&character_composer, GDK_KEY_0, 0); |
- EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_space, 0)); |
+ EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_space, 0, 0)); |
EXPECT_TRUE(character_composer.composed_character().empty()); |
} |
@@ -436,7 +510,7 @@ TEST(CharacterComposerTest, HexadecimalSequenceAndDeadKey) { |
// LATIN CAPITAL LETTER U WITH ACUTE while 'U' is pressed with Ctrl+Shift. |
ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute, 0); |
EXPECT_TRUE(character_composer.FilterKeyPress( |
- GDK_KEY_U, EF_SHIFT_DOWN | EF_CONTROL_DOWN)); |
+ GDK_KEY_U, 0, EF_SHIFT_DOWN | EF_CONTROL_DOWN)); |
EXPECT_EQ(string16(1, 0x00DA), character_composer.composed_character()); |
} |