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 |