| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "views/ime/character_composer.h" | 5 #include "views/ime/character_composer.h" |
| 6 | 6 |
| 7 #include "testing/gtest/include/gtest/gtest.h" | 7 #include "testing/gtest/include/gtest/gtest.h" |
| 8 #include "third_party/gtk+/gdk/gdkkeysyms.h" | 8 #include "third_party/gtk+/gdk/gdkkeysyms.h" |
| 9 | 9 |
| 10 namespace views { | 10 namespace views { |
| 11 | 11 |
| 12 namespace { | 12 namespace { |
| 13 | 13 |
| 14 // Expects key is not filtered and no character is composed | 14 // Expects key is not filtered and no character is composed. |
| 15 void ExpectKeyNotFiltered(CharacterComposer* character_composer, uint key) { | 15 void ExpectKeyNotFiltered(CharacterComposer* character_composer, uint key) { |
| 16 EXPECT_FALSE(character_composer->FilterKeyPress(key)); | 16 EXPECT_FALSE(character_composer->FilterKeyPress(key)); |
| 17 EXPECT_TRUE(character_composer->GetComposedCharacter().empty()); | 17 EXPECT_TRUE(character_composer->composed_character().empty()); |
| 18 } | 18 } |
| 19 | 19 |
| 20 // Expects key is filtered and no character is composed | 20 // Expects key is filtered and no character is composed. |
| 21 void ExpectKeyFiltered(CharacterComposer* character_composer, uint key) { | 21 void ExpectKeyFiltered(CharacterComposer* character_composer, uint key) { |
| 22 EXPECT_TRUE(character_composer->FilterKeyPress(key)); | 22 EXPECT_TRUE(character_composer->FilterKeyPress(key)); |
| 23 EXPECT_TRUE(character_composer->GetComposedCharacter().empty()); | 23 EXPECT_TRUE(character_composer->composed_character().empty()); |
| 24 } | 24 } |
| 25 | 25 |
| 26 // Expects |expected_character| is composed after sequence [key1, key2] | 26 // Expects |expected_character| is composed after sequence [key1, key2]. |
| 27 void ExpectCharacterComposed(CharacterComposer* character_composer, | 27 void ExpectCharacterComposed(CharacterComposer* character_composer, |
| 28 uint key1, | 28 uint key1, |
| 29 uint key2, | 29 uint key2, |
| 30 const string16& expected_character) { | 30 const string16& expected_character) { |
| 31 ExpectKeyFiltered(character_composer, key1); | 31 ExpectKeyFiltered(character_composer, key1); |
| 32 EXPECT_TRUE(character_composer->FilterKeyPress(key2)); | 32 EXPECT_TRUE(character_composer->FilterKeyPress(key2)); |
| 33 EXPECT_EQ(character_composer->GetComposedCharacter(), expected_character); | 33 EXPECT_EQ(character_composer->composed_character(), expected_character); |
| 34 } | 34 } |
| 35 | 35 |
| 36 // Expects |expected_character| is composed after sequence [key1, key2, key3] | 36 // Expects |expected_character| is composed after sequence [key1, key2, key3]. |
| 37 void ExpectCharacterComposed(CharacterComposer* character_composer, | 37 void ExpectCharacterComposed(CharacterComposer* character_composer, |
| 38 uint key1, | 38 uint key1, |
| 39 uint key2, | 39 uint key2, |
| 40 uint key3, | 40 uint key3, |
| 41 const string16& expected_character) { | 41 const string16& expected_character) { |
| 42 ExpectKeyFiltered(character_composer, key1); | 42 ExpectKeyFiltered(character_composer, key1); |
| 43 ExpectCharacterComposed(character_composer, key2, key3, expected_character); | 43 ExpectCharacterComposed(character_composer, key2, key3, expected_character); |
| 44 } | 44 } |
| 45 | 45 |
| 46 // Expects |expected_character| is composed after sequence [key1, key2, key3, | 46 // Expects |expected_character| is composed after sequence [key1, key2, key3, |
| 47 // key 4] | 47 // key 4]. |
| 48 void ExpectCharacterComposed(CharacterComposer* character_composer, | 48 void ExpectCharacterComposed(CharacterComposer* character_composer, |
| 49 uint key1, | 49 uint key1, |
| 50 uint key2, | 50 uint key2, |
| 51 uint key3, | 51 uint key3, |
| 52 uint key4, | 52 uint key4, |
| 53 const string16& expected_character) { | 53 const string16& expected_character) { |
| 54 ExpectKeyFiltered(character_composer, key1); | 54 ExpectKeyFiltered(character_composer, key1); |
| 55 ExpectCharacterComposed(character_composer, key2, key3, key4, | 55 ExpectCharacterComposed(character_composer, key2, key3, key4, |
| 56 expected_character); | 56 expected_character); |
| 57 } | 57 } |
| 58 | 58 |
| 59 } // anonymous namespace | 59 } // namespace |
| 60 | 60 |
| 61 TEST(CharacterComposerTest, InitialState) { | 61 TEST(CharacterComposerTest, InitialState) { |
| 62 CharacterComposer character_composer; | 62 CharacterComposer character_composer; |
| 63 EXPECT_TRUE(character_composer.GetComposedCharacter().empty()); | 63 EXPECT_TRUE(character_composer.composed_character().empty()); |
| 64 } | 64 } |
| 65 | 65 |
| 66 TEST(CharacterComposerTest, NormalKeyIsNotFiltered) { | 66 TEST(CharacterComposerTest, NormalKeyIsNotFiltered) { |
| 67 CharacterComposer character_composer; | 67 CharacterComposer character_composer; |
| 68 ExpectKeyNotFiltered(&character_composer, GDK_KEY_B); | 68 ExpectKeyNotFiltered(&character_composer, GDK_KEY_B); |
| 69 ExpectKeyNotFiltered(&character_composer, GDK_KEY_Z); | 69 ExpectKeyNotFiltered(&character_composer, GDK_KEY_Z); |
| 70 ExpectKeyNotFiltered(&character_composer, GDK_KEY_c); | 70 ExpectKeyNotFiltered(&character_composer, GDK_KEY_c); |
| 71 ExpectKeyNotFiltered(&character_composer, GDK_KEY_m); | 71 ExpectKeyNotFiltered(&character_composer, GDK_KEY_m); |
| 72 ExpectKeyNotFiltered(&character_composer, GDK_KEY_0); | 72 ExpectKeyNotFiltered(&character_composer, GDK_KEY_0); |
| 73 ExpectKeyNotFiltered(&character_composer, GDK_KEY_1); | 73 ExpectKeyNotFiltered(&character_composer, GDK_KEY_1); |
| 74 ExpectKeyNotFiltered(&character_composer, GDK_KEY_8); | 74 ExpectKeyNotFiltered(&character_composer, GDK_KEY_8); |
| 75 } | 75 } |
| 76 | 76 |
| 77 TEST(CharacterComposerTest, PartiallyMatchingSequence) { | 77 TEST(CharacterComposerTest, PartiallyMatchingSequence) { |
| 78 CharacterComposer character_composer; | 78 CharacterComposer character_composer; |
| 79 | 79 |
| 80 // Composition with sequence ['dead acute', '1'] will fail | 80 // Composition with sequence ['dead acute', '1'] will fail. |
| 81 ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute); | 81 ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute); |
| 82 EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_1)); | 82 EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_1)); |
| 83 EXPECT_TRUE(character_composer.GetComposedCharacter().empty()); | 83 EXPECT_TRUE(character_composer.composed_character().empty()); |
| 84 | 84 |
| 85 // Composition with sequence ['dead acute', 'dead circumflex', '1'] will fail | 85 // Composition with sequence ['dead acute', 'dead circumflex', '1'] will fail. |
| 86 ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute); | 86 ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute); |
| 87 ExpectKeyFiltered(&character_composer, GDK_KEY_dead_circumflex); | 87 ExpectKeyFiltered(&character_composer, GDK_KEY_dead_circumflex); |
| 88 EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_1)); | 88 EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_1)); |
| 89 EXPECT_TRUE(character_composer.GetComposedCharacter().empty()); | 89 EXPECT_TRUE(character_composer.composed_character().empty()); |
| 90 } | 90 } |
| 91 | 91 |
| 92 TEST(CharacterComposerTest, FullyMatchingSequences) { | 92 TEST(CharacterComposerTest, FullyMatchingSequences) { |
| 93 CharacterComposer character_composer; | 93 CharacterComposer character_composer; |
| 94 // LATIN SMALL LETTER A WITH ACUTE | 94 // LATIN SMALL LETTER A WITH ACUTE |
| 95 ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, GDK_KEY_a, | 95 ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, GDK_KEY_a, |
| 96 string16(1, 0x00E1)); | 96 string16(1, 0x00E1)); |
| 97 // LATIN CAPITAL LETTER A WITH ACUTE | 97 // LATIN CAPITAL LETTER A WITH ACUTE |
| 98 ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, GDK_KEY_A, | 98 ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, GDK_KEY_A, |
| 99 string16(1, 0x00C1)); | 99 string16(1, 0x00C1)); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 110 // LATIN CAPITAL LETTER C WITH CEDILLA | 110 // LATIN CAPITAL LETTER C WITH CEDILLA |
| 111 ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, GDK_KEY_C, | 111 ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, GDK_KEY_C, |
| 112 string16(1, 0x00C7)); | 112 string16(1, 0x00C7)); |
| 113 // LATIN SMALL LETTER C WITH CEDILLA | 113 // LATIN SMALL LETTER C WITH CEDILLA |
| 114 ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, GDK_KEY_c, | 114 ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, GDK_KEY_c, |
| 115 string16(1, 0x00E7)); | 115 string16(1, 0x00E7)); |
| 116 } | 116 } |
| 117 | 117 |
| 118 TEST(CharacterComposerTest, FullyMatchingSequencesAfterMatchingFailure) { | 118 TEST(CharacterComposerTest, FullyMatchingSequencesAfterMatchingFailure) { |
| 119 CharacterComposer character_composer; | 119 CharacterComposer character_composer; |
| 120 // Composition with sequence ['dead acute', 'dead circumflex', '1'] will fail | 120 // Composition with sequence ['dead acute', 'dead circumflex', '1'] will fail. |
| 121 ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute); | 121 ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute); |
| 122 ExpectKeyFiltered(&character_composer, GDK_KEY_dead_circumflex); | 122 ExpectKeyFiltered(&character_composer, GDK_KEY_dead_circumflex); |
| 123 EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_1)); | 123 EXPECT_TRUE(character_composer.FilterKeyPress(GDK_KEY_1)); |
| 124 EXPECT_TRUE(character_composer.GetComposedCharacter().empty()); | 124 EXPECT_TRUE(character_composer.composed_character().empty()); |
| 125 // LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE | 125 // LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE |
| 126 ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, | 126 ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, |
| 127 GDK_KEY_dead_circumflex, GDK_KEY_a, | 127 GDK_KEY_dead_circumflex, GDK_KEY_a, |
| 128 string16(1, 0x1EA5)); | 128 string16(1, 0x1EA5)); |
| 129 } | 129 } |
| 130 | 130 |
| 131 TEST(CharacterComposerTest, ComposedCharacterIsClearedAfterReset) { | 131 TEST(CharacterComposerTest, ComposedCharacterIsClearedAfterReset) { |
| 132 CharacterComposer character_composer; | 132 CharacterComposer character_composer; |
| 133 ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, GDK_KEY_a, | 133 ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, GDK_KEY_a, |
| 134 string16(1, 0x00E1)); | 134 string16(1, 0x00E1)); |
| 135 character_composer.Reset(); | 135 character_composer.Reset(); |
| 136 EXPECT_TRUE(character_composer.GetComposedCharacter().empty()); | 136 EXPECT_TRUE(character_composer.composed_character().empty()); |
| 137 } | 137 } |
| 138 | 138 |
| 139 TEST(CharacterComposerTest, CompositionStateIsClearedAfterReset) { | 139 TEST(CharacterComposerTest, CompositionStateIsClearedAfterReset) { |
| 140 CharacterComposer character_composer; | 140 CharacterComposer character_composer; |
| 141 // Even though sequence ['dead acute', 'a'] will compose 'a with acute', | 141 // Even though sequence ['dead acute', 'a'] will compose 'a with acute', |
| 142 // no character is composed here because of reset. | 142 // no character is composed here because of reset. |
| 143 ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute); | 143 ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute); |
| 144 character_composer.Reset(); | 144 character_composer.Reset(); |
| 145 EXPECT_FALSE(character_composer.FilterKeyPress(GDK_KEY_a)); | 145 EXPECT_FALSE(character_composer.FilterKeyPress(GDK_KEY_a)); |
| 146 EXPECT_TRUE(character_composer.GetComposedCharacter().empty()); | 146 EXPECT_TRUE(character_composer.composed_character().empty()); |
| 147 } | 147 } |
| 148 | 148 |
| 149 } // namespace views | 149 } // namespace views |
| OLD | NEW |