1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/base/ime/chromeos/character_composer.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/gtk+/gdk/gdkkeysyms.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/glib/glib_integers.h"
11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_constants.h"
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class CharacterComposerTest : public testing::Test {
19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) protected:
20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool FilterKeyPress(CharacterComposer* character_composer,
21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                      uint key,
22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                      uint keycode,
23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                      int flags) {
24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return character_composer->FilterKeyPressInternal(key, keycode, flags);
25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Expects key is not filtered and no character is composed.
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void ExpectKeyNotFilteredWithKeyCode(CharacterComposer* character_composer,
29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       uint key,
30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       uint keycode,
31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       int flags) {
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_FALSE(character_composer->FilterKeyPressInternal(key, keycode,
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                            flags));
34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(character_composer->composed_character().empty());
35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Expects key is filtered and no character is composed.
38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void ExpectKeyFilteredWithKeycode(CharacterComposer* character_composer,
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                    uint key,
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                    uint keycode,
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                    int flags) {
42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(character_composer->FilterKeyPressInternal(key, keycode,
43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                           flags));
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(character_composer->composed_character().empty());
45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Expects key is not filtered and no character is composed.
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void ExpectKeyNotFiltered(CharacterComposer* character_composer,
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            uint key,
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            int flags) {
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ExpectKeyNotFilteredWithKeyCode(character_composer, key, 0, flags);
52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Expects key is filtered and no character is composed.
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void ExpectKeyFiltered(CharacterComposer* character_composer,
56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                         uint key,
57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                         int flags) {
58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ExpectKeyFilteredWithKeycode(character_composer, key, 0, flags);
59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Expects |expected_character| is composed after sequence [key1, key2].
62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void ExpectCharacterComposed(CharacterComposer* character_composer,
63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               uint key1,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             uint key2,
65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               int flags,
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               const base::string16& expected_character) {
67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ExpectKeyFiltered(character_composer, key1, flags);
68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(character_composer->FilterKeyPressInternal(key2, 0, flags));
69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(expected_character, character_composer->composed_character());
70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Expects |expected_character| is composed after sequence [key1, key2, key3].
73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void ExpectCharacterComposed(CharacterComposer* character_composer,
74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               uint key1,
75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               uint key2,
76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               uint key3,
77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               int flags,
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               const base::string16& expected_character) {
79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ExpectKeyFiltered(character_composer, key1, flags);
80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ExpectCharacterComposed(character_composer, key2, key3, flags,
81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            expected_character);
82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Expects |expected_character| is composed after sequence [key1, key2, key3,
85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // key 4].
86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void ExpectCharacterComposed(CharacterComposer* character_composer,
87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               uint key1,
88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               uint key2,
89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               uint key3,
90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               uint key4,
91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               int flags,
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               const base::string16& expected_character) {
93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ExpectKeyFiltered(character_composer, key1, flags);
94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ExpectCharacterComposed(character_composer, key2, key3, key4, flags,
95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            expected_character);
96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Expects |expected_character| is composed after sequence [key1, key2, key3,
99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // key 4, key5].
100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void ExpectCharacterComposed(CharacterComposer* character_composer,
101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               uint key1,
102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               uint key2,
103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               uint key3,
104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               uint key4,
105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               uint key5,
106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               int flags,
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               const base::string16& expected_character) {
108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ExpectKeyFiltered(character_composer, key1, flags);
109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ExpectCharacterComposed(character_composer, key2, key3, key4, key5, flags,
110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            expected_character);
111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Expects |expected_character| is composed after sequence [key1, key2, key3,
114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // key 4, key5, key6].
115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void ExpectCharacterComposed(CharacterComposer* character_composer,
116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               uint key1,
117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               uint key2,
118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               uint key3,
119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               uint key4,
120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               uint key5,
121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               uint key6,
122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               int flags,
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               const base::string16& expected_character) {
124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ExpectKeyFiltered(character_composer, key1, flags);
125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ExpectCharacterComposed(character_composer, key2, key3, key4, key5, key6,
126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            flags, expected_character);
127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Expects |expected_character| is composed after sequence [{key1, keycode1}].
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void ExpectCharacterComposedWithKeyCode(
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      CharacterComposer* character_composer,
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      uint key1, uint keycode1,
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      int flags,
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const base::string16& expected_character) {
135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(character_composer->FilterKeyPressInternal(key1, keycode1,
136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                           flags));
137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(expected_character, character_composer->composed_character());
138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(CharacterComposerTest, InitialState) {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CharacterComposer character_composer;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(character_composer.composed_character().empty());
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(CharacterComposerTest, NormalKeyIsNotFiltered) {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CharacterComposer character_composer;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyNotFiltered(&character_composer, GDK_KEY_B, 0);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyNotFiltered(&character_composer, GDK_KEY_Z, 0);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyNotFiltered(&character_composer, GDK_KEY_c, 0);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyNotFiltered(&character_composer, GDK_KEY_m, 0);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyNotFiltered(&character_composer, GDK_KEY_0, 0);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyNotFiltered(&character_composer, GDK_KEY_1, 0);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyNotFiltered(&character_composer, GDK_KEY_8, 0);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(CharacterComposerTest, PartiallyMatchingSequence) {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CharacterComposer character_composer;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Composition with sequence ['dead acute', '1'] will fail.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute, 0);
162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_1, 0);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Composition with sequence ['dead acute', 'dead circumflex', '1'] will fail.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute, 0);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_dead_circumflex, 0);
167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_1, 0);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(CharacterComposerTest, FullyMatchingSequences) {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CharacterComposer character_composer;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // LATIN SMALL LETTER A WITH ACUTE
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, GDK_KEY_a, 0,
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          base::string16(1, 0x00E1));
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // LATIN CAPITAL LETTER A WITH ACUTE
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, GDK_KEY_A, 0,
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          base::string16(1, 0x00C1));
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GRAVE ACCENT
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectCharacterComposed(&character_composer, GDK_KEY_dead_grave,
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          GDK_KEY_dead_grave, 0, base::string16(1, 0x0060));
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          GDK_KEY_dead_circumflex, GDK_KEY_a, 0,
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          base::string16(1, 0x1EA5));
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // LATIN CAPITAL LETTER U WITH HORN AND GRAVE
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectCharacterComposed(&character_composer, GDK_KEY_dead_grave,
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          GDK_KEY_dead_horn, GDK_KEY_U, 0,
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          base::string16(1, 0x1EEA));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // LATIN CAPITAL LETTER C WITH CEDILLA
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, GDK_KEY_C, 0,
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          base::string16(1, 0x00C7));
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // LATIN SMALL LETTER C WITH CEDILLA
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, GDK_KEY_c, 0,
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          base::string16(1, 0x00E7));
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(CharacterComposerTest, FullyMatchingSequencesAfterMatchingFailure) {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CharacterComposer character_composer;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Composition with sequence ['dead acute', 'dead circumflex', '1'] will fail.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute, 0);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_dead_circumflex, 0);
202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_1, 0);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute,
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          GDK_KEY_dead_circumflex, GDK_KEY_a, 0,
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          base::string16(1, 0x1EA5));
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(CharacterComposerTest, ComposedCharacterIsClearedAfterReset) {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CharacterComposer character_composer;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, GDK_KEY_a, 0,
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          base::string16(1, 0x00E1));
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  character_composer.Reset();
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(character_composer.composed_character().empty());
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(CharacterComposerTest, CompositionStateIsClearedAfterReset) {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CharacterComposer character_composer;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Even though sequence ['dead acute', 'a'] will compose 'a with acute',
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // no character is composed here because of reset.
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute, 0);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  character_composer.Reset();
223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ExpectKeyNotFiltered(&character_composer, GDK_KEY_a, 0);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(CharacterComposerTest, KeySequenceCompositionPreedit) {
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CharacterComposer character_composer;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // LATIN SMALL LETTER A WITH ACUTE
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // preedit_string() is always empty in key sequence composition mode.
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute, 0);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(character_composer.preedit_string().empty());
232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(FilterKeyPress(&character_composer, GDK_KEY_a, 0, 0));
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::string16(1, 0x00E1), character_composer.composed_character());
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(character_composer.preedit_string().empty());
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ComposeCheckerWithCompactTable in character_composer.cc is depending on the
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// assumption that the data in gtkimcontextsimpleseqs.h is correctly ordered.
239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(CharacterComposerTest, MainTableIsCorrectlyOrdered) {
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This file is included here intentionally, instead of the top of the file,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // because including this file at the top of the file will define a
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // global constant and contaminate the global namespace.
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/gtk+/gtk/gtkimcontextsimpleseqs.h"
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int index_size = 26;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int index_stride = 6;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the index is correctly ordered
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 1; i < index_size; ++i) {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int index_key_prev = gtk_compose_seqs_compact[(i - 1)*index_stride];
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int index_key = gtk_compose_seqs_compact[i*index_stride];
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(index_key > index_key_prev);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the sequenes are correctly ordered
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int operator()(const uint16* l, const uint16* r, int length) const{
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (int i = 0; i < length; ++i) {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (l[i] > r[i])
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return 1;
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (l[i] < r[i])
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return -1;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } compare_sequence;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < index_size; ++i) {
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int length = 1; length < index_stride - 1; ++length) {
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const int index_begin = gtk_compose_seqs_compact[i*index_stride + length];
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const int index_end =
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          gtk_compose_seqs_compact[i*index_stride + length + 1];
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const int stride = length + 1;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (int index = index_begin + stride; index < index_end;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           index += stride) {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const uint16* sequence = &gtk_compose_seqs_compact[index];
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const uint16* sequence_prev = sequence - stride;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_EQ(1, compare_sequence(sequence, sequence_prev, length));
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(CharacterComposerTest, HexadecimalComposition) {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CharacterComposer character_composer;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HIRAGANA LETTER A (U+3042)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_U,
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    EF_SHIFT_DOWN | EF_CONTROL_DOWN);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectCharacterComposed(&character_composer, GDK_KEY_3, GDK_KEY_0, GDK_KEY_4,
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          GDK_KEY_2, GDK_KEY_space, 0,
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          base::string16(1, 0x3042));
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // MUSICAL KEYBOARD (U+1F3B9)
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::char16 kMusicalKeyboard[] = {0xd83c, 0xdfb9};
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_U,
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    EF_SHIFT_DOWN | EF_CONTROL_DOWN);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectCharacterComposed(&character_composer, GDK_KEY_1, GDK_KEY_f, GDK_KEY_3,
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          GDK_KEY_b, GDK_KEY_9, GDK_KEY_Return, 0,
2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          base::string16(kMusicalKeyboard,
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   kMusicalKeyboard +
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   arraysize(kMusicalKeyboard)));
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
302a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(CharacterComposerTest, HexadecimalCompositionPreedit) {
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CharacterComposer character_composer;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HIRAGANA LETTER A (U+3042)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_U,
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    EF_SHIFT_DOWN | EF_CONTROL_DOWN);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("u"), character_composer.preedit_string());
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_3, 0);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("u3"), character_composer.preedit_string());
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_0, 0);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("u30"), character_composer.preedit_string());
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_4, 0);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("u304"), character_composer.preedit_string());
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_a, 0);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("u304a"), character_composer.preedit_string());
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_BackSpace, 0);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("u304"), character_composer.preedit_string());
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectCharacterComposed(&character_composer, GDK_KEY_2, GDK_KEY_Return, 0,
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          base::string16(1, 0x3042));
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16(""), character_composer.preedit_string());
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sequence with an ignored character ('x') and Escape.
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_U,
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    EF_SHIFT_DOWN | EF_CONTROL_DOWN);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("u"), character_composer.preedit_string());
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_3, 0);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("u3"), character_composer.preedit_string());
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_0, 0);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("u30"), character_composer.preedit_string());
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_x, 0);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("u30"), character_composer.preedit_string());
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_4, 0);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("u304"), character_composer.preedit_string());
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_2, 0);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("u3042"), character_composer.preedit_string());
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_Escape, 0);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16(""), character_composer.preedit_string());
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
340a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(CharacterComposerTest, HexadecimalCompositionWithNonHexKey) {
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CharacterComposer character_composer;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sequence [Ctrl+Shift+U, x, space] does not compose a character.
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_U,
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    EF_SHIFT_DOWN | EF_CONTROL_DOWN);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_x, 0);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_space, 0);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(character_composer.composed_character().empty());
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HIRAGANA LETTER A (U+3042) with a sequence [3, 0, x, 4, 2].
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_U,
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    EF_SHIFT_DOWN | EF_CONTROL_DOWN);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectCharacterComposed(&character_composer, GDK_KEY_3, GDK_KEY_0, GDK_KEY_x,
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          GDK_KEY_4, GDK_KEY_2, GDK_KEY_space, 0,
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          base::string16(1, 0x3042));
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
358a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(CharacterComposerTest, HexadecimalCompositionWithAdditionalModifiers) {
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CharacterComposer character_composer;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ctrl+Shift+Alt+U
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HIRAGANA LETTER A (U+3042)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_U,
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    EF_SHIFT_DOWN | EF_CONTROL_DOWN | EF_ALT_DOWN);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectCharacterComposed(&character_composer, GDK_KEY_3, GDK_KEY_0, GDK_KEY_4,
3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          GDK_KEY_2, GDK_KEY_space, 0,
3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          base::string16(1, 0x3042));
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ctrl+Shift+u (CapsLock enabled)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyNotFiltered(&character_composer, GDK_KEY_u,
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       EF_SHIFT_DOWN | EF_CONTROL_DOWN | EF_CAPS_LOCK_DOWN);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
374a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(CharacterComposerTest, CancelHexadecimalComposition) {
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CharacterComposer character_composer;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cancel composition with ESC.
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_U,
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    EF_SHIFT_DOWN | EF_CONTROL_DOWN);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_1, 0);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_Escape, 0);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now we can start composition again since the last composition was
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cancelled.
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HIRAGANA LETTER A (U+3042)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_U,
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    EF_SHIFT_DOWN | EF_CONTROL_DOWN);
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectCharacterComposed(&character_composer, GDK_KEY_3, GDK_KEY_0, GDK_KEY_4,
3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          GDK_KEY_2, GDK_KEY_space, 0,
3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          base::string16(1, 0x3042));
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
392a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(CharacterComposerTest, HexadecimalCompositionWithBackspace) {
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CharacterComposer character_composer;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HIRAGANA LETTER A (U+3042)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_U,
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    EF_SHIFT_DOWN | EF_CONTROL_DOWN);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_3, 0);
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_0, 0);
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_f, 0);
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_BackSpace, 0);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectCharacterComposed(&character_composer, GDK_KEY_4, GDK_KEY_2,
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          GDK_KEY_space, 0, base::string16(1, 0x3042));
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(CharacterComposerTest, CancelHexadecimalCompositionWithBackspace) {
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CharacterComposer character_composer;
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Backspace just after Ctrl+Shift+U.
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_U,
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    EF_SHIFT_DOWN | EF_CONTROL_DOWN);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_BackSpace, 0);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyNotFiltered(&character_composer, GDK_KEY_3, 0);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Backspace twice after Ctrl+Shift+U and 3.
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_U,
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    EF_SHIFT_DOWN | EF_CONTROL_DOWN);
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_3, 0);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_BackSpace, 0);
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_BackSpace, 0);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyNotFiltered(&character_composer, GDK_KEY_3, 0);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
423a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(CharacterComposerTest, HexadecimalCompositionPreeditWithModifierPressed)
424a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles){
42590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // This test case supposes X Window System uses 101 keyboard layout.
42690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CharacterComposer character_composer;
42790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const int control_shift =  EF_CONTROL_DOWN | EF_SHIFT_DOWN;
42890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // HIRAGANA LETTER A (U+3042)
42990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ExpectKeyFilteredWithKeycode(&character_composer,
430f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                               GDK_KEY_U, ui::VKEY_U, control_shift);
43190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("u"), character_composer.preedit_string());
43290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ExpectKeyFilteredWithKeycode(&character_composer,
433f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                               GDK_KEY_numbersign, ui::VKEY_3, control_shift);
43490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("u3"), character_composer.preedit_string());
43590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ExpectKeyFilteredWithKeycode(&character_composer,
436f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                               GDK_KEY_parenright, ui::VKEY_0, control_shift);
43790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("u30"), character_composer.preedit_string());
43890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ExpectKeyFilteredWithKeycode(&character_composer,
439f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                               GDK_KEY_dollar, ui::VKEY_4, control_shift);
44090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("u304"), character_composer.preedit_string());
44190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ExpectKeyFilteredWithKeycode(&character_composer,
442f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                               GDK_KEY_A, ui::VKEY_A, control_shift);
44390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("u304a"), character_composer.preedit_string());
44490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ExpectKeyFilteredWithKeycode(&character_composer,
445f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                               GDK_KEY_BackSpace, ui::VKEY_BACK, control_shift);
44690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("u304"), character_composer.preedit_string());
44790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ExpectKeyFilteredWithKeycode(&character_composer,
448f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                               GDK_KEY_at, ui::VKEY_2, control_shift);
44990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("u3042"), character_composer.preedit_string());
45090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ExpectCharacterComposedWithKeyCode(&character_composer,
451f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                     GDK_KEY_Return, ui::VKEY_RETURN,
45290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                     control_shift,
4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     base::string16(1, 0x3042));
45490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16(""), character_composer.preedit_string());
45590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
45690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Sequence with an ignored character (control + shift + 'x') and Escape.
45790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ExpectKeyFilteredWithKeycode(&character_composer,
458f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                               GDK_KEY_U, ui::VKEY_U, control_shift);
45990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("u"), character_composer.preedit_string());
46090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ExpectKeyFilteredWithKeycode(&character_composer,
461f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                               GDK_KEY_numbersign, ui::VKEY_3, control_shift);
46290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("u3"), character_composer.preedit_string());
46390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ExpectKeyFilteredWithKeycode(&character_composer,
464f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                               GDK_KEY_parenright, ui::VKEY_0, control_shift);
46590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("u30"), character_composer.preedit_string());
46690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ExpectKeyFilteredWithKeycode(&character_composer,
467f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                               GDK_KEY_X, ui::VKEY_X, control_shift);
46890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("u30"), character_composer.preedit_string());
46990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ExpectKeyFilteredWithKeycode(&character_composer,
470f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                               GDK_KEY_dollar, ui::VKEY_4, control_shift);
47190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("u304"), character_composer.preedit_string());
47290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ExpectKeyFilteredWithKeycode(&character_composer,
473f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                               GDK_KEY_at, ui::VKEY_2, control_shift);
47490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("u3042"), character_composer.preedit_string());
47590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ExpectKeyFilteredWithKeycode(&character_composer,
476f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                               GDK_KEY_Escape, ui::VKEY_ESCAPE, control_shift);
47790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16(""), character_composer.preedit_string());
47890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
47990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
480a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(CharacterComposerTest, InvalidHexadecimalSequence) {
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CharacterComposer character_composer;
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // U+FFFFFFFF
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_U,
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    EF_SHIFT_DOWN | EF_CONTROL_DOWN);
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 8; ++i)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectKeyFiltered(&character_composer, GDK_KEY_f, 0);
487a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_space, 0);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // U+0000 (Actually, this is a valid unicode character, but we don't
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // compose a string with a character '\0')
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_U,
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    EF_SHIFT_DOWN | EF_CONTROL_DOWN);
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 4; ++i)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectKeyFiltered(&character_composer, GDK_KEY_0, 0);
495a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_space, 0);
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // U+10FFFF
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_U,
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    EF_SHIFT_DOWN | EF_CONTROL_DOWN);
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_1, 0);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_0, 0);
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 4; ++i)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectKeyFiltered(&character_composer, GDK_KEY_f, 0);
504a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_space, 0);
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // U+110000
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_U,
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    EF_SHIFT_DOWN | EF_CONTROL_DOWN);
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_1, 0);
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_1, 0);
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 4; ++i)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpectKeyFiltered(&character_composer, GDK_KEY_0, 0);
513a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_space, 0);
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
516a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(CharacterComposerTest, HexadecimalSequenceAndDeadKey) {
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CharacterComposer character_composer;
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // LATIN SMALL LETTER A WITH ACUTE
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectCharacterComposed(&character_composer, GDK_KEY_dead_acute, GDK_KEY_a, 0,
5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          base::string16(1, 0x00E1));
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HIRAGANA LETTER A (U+3042) with dead_acute ignored.
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_U,
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    EF_SHIFT_DOWN | EF_CONTROL_DOWN);
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectCharacterComposed(&character_composer, GDK_KEY_3, GDK_KEY_0,
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          GDK_KEY_dead_acute, GDK_KEY_4,  GDK_KEY_2,
5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          GDK_KEY_space, 0, base::string16(1, 0x3042));
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // LATIN CAPITAL LETTER U WITH ACUTE while 'U' is pressed with Ctrl+Shift.
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectKeyFiltered(&character_composer, GDK_KEY_dead_acute, 0);
529a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(FilterKeyPress(&character_composer, GDK_KEY_U, 0,
530a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             EF_SHIFT_DOWN | EF_CONTROL_DOWN));
5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::string16(1, 0x00DA), character_composer.composed_character());
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
534a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(CharacterComposerTest, BlacklistedKeyeventsTest) {
5357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  CharacterComposer character_composer;
536a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_TRUE(FilterKeyPress(&character_composer, GDK_KEY_dead_acute, 0, 0));
537a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_FALSE(FilterKeyPress(&character_composer, GDK_KEY_s, 0, 0));
5387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(1U, character_composer.composed_character().size());
5397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(GDK_KEY_apostrophe, character_composer.composed_character().at(0));
5407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
5417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
543